Restored 'org.eclipse.update.core'
diff --git a/update/org.eclipse.update.core/.classpath b/update/org.eclipse.update.core/.classpath
new file mode 100644
index 0000000..b54a094
--- /dev/null
+++ b/update/org.eclipse.update.core/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<classpath>

+	<classpathentry kind="src" path="src"/>

+	<classpathentry kind="src" path="jarprocessor"/>

+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>

+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>

+	<classpathentry kind="output" path="bin"/>

+</classpath>

diff --git a/update/org.eclipse.update.core/.cvsignore b/update/org.eclipse.update.core/.cvsignore
new file mode 100644
index 0000000..c5e82d7
--- /dev/null
+++ b/update/org.eclipse.update.core/.cvsignore
@@ -0,0 +1 @@
+bin
\ No newline at end of file
diff --git a/update/org.eclipse.update.core/.options b/update/org.eclipse.update.core/.options
new file mode 100644
index 0000000..7bf6197
--- /dev/null
+++ b/update/org.eclipse.update.core/.options
@@ -0,0 +1,9 @@
+org.eclipse.update.core/debug=true

+org.eclipse.update.core/debug/warning=false

+org.eclipse.update.core/debug/parsing=false

+org.eclipse.update.core/debug/install=false

+org.eclipse.update.core/debug/configuration=false

+org.eclipse.update.core/debug/type=false

+org.eclipse.update.core/debug/web=false

+org.eclipse.update.core/debug/installhandler=false

+org.eclipse.update.core/debug/reconciler=false

diff --git a/update/org.eclipse.update.core/.project b/update/org.eclipse.update.core/.project
index dec3727..e358fd4 100644
--- a/update/org.eclipse.update.core/.project
+++ b/update/org.eclipse.update.core/.project
@@ -1,11 +1,26 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.update.core</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-	</buildSpec>
-	<natures>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>

+<projectDescription>

+	<name>org.eclipse.update.core</name>

+	<comment></comment>

+	<buildSpec>

+		<buildCommand>

+			<name>org.eclipse.jdt.core.javabuilder</name>

+			<arguments>

+			</arguments>

+		</buildCommand>

+		<buildCommand>

+			<name>org.eclipse.pde.ManifestBuilder</name>

+			<arguments>

+			</arguments>

+		</buildCommand>

+		<buildCommand>

+			<name>org.eclipse.pde.SchemaBuilder</name>

+			<arguments>

+			</arguments>

+		</buildCommand>

+	</buildSpec>

+	<natures>

+		<nature>org.eclipse.jdt.core.javanature</nature>

+		<nature>org.eclipse.pde.PluginNature</nature>

+	</natures>

+</projectDescription>

diff --git a/update/org.eclipse.update.core/.settings/org.eclipse.jdt.core.prefs b/update/org.eclipse.update.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..23d6e87
--- /dev/null
+++ b/update/org.eclipse.update.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,86 @@
+#Wed Feb 11 12:06:10 EST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.4
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=error
+org.eclipse.jdt.core.compiler.problem.deprecation=ignore
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=error
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.3
diff --git a/update/org.eclipse.update.core/META-INF/MANIFEST.MF b/update/org.eclipse.update.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..62ba95b
--- /dev/null
+++ b/update/org.eclipse.update.core/META-INF/MANIFEST.MF
@@ -0,0 +1,34 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.update.core; singleton:=true
+Bundle-Version: 3.2.600.qualifier
+Bundle-Activator: org.eclipse.update.internal.core.UpdateCore
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Export-Package: org.eclipse.update.configuration,
+ org.eclipse.update.core,
+ org.eclipse.update.core.model,
+ org.eclipse.update.internal.core;x-friends:="org.eclipse.update.ui,org.eclipse.update.scheduler,org.eclipse.pde.build",
+ org.eclipse.update.internal.core.connection;x-internal:=true,
+ org.eclipse.update.internal.jarprocessor;x-friends:="org.eclipse.pde.build",
+ org.eclipse.update.internal.mirror;x-internal:=true,
+ org.eclipse.update.internal.model;x-friends:="org.eclipse.update.ui",
+ org.eclipse.update.internal.operations;x-friends:="org.eclipse.update.ui,org.eclipse.update.scheduler",
+ org.eclipse.update.internal.provisional;x-internal:=true,
+ org.eclipse.update.internal.search;x-friends:="org.eclipse.update.ui",
+ org.eclipse.update.internal.security;x-internal:=true,
+ org.eclipse.update.internal.verifier;x-internal:=true,
+ org.eclipse.update.operations,
+ org.eclipse.update.search,
+ org.eclipse.update.standalone
+Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
+ org.eclipse.update.configurator;bundle-version="[3.1.0,4.0.0)",
+ org.eclipse.core.net;bundle-version="[1.0.0,2.0.0)"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.4,
+ CDC-1.1/Foundation-1.1
+Import-Package: javax.xml.parsers,
+ org.w3c.dom,
+ org.xml.sax,
+ org.xml.sax.helpers
diff --git a/update/org.eclipse.update.core/README.TXT b/update/org.eclipse.update.core/README.TXT
deleted file mode 100644
index c809c74..0000000
--- a/update/org.eclipse.update.core/README.TXT
+++ /dev/null
@@ -1,2 +0,0 @@
-This bundle is obsolete.
-Its functionality is provided by p2.
\ No newline at end of file
diff --git a/update/org.eclipse.update.core/about.html b/update/org.eclipse.update.core/about.html
new file mode 100644
index 0000000..4602330
--- /dev/null
+++ b/update/org.eclipse.update.core/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 2, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/update/org.eclipse.update.core/build.properties b/update/org.eclipse.update.core/build.properties
new file mode 100644
index 0000000..cc35d07
--- /dev/null
+++ b/update/org.eclipse.update.core/build.properties
@@ -0,0 +1,22 @@
+###############################################################################

+# Copyright (c) 2000, 2008 IBM Corporation and others.

+# All rights reserved. This program and the accompanying materials

+# are made available under the terms of the Eclipse Public License v1.0

+# which accompanies this distribution, and is available at

+# http://www.eclipse.org/legal/epl-v10.html

+#

+# Contributors:

+#     IBM Corporation - initial API and implementation

+###############################################################################

+source.. = src/,\

+           jarprocessor/

+bin.includes = plugin.xml,\

+               plugin.properties,\

+               .,\

+               about.html,\

+               .options,\

+               META-INF/

+src.includes = about.html,\

+               schema/

+output.. = bin/

+customBuildCallbacks=customBuildCallbacks.xml

diff --git a/update/org.eclipse.update.core/customBuildCallbacks.xml b/update/org.eclipse.update.core/customBuildCallbacks.xml
new file mode 100644
index 0000000..a26456f
--- /dev/null
+++ b/update/org.eclipse.update.core/customBuildCallbacks.xml
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="UTF-8"?>
<!--
+     Copyright (c) 2005, 2007 IBM Corporation and others.
+     All rights reserved. This program and the accompanying materials
+     are made available under the terms of the Eclipse Public License v1.0
+     which accompanies this distribution, and is available at
+     http://www.eclipse.org/legal/epl-v10.html
+    
+     Contributors:
+         IBM Corporation - initial API and implementation
+ -->
+
+<!-- ===================================================================== -->
+<!-- Custom targets called from a project's generated build.xml            -->
+<!-- Set customBuildCallbacks=<path/to/this/file> in your build.properties.-->
+<!-- ===================================================================== -->
+<project name="Build specific targets and properties" default="noDefault">
+
+	<!-- ===================================================================== -->
+	<!-- Default target                                                        -->
+	<!-- ===================================================================== -->
+	<target name="noDefault">
+		<echo message="This file must be called with explicit targets" />
+	</target>
+	
+	<!-- ===================================================================== -->
+	<!-- Steps to do before the target build.jars                              -->
+	<!-- Available parameters :                                                -->
+	<!--   build.result.folder - folder to contain the build results           -->
+	<!-- ===================================================================== -->
+	<target name="pre.build.jars">
+	</target>
+
+	<!-- ===================================================================== -->
+	<!-- Steps to do after the target build.jars                               -->
+	<!-- Available parameters :                                                -->
+	<!--   build.result.folder - folder to contain the build results           -->
+	<!-- ===================================================================== -->
+	<target name="post.build.jars">
+	</target>
+	
+	<!-- ===================================================================== -->
+	<!-- Steps to do before the target build.sources                           -->
+	<!-- Available parameters :                                                -->
+	<!--   build.result.folder - folder to contain the build results           -->
+	<!-- ===================================================================== -->
+	<target name="pre.build.sources">
+	</target>
+
+	<!-- ===================================================================== -->
+	<!-- Steps to do after the target build.sources                            -->
+	<!-- Available parameters :                                                -->
+	<!--   build.result.folder - folder to contain the build results           -->
+	<!-- ===================================================================== -->
+	<target name="post.build.sources">
+	</target>
+
+	<!-- ===================================================================== -->
+	<!-- Steps to do before the compilation target <name>                      -->
+	<!-- Substitute "name" with the name of the compilation target, eg @dot    -->
+	<!-- Available parameters :                                                -->
+	<!--   source.foldern : n = 1 ... N, the source folders                    -->
+	<!--   target.folder  : where the results of the compilation go            -->
+	<!--   <name>.classpath : name = name of the compilation target. A         -->
+	<!--                      reference to the classpath structure.            -->
+	<!-- ===================================================================== -->
+	<target name="pre.name">
+	</target>
+
+	<target name="pre.@dot">
+	</target>
+
+	<!-- ===================================================================== -->
+	<!-- Steps to do during the compilation target <name>, after the compile   -->
+	<!-- but before jaring.  Substitute "name" with the name of the compilation-->
+	<!-- target, eg @dot                                                       -->
+	<!-- Available parameters :                                                -->
+	<!--   source.foldern : n = 1 ... N, the source folders                    -->
+	<!--   target.folder  : where the results of the compilation go            -->
+	<!--   <name>.classpath : name = name of the compilation target. A         -->
+	<!--                      reference to the classpath structure.            -->
+	<!-- ===================================================================== -->
+	<target name="post.compile.name">
+	</target>
+
+	<target name="post.compile.@dot">
+		<property name="buildLabel" value="" />
+		<property name="postingDirectory" value="${basedir}" />
+		<property name="dest" value="${postingDirectory}/${buildLabel}" />
+		<mkdir dir="${dest}"/>
+		<echo message="UPDATE jarprocessor.jar" />
+		<delete file="${dest}/jarprocessor.jar" failonerror="false"/>
+		<jar destfile="${dest}/jarprocessor.jar">
+			<fileset dir="${target.folder}">
+				<include name="org/eclipse/update/internal/jarprocessor/*"/>
+				<exclude name="**/jarprocessor.jardesc"/>
+			</fileset>
+			<fileset dir="${basedir}" includes="about.html" />
+			<manifest>
+				<attribute name="Main-Class" value="org.eclipse.update.internal.jarprocessor.Main"/>
+			</manifest>
+		</jar>
+		
+		<echo message="UPDATE jarprocessorsrc.zip"/>
+		<delete file="${dest}/jarprocessorsrc.zip" failonerror="false" />
+		<zip destFile="${dest}/jarprocessorsrc.zip">
+			<fileset dir="${basedir}/jarprocessor" includes="**/*.java" />
+			<fileset dir="${basedir}" includes="about.html" />
+		</zip>
+	</target>
+	
+	<!-- ===================================================================== -->
+	<!-- Steps to do after the compilation target <name>                       -->
+	<!-- Substitute "name" with the name of the compilation target, eg @dot    -->
+	<!-- Available parameters :                                                -->
+	<!--   jar.location - the location of the compilation results              -->
+	<!--   <name>.classpath : name = name of the compilation target. A         -->
+	<!--                      reference to the classpath structure.            -->
+	<!-- ===================================================================== -->
+	<target name="post.name">
+	</target>
+
+	<target name="post.@dot">
+	</target>
+	
+	<!-- ===================================================================== -->
+	<!-- Steps to do before the target gather.bin.parts                         -->
+	<!-- Available parameters :                                                -->
+	<!--   build.result.folder - folder containing the build results           -->
+	<!--   target.folder - destination folder                                  -->
+	<!-- ===================================================================== -->
+	<target name="pre.gather.bin.parts">
+	</target>
+		
+	<!-- ===================================================================== -->
+	<!-- Steps to do after the target gather.bin.parts                         -->
+	<!-- Available parameters :                                                -->
+	<!--   build.result.folder - folder containing the build results           -->
+	<!--   target.folder - destination folder                                  -->
+	<!-- ===================================================================== -->
+	<target name="post.gather.bin.parts">
+	</target>
+
+	<!-- ===================================================================== -->
+	<!-- Steps to do before the target gather.sources                          -->
+	<!-- Available parameters :                                                -->
+	<!--   destination.temp.folder - destination folder                        -->
+	<!-- ===================================================================== -->
+	<target name="pre.gather.sources">
+	</target>
+
+	<!-- ===================================================================== -->
+	<!-- Steps to do after the target gather.sources                           -->
+	<!-- Available parameters :                                                -->
+	<!--   destination.temp.folder - destination folder                        -->
+	<!-- ===================================================================== -->
+	<target name="post.gather.sources">
+	</target>
+
+	<!-- ===================================================================== -->
+	<!-- Steps to do before the target gather.logs                             -->
+	<!-- Available parameters :                                                -->
+	<!--   destination.temp.folder - destination folder                        -->
+	<!-- ===================================================================== -->
+	<target name="pre.gather.logs">
+	</target>
+
+	<!-- ===================================================================== -->
+	<!-- Steps to do after the target gather.logs                              -->
+	<!-- Available parameters :                                                -->
+	<!--   destination.temp.folder - destination folder                        -->
+	<!-- ===================================================================== -->
+	<target name="post.gather.logs">
+	</target>
+
+	<!-- ===================================================================== -->
+	<!-- Steps to do before the target clean                                   -->
+	<!-- Available parameters :                                                -->
+	<!--   destination.temp.folder - destination folder                        -->
+	<!-- ===================================================================== -->
+	<target name="pre.clean">
+	</target>
+
+	<!-- ===================================================================== -->
+	<!-- Steps to do after the target clean                                    -->
+	<!-- Available parameters :                                                -->
+	<!--   plugin.destination - final destination of the build                 -->
+	<!--   build.result.folder - results of the compilation                    -->
+	<!--   temp.folder - temporary folder                                      -->
+	<!-- ===================================================================== -->
+	<target name="post.clean">
+	</target>
+
+</project>
\ No newline at end of file
diff --git a/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/CommandStep.java b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/CommandStep.java
new file mode 100644
index 0000000..39c17d3
--- /dev/null
+++ b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/CommandStep.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.internal.jarprocessor;
+
+import java.io.File;
+import java.util.List;
+import java.util.Properties;
+
+/**
+ * @author aniefer@ca.ibm.com
+ *
+ */
+public abstract class CommandStep implements IProcessStep {
+	protected String command = null;
+	protected String extension = null;
+	private  Properties options = null;
+	protected boolean verbose = false;
+	
+	public CommandStep(Properties options, String command, String extension, boolean verbose) {
+		this.command = command;
+		this.extension = extension;
+		this.options = options;
+		this.verbose = verbose;
+	}
+
+	protected static int execute(String[] cmd) {
+		return execute(cmd, false);
+	}
+	
+	protected static int execute(String[] cmd, boolean verbose) {
+		Runtime runtime = Runtime.getRuntime();
+		Process proc = null;
+		try {
+			proc = runtime.exec(cmd);
+			StreamProcessor errorStreamProcessor = new StreamProcessor(proc.getErrorStream(), StreamProcessor.STDERR, verbose); //$NON-NLS-1$
+			StreamProcessor outputStreamProcessor = new StreamProcessor(proc.getInputStream(), StreamProcessor.STDOUT, verbose); //$NON-NLS-1$
+			errorStreamProcessor.start();
+			outputStreamProcessor.start();
+		} catch (Exception e) {
+			if(verbose) {
+				System.out.println("Error executing command " + Utils.concat(cmd)); //$NON-NLS-1$
+				e.printStackTrace();
+			}
+			return -1;
+		}
+		try {
+			int result = proc.waitFor();
+			return result;
+		} catch (InterruptedException e) {
+			if(verbose)
+				e.printStackTrace();
+		}
+		return -1;
+	}
+	
+	public Properties getOptions() {
+		if(options == null)
+			options = new Properties();
+		return options;
+	}
+	
+	public void adjustInf(File input, Properties inf, List containers) {
+		//nothing
+	}
+}
diff --git a/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/IProcessStep.java b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/IProcessStep.java
new file mode 100644
index 0000000..18c438e
--- /dev/null
+++ b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/IProcessStep.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.internal.jarprocessor;
+
+import java.io.File;
+import java.util.List;
+import java.util.Properties;
+
+/**
+ * @author aniefer@ca.ibm.com
+ *
+ */
+public interface IProcessStep {
+	
+	/**
+	 * The effect of this processing step if the JarProcessor was to recurse on this entry.
+	 * Return null if this step will not do anything with this entry.
+	 * Return the new entryName if this step will modify this entry on recursion.
+	 * @param entryName
+	 * @return
+	 */
+	public String recursionEffect(String entryName);
+	
+	/**
+	 * Perform some processing on the input file before the JarProcessor considers the entries for recursion.
+	 *  return the file containing the result of the processing
+	 * @param input
+	 * @param workingDirectory
+	 * @param containers: inf properties for containing jars, innermost jar is first on the list
+	 * @return
+	 */
+	public File preProcess(File input, File workingDirectory, List containers);
+	
+	/**
+	 * Perform some processing on the input file after the JarProcessor returns from recursion
+	 * return the file containing the result of the processing
+	 * @param input
+	 * @param workingDirectory
+	 * @param containers: inf properties for containing jars, innermost jar is first on the list
+	 * @return
+	 */
+	public File postProcess(File input, File workingDirectory, List containers);
+	
+	/**
+	 * Return the name of this process step
+	 * @return
+	 */
+	public String getStepName();
+
+	/**
+	 * Adjust any properties in the eclipse.inf as appropriate for this step
+	 * @param input
+	 * @param inf
+	 * @param containers: inf properties for containing jars, innermost jar is first on the list
+	 */
+	public void adjustInf(File input, Properties inf, List containers);
+}
diff --git a/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/JarProcessor.java b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/JarProcessor.java
new file mode 100644
index 0000000..aef3704
--- /dev/null
+++ b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/JarProcessor.java
@@ -0,0 +1,393 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.internal.jarprocessor;
+
+import java.io.*;
+import java.util.*;
+import java.util.jar.*;
+
+/**
+ * @author aniefer@ca.ibm.com
+ *
+ */
+public class JarProcessor {
+	private List steps = new ArrayList();
+	private String workingDirectory = ""; //$NON-NLS-1$
+	private int depth = -1;
+	private boolean verbose = false;
+	private boolean processAll = false;
+	private LinkedList containingInfs = new LinkedList();
+
+	static public JarProcessor getUnpackProcessor(Properties properties) {
+		if (!canPerformUnpack())
+			throw new UnsupportedOperationException();
+		JarProcessor processor = new JarProcessor();
+		processor.addProcessStep(new UnpackStep(properties));
+		return processor;
+	}
+
+	static public JarProcessor getPackProcessor(Properties properties) {
+		if (!canPerformPack())
+			throw new UnsupportedOperationException();
+		JarProcessor processor = new JarProcessor();
+		processor.addProcessStep(new PackStep(properties));
+		return processor;
+	}
+
+	static public boolean canPerformPack() {
+		return PackStep.canPack();
+	}
+
+	static public boolean canPerformUnpack() {
+		return UnpackStep.canUnpack();
+	}
+
+	public String getWorkingDirectory() {
+		return workingDirectory;
+	}
+
+	public void setWorkingDirectory(String dir) {
+		if(dir != null)
+			workingDirectory = dir;
+	}
+	
+	public void setVerbose(boolean verbose) {
+		this.verbose = verbose;
+	}
+	
+	public void setProcessAll(boolean all){
+		this.processAll = all;
+	}
+
+	public void addProcessStep(IProcessStep step) {
+		steps.add(step);
+	}
+
+	public void clearProcessSteps() {
+		steps.clear();
+	}
+
+	/**
+	 * Recreate a jar file.  The replacements map specifies entry names to be replaced, the replacements are
+	 * expected to be found in directory.
+	 * 
+	 * @param jar - The input jar
+	 * @param outputJar - the output
+	 * @param replacements - map of entryName -> new entryName
+	 * @param directory - location to find file for new entryName
+	 * @throws IOException
+	 */
+	private void recreateJar(JarFile jar, JarOutputStream outputJar, Map replacements, File directory, Properties inf) throws IOException {
+		InputStream in = null;
+		boolean marked = false;
+		try {
+			Enumeration entries = jar.entries();
+			for (JarEntry entry = (JarEntry) entries.nextElement(); entry != null; entry = entries.hasMoreElements() ? (JarEntry) entries.nextElement() : null) {
+				File replacement = null;
+				JarEntry newEntry = null;
+				if (replacements.containsKey(entry.getName())) {
+					String name = (String) replacements.get(entry.getName());
+					replacement = new File(directory, name);
+					if (name != null) {
+						if (replacement.exists()) {
+							try {
+								in = new BufferedInputStream(new FileInputStream(replacement));
+								newEntry = new JarEntry(name);
+							} catch (Exception e) {
+								if (verbose) {
+									e.printStackTrace();
+									System.out.println("Warning: Problem reading " +replacement.getPath() + ", using " + jar.getName() + File.separator + entry.getName()  + " instead.");
+								}
+							}
+						} else if (verbose) {
+							System.out.println("Warning: " + replacement.getPath() + " not found, using " + jar.getName() + File.separator + entry.getName() + " instead.");	
+						}
+					}
+				}
+				if (newEntry == null) {
+					try {
+						in = new BufferedInputStream(jar.getInputStream(entry));
+						newEntry = new JarEntry(entry.getName());
+					} catch( Exception e ) {
+						if(verbose) {
+							e.printStackTrace();
+							System.out.println("ERROR: problem reading " + entry.getName() + " from " + jar.getName());
+						}
+						continue;
+					}
+				}
+				newEntry.setTime(entry.getTime());
+				outputJar.putNextEntry(newEntry);
+				if (entry.getName().equals(Utils.MARK_FILE_NAME)) {
+					//The eclipse.inf file was read in earlier, don't need to reread it, just write it out now
+					Utils.storeProperties(inf, outputJar);
+					marked = true;
+				} else {
+					Utils.transferStreams(in, outputJar, false);
+				}
+				outputJar.closeEntry();
+				in.close();
+
+				//delete the nested jar file
+				if (replacement != null) {
+					replacement.delete();
+				}
+			}
+			if (!marked) {
+				JarEntry entry = new JarEntry(Utils.MARK_FILE_NAME);
+				outputJar.putNextEntry(entry);
+				Utils.storeProperties(inf, outputJar);
+				outputJar.closeEntry();
+			}
+		} finally {
+			Utils.close(outputJar);
+			Utils.close(jar);
+			Utils.close(in);
+		}
+	}
+
+	private String recursionEffect(String entryName) {
+		String result = null;
+		for (Iterator iter = steps.iterator(); iter.hasNext();) {
+			IProcessStep step = (IProcessStep) iter.next();
+
+			result = step.recursionEffect(entryName);
+			if (result != null)
+				entryName = result;
+		}
+		return result;
+	}
+
+	private void extractEntries(JarFile jar, File tempDir, Map data, Properties inf) throws IOException {
+		if(inf != null ) {
+			//skip if excluding children
+			if(inf.containsKey(Utils.MARK_EXCLUDE_CHILDREN)){
+				String excludeChildren = inf.getProperty(Utils.MARK_EXCLUDE_CHILDREN);
+				if( Boolean.valueOf(excludeChildren).booleanValue() )
+					if(verbose){
+						for(int i = 0; i <= depth; i++)
+							System.out.print("  "); //$NON-NLS-1$
+						System.out.println("Children of " + jar.getName() + "are excluded from processing.");
+					}
+					return;
+			}
+		}
+		
+		Enumeration entries = jar.entries();
+		if (entries.hasMoreElements()) {
+			for (JarEntry entry = (JarEntry) entries.nextElement(); entry != null; entry = entries.hasMoreElements() ? (JarEntry) entries.nextElement() : null) {
+				String name = entry.getName();
+				String newName = recursionEffect(name);
+				if (newName != null) {
+					if(verbose){
+						for(int i = 0; i <= depth; i++)
+							System.out.print("  "); //$NON-NLS-1$
+						System.out.println("Processing nested file: " + name); //$NON-NLS-1$
+					}
+					//extract entry to temp directory
+					File extracted = new File(tempDir, name);
+					File parentDir = extracted.getParentFile();
+					if (!parentDir.exists())
+						parentDir.mkdirs();
+
+					InputStream in = null;
+					OutputStream out = null;
+					try {
+						in = jar.getInputStream(entry);
+						out = new BufferedOutputStream(new FileOutputStream(extracted));
+						Utils.transferStreams(in, out, true); //this will close both streams
+					} finally {
+						Utils.close(in);
+						Utils.close(out);
+					}
+					extracted.setLastModified(entry.getTime());
+
+					//recurse
+					containingInfs.addFirst(inf);
+					String dir = getWorkingDirectory();
+					setWorkingDirectory(parentDir.getCanonicalPath());
+					File result = processJar(extracted);
+
+					newName = name.substring(0, name.length() - extracted.getName().length()) + result.getName();
+					data.put(name, newName);
+
+					setWorkingDirectory(dir);
+					containingInfs.removeFirst();
+
+					//delete the extracted item leaving the recursion result
+					if (!name.equals(newName))
+						extracted.delete();
+				}
+			}
+		}
+	}
+
+	private File preProcess(File input, File tempDir) {
+		File result = null;
+		for (Iterator iter = steps.iterator(); iter.hasNext();) {
+			IProcessStep step = (IProcessStep) iter.next();
+			result = step.preProcess(input, tempDir, containingInfs);
+			if (result != null)
+				input = result;
+		}
+		return input;
+	}
+
+	private File postProcess(File input, File tempDir) {
+		File result = null;
+		for (Iterator iter = steps.iterator(); iter.hasNext();) {
+			IProcessStep step = (IProcessStep) iter.next();
+			result = step.postProcess(input, tempDir, containingInfs);
+			if (result != null)
+				input = result;
+		}
+		return input;
+	}
+
+	private void adjustInf(File input, Properties inf) {
+		for (Iterator iter = steps.iterator(); iter.hasNext();) {
+			IProcessStep step = (IProcessStep) iter.next();
+			step.adjustInf(input, inf, containingInfs);
+		}
+	}
+
+	public File processJar(File input) throws IOException {
+		++depth;
+		long lastModified = input.lastModified();
+		File workingDir = new File(getWorkingDirectory());
+		if (!workingDir.exists())
+			workingDir.mkdirs();
+
+		boolean skip = Utils.shouldSkipJar(input, processAll, verbose);
+		if (depth == 0 && verbose) {
+			if (skip)
+				System.out.println("Skipping " + input.getPath()); //$NON-NLS-1$
+			else {
+				System.out.print("Running "); //$NON-NLS-1$ 
+				for (Iterator iter = steps.iterator(); iter.hasNext();) {
+					IProcessStep step = (IProcessStep) iter.next();
+					System.out.print(step.getStepName() + " "); //$NON-NLS-1$
+				}
+				System.out.println("on " + input.getPath()); //$NON-NLS-1$
+			}
+		}
+
+		if (skip) {
+			//This jar was not marked as conditioned, and we are only processing conditioned jars, so do nothing
+			--depth;
+			return input;
+		}
+
+		//pre
+		File workingFile = preProcess(input, workingDir);
+
+		//Extract entries from jar and recurse on them
+		File tempDir = null;
+		if (depth == 0) {
+			tempDir = new File(workingDir, "temp." + workingFile.getName()); //$NON-NLS-1$
+		} else {
+			File parent = workingDir.getParentFile();
+			tempDir = new File(parent, "temp_" + depth + '_' + workingFile.getName()); //$NON-NLS-1$
+		}
+
+		JarFile jar = new JarFile(workingFile, false);
+		Map replacements = new HashMap();
+		Properties inf = Utils.getEclipseInf(workingFile, verbose);
+		extractEntries(jar, tempDir, replacements, inf);
+
+		if (inf != null)
+			adjustInf(workingFile, inf);
+
+		//Recreate the jar with replacements. 
+		//TODO: This is not strictly necessary if we didn't change the inf file and didn't change any content
+		File tempJar = null;
+		tempJar = new File(tempDir, workingFile.getName());
+		File parent = tempJar.getParentFile();
+		if (!parent.exists())
+			parent.mkdirs();
+		JarOutputStream jarOut = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(tempJar)));
+		recreateJar(jar, jarOut, replacements, tempDir, inf);
+
+		jar.close();
+		if (tempJar != null) {
+			if (!workingFile.equals(input)) {
+				workingFile.delete();
+			}
+			workingFile = tempJar;
+		}
+
+		//post
+		File result = postProcess(workingFile, workingDir);
+		
+		//have to normalize after the post steps
+		normalize(result, workingDir);
+		
+		if (!result.equals(workingFile) && !workingFile.equals(input))
+			workingFile.delete();
+		if (!result.getParentFile().equals(workingDir)) {
+			File finalFile = new File(workingDir, result.getName());
+			if (finalFile.exists())
+				finalFile.delete();
+			result.renameTo(finalFile);
+			result = finalFile;
+		}
+
+		if (tempDir.exists())
+			Utils.clear(tempDir);
+
+		result.setLastModified(lastModified);
+		--depth;
+		return result;
+	}
+	
+	private void normalize(File input, File workingDirectory) {
+		if(input.getName().endsWith(Utils.PACKED_SUFFIX)) {
+			//not a jar
+			return;
+		}
+		try {
+			File tempJar = new File(workingDirectory, "temp_" + input.getName()); //$NON-NLS-1$
+			JarFile jar = null;
+			try {
+				jar = new JarFile(input, false);
+			} catch (JarException e) {
+				//not a jar
+				return ;
+			}
+			JarOutputStream jarOut = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(tempJar)));
+			InputStream in = null;
+			try {
+				Enumeration entries = jar.entries();
+				for (JarEntry entry = (JarEntry) entries.nextElement(); entry != null; entry = entries.hasMoreElements() ? (JarEntry) entries.nextElement() : null) {
+					JarEntry newEntry = new JarEntry(entry.getName());
+					newEntry.setTime(entry.getTime());
+					in = new BufferedInputStream(jar.getInputStream(entry));
+					jarOut.putNextEntry(newEntry);
+					Utils.transferStreams(in, jarOut, false);
+					jarOut.closeEntry();
+					in.close();
+				}
+			} finally {
+				Utils.close(jarOut);
+				Utils.close(jar);
+				Utils.close(in);
+			}
+			tempJar.setLastModified(input.lastModified());
+			input.delete();
+			tempJar.renameTo(input);
+		} catch (IOException e) {
+			if (verbose) {
+				System.out.println("Error normalizing jar " + input.getName()); //$NON-NLS-1$
+				e.printStackTrace();
+			}
+		}
+	}
+}
diff --git a/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/JarProcessorExecutor.java b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/JarProcessorExecutor.java
new file mode 100644
index 0000000..160785d
--- /dev/null
+++ b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/JarProcessorExecutor.java
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.update.internal.jarprocessor;
+
+import java.io.*;
+import java.util.Properties;
+import java.util.zip.ZipException;
+import org.eclipse.update.internal.jarprocessor.Main.Options;
+
+public class JarProcessorExecutor {
+	public void runJarProcessor(Options options) {
+		if (options.input.isFile() && options.input.getName().endsWith(".zip")) { //$NON-NLS-1$
+			ZipProcessor processor = new ZipProcessor();
+			processor.setWorkingDirectory(options.outputDir);
+			processor.setSignCommand(options.signCommand);
+			processor.setPack(options.pack);
+			processor.setRepack(options.repack || (options.pack && options.signCommand != null));
+			processor.setUnpack(options.unpack);
+			processor.setVerbose(options.verbose);
+			processor.setProcessAll(options.processAll);
+			try {
+				processor.processZip(options.input);
+			} catch (ZipException e) {
+				if (options.verbose)
+					e.printStackTrace();
+			} catch (IOException e) {
+				if (options.verbose)
+					e.printStackTrace();
+			}
+		} else {
+			JarProcessor processor = new JarProcessor();
+			JarProcessor packProcessor = null;
+
+			processor.setWorkingDirectory(options.outputDir);
+			processor.setProcessAll(options.processAll);
+			processor.setVerbose(options.verbose);
+
+			//load options file
+			Properties properties = new Properties();
+			if (options.input.isDirectory()) {
+				File packProperties = new File(options.input, "pack.properties");
+				if (packProperties.exists() && packProperties.isFile()) {
+					InputStream in = null;
+					try {
+						in = new BufferedInputStream(new FileInputStream(packProperties));
+						properties.load(in);
+					} catch (IOException e) {
+						if (options.verbose)
+							e.printStackTrace();
+					} finally {
+						Utils.close(in);
+					}
+				}
+			}
+
+			if (options.unpack)
+				addUnpackStep(processor, properties, options);
+
+			if (options.repack || (options.pack && options.signCommand != null))
+				addPackUnpackStep(processor, properties, options);
+
+			if (options.signCommand != null)
+				addSignStep(processor, properties, options);
+
+			if (options.pack) {
+				packProcessor = new JarProcessor();
+				packProcessor.setWorkingDirectory(options.outputDir);
+				packProcessor.setProcessAll(options.processAll);
+				packProcessor.setVerbose(options.verbose);
+				addPackStep(packProcessor, properties, options);
+			}
+
+			try {
+				process(options.input, options.unpack ? Utils.PACK_GZ_FILTER : Utils.JAR_FILTER, options.verbose, processor, packProcessor);
+			} catch (FileNotFoundException e) {
+				if (options.verbose)
+					e.printStackTrace();
+			}
+		}
+	}
+
+	protected void process(File input, FileFilter filter, boolean verbose, JarProcessor processor, JarProcessor packProcessor) throws FileNotFoundException {
+		if (!input.exists())
+			throw new FileNotFoundException();
+
+		File[] files = null;
+		if (input.isDirectory()) {
+			files = input.listFiles();
+		} else if (filter.accept(input)) {
+			files = new File[] {input};
+		}
+		for (int i = 0; i < files.length; i++) {
+			if (files[i].isDirectory()) {
+				String dir = processor.getWorkingDirectory();
+				processor.setWorkingDirectory(dir + "/" + files[i].getName()); //$NON-NLS-1$
+				if (packProcessor != null)
+					packProcessor.setWorkingDirectory(dir + "/" + files[i].getName());
+				process(files[i], filter, verbose, processor, packProcessor);
+				processor.setWorkingDirectory(dir);
+				if (packProcessor != null)
+					packProcessor.setWorkingDirectory(dir);
+			} else if (filter.accept(files[i])) {
+				try {
+					File result = processor.processJar(files[i]);
+					if (packProcessor != null && result != null && result.exists()) {
+						packProcessor.processJar(result);
+					}
+				} catch (IOException e) {
+					if (verbose)
+						e.printStackTrace();
+				}
+			}
+		}
+	}
+
+	public void addPackUnpackStep(JarProcessor processor, Properties properties, Options options) {
+		processor.addProcessStep(new PackUnpackStep(properties, options.verbose));
+	}
+
+	public void addSignStep(JarProcessor processor, Properties properties, Options options) {
+		processor.addProcessStep(new SignCommandStep(properties, options.signCommand, options.verbose));
+	}
+
+	public void addPackStep(JarProcessor processor, Properties properties, Options options) {
+		processor.addProcessStep(new PackStep(properties, options.verbose));
+	}
+
+	public void addUnpackStep(JarProcessor processor, Properties properties, Options options) {
+		processor.addProcessStep(new UnpackStep(properties, options.verbose));
+	}
+}
diff --git a/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/Main.java b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/Main.java
new file mode 100644
index 0000000..43d8e0a
--- /dev/null
+++ b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/Main.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2006-2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.internal.jarprocessor;
+
+import java.io.File;
+
+public class Main {
+
+	public static class Options {
+		public String outputDir = "."; //$NON-NLS-1$
+		public String signCommand = null;
+		public boolean pack = false;
+		public boolean repack = false;
+		public boolean unpack = false;
+		public boolean verbose = false;
+		public boolean processAll = false;
+		public File input = null;
+	}
+
+	private static void printUsage() {
+		System.out.println("[-option ...]... input"); //$NON-NLS-1$
+		System.out.println("The following options are supported:"); //$NON-NLS-1$
+		System.out.println("-processAll     process all jars, regardless of whether they were previously normalized"); //$NON-NLS-1$
+		System.out.println("                By default only normalized jars will be processed."); //$NON-NLS-1$
+		System.out.println("-repack         normalize jars "); //$NON-NLS-1$
+		System.out.println("-sign <command> sign jars using <command>"); //$NON-NLS-1$
+		System.out.println("-pack           pack the jars.  pack and repack are redundant unless"); //$NON-NLS-1$
+		System.out.println("                sign is also specified."); //$NON-NLS-1$
+		System.out.println("-unpack         unpack pack.gz files. Unpack is mutually exclusive"); //$NON-NLS-1$
+		System.out.println("                with repack, sign and pack."); //$NON-NLS-1$
+		System.out.println();
+		System.out.println("-outputDir <dir>  the output directory"); //$NON-NLS-1$
+		System.out.println("-verbose        verbose mode "); //$NON-NLS-1$
+	}
+
+	public static Options processArguments(String[] args) {
+		if (args.length == 0) {
+			printUsage();
+			return null;
+		}
+
+		Options options = new Options();
+		int i = 0;
+		for (; i < args.length - 1; i++) {
+			if (args[i].equals("-pack")) {//$NON-NLS-1$
+				options.pack = true;
+			} else if (args[i].equals("-unpack")) { //$NON-NLS-1$
+				options.unpack = true;
+			} else if (args[i].equals("-sign") && i < args.length - 2) { //$NON-NLS-1$
+				if (args[i + 1].startsWith("-")) { //$NON-NLS-1$
+					printUsage();
+					return null;
+				}
+				options.signCommand = args[++i];
+			} else if (args[i].equals("-repack")) { //$NON-NLS-1$
+				options.repack = true;
+			} else if (args[i].equals("-outputDir") && i < args.length - 2) { //$NON-NLS-1$
+				if (args[i + 1].startsWith("-")) { //$NON-NLS-1$
+					printUsage();
+					return null;
+				}
+				options.outputDir = args[++i];
+			} else if (args[i].equals("-verbose")) { //$NON-NLS-1$
+				options.verbose = true;
+			}  else if (args[i].equals("-processAll")) { //$NON-NLS-1$
+				options.processAll = true;
+			} 
+		}
+
+		options.input = new File(args[i]);
+
+		String problemMessage = null;
+		String inputName = options.input.getName();
+		if (options.unpack) {
+			if (!JarProcessor.canPerformUnpack()) {
+				problemMessage = "The unpack200 command cannot be found."; //$NON-NLS-1$
+			} else 	if (options.input.isFile() && !inputName.endsWith(".zip") && !inputName.endsWith(".pack.gz")) { //$NON-NLS-1$ //$NON-NLS-2$
+				problemMessage = "Input file is not a pack.gz file."; //$NON-NLS-1$
+			} else 	if (options.pack || options.repack || options.signCommand != null) {
+				problemMessage = "Pack, repack or sign cannot be specified with unpack."; //$NON-NLS-1$
+			}
+		} else {
+			if (options.input.isFile() && !inputName.endsWith(".zip") && !inputName.endsWith(".jar")) { //$NON-NLS-1$ //$NON-NLS-2$
+				problemMessage = "Input file is not a jar file."; //$NON-NLS-1$
+			} else	if ((options.pack || options.repack) && !JarProcessor.canPerformPack()) {
+				problemMessage = "The pack200 command can not be found."; //$NON-NLS-1$
+			}
+		}
+		if(problemMessage != null){
+			System.out.println(problemMessage);
+			System.out.println();
+			printUsage();
+			return null;
+		}
+
+		return options;
+	}
+	
+	/**
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		Options options = processArguments(args);
+		if (options == null)
+			return;
+		new JarProcessorExecutor().runJarProcessor(options);
+	}
+
+}
diff --git a/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/PackStep.java b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/PackStep.java
new file mode 100644
index 0000000..4afd638
--- /dev/null
+++ b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/PackStep.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.internal.jarprocessor;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+
+public class PackStep extends CommandStep {
+
+	protected static String packCommand = null;
+	private static Boolean canPack = null;
+
+	private Set exclusions = Collections.EMPTY_SET;
+
+	public static boolean canPack() {
+		if (canPack != null)
+			return canPack.booleanValue();
+
+		String[] locations = Utils.getPack200Commands("pack200"); //$NON-NLS-1$
+		if (locations == null) {
+			canPack = Boolean.FALSE;
+			packCommand = null;
+			return false;
+		}
+
+		int result;
+		for (int i = 0; i < locations.length; i++) {
+			if (locations[i] == null)
+				continue;
+			result = execute(new String[] {locations[i], "-V"}); //$NON-NLS-1$
+			if (result == 0) {
+				packCommand = locations[i];
+				canPack = Boolean.TRUE;
+				return true;
+			}
+		}
+
+		canPack = Boolean.FALSE;
+		return false;
+	}
+
+	public PackStep(Properties options) {
+		super(options, null, null, false);
+		exclusions = Utils.getPackExclusions(options);
+	}
+
+	public PackStep(Properties options, boolean verbose) {
+		super(options, null, null, verbose);
+		exclusions = Utils.getPackExclusions(options);
+	}
+
+	public String recursionEffect(String entryName) {
+		if (canPack() && entryName.endsWith(".jar") && !exclusions.contains(entryName)) { //$NON-NLS-1$
+			return entryName + Utils.PACKED_SUFFIX;
+		}
+		return null;
+	}
+
+	public File preProcess(File input, File workingDirectory, List containers) {
+		return null;
+	}
+
+	public File postProcess(File input, File workingDirectory, List containers) {
+		if (canPack() && packCommand != null) {
+			Properties inf = Utils.getEclipseInf(input, verbose);
+			if (!shouldPack(input, containers, inf))
+				return null;
+			File outputFile = new File(workingDirectory, input.getName() + Utils.PACKED_SUFFIX);
+			try {
+				String[] cmd = getCommand(input, outputFile, inf, containers);
+				int result = execute(cmd, verbose);
+				if (result != 0 && verbose)
+					System.out.println("Error: " + result + " was returned from command: " + Utils.concat(cmd)); //$NON-NLS-1$ //$NON-NLS-2$
+			} catch (IOException e) {
+				if (verbose)
+					e.printStackTrace();
+				return null;
+			}
+			return outputFile;
+		}
+		return null;
+	}
+
+	protected boolean shouldPack(File input, List containers, Properties inf) {
+		//1: exclude by containers
+		// innermost jar is first on the list, it can override outer jars
+		for (Iterator iterator = containers.iterator(); iterator.hasNext();) {
+			Properties container = (Properties) iterator.next();
+			if (container.containsKey(Utils.MARK_EXCLUDE_CHILDREN_PACK)) {
+				if (Boolean.valueOf(container.getProperty(Utils.MARK_EXCLUDE_CHILDREN_PACK)).booleanValue()) {
+					if (verbose)
+						System.out.println(input.getName() + " is excluded from pack200 by its containers.");
+					return false;
+				}
+				break;
+			}
+		}
+
+		//2: excluded by self
+		if (inf != null && inf.containsKey(Utils.MARK_EXCLUDE_PACK) && Boolean.valueOf(inf.getProperty(Utils.MARK_EXCLUDE_PACK)).booleanValue()) {
+			if (verbose)
+				System.out.println("Excluding " + input.getName() + " from " + getStepName()); //$NON-NLS-1$ //$NON-NLS-2$
+			return false;
+		}
+
+		return true;
+	}
+
+	protected String[] getCommand(File input, File outputFile, Properties inf, List containers) throws IOException {
+		String[] cmd = null;
+		String arguments = getArguments(input, inf, containers);
+		if (arguments != null && arguments.length() > 0) {
+			String[] args = Utils.toStringArray(arguments, ","); //$NON-NLS-1$
+			cmd = new String[3 + args.length];
+			cmd[0] = packCommand;
+			System.arraycopy(args, 0, cmd, 1, args.length);
+			cmd[cmd.length - 2] = outputFile.getCanonicalPath();
+			cmd[cmd.length - 1] = input.getCanonicalPath();
+		} else {
+			cmd = new String[] {packCommand, outputFile.getCanonicalPath(), input.getCanonicalPath()};
+		}
+		return cmd;
+	}
+
+	protected String getArguments(File input, Properties inf, List containers) {	
+		//1: Explicitly marked in our .inf file
+		if (inf != null && inf.containsKey(Utils.PACK_ARGS)) {
+			return  inf.getProperty(Utils.PACK_ARGS);
+		}
+
+		//2: Defaults set in one of our containing jars
+		for (Iterator iterator = containers.iterator(); iterator.hasNext();) {
+			Properties container = (Properties) iterator.next();
+			if (container.containsKey(Utils.DEFAULT_PACK_ARGS)) {
+				return container.getProperty(Utils.DEFAULT_PACK_ARGS);
+			}
+		}
+
+		//3: Set by name in outside pack.properties file
+		Properties options = getOptions();
+		String argsKey = input.getName() + Utils.PACK_ARGS_SUFFIX;
+		if (options.containsKey(argsKey)) {
+			return options.getProperty(argsKey);
+		}
+
+		//4: Set by default in outside pack.properties file
+		if (options.containsKey(Utils.DEFAULT_PACK_ARGS)) {
+			return options.getProperty(Utils.DEFAULT_PACK_ARGS);
+		}
+
+		return ""; //$NON-NLS-1$
+	}
+
+	public String getStepName() {
+		return "Pack"; //$NON-NLS-1$
+	}
+
+	public void adjustInf(File input, Properties inf, List containers) {
+		if (input == null || inf == null)
+			return;
+
+		//don't be verbose to check if we should mark the inf
+		boolean v = verbose;
+		verbose = false;
+		if (!shouldPack(input, containers, inf)) {
+			verbose = v;
+			return;
+		}
+		verbose = v;
+
+		//mark as conditioned if not previously marked.  A signed jar is assumed to be previously conditioned.
+		if (inf.getProperty(Utils.MARK_PROPERTY) == null) {
+			inf.put(Utils.MARK_PROPERTY, "true"); //$NON-NLS-1$
+	
+			//record arguments used
+			String arguments = inf.getProperty(Utils.PACK_ARGS);
+			if (arguments == null) {
+				arguments = getArguments(input, inf, containers);
+				if (arguments != null && arguments.length() > 0)
+					inf.put(Utils.PACK_ARGS, arguments);
+			}
+		}
+	}
+}
diff --git a/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/PackUnpackStep.java b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/PackUnpackStep.java
new file mode 100644
index 0000000..019812b
--- /dev/null
+++ b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/PackUnpackStep.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.internal.jarprocessor;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+
+/**
+ * @author aniefer@ca.ibm.com
+ *
+ */
+public class PackUnpackStep extends PackStep {
+	private Set exclusions = null;
+
+	public PackUnpackStep(Properties options) {
+		super(options);
+		exclusions = Utils.getPackExclusions(options);
+	}
+
+	public PackUnpackStep(Properties options, boolean verbose) {
+		super(options, verbose);
+		exclusions = Utils.getPackExclusions(options);
+	}
+
+	public String recursionEffect(String entryName) {
+		if (canPack() && entryName.endsWith(".jar") && !exclusions.contains(entryName)) { //$NON-NLS-1$
+			return entryName;
+		}
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.update.internal.jarprocessor.PackStep#postProcess(java.io.File, java.io.File, java.util.LinkedList)
+	 */
+	public File postProcess(File input, File workingDirectory, List containers) {
+		if (canPack() && packCommand != null && input != null) {
+			Properties inf = Utils.getEclipseInf(input, verbose);
+			if (!shouldPack(input, containers, inf))
+				return null;
+			File tempFile = new File(workingDirectory, "temp_" + input.getName()); //$NON-NLS-1$
+			try {
+				String[] tmp = getCommand(input, tempFile, inf, containers);
+				String[] cmd = new String[tmp.length + 1];
+				cmd[0] = tmp[0];
+				cmd[1] = "-r"; //$NON-NLS-1$
+				System.arraycopy(tmp, 1, cmd, 2, tmp.length - 1);
+
+				int result = execute(cmd, verbose);
+				if (result == 0 && tempFile.exists()) {
+					File finalFile = new File(workingDirectory, input.getName());
+					if (finalFile.exists())
+						finalFile.delete();
+					tempFile.renameTo(finalFile);
+					return finalFile;
+				} else if (verbose) {
+					System.out.println("Error: " + result + " was returned from command: " + Utils.concat(cmd)); //$NON-NLS-1$ //$NON-NLS-2$
+				}
+			} catch (IOException e) {
+				if (verbose)
+					e.printStackTrace();
+				return null;
+			}
+		}
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.update.internal.jarprocessor.PackStep#preProcess(java.io.File, java.io.File, java.util.LinkedList)
+	 */
+	public File preProcess(File input, File workingDirectory, List containers) {
+		return null;
+	}
+
+	public String getStepName() {
+		return "Repack"; //$NON-NLS-1$
+	}
+}
diff --git a/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/SignCommandStep.java b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/SignCommandStep.java
new file mode 100644
index 0000000..282ed75
--- /dev/null
+++ b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/SignCommandStep.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2006-2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.internal.jarprocessor;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+
+public class SignCommandStep extends CommandStep {
+	private Set exclusions = null;
+
+	public SignCommandStep(Properties options, String command) {
+		super(options, command, ".jar", false); //$NON-NLS-1$
+		exclusions = Utils.getSignExclusions(options);
+	}
+
+	public SignCommandStep(Properties options, String command, boolean verbose) {
+		super(options, command, ".jar", verbose); //$NON-NLS-1$
+		exclusions = Utils.getSignExclusions(options);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.update.jarprocessor.IProcessStep#recursionEffect(java.lang.String)
+	 */
+	public String recursionEffect(String entryName) {
+		if (entryName.endsWith(extension) && !exclusions.contains(entryName))
+			return entryName;
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.update.jarprocessor.IProcessStep#preProcess(java.io.File, java.io.File)
+	 */
+	public File preProcess(File input, File workingDirectory, List containers) {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.update.jarprocessor.IProcessStep#postProcess(java.io.File, java.io.File)
+	 */
+	public File postProcess(File input, File workingDirectory, List containers) {
+		if (command != null && input != null && shouldSign(input, containers)) {
+			try {
+				String[] cmd = new String[] {command, input.getCanonicalPath()};
+				int result = execute(cmd, verbose);
+				if (result == 0) {
+					return input;
+				} else if (verbose) {
+					System.out.println("Error: " + result + " was returned from command: " + Utils.concat(cmd)); //$NON-NLS-1$ //$NON-NLS-2$
+				}
+			} catch (IOException e) {
+				if (verbose) {
+					e.printStackTrace();
+				}
+			}
+		}
+		return null;
+	}
+
+	public boolean shouldSign(File input, List containers) {
+		Properties inf = null;
+
+		//1: Are we excluded from signing by our parents?
+		//innermost jar is first on the list, it overrides outer jars
+		for (Iterator iterator = containers.iterator(); iterator.hasNext();) {
+			inf = (Properties) iterator.next();
+			if (inf.containsKey(Utils.MARK_EXCLUDE_CHILDREN_SIGN)){
+				if(Boolean.valueOf(inf.getProperty(Utils.MARK_EXCLUDE_CHILDREN_SIGN)).booleanValue()) {
+					if (verbose)
+						System.out.println(input.getName() + "is excluded from signing by its containers."); //$NON-NLS-1$ //$NON-NLS-2$
+					return false;
+				}
+				break;
+			}
+		}
+
+		//2: Is this jar itself marked as exclude?
+		inf = Utils.getEclipseInf(input, verbose);
+		if (inf != null && inf.containsKey(Utils.MARK_EXCLUDE_SIGN) && Boolean.valueOf(inf.getProperty(Utils.MARK_EXCLUDE_SIGN)).booleanValue()) {
+			if (verbose)
+				System.out.println("Excluding " + input.getName() + " from signing."); //$NON-NLS-1$ //$NON-NLS-2$
+			return false;
+		}
+		return true;
+	}
+
+	public String getStepName() {
+		return "Sign"; //$NON-NLS-1$
+	}
+}
diff --git a/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/StreamProcessor.java b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/StreamProcessor.java
new file mode 100644
index 0000000..e0b5c3a
--- /dev/null
+++ b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/StreamProcessor.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.internal.jarprocessor;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+public class StreamProcessor extends Thread {
+	public static final String STDERR = "STDERR"; //$NON-NLS-1$
+	public static final String STDOUT = "STDOUT"; //$NON-NLS-1$
+
+	private InputStream inputStream;
+	private String name;
+	private boolean verbose;
+
+	public StreamProcessor(InputStream is, String name, boolean verbose) {
+		this.inputStream = is;
+		this.name = name;
+		this.verbose = verbose;
+	}
+
+	public void run() {
+		try {
+			InputStreamReader isr = new InputStreamReader(inputStream);
+			BufferedReader br = new BufferedReader(isr);
+			while (true) {
+				String s = br.readLine();
+				if (s == null) {
+					break;
+				}
+				if (verbose) {
+					if (STDERR.equals(name))
+						System.err.println(name + ": " + s); //$NON-NLS-1$
+					else
+						System.out.println(name + ": " + s); //$NON-NLS-1$
+				}
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+}
diff --git a/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/UnpackStep.java b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/UnpackStep.java
new file mode 100644
index 0000000..1d30dd8
--- /dev/null
+++ b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/UnpackStep.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.internal.jarprocessor;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Properties;
+
+/**
+ * @author aniefer
+ *
+ */
+public class UnpackStep extends CommandStep {
+	public static final String UNPACKER_PROPERTY = "org.eclipse.update.jarprocessor.Unpacker"; //$NON-NLS-1$
+	private static Boolean canUnpack = null;
+	private static String unpackCommand = null;
+
+	public static boolean canUnpack() {
+		if (canUnpack != null)
+			return canUnpack.booleanValue();
+
+		String[] locations = Utils.getPack200Commands("unpack200"); //$NON-NLS-1$
+		if (locations == null) {
+			canUnpack = Boolean.FALSE;
+			unpackCommand = null;
+			return false;
+		}
+
+		int result;
+		for (int i = 0; i < locations.length; i++) {
+			if (locations[i] == null)
+				continue;
+			result = execute(new String[] {locations[i], "-V"}); //$NON-NLS-1$
+			if (result == 0) {
+				unpackCommand = locations[i];
+				canUnpack = Boolean.TRUE;
+				return true;
+			}
+		}
+
+		canUnpack = Boolean.FALSE;
+		return false;
+	}
+
+	public UnpackStep(Properties options) {
+		super(options, null, null, false);
+	}
+
+	public UnpackStep(Properties options, boolean verbose) {
+		super(options, null, null, verbose);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.update.jarprocessor.IProcessStep#recursionEffect(java.lang.String)
+	 */
+	public String recursionEffect(String entryName) {
+		if (canUnpack() && entryName.endsWith(Utils.PACKED_SUFFIX)) {
+			return entryName.substring(0, entryName.length() - Utils.PACKED_SUFFIX.length());
+		}
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.update.jarprocessor.IProcessStep#preProcess(java.io.File, java.io.File)
+	 */
+	public File preProcess(File input, File workingDirectory, List containers) {
+		if (canUnpack() && unpackCommand != null) {
+			String name = input.getName();
+			if (name.endsWith(Utils.PACKED_SUFFIX)) {
+				name = name.substring(0, name.length() - Utils.PACKED_SUFFIX.length());
+
+				File unpacked = new File(workingDirectory, name);
+				File parent = unpacked.getParentFile();
+				if (!parent.exists())
+					parent.mkdirs();
+				try {
+					String options = getOptions().getProperty(input.getName() + ".unpack.args"); //$NON-NLS-1$
+					String[] cmd = null;
+					if (options != null) {
+						cmd = new String[] {unpackCommand, options, input.getCanonicalPath(), unpacked.getCanonicalPath()};
+					} else {
+						cmd = new String[] {unpackCommand, input.getCanonicalPath(), unpacked.getCanonicalPath()};
+					}
+					int result = execute(cmd, verbose);
+					if (result != 0 && verbose)
+						System.out.println("Error: " + result + " was returned from command: " + Utils.concat(cmd)); //$NON-NLS-1$ //$NON-NLS-2$
+				} catch (IOException e) {
+					if (verbose)
+						e.printStackTrace();
+					return null;
+				}
+				return unpacked;
+			}
+		}
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.update.jarprocessor.IProcessStep#postProcess(java.io.File, java.io.File)
+	 */
+	public File postProcess(File input, File workingDirectory, List containers) {
+		return null;
+	}
+
+	public String getStepName() {
+		return "Unpack"; //$NON-NLS-1$
+	}
+}
diff --git a/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/Utils.java b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/Utils.java
new file mode 100644
index 0000000..0f4ebbf
--- /dev/null
+++ b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/Utils.java
@@ -0,0 +1,326 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.internal.jarprocessor;
+
+import java.io.*;
+import java.util.*;
+import java.util.jar.*;
+import java.util.zip.ZipException;
+
+/**
+ * @author aniefer@ca.ibm.com
+ *
+ */
+public class Utils {
+	public static final String MARK_FILE_NAME = "META-INF/eclipse.inf"; //$NON-NLS-1$
+	
+	/*
+	 * Properties found in outer pack.properties file
+	 */
+	//comma separated list of jars to exclude from sigining
+	public static final String SIGN_EXCLUDES = "sign.excludes"; //$NON-NLS-1$
+	//comma separated list of jars to exlclude from packing
+	public static final String PACK_EXCLUDES = "pack.excludes"; //$NON-NLS-1$
+	//Suffix used when specifying arguments to use when running pack200 on a jar
+	public static final String PACK_ARGS_SUFFIX = ".pack.args"; //$NON-NLS-1$
+	
+	/*
+	 * Properties found in both pack.properties and eclipse.inf
+	 */
+	//	Default arguments to use when running pack200.
+	// Affects all jars when specified in pack.properties, affects children when specified in eclipse.inf
+	public static final String DEFAULT_PACK_ARGS = "pack200.default.args"; //$NON-NLS-1$
+	
+	/*
+	 * Properties found in eclipse.inf file
+	 */
+	//This jar has been conditioned with pack200
+	public static final String MARK_PROPERTY = "pack200.conditioned"; //$NON-NLS-1$
+	//Exclude this jar from processing
+	public static final String MARK_EXCLUDE = "jarprocessor.exclude"; //$NON-NLS-1$
+	//Exclude this jar from pack200
+	public static final String MARK_EXCLUDE_PACK = "jarprocessor.exclude.pack"; //$NON-NLS-1$
+	//Exclude this jar from signing
+	public static final String MARK_EXCLUDE_SIGN = "jarprocessor.exclude.sign"; //$NON-NLS-1$
+	//Exclude this jar's children from processing
+	public static final String MARK_EXCLUDE_CHILDREN = "jarprocessor.exclude.children";
+	//Exclude this jar's children from pack200
+	public static final String MARK_EXCLUDE_CHILDREN_PACK = "jarprocessor.exclude.children.pack";
+	//Exclude this jar's children from signing
+	public static final String MARK_EXCLUDE_CHILDREN_SIGN = "jarprocessor.exclude.children.sign";
+	//Arguments used in pack200 for this jar
+	public static final String PACK_ARGS = "pack200.args"; //$NON-NLS-1$
+	
+	public static final String PACK200_PROPERTY = "org.eclipse.update.jarprocessor.pack200"; //$NON-NLS-1$
+	public static final String JRE = "@jre"; //$NON-NLS-1$
+	public static final String PATH = "@path"; //$NON-NLS-1$
+	public static final String NONE = "@none"; //$NON-NLS-1$
+
+	public static final String PACKED_SUFFIX = ".pack.gz"; //$NON-NLS-1$
+	public static final String JAR_SUFFIX = ".jar"; //$NON-NLS-1$
+
+	public static final FileFilter JAR_FILTER = new FileFilter() {
+		public boolean accept(File pathname) {
+			return pathname.isFile() && pathname.getName().endsWith(".jar"); //$NON-NLS-1$
+		}
+	};
+
+	public static final FileFilter PACK_GZ_FILTER = new FileFilter() {
+		public boolean accept(File pathname) {
+			return pathname.isFile() && pathname.getName().endsWith(PACKED_SUFFIX);
+		}
+	};
+
+	public static void close(Object stream) {
+		if (stream != null) {
+			try {
+				if (stream instanceof InputStream)
+					((InputStream) stream).close();
+				else if (stream instanceof OutputStream)
+					((OutputStream) stream).close();
+				else if (stream instanceof JarFile)
+					((JarFile) stream).close();
+			} catch (IOException e) {
+				//ignore
+			}
+		}
+	}
+
+	/**
+	 * get the set of commands to try to execute pack/unpack 
+	 * @param cmd, the command, either "pack200" or "unpack200"
+	 * @return String [] or null
+	 */
+	public static String[] getPack200Commands(String cmd) {
+		String[] locations = null;
+		String prop = System.getProperty(PACK200_PROPERTY);
+		String javaHome = System.getProperty("java.home"); //$NON-NLS-1$
+		if (NONE.equals(prop)) {
+			return null;
+		} else if (JRE.equals(prop)) {
+			locations = new String[] {javaHome + "/bin/" + cmd}; //$NON-NLS-1$
+		} else if (PATH.equals(prop)) {
+			locations = new String[] {cmd};
+		} else if (prop == null) {
+			locations = new String[] {javaHome + "/bin/" + cmd, cmd}; //$NON-NLS-1$ 
+		} else {
+			locations = new String[] {prop + "/" + cmd}; //$NON-NLS-1$
+		}
+		return locations;
+	}
+
+	/**
+	 * Transfers all available bytes from the given input stream to the given
+	 * output stream. Closes both streams if close == true, regardless of failure. 
+	 * Flushes the destination stream if close == false
+	 * 
+	 * @param source
+	 * @param destination
+	 * @param close 
+	 * @throws IOException
+	 */
+	public static void transferStreams(InputStream source, OutputStream destination, boolean close) throws IOException {
+		source = new BufferedInputStream(source);
+		destination = new BufferedOutputStream(destination);
+		try {
+			byte[] buffer = new byte[8192];
+			while (true) {
+				int bytesRead = -1;
+				if ((bytesRead = source.read(buffer)) == -1)
+					break;
+				destination.write(buffer, 0, bytesRead);
+			}
+		} finally {
+			if (close) {
+				close(source);
+				close(destination);
+			} else {
+				destination.flush();
+			}
+		}
+	}
+
+	/**
+	 * Deletes all the files and directories from the given root down (inclusive).
+	 * Returns false if we could not delete some file or an exception occurred
+	 * at any point in the deletion.
+	 * Even if an exception occurs, a best effort is made to continue deleting.
+	 */
+	public static boolean clear(java.io.File root) {
+		boolean result = clearChildren(root);
+		try {
+			if (root.exists())
+				result &= root.delete();
+		} catch (Exception e) {
+			result = false;
+		}
+		return result;
+	}
+
+	/**
+	 * Deletes all the files and directories from the given root down, except for 
+	 * the root itself.
+	 * Returns false if we could not delete some file or an exception occurred
+	 * at any point in the deletion.
+	 * Even if an exception occurs, a best effort is made to continue deleting.
+	 */
+	public static boolean clearChildren(java.io.File root) {
+		boolean result = true;
+		if (root.isDirectory()) {
+			String[] list = root.list();
+			// for some unknown reason, list() can return null.  
+			// Just skip the children If it does.
+			if (list != null)
+				for (int i = 0; i < list.length; i++)
+					result &= clear(new java.io.File(root, list[i]));
+		}
+		return result;
+	}
+
+	public static Set getPackExclusions(Properties properties) {
+		if (properties == null)
+			return Collections.EMPTY_SET;
+
+		String packExcludes = properties.getProperty(PACK_EXCLUDES);
+		if (packExcludes != null) {
+			String[] excludes = toStringArray(packExcludes, ","); //$NON-NLS-1$
+			Set packExclusions = new HashSet();
+			for (int i = 0; i < excludes.length; i++) {
+				packExclusions.add(excludes[i]);
+			}
+			return packExclusions;
+		}
+		return Collections.EMPTY_SET;
+	}
+
+	public static Set getSignExclusions(Properties properties) {
+		if (properties == null)
+			return Collections.EMPTY_SET;
+		String signExcludes = properties.getProperty(SIGN_EXCLUDES);
+		if (signExcludes != null) {
+			String[] excludes = toStringArray(signExcludes, ","); //$NON-NLS-1$
+			Set signExclusions = new HashSet();
+			for (int i = 0; i < excludes.length; i++) {
+				signExclusions.add(excludes[i]);
+			}
+			return signExclusions;
+		}
+		return Collections.EMPTY_SET;
+	}
+
+	public static String concat(String[] array) {
+		StringBuffer buffer = new StringBuffer();
+		for (int i = 0; i < array.length; i++) {
+			if (i > 0)
+				buffer.append(' ');
+			buffer.append(array[i]);
+		}
+		return buffer.toString();
+	}
+
+	public static String[] toStringArray(String input, String separator) {
+		StringTokenizer tokenizer = new StringTokenizer(input, separator);
+		int count = tokenizer.countTokens();
+		String[] result = new String[count];
+		for (int i = 0; i < count; i++) {
+			result[i] = tokenizer.nextToken().trim();
+		}
+		return result;
+	}
+
+	/**
+	 * Get the properties from the eclipse.inf file from the given jar.  If the file is not a jar, null is returned.
+	 * If the file is a jar, but does not contain an eclipse.inf file, an empty Properties object is returned.
+	 * @param jarFile
+	 * @return The eclipse.inf properties for the given jar file
+	 */
+	public static Properties getEclipseInf(File jarFile, boolean verbose) {
+		if (jarFile == null || !jarFile.exists()) {
+			if (verbose)
+				System.out.println("Failed to obtain eclipse.inf due to missing jar file: " + jarFile);
+			return null;
+		}
+		JarFile jar = null;
+		try {
+			jar = new JarFile(jarFile, false);
+		} catch (ZipException e) {
+			//not a jar, don't bother logging this.
+			return null;
+		} catch (IOException e) {
+			if (verbose) {
+				System.out.println("Failed to obtain eclipse.inf due to IOException: " + jarFile);
+				e.printStackTrace();
+			}
+			return null;
+		}
+		try {
+			JarEntry mark = jar.getJarEntry(MARK_FILE_NAME);
+			if (mark != null) {
+				InputStream in = jar.getInputStream(mark);
+				Properties props = new Properties();
+				props.load(in);
+				in.close();
+				return props;
+			}
+			return new Properties();
+		} catch (IOException e) {
+			if (verbose) {
+				System.out.println("Failed to obtain eclipse.inf due to IOException: " + jarFile);
+				e.printStackTrace();
+			}
+			return null;
+		} finally {
+			close(jar);
+		}
+	}
+
+	public static boolean shouldSkipJar(File input, boolean processAll, boolean verbose) {
+		Properties inf = getEclipseInf(input, verbose);
+		if (inf == null) {
+			//not a jar, could be a pack.gz
+			return false;
+		}
+		String exclude = inf.getProperty(MARK_EXCLUDE);
+
+		//was marked as exclude, we should skip
+		if (exclude != null && Boolean.valueOf(exclude).booleanValue())
+			return true;
+
+		//process all was set, don't skip
+		if (processAll)
+			return false;
+
+		//otherwise, we skip if not marked marked
+		String marked = inf.getProperty(MARK_PROPERTY);
+		return !Boolean.valueOf(marked).booleanValue();
+	}
+
+	/**
+	 * Stores the given properties in the output stream.  We store the properties 
+	 * in sorted order so that the signing hash doesn't change if the properties didn't change. 
+	 * @param props
+	 * @param stream
+	 */
+	public static void storeProperties(Properties props, OutputStream stream) {
+		PrintStream printStream = new PrintStream(stream);
+		printStream.print("#Processed using Jarprocessor\n"); //$NON-NLS-1$
+		SortedMap sorted = new TreeMap(props);
+		for (Iterator iter = sorted.keySet().iterator(); iter.hasNext();) {
+			String key = (String) iter.next();
+			printStream.print(key);
+			printStream.print(" = "); //$NON-NLS-1$
+			printStream.print(sorted.get(key));
+			printStream.print("\n");
+
+		}
+		printStream.flush();
+	}
+}
diff --git a/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/ZipProcessor.java b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/ZipProcessor.java
new file mode 100644
index 0000000..118b667
--- /dev/null
+++ b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/ZipProcessor.java
@@ -0,0 +1,243 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.internal.jarprocessor;
+
+import java.io.*;
+import java.util.*;
+import java.util.zip.*;
+
+/**
+ * @author aniefer@ca.ibm.com
+ *
+ */
+public class ZipProcessor {
+
+	private IProcessStep signStep = null;
+	private IProcessStep packStep = null;
+	private IProcessStep packUnpackStep = null;
+	private IProcessStep unpackStep = null;
+
+	private String workingDirectory = null;
+	private Properties properties = null;
+	private Set packExclusions = null;
+	private Set signExclusions = null;
+	private String command = null;
+	private boolean packing = false;
+	private boolean signing = false;
+	private boolean repacking = false;
+	private boolean unpacking = false;
+	private boolean verbose = false;
+	private boolean processAll = false;
+
+	public void setWorkingDirectory(String dir) {
+		workingDirectory = dir;
+	}
+
+	public String getWorkingDirectory() {
+		if (workingDirectory == null)
+			workingDirectory = "."; //$NON-NLS-1$
+		return workingDirectory;
+	}
+
+	public void setSignCommand(String command) {
+		this.command = command;
+		this.signing = (command != null);
+	}
+
+	public void setPack(boolean pack) {
+		this.packing = pack;
+	}
+
+	public void setRepack(boolean repack) {
+		this.repacking = repack;
+	}
+
+	public void setUnpack(boolean unpack) {
+		this.unpacking = unpack;
+	}
+
+	public void setVerbose(boolean verbose) {
+		this.verbose = verbose;
+	}
+
+	public void setProcessAll(boolean all) {
+		this.processAll = all;
+	}
+
+	public void processZip(File zipFile) throws ZipException, IOException {
+		if (verbose)
+			System.out.println("Processing " + zipFile.getPath()); //$NON-NLS-1$
+		ZipFile zip = new ZipFile(zipFile);
+		initialize(zip);
+
+		String extension = unpacking ? "pack.gz" : ".jar"; //$NON-NLS-1$ //$NON-NLS-2$
+		File tempDir = new File(getWorkingDirectory(), "temp_" + zipFile.getName()); //$NON-NLS-1$
+		JarProcessor processor = new JarProcessor();
+		processor.setVerbose(verbose);
+		processor.setProcessAll(processAll);
+		processor.setWorkingDirectory(tempDir.getCanonicalPath());
+		if (unpacking) {
+			processor.addProcessStep(unpackStep);
+		}
+
+		File outputFile = new File(getWorkingDirectory(), zipFile.getName() + ".temp"); //$NON-NLS-1$
+		File parent = outputFile.getParentFile();
+		if (!parent.exists())
+			parent.mkdirs();
+		ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(outputFile));
+		Enumeration entries = zip.entries();
+		if (entries.hasMoreElements()) {
+			for (ZipEntry entry = (ZipEntry) entries.nextElement(); entry != null; entry = entries.hasMoreElements() ? (ZipEntry) entries.nextElement() : null) {
+				String name = entry.getName();
+
+				InputStream entryStream = zip.getInputStream(entry);
+
+				boolean pack = packing && !packExclusions.contains(name);
+				boolean sign = signing && !signExclusions.contains(name);
+				boolean repack = repacking && !packExclusions.contains(name);
+
+				File extractedFile = null;
+
+				if (entry.getName().endsWith(extension) && (pack || sign || repack || unpacking)) {
+					extractedFile = new File(tempDir, name);
+					parent = extractedFile.getParentFile();
+					if (!parent.exists())
+						parent.mkdirs();
+					if (verbose)
+						System.out.println("Extracting " + entry.getName()); //$NON-NLS-1$
+					FileOutputStream extracted = new FileOutputStream(extractedFile);
+					Utils.transferStreams(entryStream, extracted, true); // this will close the stream
+					entryStream = null;
+
+					boolean skip = Utils.shouldSkipJar(extractedFile, processAll, verbose);
+					if (skip) {
+						//skipping this file 
+						entryStream = new FileInputStream(extractedFile);
+						if (verbose)
+							System.out.println(entry.getName() + " is not marked, skipping."); //$NON-NLS-1$
+					} else {
+						if (unpacking) {
+							File result = processor.processJar(extractedFile);
+							name = name.substring(0, name.length() - extractedFile.getName().length()) + result.getName();
+							extractedFile = result;
+						} else {
+							if (repack || sign) {
+								processor.clearProcessSteps();
+								if (repack)
+									processor.addProcessStep(packUnpackStep);
+								if (sign)
+									processor.addProcessStep(signStep);
+								extractedFile = processor.processJar(extractedFile);
+							}
+							if (pack) {
+								processor.clearProcessSteps();
+								processor.addProcessStep(packStep);
+								File modifiedFile = processor.processJar(extractedFile);
+								if (modifiedFile.exists()) {
+									try {
+										String newName = name.substring(0, name.length() - extractedFile.getName().length()) + modifiedFile.getName();
+										if (verbose) {
+											System.out.println("Adding " + newName + " to " + outputFile.getPath()); //$NON-NLS-1$ //$NON-NLS-2$
+											System.out.println();
+										}
+										ZipEntry zipEntry = new ZipEntry(newName);
+										entryStream = new FileInputStream(modifiedFile);
+										zipOut.putNextEntry(zipEntry);
+										Utils.transferStreams(entryStream, zipOut, false); //we want to keep zipOut open
+										entryStream.close();
+										Utils.clear(modifiedFile);
+									} catch (IOException e) {
+										Utils.close(entryStream);
+										if (verbose) {
+											e.printStackTrace();
+											System.out.println("Warning: Problem reading " + modifiedFile.getPath() + ".");
+										}
+									}
+									entryStream = null;
+								} else if (verbose) {
+									System.out.println("Warning: " + modifiedFile.getPath() + " not found.");
+								}
+							}
+						}
+						if (extractedFile.exists()) {
+							try {
+								entryStream = new FileInputStream(extractedFile);
+							} catch (IOException e) {
+								if (verbose) {
+									e.printStackTrace();
+									System.out.println("Warning: Problem reading " + extractedFile.getPath() + ".");
+								}
+							}
+						}
+
+						if (verbose && entryStream != null) {
+							System.out.println("Adding " + name + " to " + outputFile.getPath()); //$NON-NLS-1$ //$NON-NLS-2$
+						}
+					}
+				}
+				if (entryStream != null) {
+					ZipEntry newEntry = new ZipEntry(name);
+					try {
+						zipOut.putNextEntry(newEntry);
+						Utils.transferStreams(entryStream, zipOut, false);
+						zipOut.closeEntry();
+					} catch (ZipException e) {
+						if(verbose) {
+							System.out.println("Warning: " + name + " already exists in " + outputFile.getName() + ".  Skipping.");
+						}
+					}
+					entryStream.close();
+				}
+
+				if (extractedFile != null)
+					Utils.clear(extractedFile);
+				
+				if (verbose) {
+					System.out.println();
+					System.out.println("Processing " + zipFile.getPath()); //$NON-NLS-1$
+				}
+			}
+		}
+		zipOut.close();
+		zip.close();
+
+		File finalFile = new File(getWorkingDirectory(), zipFile.getName());
+		if (finalFile.exists())
+			finalFile.delete();
+		outputFile.renameTo(finalFile);
+		Utils.clear(tempDir);
+	}
+
+	private void initialize(ZipFile zip) {
+		ZipEntry entry = zip.getEntry("pack.properties"); //$NON-NLS-1$
+		properties = new Properties();
+		if (entry != null) {
+			InputStream stream = null;
+			try {
+				stream = zip.getInputStream(entry);
+				properties.load(stream);
+			} catch (IOException e) {
+				if (verbose)
+					e.printStackTrace();
+			} finally {
+				Utils.close(stream);
+			}
+		}
+
+		packExclusions = Utils.getPackExclusions(properties);
+		signExclusions = Utils.getSignExclusions(properties);
+
+		packUnpackStep = new PackUnpackStep(properties, verbose);
+		packStep = new PackStep(properties, verbose);
+		signStep = new SignCommandStep(properties, command, verbose);
+		unpackStep = new UnpackStep(properties, verbose);
+	}
+}
diff --git a/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/pack-readme.html b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/pack-readme.html
new file mode 100644
index 0000000..ef5fe5e
--- /dev/null
+++ b/update/org.eclipse.update.core/jarprocessor/org/eclipse/update/internal/jarprocessor/pack-readme.html
@@ -0,0 +1,82 @@
+<!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>Eclipse update packing tool readme</title>
+</head>
+<body>
+<h1>Eclipse update packing tool</h1>
+
+<h3>Overview</h3>
+The update packing tool processes a hierarchy of arbitrarily nested
+JARs and ZIP files.  It is a generic utility that performs a depth first traversal of 
+a nested hierarchy of ZIPs and JARs, performs various commands on
+each of the JARs in the hierarchy, and then rebuilds the same hierarchy
+of ZIPs and JARs again.  Currently its main functions are:
+<ul>
+	<li>Packing JARs using the Java 1.5 <a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/pack200.html">pack200</a>
+	 command.</li>
+	 <li>Unpacking PACK.GZs using the Java 1.5 <a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/unpack200.html">unpack200</a>
+	 command.</li>
+	 <li>Normalizing JARs for future compression by pack200. This is accomplished
+	 by running the pack200 command with the <tt>--repack</tt> command line argument.</li>
+	 <li>Signing JARs to allow for authentication of the origin of JARs. This is accomplished by
+	 running a supplied command (typically the command will just be a wrapper around
+	 the Java <a href="http://java.sun.com/j2se/1.3/docs/tooldocs/win32/jarsigner.html">jarsigner</a> tool).</li>
+</ul>
+The packing tool is used in the following contexts:
+<ul>
+	<li>During a PDE build, to prepare JARs for uploading to an Eclipse
+	update site.  In this usage, it is used to both nomalize JAR contents
+	(pack200 -repack), and sign JARs.</li>
+	<li>On an update site, to convert traditional JAR content into the 
+	compressed pack200 format.</li>
+	<li>From an Eclipse client application during update, to convert
+	compressed pack200 format content into executable JAR files.</li>
+</ul>
+<h3>Tool usage</h3>
+To run the packing tool, you need a 1.5 JRE installed. The tool is run
+by invoking Java as follows:
+
+<pre>
+	java jarprocessor.jar [options] input
+</pre>
+
+Where <tt>input</tt> is either a zip file, a directory, or a JAR (or a pack.gz file). All files ending 
+in ".jar" or ".pack.gz" in the provided zip or directory hierarchy
+will be processed. 
+The following additional command line arguments are supported:
+<ul>
+<li>-repack : Normalize the jars using pack200 <tt>--repack</tt></li>
+<li>-sign &lt;cmd&gt; : signs the jars by executing the provided command.  
+The command will be provided a single argument that will be the full path of the JAR to process.
+</li>
+<li>-pack : for each input in JAR form, produce a corresponding output
+in packed form.  For an input "a.jar", the output is a.jar.pack.gz.  
+</li>
+<li>-unpack : for each input in packed form, produce a corresponding output
+in unpacked form.  For an input "a.jar.pack.gz", the output is "a.jar". -unpack is mutually exclusive with -repack, -pack and -sign.</li>
+<li>-outputDir &lt;dir&gt; : The directory to put the tool's output into.  If the input was a zip file, then an output zip file will be
+created containg all the output files.  If the input was a directory, for each input file there is a corresponding output file in the output directory. By default the current working directory is used.  If the input is in the same
+directory as the output, the input files may be overwritten.</li>
+</ul>
+
+Additionally, when the input is a zip file, it may contain a file called
+<tt>pack.properties</tt>.  The pack.properties file supports the following values:
+<ul>
+<li>pack.excludes =  jarName[, jarName]* : A comma-delimited list of JARs that should not be packed or repacked.
+</li>
+<li>sign.excludes =  jarName[, jarName]* : A comma-delimited list of JARs that should not be signed.
+</li>
+<li>&lt;jarname&gt;.pack.args = option[, option]* : A comma-delimited list of additional arguments that should
+be passed to pack200 when packing any jar with name &lt;jarname&gt;.
+</ul>
+</p>
+<p>
+<font size=-1>
+Copyright (c) IBM Corporation and others 2006. All rights reserved. This program and the accompanying materials
+are made available under the terms of the 
+<a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License v1.0</a>.
+</font>
+</body>
+</html>
diff --git a/update/org.eclipse.update.core/plugin.properties b/update/org.eclipse.update.core/plugin.properties
new file mode 100644
index 0000000..baa2ab4
--- /dev/null
+++ b/update/org.eclipse.update.core/plugin.properties
@@ -0,0 +1,20 @@
+###############################################################################

+# Copyright (c) 2000, 2011 IBM Corporation and others.

+# All rights reserved. This program and the accompanying materials

+# are made available under the terms of the Eclipse Public License v1.0

+# which accompanies this distribution, and is available at

+# http://www.eclipse.org/legal/epl-v10.html

+#

+# Contributors:

+#     IBM Corporation - initial API and implementation

+###############################################################################

+pluginName= Install/Update Core

+providerName= Eclipse.org

+fragmentNameWin= Install/Update Core for Windows

+fragmentNameLinux= Install/Update Core for Linux

+featureTypes.name=Install/Update Concrete Feature Type Implementation Factory

+siteTypes.name=Install/Update Concrete Site Type Implementation Factory

+installHandlers.name=Install/Update Global Install Handlers

+deltaHandler.name=Install/Update Delta Handler

+productProviderName= Update Core Product Provider

+

diff --git a/update/org.eclipse.update.core/plugin.xml b/update/org.eclipse.update.core/plugin.xml
new file mode 100644
index 0000000..db0d7fd
--- /dev/null
+++ b/update/org.eclipse.update.core/plugin.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<?eclipse version="3.0"?>

+<!--

+     Copyright (c) 2005, 2010 IBM Corporation and others.

+     All rights reserved. This program and the accompanying materials

+     are made available under the terms of the Eclipse Public License v1.0

+     which accompanies this distribution, and is available at

+     http://www.eclipse.org/legal/epl-v10.html

+    

+     Contributors:

+         IBM Corporation - initial API and implementation

+ -->

+

+<plugin>

+

+   <extension-point id="featureTypes" name="%featureTypes.name" schema="schema/featureTypes.exsd"/>

+   <extension-point id="siteTypes" name="%siteTypes.name" schema="schema/siteTypes.exsd"/>

+   <extension-point id="installHandlers" name="%installHandlers.name" schema="schema/installHandlers.exsd"/>

+   <!-- The deltaHandler extension point is deprecated. Do not use it -->

+   <extension-point id="deltaHandler" name="%deltaHandler.name"/>

+

+   <extension

+         id="preferenceInitializer"

+         point="org.eclipse.core.runtime.preferences">

+      <initializer class="org.eclipse.update.internal.core.UpdatePreferencesInitializer"/>

+   </extension>

+

+   <extension

+         id="packaged"

+         point="org.eclipse.update.core.featureTypes">

+      <feature-factory

+            class="org.eclipse.update.internal.core.FeaturePackagedFactory">

+      </feature-factory>

+   </extension>

+   <extension

+         id="installed"

+         point="org.eclipse.update.core.featureTypes">

+      <feature-factory

+            class="org.eclipse.update.internal.core.FeatureExecutableFactory">

+      </feature-factory>

+   </extension>

+   <extension

+         id="http"

+         point="org.eclipse.update.core.siteTypes">

+      <site-factory

+            class="org.eclipse.update.internal.core.ExtendedSiteURLFactory">

+      </site-factory>

+   </extension>

+   <extension

+         id="file"

+         point="org.eclipse.update.core.siteTypes">

+      <site-factory

+            class="org.eclipse.update.internal.core.SiteFileFactory">

+      </site-factory>

+   </extension>

+   <extension

+         id="DefaultInstallHandler"

+         point="org.eclipse.update.core.installHandlers">

+      <install-handler

+            class="org.eclipse.update.internal.core.DefaultInstallHandler">

+      </install-handler>

+   </extension>

+   <extension

+         id="DeltaInstallHandler"

+         point="org.eclipse.update.core.installHandlers">

+      <install-handler

+            class="org.eclipse.update.internal.core.DeltaInstallHandler">

+      </install-handler>

+   </extension>

+   <extension

+         id="JarDeltaInstallHandler"

+         point="org.eclipse.update.core.installHandlers">

+      <install-handler

+            class="org.eclipse.update.internal.core.JarDeltaInstallHandler">

+      </install-handler>

+   </extension>

+   <extension

+         id="standaloneUpdate"

+         point="org.eclipse.core.runtime.applications">

+      <application>

+         <run

+               class="org.eclipse.update.standalone.StandaloneUpdateApplication">

+         </run>

+      </application>

+   </extension>

+      <extension

+         id="siteOptimizer"

+         point="org.eclipse.core.runtime.applications">

+      <application>

+         <run

+               class="org.eclipse.update.internal.provisional.SiteOptimizerApplication">

+         </run>

+      </application>

+   </extension>

+	<extension

+			id="updateCoreProductProvider"

+			name="%productProviderName"

+			point="org.eclipse.core.runtime.products">

+		<provider> 

+			<run class="org.eclipse.update.internal.core.ProductProvider"/> 

+		</provider> 

+	</extension>

+

+</plugin>

diff --git a/update/org.eclipse.update.core/pom.xml b/update/org.eclipse.update.core/pom.xml
new file mode 100644
index 0000000..dd8679e
--- /dev/null
+++ b/update/org.eclipse.update.core/pom.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (c) 2012 Eclipse Foundation.
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Distribution License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/org/documents/edl-v10.php
+ 
+  Contributors:
+     Igor Fedorenko - initial implementation
+-->
+
+<project
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+  xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>eclipse.platform</artifactId>
+    <groupId>org.eclipse.platform</groupId>
+    <version>3.8.0-SNAPSHOT</version>
+    <relativePath>../../</relativePath>
+  </parent>
+  <groupId>org.eclipse.platform</groupId>
+  <artifactId>org.eclipse.update.core</artifactId>
+  <version>3.2.600-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/update/org.eclipse.update.core/preferences.ini b/update/org.eclipse.update.core/preferences.ini
new file mode 100644
index 0000000..7936e7f
--- /dev/null
+++ b/update/org.eclipse.update.core/preferences.ini
@@ -0,0 +1,8 @@
+# The port number on which the sever listens for http requests.
+# If the port is 0 and arbitrary port is picked by the system.
+
+# Defines the policy url that contains directives for redirecting 
+# updates to different update sites.
+#updatePolicyURL=
+
+
diff --git a/update/org.eclipse.update.core/schema/featureTypes.exsd b/update/org.eclipse.update.core/schema/featureTypes.exsd
new file mode 100644
index 0000000..0517f10
--- /dev/null
+++ b/update/org.eclipse.update.core/schema/featureTypes.exsd
@@ -0,0 +1,122 @@
+<?xml version='1.0' encoding='UTF-8'?>

+<!-- Schema file written by PDE -->

+<schema targetNamespace="org.eclipse.update.core">

+<annotation>

+      <appInfo>

+         <meta.schema plugin="org.eclipse.update.core" id="featureTypes" name="Feature Type Factory"/>

+      </appInfo>

+      <documentation>

+         The platform update mechanism supports pluggable feature type
+implementations. A new feature type can be registered in order
+to support
+alternate packaging and verification schemes.
+&lt;p&gt;
+The &lt;code&gt;featureTypes&lt;/code&gt;
+extension point allows alternate feature implementations to be
+registered using a symbolic type identifier. Whenever the 
+type is referenced using this identifier, the supplied factory
+is used to create the correct concrete feature implementation.
+&lt;/p&gt;

+      </documentation>

+   </annotation>

+

+   <element name="extension">

+      <complexType>

+         <sequence>

+            <element ref="feature-factory" minOccurs="1" maxOccurs="unbounded"/>

+         </sequence>

+         <attribute name="point" type="string" use="required">

+            <annotation>

+               <documentation>

+                  must be specified as &lt;b&gt;org.eclipse.update.core.featureTypes&lt;/b&gt;

+               </documentation>

+            </annotation>

+         </attribute>

+         <attribute name="id" type="string">

+            <annotation>

+               <documentation>

+                  must be specified. Identifies the new feature type

+               </documentation>

+            </annotation>

+         </attribute>

+         <attribute name="name" type="string">

+            <annotation>

+               <documentation>

+                  optional displayable label for the new feature type

+               </documentation>

+               <appInfo>

+                  <meta.attribute translatable="true"/>

+               </appInfo>

+            </annotation>

+         </attribute>

+      </complexType>

+   </element>

+

+   <element name="feature-factory">

+      <complexType>

+         <attribute name="class" type="string" use="required">

+            <annotation>

+               <documentation>

+                  fully qualified name of the factory class for the identified feature type

+               </documentation>

+               <appInfo>

+                  <meta.attribute kind="java" basedOn="org.eclipse.update.configuration.IInstallDeltaHandler"/>

+               </appInfo>

+            </annotation>

+         </attribute>

+      </complexType>

+   </element>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="examples"/>

+      </appInfo>

+      <documentation>

+         The following is an example of new feature type registration:
+&lt;p&gt;
+&lt;pre&gt;
+   &lt;extension
+      id=&quot;custom&quot;
+      point=&quot;org.eclipse.update.core.featureTypes&quot;
+      name=&quot;Custom packaged feature&quot;&gt;
+      &lt;feature-factory
+          class=&quot;com.xyz.update.CustomFeatureFactory&quot;&gt;
+      &lt;/feature-factory&gt;
+   &lt;/extension&gt;
+&lt;/pre&gt;
+&lt;/p&gt;

+      </documentation>

+   </annotation>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="apiInfo"/>

+      </appInfo>

+      <documentation>

+         Registered factory classes must implement 
+&lt;code&gt;&lt;b&gt;org.eclipse.update.core.IFeatureFactory&lt;/b&gt;&lt;/code&gt;

+      </documentation>

+   </annotation>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="implementation"/>

+      </appInfo>

+      <documentation>

+         The platform supplies two standard implementations of feature
+types. One representing the default packaged feature type, and
+the other representing an installed feature type.

+      </documentation>

+   </annotation>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="copyright"/>

+      </appInfo>

+      <documentation>

+         Copyright (c) 2004 IBM Corporation and others.
+All rights reserved.   This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;.

+      </documentation>

+   </annotation>

+

+</schema>

diff --git a/update/org.eclipse.update.core/schema/installHandlers.exsd b/update/org.eclipse.update.core/schema/installHandlers.exsd
new file mode 100644
index 0000000..084a25f
--- /dev/null
+++ b/update/org.eclipse.update.core/schema/installHandlers.exsd
@@ -0,0 +1,113 @@
+<?xml version='1.0' encoding='UTF-8'?>

+<!-- Schema file written by PDE -->

+<schema targetNamespace="org.eclipse.update.core">

+<annotation>

+      <appInfo>

+         <meta.schema plugin="org.eclipse.update.core" id="installHandlers" name="Global Install Handlers"/>

+      </appInfo>

+      <documentation>

+         Extension point for registering global install handlers. Global
+install handlers can be referenced by features 
+(using the &lt;code&gt;&amp;lt;feature&amp;gt; &amp;lt;install-handler&amp;gt;&lt;/code&gt;
+tags) without having to include a copy of the handler code as
+part of the downloadable feature.

+      </documentation>

+   </annotation>

+

+   <element name="extension">

+      <complexType>

+         <sequence>

+            <element ref="install-handler" minOccurs="1" maxOccurs="unbounded"/>

+         </sequence>

+         <attribute name="point" type="string" use="required">

+            <annotation>

+               <documentation>

+                  must be specified as &lt;b&gt;org.eclipse.update.core.installHandlers&lt;/b&gt;

+               </documentation>

+            </annotation>

+         </attribute>

+         <attribute name="id" type="string">

+            <annotation>

+               <documentation>

+                  must be specified. Identifies the new install handler

+               </documentation>

+            </annotation>

+         </attribute>

+         <attribute name="name" type="string">

+            <annotation>

+               <documentation>

+                  optional displayable label for the new install handler

+               </documentation>

+               <appInfo>

+                  <meta.attribute translatable="true"/>

+               </appInfo>

+            </annotation>

+         </attribute>

+      </complexType>

+   </element>

+

+   <element name="install-handler">

+      <complexType>

+         <attribute name="class" type="string" use="required">

+            <annotation>

+               <documentation>

+                  fully qualified name of the handler implementation class for the identified
+install handler

+               </documentation>

+            </annotation>

+         </attribute>

+      </complexType>

+   </element>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="examples"/>

+      </appInfo>

+      <documentation>

+         The following is an example of new global install handler registration:
+&lt;p&gt;
+&lt;pre&gt;
+   &lt;extension
+        id=&quot;custom&quot;
+        point=&quot;org.eclipse.update.core.installHandlers&quot;
+        name=&quot;Custom install handler&quot;&gt;
+     &lt;install-handler
+        class=&quot;com.xyz.update.CustomInstallHandler&quot;&gt;
+     &lt;/install-handler&gt;
+   &lt;/extension&gt;
+&lt;/pre&gt;
+&lt;/p&gt;

+      </documentation>

+   </annotation>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="apiInfo"/>

+      </appInfo>

+      <documentation>

+         Registered install handler classes must implement 
+&lt;code&gt;org.eclipse.update.core.IInstallHandler&lt;/code&gt; interface.
+Implementers should extend base class &lt;code&gt;org.eclipse.update.core.BaseInstallHandler&lt;/code&gt;.

+      </documentation>

+   </annotation>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="implementation"/>

+      </appInfo>

+      <documentation>

+         The platform supplies a simple install handler that is registered as &lt;code&gt;org.eclipse.update.core.DefaultInstallHandler&lt;/code&gt;. If used, it will copy any non-plug-in data entries provided with the feature into the feature installation directory.

+      </documentation>

+   </annotation>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="copyright"/>

+      </appInfo>

+      <documentation>

+         Copyright (c) 2004 IBM Corporation and others.
+All rights reserved.   This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;.

+      </documentation>

+   </annotation>

+

+</schema>

diff --git a/update/org.eclipse.update.core/schema/siteTypes.exsd b/update/org.eclipse.update.core/schema/siteTypes.exsd
new file mode 100644
index 0000000..102dc16
--- /dev/null
+++ b/update/org.eclipse.update.core/schema/siteTypes.exsd
@@ -0,0 +1,119 @@
+<?xml version='1.0' encoding='UTF-8'?>

+<!-- Schema file written by PDE -->

+<schema targetNamespace="org.eclipse.update.core">

+<annotation>

+      <appInfo>

+         <meta.schema plugin="org.eclipse.update.core" id="siteTypes" name="Site Type Factory"/>

+      </appInfo>

+      <documentation>

+         The platform update mechanism supports pluggable site type
+implementations. A new site type can be registered in order
+to support alternate site layout schemes.
+&lt;p&gt;
+The &lt;code&gt;siteTypes&lt;/code&gt;
+extension point allows alternate site implementations to be
+registered using a symbolic type identifier. Whenever the 
+type is referenced using this identifier, the supplied factory
+is used to create the correct concrete site implementation.
+&lt;/p&gt;

+      </documentation>

+   </annotation>

+

+   <element name="extension">

+      <complexType>

+         <sequence>

+            <element ref="site-factory" minOccurs="1" maxOccurs="unbounded"/>

+         </sequence>

+         <attribute name="point" type="string" use="required">

+            <annotation>

+               <documentation>

+                  must be specified as &lt;b&gt;org.eclipse.update.core.siteTypes&lt;/b&gt;

+               </documentation>

+            </annotation>

+         </attribute>

+         <attribute name="id" type="string">

+            <annotation>

+               <documentation>

+                  must be specified. Identifies the new site type

+               </documentation>

+            </annotation>

+         </attribute>

+         <attribute name="name" type="string">

+            <annotation>

+               <documentation>

+                  optional displayable label for the new site type

+               </documentation>

+               <appInfo>

+                  <meta.attribute translatable="true"/>

+               </appInfo>

+            </annotation>

+         </attribute>

+      </complexType>

+   </element>

+

+   <element name="site-factory">

+      <complexType>

+         <attribute name="class" type="string" use="required">

+            <annotation>

+               <documentation>

+                  fully qualified name of the factory class for the identified
+site type

+               </documentation>

+            </annotation>

+         </attribute>

+      </complexType>

+   </element>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="examples"/>

+      </appInfo>

+      <documentation>

+         The following is an example of new site type registration.
+&lt;p&gt;
+&lt;pre&gt;
+   &lt;extension
+        id=&quot;custom&quot;
+        point=&quot;org.eclipse.update.core.siteTypes&quot;
+        name=&quot;Custom site&quot;&gt;
+      &lt;site-factory
+          class=&quot;com.xyz.update.CustomSiteFactory&quot;&gt;
+      &lt;/site-factory&gt;
+   &lt;/extension&gt;
+&lt;/pre&gt;
+&lt;/p&gt;

+      </documentation>

+   </annotation>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="apiInfo"/>

+      </appInfo>

+      <documentation>

+         Registered factory classes must implement 
+&lt;code&gt;&lt;b&gt;org.eclipse.update.core.ISiteFactory&lt;/b&gt;&lt;/code&gt;

+      </documentation>

+   </annotation>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="implementation"/>

+      </appInfo>

+      <documentation>

+         The platform supplies two standard implementations of site
+types. One representing the default update server type, and
+the other representing the local file system site.

+      </documentation>

+   </annotation>

+

+   <annotation>

+      <appInfo>

+         <meta.section type="copyright"/>

+      </appInfo>

+      <documentation>

+         Copyright (c) 2004 IBM Corporation and others.
+All rights reserved.   This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;.

+      </documentation>

+   </annotation>

+

+</schema>

diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IActivity.java b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IActivity.java
new file mode 100644
index 0000000..6c18192
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IActivity.java
@@ -0,0 +1,261 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.configuration;
+
+import java.util.Date;
+
+import org.eclipse.core.runtime.*;
+
+/**
+ * Install activity.
+ * Represents a record of an installation action performed
+ * on a particular installation configuration.
+ * <p>
+ * This interface is not intended to be implemented by clients.
+ * </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 org.eclipse.update.configuration.IInstallConfiguration
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IActivity extends IAdaptable {
+
+	/**
+	 * Indicates feature installation action
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int ACTION_FEATURE_INSTALL = 1;
+
+	/**
+	 * Indicates feature removal (uninstallation) action
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int ACTION_FEATURE_REMOVE = 2;
+
+	/**
+	 * Indicates an addition of a site to a configuration
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int ACTION_SITE_INSTALL = 3;
+
+	/**
+	 * Indicates removal of a site from a configuration
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int ACTION_SITE_REMOVE = 4;
+
+	/**
+	 * Indicates feature unconfiguration action
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int ACTION_UNCONFIGURE = 5;
+
+	/**
+	 * Indicates feature configuration action
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int ACTION_CONFIGURE = 6;
+
+	/**
+	 * Indicates reverting to a prior configuration state
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int ACTION_REVERT = 7;
+
+	/**
+	 * Indicates reconcilliation with changes made directly to the site
+	 * installation directory
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int ACTION_RECONCILIATION = 8;
+
+	/**
+	 * Indicates adding the configuration to a preserved state
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int ACTION_ADD_PRESERVED = 9;
+	
+	/**
+	 * Indicates the action completed cussessfully
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int STATUS_OK = 0;
+
+	/**
+	 * Indicates the action did not complete successfully
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int STATUS_NOK = 1;
+
+	/**
+	 * Returns the action code for this activity
+	 * 
+	 * @see #ACTION_FEATURE_INSTALL
+	 * @see #ACTION_FEATURE_REMOVE
+	 * @see #ACTION_SITE_INSTALL
+	 * @see #ACTION_SITE_REMOVE
+	 * @see #ACTION_UNCONFIGURE
+	 * @see #ACTION_CONFIGURE
+	 * @see #ACTION_REVERT
+	 * @see #ACTION_RECONCILIATION
+	 * @return action code, as defined in this interface
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 int getAction();
+
+	/**
+	 * Returns the displayable label for this action
+	 * 
+	 * @return diplayable label for action
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 String getLabel();
+
+	/**
+	 * Returns the creation date of this activity
+	 * 
+	 * @return activity date
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 Date getDate();
+
+	/** 
+	 * Returns the activity completion status
+	 * 
+	 * @see #STATUS_OK
+	 * @see #STATUS_NOK
+	 * @return completion status, as defined in this interface
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 int getStatus();
+
+	/**
+	 * Returns the installation configuration that was the result of 
+	 * this action
+	 * 
+	 * @return installation configuration
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This method 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 IInstallConfiguration getInstallConfiguration();
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IConfiguredSite.java b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IConfiguredSite.java
new file mode 100644
index 0000000..8c5aaf8
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IConfiguredSite.java
@@ -0,0 +1,380 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.configuration;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.update.core.IFeature;
+import org.eclipse.update.core.IFeatureReference;
+import org.eclipse.update.core.ISite;
+import org.eclipse.update.core.IVerificationListener;
+
+/**
+ * Configured Site.
+ * Represents an installation site "filtered" by configuration information.
+ * Configured site is the target of the feature update operations (install
+ * feature, remove feature, configure feature, unconfigure feature).
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IConfiguredSite extends IAdaptable {
+
+	/**
+	 * Returns the underlying "unfiltered" site.
+	 * 
+	 * @return the underlying site 
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 ISite getSite();
+
+	/**
+	 * Indicates whether updates can be applied to the site.
+	 * 
+	 * <code>IStatus.isOk()</code> return <code>true</code> if
+	 * the site can be updated, <code>false</code> otherwise.
+	 * 
+	 * If updates cannot be aplied, the status contains the error message, and
+	 * the possible exception. 
+	 * 
+	 * @see IStatus
+	 * @return an IStatus
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 IStatus verifyUpdatableStatus();
+
+	/**
+	 * Indicates whether updates can be applied to the site.
+	 * 
+	 * A configuration site is tagged a non-updatable by reading
+	 * the platform configuration for this site.
+	 * 
+	 * @return <code>true</code> if the site can be updated, 
+	 * <code>false</code> otherwise
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 boolean isUpdatable();
+
+	/**
+	 * Install the specified feature on this site.
+	 * 
+	 * @param feature feature to install
+	 * @param verificationListener verification listener, or <code>null</code>
+	 * @param monitor progress monitor, or <code>null</code>
+	 * @exception CoreException
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 IFeatureReference install(IFeature feature, IVerificationListener verificationListener, IProgressMonitor monitor) throws CoreException;
+
+	/**
+	 * Install the specified feature on this site.
+	 * Only the specified optional features will be installed
+	 * 
+	 * @param feature feature to install
+	 * @param optionalFeatures optional features to install
+	 * @param verificationListener verification listener, or <code>null</code>
+	 * @param monitor progress monitor, or <code>null</code>
+	 * @exception CoreException
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 IFeatureReference install(IFeature feature, IFeatureReference[] optionalFeatures, IVerificationListener verificationListener, IProgressMonitor monitor) throws CoreException;
+
+
+	/**
+	 * Remove (uninstall) the specified feature from this site
+	 * 
+	 * @param feature feature to remove
+	 * @param monitor progress monitor, or <code>null</code>
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void remove(IFeature feature, IProgressMonitor monitor) throws CoreException;
+
+	/**
+	 * Indicates if the specified feature is "broken". A feature is considered
+	 * to be broken in the context of this site, if some of the plug-ins
+	 * referenced by the feature are not installed on this site.
+	 * 
+	 * The status code is <code>IStatus.ERROR</code> if the feature is considered
+	 * broken. The Status may contain the reason why the feature is broken.
+	 * The status code is <code>IStatus.OK</code> if the feature is not considered
+	 * broken.
+	 * 
+	 * @param feature the feature
+	 * @return the status for this feature on this configured site
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This method 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 IStatus getBrokenStatus(IFeature feature);
+
+	/**
+	 * Indicates if the specified feature is configured on this site.
+	 * 
+	 * @param feature the feature
+	 * @return <code>true</code> if the feature is configured,
+	 * <code>false</code> otherwise
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This method 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 boolean isConfigured(IFeature feature);
+
+	/**
+	 * Configure the specified feature on this site. The configured
+	 * feature will be included on next startup.
+	 * 
+	 * @param feature the feature
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void configure(IFeature feature) throws CoreException;
+
+	/**
+	 * Unconfigure the specified feature from this site. The unconfigured
+	 * feature will be omitted on the next startup.
+	 * 
+	 * @param feature the feature
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 boolean unconfigure(IFeature feature) throws CoreException;
+
+	/**
+	 * Return references to features configured on this site.
+	 * 
+	 * @return an array of feature references, or an empty array.
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 IFeatureReference[] getConfiguredFeatures();
+
+	/**
+	 * Return all features installed on this site (configured as well
+	 * as unconfigured). Note, that if the site requires reconciliation,
+	 * the result may not match the result of the corresponding method
+	 * on the underlying site.
+	 * 
+	 * @see ISite#getFeatureReferences()
+	 * @return an array of site feature references, or an empty array.
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 IFeatureReference[] getFeatureReferences();
+
+	/**
+	 * Returns the install configuration object this site is part of.
+	 * 
+	 * @return install configuration object
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This method 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 IInstallConfiguration getInstallConfiguration();
+
+	/**
+	 * Adds a change listener to the configured site.
+	 * 
+	 * @param listener the listener to add
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void addConfiguredSiteChangedListener(IConfiguredSiteChangedListener listener);
+
+	/**
+	 * Removes a change listener from the configured site.
+	 * 
+	 * @param listener the listener to remove
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void removeConfiguredSiteChangedListener(IConfiguredSiteChangedListener listener);
+
+	/**
+	 * Indicates if the site is an extension site.
+	 * 
+	 * @return <code>true</code> if the site is an extension site,
+	 * <code>false</code> otherwise
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This method 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 boolean isExtensionSite();
+
+	/**
+	 * Indicates if the site is a product site.
+	 * 
+	 * @return <code>true</code> if the site is a product site,
+	 * <code>false</code> otherwise
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This method 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 boolean isProductSite();
+
+	/**
+	 * Indicates if the site is a private site.
+	 * This does not check if this private site belongs to the
+	 * product that is running.
+	 * 
+	 * @return <code>true</code> if the site is a private site,
+	 * <code>false</code> otherwise
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This method 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>
+	 * @deprecated private site are considered the same as extension site (3.0)
+	 */
+	public boolean isPrivateSite();
+
+	/**
+	 * Indicates if the site has been linked by a native
+	 * installer.
+	 * 
+	 * @return <code>true</code> if the site is a natively linked site,
+	 * <code>false</code> otherwise
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This method 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 boolean isNativelyLinked() throws CoreException;
+
+	/**
+	 * Sets if the site is enabled
+	 * 
+	 * @param value <code>true</code> if the site is enable, <code>false</code>
+	 * otherwise
+	 * @since 2.1
+	 * <p>
+	 * <b>Note:</b> This method 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 void setEnabled(boolean value);
+
+	/**
+	 * Indicates if the site is enabled. 
+	 * If a site is not enable, all teh features are considered disabled.
+	 * 
+	 * @return <code>true</code> if the site is enable, <code>false</code>
+	 * otherwise
+	 * @since 2.1
+	 * <p>
+	 * <b>Note:</b> This method 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 boolean isEnabled();
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IConfiguredSiteChangedListener.java b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IConfiguredSiteChangedListener.java
new file mode 100644
index 0000000..7266208
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IConfiguredSiteChangedListener.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.configuration;
+
+import org.eclipse.update.core.IFeature;
+
+/**
+ * Configuration change listener. * 
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IConfiguredSiteChangedListener {
+	
+	/**
+	 * Indicates the specified feature was installed.
+	 * 
+	 * @param feature the feature
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void featureInstalled(IFeature feature);
+	
+	/**
+	 * Indicates the specified feature was removed (uninstalled)
+	 * 
+	 * @param feature the feature
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void featureRemoved(IFeature feature);
+	
+	/**
+	 * Indicates the specified feature was configured.
+	 * 
+	 * @param feature the feature
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void featureConfigured(IFeature feature);
+	
+	/**
+	 * Indicates the specified feature was unconfigured.
+	 * 
+	 * @param feature the feature
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void featureUnconfigured(IFeature feature);
+}
+
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IInstallConfiguration.java b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IInstallConfiguration.java
new file mode 100644
index 0000000..473b970
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IInstallConfiguration.java
@@ -0,0 +1,237 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.configuration;
+
+import java.io.File;
+import java.util.Date;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+
+/**
+ * Installation configuration.
+ * Represents a specific configuration of a number of sites as a point
+ * in time. Maintains a record of the specific activities that resulted
+ * in this configuration. Current installation configuration is
+ * the configuration the platform was started with.
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IInstallConfiguration extends IAdaptable {
+
+	/**
+	 * Indicates if this is the current configuration
+	 * 
+	 * @return <code>true</code> if this is the current configuration,
+	 * <code>false</code> otherwise
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 boolean isCurrent();
+
+	/**
+	 * Return the sites that are part of this configuration.
+	 * 
+	 * @return an array of configured sites, or an empty array.
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 IConfiguredSite[] getConfiguredSites();
+
+	/**
+	 * Create a new installation site, based on a local file 
+	 * system directory. Note, the site is not added to the
+	 * configuration as a result of this call.
+	 * 
+	 * @param directory file directory
+	 * @return new site
+	 * @exception CoreException
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 IConfiguredSite createConfiguredSite(File directory) throws CoreException;
+
+	/**
+	 * Create a new linked site, based on a local file 
+	 * system directory. Note, the site is not added to the
+	 * configuration as a result of this call.
+	 * The linked site is only created if the directory is an
+	 * already existing extension site and if it is not already
+	 * natively linked to the local site.
+	 * 
+	 * @param directory file directory
+	 * @return new linked site
+	 * @exception CoreException
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 IConfiguredSite createLinkedConfiguredSite(File directory) throws CoreException;
+
+	/**
+	 * Adds the specified site to this configuration.
+	 * 
+	 * @param site new site
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void addConfiguredSite(IConfiguredSite site);
+
+	/**
+	 * Removes the specified site from this configuration.
+	 * 
+	 * @param site site to remove
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void removeConfiguredSite(IConfiguredSite site);
+
+	/**
+	 * Adds a configuration change listener.
+	 * 
+	 * @param listener the listener
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void addInstallConfigurationChangedListener(IInstallConfigurationChangedListener listener);
+
+	/**
+	 * Removes a configuration change listener.
+	 * 
+	 * @param listener the listener
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void removeInstallConfigurationChangedListener(IInstallConfigurationChangedListener listener);
+
+	/**
+	 * Return the list of activities that resulted in this configuration.
+	 * There is always at least one activity
+	 * 
+	 * @return an array of activities
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 IActivity[] getActivities();
+
+	/**
+	 * Retrun the date the configuration was created.
+	 * 
+	 * @return create date
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 Date getCreationDate();
+
+	/**
+	 * Return the configuration label.
+	 * 
+	 * @return the configuration label. If the configuration label was not
+	 * explicitly set, a default label is generated based on the creation
+	 * date
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 String getLabel();
+
+	/**
+	 * Sets the configuration label.
+	 * 
+	 * @param label the label
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void setLabel(String label);
+
+	/**
+	 * Returns an integer that represents a time stamp created at the beginning of a new configuration time line.
+	 * Time line is started when configuration state is created by a full file system reconciliation. All configurations
+	 * subsequently created will have the same time line until the next full reconciliation. Certain operations
+ 	 * (e.g. revert) make sense only between objects that belong to the same time line.
+ 	 * 
+	 * @since 2.0.2
+	 * @return the time stamp of the full system reconciliation
+	 * 
+	 * <b>Note:</b> This method 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 long getTimeline();
+
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IInstallConfigurationChangedListener.java b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IInstallConfigurationChangedListener.java
new file mode 100644
index 0000000..d6f02c2
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IInstallConfigurationChangedListener.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.configuration;
+
+/**
+ * Configuration change listener.
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IInstallConfigurationChangedListener {
+	
+	/**
+	 * Indicates the specified site was added to the configuration
+	 * 
+	 * @param site the site
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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>
+	 */
+	void installSiteAdded(IConfiguredSite site);
+	
+	/**
+	 * Indicates the specified site was removed from the configuration
+	 * 
+	 * @param site the site
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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>
+	 */
+	void installSiteRemoved(IConfiguredSite site);
+
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IInstallDeltaHandler.java b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IInstallDeltaHandler.java
new file mode 100644
index 0000000..71e92e2
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IInstallDeltaHandler.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.configuration;
+
+/**
+ * Install Delta Handler.
+ * Presents the changes the reconciler found to the user
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IInstallDeltaHandler{
+
+	/**
+	 * Sets the list of session delta to present to the user
+	 * 
+	 * @param deltas an Array of <code>ISessionDelta</code>
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void init(ISessionDelta[] deltas);
+
+	/**
+	 * Prompt the user to configure or unconfigure
+	 * new features found during reconciliation
+	 * 
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void open();
+
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/configuration/ILocalSite.java b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/ILocalSite.java
new file mode 100644
index 0000000..bcc03e9
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/ILocalSite.java
@@ -0,0 +1,274 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.configuration;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.update.core.IFeature;
+
+/**
+ * Local Site.
+ * Represents the local installation. It consists of the current
+ * configuration and the configuration history. A local site
+ * manages the number of configuration histories kept. It also allows
+ * specific configuration histories to be saved.
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p> 
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface ILocalSite extends IAdaptable {
+
+	/**
+	 * Return the current configuration.
+	 * 
+	 * @return current configuration
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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>
+	 */
+	IInstallConfiguration getCurrentConfiguration();
+
+	/**
+	 * Return configuration history.
+	 * 
+	 * @return an array of configurations, or an empty array.
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 IInstallConfiguration[] getConfigurationHistory();
+
+	/**
+	 * Reverts the local site to use the specified configuration.
+	 * The result of this operation is a new configuration that
+	 * contains the same configured features as the specified configuration.
+	 * The new configuration becomes the current configuration.
+	 * 
+	 * @param configuration configuration state to revert to
+	 * @param monitor progress monitor
+	 * @param handler problem handler
+	 * @exception CoreException
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void revertTo(
+		IInstallConfiguration configuration,
+		IProgressMonitor monitor,
+		IProblemHandler handler)
+		throws CoreException;
+
+	/**
+	 * Creates a new configuration containing the same state as the 
+	 * specified configuration. The new configuration is not added to
+	 * this lical site.
+	 * 
+	 * @return cloned configuration
+	 * @exception CoreException
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 IInstallConfiguration cloneCurrentConfiguration() throws CoreException;
+
+	/**
+	 * Adds the specified configuration to this local site.
+	 * The new configuration becomes the current one.
+	 * 
+	 * @param config the configuration
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void addConfiguration(IInstallConfiguration config);
+
+	/**
+	 * Saves the local site state
+	 * 
+	 * @exception CoreException
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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>
+	 * @return true if a restart is needed. This return code was added in 3.0.
+	 */
+	public boolean save() throws CoreException;
+
+	/**
+	 * Indicates how many configuration histories should be maintained.
+	 * Histories beyond the specified count are automatically deleted.
+	 * 
+	 * @return number of past configurations to keep as history
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 int getMaximumHistoryCount();
+
+	/**
+	 * Sets the number of past configurations to keep in history
+	 * 
+	 * @param history number of configuration to keep
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void setMaximumHistoryCount(int history);
+
+	/**
+	 * Adds a site change listener
+	 * 
+	 * @param listener the listener
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void addLocalSiteChangedListener(ILocalSiteChangedListener listener);
+
+	/**
+	 * Removes a site listener
+	 * 
+	 * @param listener the listener
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void removeLocalSiteChangedListener(ILocalSiteChangedListener listener);
+
+	/**
+	 * Save the specified configuration. Saved configurations are 
+	 * not deleted based on the history count. They must be explicitly
+	 * removed.
+	 * 
+	 * @param configuration the configuration to save
+	 * @return the preserved configuration or <code>null</code> if the configuration to save is <code>null</code>
+	 * @exception CoreException
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 IInstallConfiguration addToPreservedConfigurations(IInstallConfiguration configuration)
+		throws CoreException;
+
+	/**
+	 * Removes the specified configuration from the list of previously
+	 * saved configurations.
+	 * 
+	 * @param configuration the configuration to remove
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void removeFromPreservedConfigurations(IInstallConfiguration configuration);
+
+	/**
+	 * Return the list of saved configurations
+	 * 
+	 * @return an array of configurations, or an empty array.
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 IInstallConfiguration[] getPreservedConfigurations();
+	
+	/**
+	 * Indicates if the 'state' of the specified feature and its children features.
+	 * 
+	 * A feature is considered to be 'unhappy' in the context of this site,
+	 * if some of the plug-ins referenced by the feature, or any of its children,
+	 *  are not installed on this site.
+	 * 
+	 * A feature is considered to be 'happy' in the context of a local site
+	 * if all the plug-ins referenced by the feature, or any of its children,
+	 * are installed on the site and no other version of any of the plug-ins
+	 * are installed on any other site of the local site.
+	 * 
+	 * A feature is considered to be 'ambiguous' in the context of a local site
+	 * if all the plug-ins referenced by the feature, or any of its children,
+	 * are installed on the site and other version of any of the plug-ins
+	 * are installed on any other site of the local site.
+	 * 
+	 * @param feature the feature
+	 * @see IFeature#STATUS_HAPPY
+	 * @see IFeature#STATUS_UNHAPPY
+	 * @see IFeature#STATUS_AMBIGUOUS
+	 * @return the state of the feature
+	 * @exception CoreException
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This method 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 IStatus getFeatureStatus(IFeature feature) throws CoreException ;	
+
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/configuration/ILocalSiteChangedListener.java b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/ILocalSiteChangedListener.java
new file mode 100644
index 0000000..98cc3ea
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/ILocalSiteChangedListener.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.configuration;
+
+/**
+ * Local site change listener. 
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface ILocalSiteChangedListener {
+	
+	/**
+	 * Indicates the current configuration has changed.
+	 * 
+	 * @param configuration the current cunfiguration
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void currentInstallConfigurationChanged(IInstallConfiguration configuration);
+	
+	/**
+	 * Indicates the specified configuration was removed.
+	 * 
+	 * @param configuration the configuration
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void installConfigurationRemoved(IInstallConfiguration configuration);
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/configuration/ILocalSystemInfoListener.java b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/ILocalSystemInfoListener.java
new file mode 100644
index 0000000..a2f3987
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/ILocalSystemInfoListener.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.configuration;
+ 
+
+
+/**
+ * Local system change listener interface.
+ * <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 LocalSystemInfo#addInfoListener(ILocalSystemInfoListener)
+ * @see LocalSystemInfo#removeInfoListener(ILocalSystemInfoListener)
+ * @see LocalSystemInfo#fireSystemInfoChanged(IVolume,int)
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface ILocalSystemInfoListener {
+	
+	/**
+	 * Volume change notification.
+	 * Called each time there are relevant volume changes
+	 * detected. This specifically includes changes to the
+	 * file system structure as a result of removable drive/ media
+	 * operations (eg. CD insertion), and changes to volume 
+	 * mount structure.
+	 * @param volume volume of the changed file
+	 * system structure. Any current paths beyond
+	 * the specified 'root' file of the volume are assumed to be invalidated.
+	 * @param changeType type of the change that occured.
+	 * @see LocalSystemInfo#VOLUME_ADDED
+	 * @see LocalSystemInfo#VOLUME_REMOVED
+	 * @see LocalSystemInfo#VOLUME_CHANGED
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This method 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 void systemInfoChanged(IVolume volume, int changeType);
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IProblemHandler.java b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IProblemHandler.java
new file mode 100644
index 0000000..037d672
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IProblemHandler.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.configuration;
+ 
+/**
+ * Generic problem handler. Used to report status from specific
+ * install operations. The methods implemented by this interface
+ * are callbacks from the update support to the caller of the update
+ * methods.
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IProblemHandler {
+
+	/**
+	 * Report problem.
+	 * 
+	 * @param problemText problem text
+	 * @return <code>true</code> if the operation should continue,
+	 * <code>false</code> if the operation should be cancelled
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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>
+	 */
+	boolean reportProblem(String problemText);
+
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/configuration/ISessionDelta.java b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/ISessionDelta.java
new file mode 100644
index 0000000..1d843a5
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/ISessionDelta.java
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.configuration;
+
+import java.util.Date;
+
+import org.eclipse.core.runtime.*;
+import org.eclipse.update.core.*;
+
+/**
+ * Installation Change.
+ * Represents the changes the reconciler found.
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @since 2.0
+ * @deprecated Do not use this interface
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface ISessionDelta extends IAdaptable {
+
+	/**
+	 * Indicates a processing type to enable the features
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 int ENABLE = 1;
+
+	/**
+	 * Indicates a processing type to disable the features
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 int DISABLE = 2;
+
+	/**
+	 * Returns the list of Features found during reconciliation
+	 * 
+	 * @return an array of feature references, or an empty array
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 IFeatureReference[] getFeatureReferences();
+
+	/**
+	 * Returns the date the reconciliation occured
+	 * 
+	 * @return the date of the reconciliation
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 Date getDate();
+
+	/**
+	 * Returns the type of the processing type
+	 * that will affect all the associated features. 
+	 * 
+	 * @return the processing type
+	 * @see ISessionDelta#ENABLE
+	 * @see ISessionDelta#DISABLE
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This method 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 int getType();
+
+	/**
+	 * Process all the feature references of the 
+	 * Session Delta. 
+	 * Removes the Session Delta from the file system after processing it.
+	 * 
+	 * @param progressMonitor the progress monitor
+	 * @throws CoreException if an error occurs. 
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void process(IProgressMonitor progressMonitor) throws CoreException;
+
+	/**
+	 * Process the selected feature references of the Session Delta.
+	 * Removes the Session Delta from the file system after processing it.
+	 *
+	 * @param selected list of selected feature references to be processed
+	 * @param monitor the progress monitor
+	 * @throws CoreException if an error occurs.
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This method 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 void process(IFeatureReference [] selected, IProgressMonitor monitor) throws CoreException;
+	
+	/**
+	 * Removes the Session Delta from the file system without processing it.
+	 * 
+	 * @since 2.0 
+	 * <p>
+	 * <b>Note:</b> This method 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 void delete();	
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IVolume.java b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IVolume.java
new file mode 100644
index 0000000..c120efc
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/IVolume.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.configuration;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.IAdaptable;
+
+/**
+ * Local Volume Info.
+ * Represents local file system information for a specific volume.
+ * <p>
+ * This interface is not intended to be implemented by clients.
+ * </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 org.eclipse.update.configuration.LocalSystemInfo
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IVolume extends IAdaptable {
+
+	/**
+	 * Returns the available free space on this volume.
+	 * Returns the amount of free space available to this
+	 * user on the volume. The
+	 * method takes into account any space quotas or other
+	 * native mechanisms that may restrict space usage
+	 * on a given volume.
+	 * @return the amount of free space available (in units
+	 * of Kbyte), or an indication the size is not known 
+	 * @see LocalSystemInfo#SIZE_UNKNOWN
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This method 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 long getFreeSpace();
+	
+	/**
+	 * returns volume label.
+	 * Returns the label of the volume.
+	 * @return volume label (as string), or <code>null</code> if
+	 * the label cannot be determined.
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This method 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 String getLabel();
+	
+	/**
+	 * Returns volume type.
+	 * Returns the type of the volume.
+	 * @return volume type
+	 * @see LocalSystemInfo#VOLUME_UNKNOWN
+	 * @see LocalSystemInfo#VOLUME_INVALID_PATH
+	 * @see LocalSystemInfo#VOLUME_REMOVABLE
+	 * @see LocalSystemInfo#VOLUME_FIXED
+	 * @see LocalSystemInfo#VOLUME_REMOTE
+	 * @see LocalSystemInfo#VOLUME_CDROM
+	 * @see LocalSystemInfo#VOLUME_FLOPPY_3
+	 * @see LocalSystemInfo#VOLUME_FLOPPY_5
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This method 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 int getType();
+	
+	/**
+	 * Returns the volume path.
+	 * Returns the path that represents the mount point of the volume.
+	 * @return mount point file
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This method 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 File getFile();
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/configuration/LocalSystemInfo.java b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/LocalSystemInfo.java
new file mode 100644
index 0000000..038cb4f
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/LocalSystemInfo.java
@@ -0,0 +1,426 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.configuration;
+ 
+import java.io.File;
+import java.util.ArrayList;
+
+import org.eclipse.update.internal.core.UpdateCore;
+import org.eclipse.update.internal.core.Volume;
+ 
+/**
+ * Utility class providing local file system information.
+ * The class attempts to load a native library implementation
+ * of its methods. If successful, the method calls are delegated
+ * to the native implementation. Otherwise a default non-native
+ * implementation is used.  * 
+ * <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 ILocalSystemInfoListener
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class LocalSystemInfo {
+	
+	/**
+	 * Indicates the amount of available free space is not known
+	 * 
+	 * @see LocalSystemInfo#getFreeSpace(File)
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final long SIZE_UNKNOWN = -1;
+	
+	/**
+	 * Indicates the volume type is not known
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int VOLUME_UNKNOWN = -1;
+	
+	/**
+	 * Indicates the volume could not be determined from path
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int VOLUME_INVALID_PATH = -2;
+	
+	/**
+	 * Indicates the volume is removable (other than floppy disk)
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int VOLUME_REMOVABLE = 1;
+	
+	/**
+	 * Indicates the volume is fixed (hard drive)
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int VOLUME_FIXED = 2;
+	
+	/**
+	 * Indicates a remote (network) volume
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int VOLUME_REMOTE = 3;
+	
+	/**
+	 * Indicates a cdrom volume (compact disc)
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int VOLUME_CDROM = 4;	
+	
+	/**
+	 * Indicates a ramdisk volume (memory)
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int VOLUME_RAMDISK = 5;	
+
+	/**
+	 * Indicates the volume is removable (floppy disk 5 1/4)
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int VOLUME_FLOPPY_5 = 6;	
+	
+	/**
+	 * Indicates the volume is removable (floppy disk 3 1/2)
+	 * 
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int VOLUME_FLOPPY_3 = 7;
+	
+	/**
+	 * Indicates a new volume has been added
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int VOLUME_ADDED = 0;
+			
+	/**
+	 * Indicates a volume has been removed
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int VOLUME_REMOVED = 1;
+
+	/**
+	 * Indicates a volume has been changed
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This field 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 static final int VOLUME_CHANGED = 2;
+
+	
+	private static ArrayList listeners = new ArrayList();	
+	private static boolean hasNatives = false;	
+	static {
+		try {
+			System.loadLibrary("update"); //$NON-NLS-1$
+			hasNatives = true;
+		} catch (UnsatisfiedLinkError e) {
+			UpdateCore.warn("Unable to load native library 'update'."); //$NON-NLS-1$
+			hasNatives = false;
+		}
+	}
+	
+	/**
+	 * Determines available free space on a volume.
+	 * Returns the amount of free space available to this
+	 * user on the volume containing the specified path. The
+	 * method takes into account any space quotas or other
+	 * native mechanisms that may restrict space usage
+	 * on a given volume.
+	 * @param path file path. May contain path elements beyond
+	 * the volume "root"
+	 * @return the amount of free space available (in units
+	 * of Kbyte), or an indication the size is not known 
+	 * @see LocalSystemInfo#SIZE_UNKNOWN
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This method 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 static long getFreeSpace(File path) {
+		if (hasNatives) {
+			try {
+				long bytes = nativeGetFreeSpace(path);
+				return (bytes!=0)?bytes/1024:0;
+			} catch (UnsatisfiedLinkError e) {
+			}
+		}
+		return SIZE_UNKNOWN;
+	}
+
+
+	/**
+	 * Lists the file system volume.
+	 * @return array of volume representing mount
+	 * points, or <code>null</code> if none found
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This method 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 static IVolume[] getVolumes() {
+		String[] mountPoints = listMountPoints();
+		Volume[] vol = new Volume[0];
+		if (mountPoints!=null){
+			vol = new Volume[mountPoints.length];
+			for (int i = 0; i < mountPoints.length; i++) {
+				File root = new File(mountPoints[i]);
+				String label = getLabel(root);
+				int type = getType(root);
+				long size = getFreeSpace(root);
+				vol[i] = new Volume(root,label,type,size);
+				vol[i].markReadOnly();
+			}
+		} else {
+			UpdateCore.warn("Unable to find mount points"); //$NON-NLS-1$
+			// fallback
+			File [] roots = File.listRoots();
+			if (roots.length == 1) {
+				// just one root - skip it
+				File root = roots[0];
+				roots = root.listFiles();
+			}
+			vol = new Volume[roots.length];			
+			for (int i = 0; i < roots.length; i++) {
+				vol[i] = new Volume(roots[i],null,LocalSystemInfo.VOLUME_UNKNOWN,LocalSystemInfo.SIZE_UNKNOWN);
+				vol[i].markReadOnly();
+			}			
+		}
+		return vol;
+	}
+
+	
+	/**
+	 * Add local system change listener.
+	 * Allows a listener to be added for monitoring changes
+	 * in the local system information. The listener is notified
+	 * each time there are relevant volume changes
+	 * detected. This specifically includes changes to the
+	 * list of volumes as a result of removable drive/ media
+	 * operations (eg. CD insertion, removal), and changes to volume 
+	 * mount structure.
+	 * @param listener change listener
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This method 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 static void addInfoListener(ILocalSystemInfoListener listener) {
+		if (!listeners.contains(listener))
+			listeners.add(listener);
+	}
+	
+	/**
+	 * Remove local system change listener
+	 * @param listener change listener
+	 * @since 2.0
+	 * <p>
+	 * <b>Note:</b> This method 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 static void removeInfoListener(ILocalSystemInfoListener listener) {
+		listeners.remove(listener);
+	}
+		
+	/**
+	 * Notify listeners of change.
+	 * 
+	 * @param volume the volume representing the
+	 * change file system structure. Any current paths beyond
+	 * the specified "root" file of the volume are assumed to be invalidated.
+	 * @param changeType type of the change that occured.
+	 * @see LocalSystemInfo#VOLUME_ADDED
+	 * @see LocalSystemInfo#VOLUME_REMOVED
+	 * @see LocalSystemInfo#VOLUME_CHANGED
+	 * <p>
+	 * <b>Note:</b> This method 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 static void fireSystemInfoChanged(IVolume volume, int changeType) {
+		for (int i=0; i< listeners.size(); i++) {
+			((ILocalSystemInfoListener)listeners.get(i)).systemInfoChanged(volume,changeType);
+		}
+	}
+		
+	/*
+	 * Determines volume label.
+	 * Returns the label of the volume containing the specified
+	 * path.
+	 * @param path file path. May contain path elements beyond
+	 * the volume "root"
+	 * @return volume label (as string), or <code>null</code> if
+	 * the label cannot be determined.
+	 * @since 2.0
+	 */
+	private static String getLabel(File path) {
+		if (hasNatives) {
+			try {
+				return nativeGetLabel(path);
+			} catch (UnsatisfiedLinkError e) {
+			}
+		}
+		return null;
+	}
+	
+	/*
+	 * Determines volume type.
+	 * Returns the type of the volume containing the specified
+	 * path.
+	 * @param path file path. May contain path elements beyond
+	 * the volume "root"
+	 * @return volume type
+	 * @see LocalSystemInfo#VOLUME_UNKNOWN
+	 * @see LocalSystemInfo#VOLUME_INVALID_PATH
+	 * @see LocalSystemInfo#VOLUME_REMOVABLE
+	 * @see LocalSystemInfo#VOLUME_FIXED
+	 * @see LocalSystemInfo#VOLUME_REMOTE
+	 * @see LocalSystemInfo#VOLUME_CDROM
+	 * @see LocalSystemInfo#VOLUME_FLOPPY_3
+	 * @see LocalSystemInfo#VOLUME_FLOPPY_5
+	 * @since 2.0
+	 */
+	private static int getType(File path) {
+		if (hasNatives) {
+			try {
+				return nativeGetType(path);
+			} catch (UnsatisfiedLinkError e) {
+			}
+		}
+		return VOLUME_UNKNOWN;
+	}
+	
+	/*
+	 * Lists the file system mount points.
+	 * @return array of absolute file paths representing mount
+	 * points, or <code>null</code> if none found
+	 * @since 2.0
+	 */
+	private static String[] listMountPoints() {
+		if (hasNatives) {
+			try {
+				String[] mountPoints = nativeListMountPoints();
+				return mountPoints;
+			} catch (UnsatisfiedLinkError e) {
+			}
+		}
+		return null;
+	}
+		
+	/*
+	 * Native implementations.
+	 */
+	private static native long nativeGetFreeSpace(File path);
+	private static native String nativeGetLabel(File path);
+	private static native int nativeGetType(File path);
+	private static native String[] nativeListMountPoints();
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/configuration/package.html b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/package.html
new file mode 100644
index 0000000..a35e812
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/configuration/package.html
@@ -0,0 +1,23 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+   <meta name="Author" content="IBM">
+   <meta name="GENERATOR" content="Mozilla/4.72 [en] (Windows NT 5.0; U) [Netscape]">
+   <title>Package-level Javadoc</title>
+</head>
+<body>
+Provides support for accessing local installation
+information.
+<h2>
+Package Specification</h2>
+This package contains interfaces for accessing and manipulating the local
+system installation and configuration information. In general, users extending
+the update support&nbsp; by writing additional feature and site implementation
+do not need to make use of interfaces defined in this package.
+<p>
+<b>Note:</b> This package has been deprecated and will be deleted in a future
+release.  See bug 311590 for details.
+</p>
+</body>
+</html>
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/ArchiveReference.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/ArchiveReference.java
new file mode 100644
index 0000000..0ee0248
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/ArchiveReference.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import org.eclipse.update.core.model.ArchiveReferenceModel;
+
+/**
+ * Convenience implementation of a site archive.
+ * <p>
+ * This class may be instantiated or subclassed by clients.
+ * </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 org.eclipse.update.core.IArchiveReference
+ * @see org.eclipse.update.core.model.ArchiveReferenceModel
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class ArchiveReference
+	extends ArchiveReferenceModel
+	implements IArchiveReference {
+
+	/**
+	 * Constructor for ArchiveReference
+	 * @since 2.0
+	 */
+	public ArchiveReference() {
+		super();
+	}
+
+	/**
+	 * @see Object#toString()
+	 * @since 2.0
+	 */
+	public String toString() {
+		String result = "IArchiveReference: "; //$NON-NLS-1$
+		result =
+			result
+				+ ((getPath() == null)
+					? getURL().toExternalForm()
+					: getPath() + " : " + getURL().toExternalForm()); //$NON-NLS-1$
+		return result;
+	}
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/BaseFeatureFactory.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/BaseFeatureFactory.java
new file mode 100644
index 0000000..79fe2df
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/BaseFeatureFactory.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.net.URL;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+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.IncludedFeatureReferenceModel;
+import org.eclipse.update.core.model.InstallHandlerEntryModel;
+import org.eclipse.update.core.model.NonPluginEntryModel;
+import org.eclipse.update.core.model.PluginEntryModel;
+import org.eclipse.update.core.model.URLEntryModel;
+
+/**
+ * Base implementation of a feature factory.
+ * The factory is responsible for constructing the correct
+ * concrete implementation of the model objects for each particular
+ * feature type. This class creates model objects that correspond
+ * to the concrete implementation classes provided in this package.
+ * The actual feature creation method is subclass responsibility.
+ * <p>
+ * This class must be subclassed by clients.
+ * </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 org.eclipse.update.core.IFeatureFactory
+ * @see org.eclipse.update.core.model.FeatureModelFactory
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public abstract class BaseFeatureFactory extends FeatureModelFactory implements IFeatureFactory {
+
+	/**
+	 * 
+	 * @deprecated implement createFeature(URL, ISite, IProgressMonitor) instead
+	 * @see IFeatureFactory#createFeature(URL,ISite)
+	 * @since 2.0
+	 */
+	public IFeature createFeature(URL url, ISite site) throws CoreException {
+		return createFeature(url, site, null);
+	}
+
+	/**
+	 * Create feature. Implementation of this method must be provided by 
+	 * subclass
+	 * 
+	 * @see IFeatureFactory#createFeature(URL,ISite,IProgressMonitor)
+	 * @since 2.0
+	 */
+	public abstract IFeature createFeature(URL url, ISite site, IProgressMonitor monitor) throws CoreException;
+
+	/**
+	 * Create a concrete implementation of feature model.
+	 * 
+	 * @see Feature
+	 * @return feature model
+	 * @since 2.0
+	 */
+	public FeatureModel createFeatureModel() {
+		return new Feature();
+	}
+
+	/**
+	 * Create a concrete implementation of included feature reference model.
+	 * 
+	 * @see IncludedFeatureReference
+	 * @return feature model
+	 * @since 2.1
+	 */
+	public IncludedFeatureReferenceModel createIncludedFeatureReferenceModel() {
+		return new IncludedFeatureReference();
+	}
+
+	/**
+	 * Create a concrete implementation of install handler model.
+	 * 
+	 * @see InstallHandlerEntry
+	 * @return install handler entry model
+	 * @since 2.0
+	 */
+	public InstallHandlerEntryModel createInstallHandlerEntryModel() {
+		return new InstallHandlerEntry();
+	}
+
+	/**
+	 * Create a concrete implementation of import dependency model.
+	 * 
+	 * @see Import
+	 * @return import dependency model
+	 * @since 2.0
+	 */
+	public ImportModel createImportModel() {
+		return new Import();
+	}
+
+	/**
+	 * Create a concrete implementation of plug-in entry model.
+	 * 
+	 * @see PluginEntry
+	 * @return plug-in entry model
+	 * @since 2.0
+	 */
+	public PluginEntryModel createPluginEntryModel() {
+		return new PluginEntry();
+	}
+
+	/**
+	 * Create a concrete implementation of non-plug-in entry model.
+	 * 
+	 * @see NonPluginEntry
+	 * @return non-plug-in entry model
+	 * @since 2.0
+	 */
+	public NonPluginEntryModel createNonPluginEntryModel() {
+		return new NonPluginEntry();
+	}
+
+	/**
+	 * Create a concrete implementation of annotated URL model.
+	 * 
+	 * @see URLEntry
+	 * @return annotated URL model
+	 * @since 2.0
+	 */
+	public URLEntryModel createURLEntryModel() {
+		return new URLEntry();
+	}
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/BaseInstallHandler.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/BaseInstallHandler.java
new file mode 100644
index 0000000..a3f5f11
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/BaseInstallHandler.java
@@ -0,0 +1,252 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * Base implementation of an install handler.
+ * This is a convenience implementation of an install handler with
+ * null implementation of its methods. It allows subclasses to selectively
+ * implement only the methods required for their installation tasks.
+ * <p>
+ * This class should be subclassed by clients.
+ * </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 org.eclipse.update.core.IInstallHandler
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class BaseInstallHandler implements IInstallHandler {
+
+	/**
+	 * Update action type
+	 * 
+	 * @see IInstallHandler#HANDLER_ACTION_INSTALL
+	 * @see IInstallHandler#HANDLER_ACTION_CONFIGURE
+	 * @see IInstallHandler#HANDLER_ACTION_UNCONFIGURE
+	 * @see IInstallHandler#HANDLER_ACTION_UNINSTALL
+	 * @since 2.0
+	 */
+	protected int type;
+
+	/**
+	 * The target of the action
+	 * @since 2.0
+	 */
+	protected IFeature feature;
+
+	/**
+	 * Model entry that defines this handler
+	 * 
+	 * @since 2.0
+	 */
+	protected IInstallHandlerEntry entry;
+
+	/** 
+	 * Optional progress monitor, can be <code>null</code>
+	 * 
+	 * @since 2.0
+	 */
+	protected InstallMonitor monitor;
+
+	/**
+	 * Plug-in entries downloaded
+	 * 
+	 * @see IInstallHandler#HANDLER_ACTION_INSTALL
+	 * @since 2.0
+	 */
+	protected IPluginEntry[] pluginEntries;
+
+	/**
+	 * Non-plug-in entries downloaded
+	 * 
+	 * @see IInstallHandler#HANDLER_ACTION_INSTALL
+	 * @since 2.0
+	 */
+	protected INonPluginEntry[] nonPluginEntries;
+
+	/**
+	 * Indicates if handler has been initialized
+	 * 
+	 * @since 2.0
+	 */
+	protected boolean initialized = false;
+
+	/**
+	 * Initialize the install handler.
+	 * 
+	 * @see IInstallHandler#initialize(int, IFeature, IInstallHandlerEntry, InstallMonitor)
+	 * @since 2.0
+	 */
+	public void initialize(
+		int type,
+		IFeature feature,
+		IInstallHandlerEntry entry,
+		InstallMonitor monitor)
+		throws CoreException {
+
+		if (this.initialized)
+			return;
+		else {
+			if (feature == null)
+				throw new IllegalArgumentException();
+			this.type = type;
+			this.feature = feature;
+			this.entry = entry;
+			this.monitor = monitor;
+			this.initialized = true;
+		}
+	}
+
+	/**
+	 * Called at the start of the install action.
+	 * 
+	 * @see IInstallHandler#installInitiated
+	 * @since 2.0
+	 */
+	public void installInitiated() throws CoreException {
+	}
+
+	/**
+	 * Called after files corresponding to plug-in entries have been downloaded,
+	 * but before they are actually unpacked and installed.
+	 * 
+	 * @see IInstallHandler#pluginsDownloaded(IPluginEntry[])
+	 * @since 2.0
+	 */
+	public void pluginsDownloaded(IPluginEntry[] plugins) throws CoreException {
+
+		this.pluginEntries = plugins;
+	}
+
+	/**
+	 * Called after files corresponding to non-plug-in entries have been 
+	 * downloaded.
+	 * 
+	 * @see IInstallHandler#nonPluginDataDownloaded(INonPluginEntry[], IVerificationListener)
+	 * @since 2.0
+	 */
+	public void nonPluginDataDownloaded(
+		INonPluginEntry[] nonPluginData,
+		IVerificationListener listener)
+		throws CoreException {
+
+		this.nonPluginEntries = nonPluginData;
+	}
+
+	/**
+	 * Called after the feature files and any downloaded plug-ins have
+	 * been installed. 
+	 * 
+	 * @see IInstallHandler#completeInstall(IFeatureContentConsumer)
+	 * @since 2.0
+	 */
+	public void completeInstall(IFeatureContentConsumer consumer)
+		throws CoreException {
+	}
+
+	/**
+	 * Called at the end of the install action.
+	 * 
+	 * @see IInstallHandler#installCompleted(boolean)
+	 * @since 2.0
+	 */
+	public void installCompleted(boolean success) throws CoreException {
+	}
+
+	/**
+	 * Called at the start of the configure action.
+	 * 
+	 * @see IInstallHandler#configureInitiated()
+	 * @since 2.0
+	 */
+	public void configureInitiated() throws CoreException {
+	}
+
+	/**
+	 * Called after the feature has been configured.
+	 * 
+	 * @see IInstallHandler#completeConfigure()
+	 * @since 2.0
+	 */
+	public void completeConfigure() throws CoreException {
+	}
+
+	/**
+	 * Called at the end of the configure action.
+	 * 
+	 * @see IInstallHandler#configureCompleted(boolean)
+	 * @since 2.0
+	 */
+	public void configureCompleted(boolean success) throws CoreException {
+	}
+
+	/**
+	 * Called at the start of the unconfigure action.
+	 * 
+	 * @see IInstallHandler#unconfigureInitiated()
+	 * @since 2.0
+	 */
+	public void unconfigureInitiated() throws CoreException {
+	}
+
+	/**
+	 * Called after the feature has been unconfigured.
+	 * 
+	 * @see IInstallHandler#completeUnconfigure()
+	 * @since 2.0
+	 */
+	public void completeUnconfigure() throws CoreException {
+	}
+
+	/**
+	 * Called at the end of the unconfigure action.
+	 * 
+	 * @see IInstallHandler#unconfigureCompleted(boolean)
+	 * @since 2.0
+	 */
+	public void unconfigureCompleted(boolean success) throws CoreException {
+	}
+
+	/**
+	 * Called at the start of the uninstall action.
+	 * 
+	 * @see IInstallHandler#uninstallInitiated()
+	 * @since 2.0
+	 */
+	public void uninstallInitiated() throws CoreException {
+	}
+
+	/**
+	 * Called after the feature has been uninstalled.
+	 * 
+	 * @see IInstallHandler#completeUninstall()
+	 * @since 2.0
+	 */
+	public void completeUninstall() throws CoreException {
+	}
+
+	/**
+	 * Called at the end of the uninstall action.
+	 * 
+	 * @see IInstallHandler#uninstallCompleted(boolean)
+	 * @since 2.0
+	 */
+	public void uninstallCompleted(boolean success) throws CoreException {
+	}
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/BaseSiteFactory.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/BaseSiteFactory.java
new file mode 100644
index 0000000..650bd1d
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/BaseSiteFactory.java
@@ -0,0 +1,165 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+ 
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.update.core.model.ArchiveReferenceModel;
+import org.eclipse.update.core.model.CategoryModel;
+import org.eclipse.update.core.model.InvalidSiteTypeException;
+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.internal.core.Messages;
+import org.eclipse.update.internal.core.UpdateCore;
+import org.eclipse.update.internal.core.UpdateManagerUtils;
+import org.eclipse.update.internal.core.connection.ConnectionFactory;
+import org.eclipse.update.internal.core.connection.IResponse;
+
+/**
+ * Base implementation of a site factory.
+ * The factory is responsible for constructing the correct
+ * concrete implementation of the model objects for each particular
+ * site type. This class creates model objects that correspond
+ * to the concrete implementation classes provided in this package.
+ * The actual site creation method is subclass responsibility.
+ * <p>
+ * This class must be subclassed by clients.
+ * </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 org.eclipse.update.core.ISiteFactory
+ * @see org.eclipse.update.core.model.SiteModelFactory
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public abstract class BaseSiteFactory extends SiteModelFactory implements ISiteFactory {
+
+
+	/**
+	 * Create site. Implementation of this method must be provided by 
+	 * subclass
+	 * 
+	 * @see ISiteFactory#createSite(URL)
+	 * @since 2.0
+	 */
+	public abstract ISite createSite(URL url) throws CoreException, InvalidSiteTypeException;
+
+	/**
+	 * Helper method to access resouce bundle for site. The default 
+	 * implementation attempts to load the appropriately localized 
+	 * site.properties file.
+	 * 
+	 * @param url base URL used to load the resource bundle.
+	 * @return resource bundle, or <code>null</code>.
+	 * @since 2.0
+	 */
+	protected ResourceBundle getResourceBundle(URL url) {
+		ResourceBundle bundle = null;
+
+		try {
+			url = UpdateManagerUtils.asDirectoryURL(url);
+			ClassLoader l = new URLClassLoader(new URL[] { url }, null);
+			bundle = ResourceBundle.getBundle(Site.SITE_FILE, Locale.getDefault(), l);
+		} catch (MissingResourceException e) {
+			UpdateCore.warn(e.getLocalizedMessage() + ":" + url.toExternalForm()); //$NON-NLS-1$
+		} catch (MalformedURLException e) {
+			UpdateCore.warn(NLS.bind(Messages.BaseSiteFactory_CannotRetriveParentDirectory, (new String[] { url.toExternalForm() })));
+		}
+
+		return bundle;
+	}
+
+	/**
+	 * Create a concrete implementation of site model.
+	 * 
+	 * @see Site
+	 * @return site model
+	 * @since 2.0
+	 */
+	public SiteModel createSiteMapModel() {
+		return new Site();
+	}
+
+
+	/**
+	 * Create a concrete implementation of feature reference model.
+	 * 
+	 * @see FeatureReference
+	 * @return feature reference model
+	 * @since 2.0
+	 */
+	public SiteFeatureReferenceModel createFeatureReferenceModel() {
+		return new SiteFeatureReference();
+	}
+
+	/**
+	 * Create a concrete implementation of archive reference model.
+	 * 
+	 * @see ArchiveReference
+	 * @return archive reference model
+	 * @since 2.0
+	 */
+	public ArchiveReferenceModel createArchiveReferenceModel() {
+		return new ArchiveReference();
+	}
+
+
+	/**
+	 * Create a concrete implementation of annotated URL model.
+	 * 
+	 * @see URLEntry
+	 * @return annotated URL model
+	 * @since 2.0
+	 */
+	public URLEntryModel createURLEntryModel() {
+		return new URLEntry();
+	}
+
+
+	/**
+	 * Create a concrete implementation of category model.
+	 * 
+	 * @see Category
+	 * @return category model
+	 * @since 2.0
+	 */
+	public CategoryModel createSiteCategoryModel() {
+		return new Category();
+	}
+
+	/**
+	 * Open a stream on a URL.
+	 * manages a time out if the connection is locked or fails
+	 * 
+	 * @param resolvedURL
+	 * @return InputStream
+	 */
+	protected InputStream openStream(URL resolvedURL)  throws IOException {
+		IResponse response = ConnectionFactory.get(resolvedURL);
+		return response.getInputStream();
+	}
+
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/Category.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/Category.java
new file mode 100644
index 0000000..73d1d56
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/Category.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import org.eclipse.update.core.model.CategoryModel;
+
+/**
+ * Convenience implementation of feature category definition.
+ * <p>
+ * This class may be instantiated or subclassed by clients.
+ * </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 org.eclipse.update.core.ICategory
+ * @see org.eclipse.update.core.model.CategoryModel
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class Category extends CategoryModel implements ICategory {
+
+	/**
+	 * Default Constructor
+	 */
+	public Category() {
+	}
+
+	/**
+	 * Constructor
+	 */
+	public Category(String name, String label) {
+		setName(name);
+		setLabel(label);
+	}
+
+	/**
+	 * Retrieve the detailed category description
+	 * @see ICategory#getDescription()
+	 */
+	public IURLEntry getDescription() {
+		return (IURLEntry) getDescriptionModel();
+	}
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/ContentReference.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/ContentReference.java
new file mode 100644
index 0000000..632e409
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/ContentReference.java
@@ -0,0 +1,340 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.update.internal.core.FatalIOException;
+import org.eclipse.update.internal.core.Messages;
+import org.eclipse.update.internal.core.URLEncoder;
+import org.eclipse.update.internal.core.UpdateManagerUtils;
+import org.eclipse.update.internal.core.connection.ConnectionFactory;
+import org.eclipse.update.internal.core.connection.HttpResponse;
+import org.eclipse.update.internal.core.connection.IResponse;
+
+/**
+ * Content reference implements a general access wrapper 
+ * to feature and site content. The reference specifies
+ * a "symbolic" path identifier for the content, and the actual
+ * reference as a file, or a URL.
+ * <p>
+ * This class may be instantiated or subclassed by clients.
+ * </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 org.eclipse.update.core.JarContentReference
+ * @see org.eclipse.update.core.JarEntryContentReference
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class ContentReference {
+
+	/**
+	 * Unknown size indication
+	 * @since 2.0
+	 */
+	public static final long UNKNOWN_SIZE = -1;
+
+	/**
+	 * Default executable permission when installing a content reference
+	 * Will add executable bit if necessary
+	 * 
+	 * @since 2.0.1
+	 */
+	public static final int DEFAULT_EXECUTABLE_PERMISSION = -1;
+
+	private static final String FILE_URL_PROTOCOL = "file"; //$NON-NLS-1$
+
+	private String id;
+	private URL url; // reference is either URL reference *OR*
+	private File file; //    local file reference
+	private IResponse response;
+	private int permission; 
+	private long length;
+	
+	// <true> if a copy of a Contentreferenec in a temp local directory
+	private boolean tempLocal = false;
+	
+	private long lastModified;
+
+	/**
+	 * Create content reference from URL.
+	 * 
+	 * @param id "symbolic" path identifier
+	 * @param url actual referenced URL
+	 * @since 2.0
+	 */
+	public ContentReference(String id, URL url) {
+		this.id = (id == null ? "" : id); //$NON-NLS-1$
+		this.url = url; // can be null
+		this.file = null;
+	}
+
+	/**
+	 * Create content reference from file.
+	 * 
+	 * @param id "symbolic" path identifier
+	 * @param file actual referenced file
+	 * @since 2.0
+	 */
+	public ContentReference(String id, File file) {
+		this.id = (id == null ? "" : id); //$NON-NLS-1$
+		this.file = file; // can be null
+		this.url = null;
+	}
+
+	/**
+	 * A factory method to create a content reference of
+	 * the same type.
+	 * 
+	 * @param id "symbolic" path identifier
+	 * @param file actual referenced file
+	 * @return content reference of the same type
+	 * @since 2.0
+	 */
+	public ContentReference createContentReference(String id, File file) {
+		return new ContentReference(id, file,true);
+	}
+	/**
+	 * 
+	 */
+	private ContentReference(String id, File file, boolean b) {
+		this(id,file);
+		setTempLocal(b);
+	}
+
+	/**
+	 * Retrieves the "symbolic" path identifier for the reference.
+	 * 
+	 * @return "symbolic" path identifier
+	 * @since 2.0
+	 */
+	public String getIdentifier() {
+		return id;
+	}
+
+	/**
+	 * Creates an input stream for the reference.
+	 * 
+	 * @return input stream
+	 * @exception IOException unable to create stream
+	 * @since 2.0
+	 */
+	public InputStream getInputStream() throws IOException {
+		if (file != null)
+			return new FileInputStream(file);
+		else if (url != null) {
+			if (response == null) {
+				URL resolvedURL = URLEncoder.encode(url);
+				response = ConnectionFactory.get(resolvedURL);
+				UpdateManagerUtils.checkConnectionResult(response,resolvedURL);
+			}
+			InputStream is=response.getInputStream();
+			length=response.getContentLength();
+			return is;
+		} else
+			throw new FatalIOException(NLS.bind(Messages.ContentReference_UnableToCreateInputStream, (new String[] { this.toString() })));
+	}
+	/**
+	 * Creates an input stream for the reference.
+	 * 
+	 * @return input stream
+	 * @exception IOException unable to create stream
+	 * @since 2.0
+	 */
+	InputStream getPartialInputStream(long offset) throws IOException {
+		if (url != null && "http".equals(url.getProtocol())) { //$NON-NLS-1$
+			URL resolvedURL = URLEncoder.encode(url);
+			response = ConnectionFactory.get(resolvedURL);
+			if(response instanceof HttpResponse)
+				((HttpResponse)response).setOffset(offset);
+			UpdateManagerUtils.checkConnectionResult(response,resolvedURL);
+			InputStream is = response.getInputStream();
+			length=offset + response.getContentLength();
+			return is;
+		} else
+			throw new FatalIOException(NLS.bind(Messages.ContentReference_UnableToCreateInputStream, (new String[] { this.toString() })));
+	}
+	
+	/**
+	 * Returns the size of the referenced input, if it can be determined.
+	 * 
+	 * @return input size, or @see #UNKNOWN_SIZE if size cannot be determined.
+	 * @since 2.0
+	 */
+	public long getInputSize() throws IOException {
+		if (length>0)
+			return length;
+		if (file != null)
+			return file.length();
+		else if (url != null) {
+			if (response == null) {
+				URL resolvedURL = null;
+				try {
+					resolvedURL = URLEncoder.encode(url);
+					response = ConnectionFactory.get(resolvedURL);
+				} catch (IOException e) {
+					return ContentReference.UNKNOWN_SIZE;
+				}
+				UpdateManagerUtils.checkConnectionResult(response,resolvedURL);			
+			}
+			long size = response.getContentLength();
+			return size == -1 ? ContentReference.UNKNOWN_SIZE : size;
+		} else
+			return ContentReference.UNKNOWN_SIZE;
+	}
+
+	/**
+	 * Indicates whether the reference is a local file reference.
+	 * 
+	 * @return <code>true</code> if the reference is local, 
+	 * otherwise <code>false</code>
+	 * @since 2.0
+	 */
+	public boolean isLocalReference() {
+		/*if (file != null)
+			return true;
+		else if (url != null)
+			return FILE_URL_PROTOCOL.equals(url.getProtocol());
+		else
+			return false;*/
+		// only temp files are considered local
+		return tempLocal;
+	}
+
+	/**
+	 * Returns the content reference as a file. Note, that this method
+	 * <b>does not</b> cause the file to be downloaded if it
+	 * is not already local.
+	 * 
+	 * @return reference as file
+	 * @exception IOException reference cannot be returned as file
+	 * @since 2.0
+	 */
+	public File asFile() throws IOException {
+		if (file != null)
+			return file;
+
+		if (url != null && FILE_URL_PROTOCOL.equals(url.getProtocol())) {
+			File result = new File(url.getFile());
+			if (result.exists())
+				return result;
+			else 
+				throw new IOException(NLS.bind(Messages.ContentReference_FileDoesNotExist, (new String[] { this.toString() }))); 			
+		}
+
+		throw new IOException(NLS.bind(Messages.ContentReference_UnableToReturnReferenceAsFile, (new String[] { this.toString() }))); 
+	}
+
+	/**
+	 * Returns the content reference as a URL.
+	 * 
+	 * @return reference as URL
+	 * @exception IOException reference cannot be returned as URL
+	 * @since 2.0
+	 */
+	public URL asURL() throws IOException {
+		if (url != null)
+			return url;
+
+		if (file != null)
+			return file.toURL();
+
+		throw new FatalIOException(NLS.bind(Messages.ContentReference_UnableToReturnReferenceAsURL, (new String[] { this.toString() })));
+	}
+
+	/**
+	 * Return string representation of this reference.
+	 * 
+	 * @return string representation
+	 * @since 2.0
+	 */
+	public String toString() {
+		if (file != null)
+			return file.getAbsolutePath();
+		else
+			return url.toExternalForm();
+	}
+	/**
+	 * Returns the permission for this file.
+	 * 
+	 * @return the content reference permission
+	 * @see #DEFAULT_EXECUTABLE_PERMISSION
+	 * @since 2.0.1
+	 */
+	public int getPermission() {
+		return permission;
+	}
+
+	/**
+	 * Sets the permission of this content reference.
+	 * 
+	 * @param permission The permission to set
+	 */
+	public void setPermission(int permission) {
+		this.permission = permission;
+	}
+
+	/**
+	 * Sets if a content reference is considered local 
+	 * 
+	 * @param tempLocal <code>true</code> if the file is considered local
+	 */
+	protected void setTempLocal(boolean tempLocal) {
+		this.tempLocal = tempLocal;
+	}
+	
+	/**
+	 * Sets the timestamp the content was last modified.
+	 * @param timestamp
+	 * @since 3.0
+	 */
+	public void setLastModified(long timestamp) {
+		this.lastModified = timestamp;
+	}
+	
+	/**
+	 * Returns the timestamp when the content was last modified
+	 * @return the timestamp
+	 * @since 3.0
+	 */
+	public long getLastModified() {
+		if (lastModified == 0) {
+			if (file != null) 
+				lastModified = file.lastModified();
+			else if (url != null) {
+				if (response == null) {
+					try {
+						URL resolvedURL = URLEncoder.encode(url);
+						response = ConnectionFactory.get(resolvedURL);
+					} catch (MalformedURLException e) {
+						// return 0
+					} catch (IOException e) {
+						// return 0
+					}
+				}
+				lastModified = response.getLastModified();
+			} 
+		}
+		return lastModified;
+	}
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/Feature.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/Feature.java
new file mode 100644
index 0000000..329ef57
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/Feature.java
@@ -0,0 +1,1163 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.Vector;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.update.core.model.ContentEntryModel;
+import org.eclipse.update.core.model.FeatureModel;
+import org.eclipse.update.core.model.FeatureReferenceModel;
+import org.eclipse.update.core.model.ImportModel;
+import org.eclipse.update.core.model.InstallAbortedException;
+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.internal.core.ErrorRecoveryLog;
+import org.eclipse.update.internal.core.InstallHandlerProxy;
+import org.eclipse.update.internal.core.InstallRegistry;
+import org.eclipse.update.internal.core.Messages;
+import org.eclipse.update.internal.core.TargetFeature;
+import org.eclipse.update.internal.core.UpdateCore;
+import org.eclipse.update.internal.core.UpdateManagerUtils;
+import org.eclipse.update.internal.core.UpdateSiteIncludedFeatureReference;
+
+/**
+ * Convenience implementation of a feature.
+ * <p>
+ * This class may be instantiated or subclassed by clients.
+ * </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 org.eclipse.update.core.IFeature
+ * @see org.eclipse.update.core.model.FeatureModel
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class Feature extends FeatureModel implements IFeature {
+
+	/**
+	 * Simple file name of the default feature manifest file
+	 * @since 2.0
+	 */
+	public static final String FEATURE_FILE = "feature"; //$NON-NLS-1$
+
+	/**
+	 * File extension of the default feature manifest file
+	 * @since 2.0
+	 */
+	public static final String FEATURE_XML = FEATURE_FILE + ".xml"; //$NON-NLS-1$
+
+	private ISite site; // feature site
+	private IFeatureContentProvider featureContentProvider; // content provider
+	private List /*of IFeatureReference*/
+	includedFeatureReferences;
+
+	//PERF: new instance variable
+	private VersionedIdentifier versionId;
+
+	private InstallAbortedException abortedException = null;
+
+	/**
+	 * Feature default constructor
+	 * 
+	 * @since 2.0
+	 */
+	public Feature() {
+	}
+
+	/**
+	 * Compares two features for equality
+	 * 
+	 * @param object feature object to compare with
+	 * @return <code>true</code> if the two features are equal, 
+	 * <code>false</code> otherwise
+	 * @since 2.0
+	 */
+	public boolean equals(Object object) {
+		if (!(object instanceof IFeature))
+			return false;
+		IFeature f = (IFeature) object;
+		return getVersionedIdentifier().equals(f.getVersionedIdentifier());
+	}
+
+	/**
+	 * Returns the feature identifier.
+	 * 
+	 * @see IFeature#getVersionedIdentifier()
+	 * @since 2.0
+	 */
+	public VersionedIdentifier getVersionedIdentifier() {
+		if (versionId != null)
+			return versionId;
+
+		String id = getFeatureIdentifier();
+		String ver = getFeatureVersion();
+		if (id != null && ver != null) {
+			try {
+				versionId = new VersionedIdentifier(id, ver);
+				return versionId;
+			} catch (Exception e) {
+				UpdateCore.warn(
+					"Unable to create versioned identifier:" + id + ":" + ver); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		}
+
+		versionId = new VersionedIdentifier(getURL().toExternalForm(), null);
+		return versionId;
+	}
+
+	/**
+	 * Returns the site this feature is associated with.
+	 * 
+	 * @see IFeature#getSite()
+	 * @since 2.0
+	 */
+	public ISite getSite() {
+		return site;
+	}
+
+	/**
+	 * Returns the feature URL.
+	 * 
+	 * @see IFeature#getURL()
+	 * @since 2.0
+	 */
+	public URL getURL() {
+		IFeatureContentProvider contentProvider = null;
+		try {
+			contentProvider = getFeatureContentProvider();
+		} catch (CoreException e) {
+			UpdateCore.warn("No content Provider", e); //$NON-NLS-1$
+		}
+		return (contentProvider != null) ? contentProvider.getURL() : null;
+	}
+
+	/**
+	 * Returns an information entry referencing the location of the
+	 * feature update site. 
+	 * 
+	 * @see IFeature#getUpdateSiteEntry()
+	 * @since 2.0
+	 */
+	public IURLEntry getUpdateSiteEntry() {
+		return (IURLEntry) getUpdateSiteEntryModel();
+	}
+
+	/**
+	 * Return an array of information entries referencing locations of other
+	 * update sites.
+	 * 
+	 * @see IFeature#getDiscoverySiteEntries()
+	 * @since 2.0
+	 */
+	public IURLEntry[] getDiscoverySiteEntries() {
+		URLEntryModel[] result = getDiscoverySiteEntryModels();
+		if (result.length == 0)
+			return new IURLEntry[0];
+		else
+			return (IURLEntry[]) result;
+	}
+
+	/**
+	 * Returns and optional custom install handler entry.
+	 * 
+	 * @see IFeature#getInstallHandlerEntry()
+	 * @since 2.0
+	 */
+	public IInstallHandlerEntry getInstallHandlerEntry() {
+		return (IInstallHandlerEntry) getInstallHandlerModel();
+	}
+
+	/**
+	 * Returns the feature description.
+	 * 
+	 * @see IFeature#getDescription()
+	 * @since 2.0
+	 */
+	public IURLEntry getDescription() {
+		return (IURLEntry) getDescriptionModel();
+	}
+
+	/**
+	 * Returns the copyright information for the feature.
+	 * 
+	 * @see IFeature#getCopyright()
+	 * @since 2.0
+	 */
+	public IURLEntry getCopyright() {
+		return (IURLEntry) getCopyrightModel();
+	}
+
+	/**
+	 * Returns the license information for the feature.
+	 * 
+	 * @see IFeature#getLicense()
+	 * @since 2.0
+	 */
+	public IURLEntry getLicense() {
+		return (IURLEntry) getLicenseModel();
+	}
+
+	/**
+	 * Return optional image for the feature.
+	 * 
+	 * @see IFeature#getImage()
+	 * @since 2.0
+	 */
+	public URL getImage() {
+		return getImageURL();
+	}
+
+	/**
+	 * Return a list of plug-in dependencies for this feature.
+	 * 
+	 * @see IFeature#getRawImports()
+	 * @since 2.0
+	 */
+	public IImport[] getRawImports() {
+		ImportModel[] result = getImportModels();
+		if (result.length == 0)
+			return new IImport[0];
+		else
+			return (IImport[]) result;
+	}
+
+	/**
+	 * Install the contents of this feature into the specified target feature.
+	 * This method is a reference implementation of the feature installation
+	 * protocol. Other concrete feature implementation that override this
+	 * method need to implement this protocol.
+	 * 
+	 * @see IFeature#install(IFeature, IVerificationListener, IProgressMonitor)
+	 * @since 2.0
+	 */
+	public IFeatureReference install(
+		IFeature targetFeature,
+		IVerificationListener verificationListener,
+		IProgressMonitor progress)
+		throws InstallAbortedException, CoreException {
+		// call other API with all optional features, or setup variable meaning install all
+		return install(targetFeature, null, verificationListener, progress);
+	}
+
+	/**
+	 * Install the contents of this feature into the specified target feature.
+	 * This method is a reference implementation of the feature installation
+	 * protocol. Other concrete feature implementation that override this
+	 * method need to implement this protocol.
+	 * 
+	 * @see IFeature#install(IFeature, IVerificationListener, IProgressMonitor)
+	 * @since 2.0
+	 */
+	public IFeatureReference install(
+		IFeature targetFeature,
+		IFeatureReference[] optionalfeatures,
+		IVerificationListener verificationListener,
+		IProgressMonitor progress)
+		throws InstallAbortedException, CoreException {
+
+		//DEBUG
+		debug("Installing...:" + getURL().toExternalForm()); //$NON-NLS-1$
+		ErrorRecoveryLog recoveryLog = ErrorRecoveryLog.getLog();
+
+		// make sure we have an InstallMonitor		
+		InstallMonitor monitor;
+		if (progress == null)
+			monitor = new InstallMonitor(new NullProgressMonitor());
+		else if (progress instanceof InstallMonitor)
+			monitor = (InstallMonitor) progress;
+		else
+			monitor = new InstallMonitor(progress);
+
+		// Setup optional install handler
+		InstallHandlerProxy handler =
+			new InstallHandlerProxy(
+				IInstallHandler.HANDLER_ACTION_INSTALL,
+				this,
+				this.getInstallHandlerEntry(),
+				monitor);
+		boolean success = false;
+		Throwable originalException = null;
+		abortedException = null;
+
+		// Get source feature provider and verifier.
+		// Initialize target variables.
+		IFeatureContentProvider provider = getFeatureContentProvider();
+		IVerifier verifier = provider.getVerifier();
+		IFeatureReference result = null;
+		IFeatureReference alreadyInstalledFeature = null;
+		IFeatureContentConsumer consumer = null;
+		IPluginEntry[] targetSitePluginEntries = null;
+		ArrayList justInstalledPlugins = new ArrayList();
+
+		try {
+			// determine list of plugins to install
+			// find the intersection between the plugin entries already contained
+			// on the target site, and plugin entries packaged in source feature
+			IPluginEntry[] sourceFeaturePluginEntries = getPluginEntries();
+			ISite targetSite = targetFeature.getSite();
+			if (targetSite == null) {
+				debug("The site to install in is null"); //$NON-NLS-1$
+				targetSitePluginEntries = new IPluginEntry[0];
+			} else {
+				targetSitePluginEntries = targetSite.getPluginEntries();
+			}
+			IPluginEntry[] pluginsToInstall =
+				UpdateManagerUtils.diff(
+					sourceFeaturePluginEntries,
+					targetSitePluginEntries);
+			INonPluginEntry[] nonPluginsToInstall = getNonPluginEntries();
+
+			IFeatureReference[] children = getIncludedFeatureReferences();
+			if (optionalfeatures != null) {
+				children =
+					UpdateManagerUtils.optionalChildrenToInstall(
+						children,
+						optionalfeatures);
+			}
+
+			// determine number of monitor tasks
+			//   2 tasks for the feature jar (download/verify + install)
+			// + 2*n tasks for plugin entries (download/verify + install for each)
+			// + 1*m tasks per non-plugin data entry (download for each)
+			// + 1 task for custom non-plugin entry handling (1 for all combined)
+			// + 5*x tasks for children features (5 subtasks per install)
+			int taskCount =
+				2
+					+ 2 * pluginsToInstall.length
+					+ nonPluginsToInstall.length
+					+ 1
+					+ 5 * children.length;
+			monitor.beginTask("", taskCount); //$NON-NLS-1$
+			SubProgressMonitor subMonitor = null;
+
+			// start log
+			recoveryLog.open(ErrorRecoveryLog.START_INSTALL_LOG);
+
+			// Start the installation tasks			
+			handler.installInitiated();
+
+			// Download and verify feature archive(s)
+			ContentReference[] references =
+				provider.getFeatureEntryArchiveReferences(monitor);
+			verifyReferences(
+				verifier,
+				references,
+				monitor,
+				verificationListener,
+				true);
+			monitorWork(monitor, 1);
+			
+			// Download and verify plugin archives
+			for (int i = 0; i < pluginsToInstall.length; i++) {
+				references = provider.getPluginEntryArchiveReferences(
+						pluginsToInstall[i], monitor);
+				verifyReferences(verifier, references, monitor,
+								verificationListener, false);
+				monitorWork(monitor, 1);
+			}
+			
+			handler.pluginsDownloaded(pluginsToInstall);
+
+			Vector filteredPlugins = new Vector();
+            // Download non-plugin archives. Verification handled by optional
+            // install handler
+            for (int i = 0; i < nonPluginsToInstall.length; i++) {
+                if (handler.acceptNonPluginData(nonPluginsToInstall[i])) {
+                    references = provider.getNonPluginEntryArchiveReferences(
+                            nonPluginsToInstall[i], monitor);
+                    monitorWork(monitor, 1);
+                    filteredPlugins.add(nonPluginsToInstall[i]);
+                }
+            }
+            nonPluginsToInstall = (INonPluginEntry[]) filteredPlugins
+                    .toArray(new INonPluginEntry[0]);
+            handler.nonPluginDataDownloaded(nonPluginsToInstall,
+                    verificationListener);
+
+			// All archives are downloaded and verified. Get ready to install
+			consumer = targetFeature.getFeatureContentConsumer();
+
+			// install the children feature
+			// check if they are optional, and if they should be installed [2.0.1]
+			for (int i = 0; i < children.length; i++) {
+				IFeature childFeature = null;
+				try {
+					childFeature = children[i].getFeature(null);
+				} catch (CoreException e) {
+					UpdateCore.warn(null, e);
+				}
+				if (childFeature != null) {
+					subMonitor = new SubProgressMonitor(monitor, 5);
+					((Site) targetSite).install(// need to cast
+					childFeature,
+						optionalfeatures,
+						consumer,
+						verifier,
+						verificationListener,
+						subMonitor);
+				}
+			}
+
+			// Install plugin files
+			for (int i = 0; i < pluginsToInstall.length; i++) {
+				// if another feature has already installed this plugin, skip it
+				if (InstallRegistry.getInstance().isPluginJustInstalled(pluginsToInstall[i])) {
+					monitor.worked(1);
+					continue;
+				}
+				IContentConsumer pluginConsumer =
+					consumer.open(pluginsToInstall[i]);
+				// TODO consumer.open returns either
+				// SiteFilePackedPluginContentConsumer or SiteFilePluginContentConsumer
+				// and they are fed either
+				// PluginEntryArchiveReference or PluginEntryContentReferences
+				// it would be better to have one that is given PluginEntryArchiveReference
+				// but it would break external IContentConsumers
+
+				if(pluginsToInstall[i] instanceof PluginEntryModel && !((PluginEntryModel)pluginsToInstall[i]).isUnpack()){
+					// plugin can run from a jar
+					references = provider.getPluginEntryArchiveReferences(
+							pluginsToInstall[i], monitor);
+				} else{
+					// plugin must be unpacked
+					references =
+						provider.getPluginEntryContentReferences(
+							pluginsToInstall[i],
+							monitor);
+				}
+
+				String msg = ""; //$NON-NLS-1$
+				subMonitor = new SubProgressMonitor(monitor, 1);
+				VersionedIdentifier pluginVerId =
+					pluginsToInstall[i].getVersionedIdentifier();
+				String pluginID =
+					(pluginVerId == null) ? "" : pluginVerId.getIdentifier(); //$NON-NLS-1$
+				msg = NLS.bind(Messages.Feature_TaskInstallPluginFiles, (new String[] { pluginID }));
+
+				for (int j = 0; j < references.length; j++) {
+					setMonitorTaskName(
+						subMonitor,
+						msg + references[j].getIdentifier());
+					pluginConsumer.store(references[j], subMonitor);
+				}
+
+				if (monitor.isCanceled())
+					abort();
+				else {
+					justInstalledPlugins.add(pluginsToInstall[i]);
+					InstallRegistry.registerPlugin(pluginsToInstall[i]);
+				}
+			}
+
+			// check if we need to install feature files [16718]	
+			// store will throw CoreException if another feature is already
+			// installed in the same place
+			alreadyInstalledFeature = featureAlreadyInstalled(targetSite);
+			// 18867
+			if (alreadyInstalledFeature == null) {
+				//Install feature files
+				references = provider.getFeatureEntryContentReferences(monitor);
+
+				String msg = ""; //$NON-NLS-1$
+				subMonitor = new SubProgressMonitor(monitor, 1);
+				msg = Messages.Feature_TaskInstallFeatureFiles; 
+
+				for (int i = 0; i < references.length; i++) {
+					setMonitorTaskName(
+						subMonitor,
+						msg + " " + references[i].getIdentifier()); //$NON-NLS-1$
+					consumer.store(references[i], subMonitor);
+				}
+
+				if (monitor.isCanceled())
+					abort();
+				else
+					InstallRegistry.registerFeature(this);
+			} else {
+				if (monitor.isCanceled())
+					abort();
+				else
+					monitor.worked(1);
+			}
+
+			// call handler to complete installation (eg. handle non-plugin entries)
+			handler.completeInstall(consumer);
+			monitorWork(monitor, 1);
+
+			// indicate install success
+			success = true;
+
+		} catch (InstallAbortedException e) {
+			abortedException = e;
+		} catch (CoreException e) {
+			originalException = e;
+		} finally {
+			Exception newException = null;
+			try {
+				if (consumer != null) {
+					if (success) {
+						result = consumer.close();
+						if (result == null) {
+							result = alreadyInstalledFeature; // 18867
+							if (result != null
+								&& optionalfeatures != null
+								&& optionalfeatures.length > 0) {
+								// reinitialize as new optional children may have been installed
+								reinitializeFeature(result);
+							}
+						}
+						// close the log
+						recoveryLog.close(ErrorRecoveryLog.END_INSTALL_LOG);
+					} else {
+						// unregister the just installed plugins
+						for (int i=0; i<justInstalledPlugins.size(); i++)
+							InstallRegistry.unregisterPlugin(((IPluginEntry)justInstalledPlugins.get(i)));
+						consumer.abort();
+					}
+				}
+				handler.installCompleted(success);
+				// if abort is done, no need for the log to stay
+				recoveryLog.delete();
+			} catch (CoreException e) {
+				newException = e;
+			}
+
+			// original exception wins unless it is InstallAbortedException
+			// and an error occured during abort
+			if (originalException != null) {
+				throw Utilities.newCoreException(
+					NLS.bind(Messages.InstallHandler_error, (new String[] { this.getLabel() })),
+					originalException);
+			}
+
+			if (newException != null)
+				throw Utilities.newCoreException(
+					NLS.bind(Messages.InstallHandler_error, (new String[] { this.getLabel() })),
+					newException);
+
+			if (abortedException != null) {
+				throw abortedException;
+			}
+
+		}
+		return result;
+	}
+
+	/**
+	 * Returns an array of plug-in entries referenced by this feature
+	 * 
+	 * @see IFeature#getPluginEntries()
+	 * @since 2.0
+	 */
+	public IPluginEntry[] getRawPluginEntries() {
+		PluginEntryModel[] result = getPluginEntryModels();
+		if (result.length == 0)
+			return new IPluginEntry[0];
+		else
+			return (IPluginEntry[]) result;
+	}
+
+	/*
+	 * Method filter.
+	 * @param result
+	 * @return IPluginEntry[]
+	 */
+	private IPluginEntry[] filterPluginEntry(IPluginEntry[] all) {
+		List list = new ArrayList();
+		if (all != null) {
+			for (int i = 0; i < all.length; i++) {
+				if (UpdateManagerUtils.isValidEnvironment(all[i]))
+					list.add(all[i]);
+			}
+		}
+
+		IPluginEntry[] result = new IPluginEntry[list.size()];
+		if (!list.isEmpty()) {
+			list.toArray(result);
+		}
+
+		return result;
+	}
+
+	/**
+	 * Returns the count of referenced plug-in entries.
+	 * 
+	 * @see IFeature#getPluginEntryCount()
+	 * @since 2.0
+	 */
+	public int getPluginEntryCount() {
+		return getPluginEntries().length;
+	}
+
+	/**
+	 * Returns an array of non-plug-in entries referenced by this feature
+	 * 
+	 * @see IFeature#getNonPluginEntries()
+	 * @since 2.0
+	 */
+	public INonPluginEntry[] getRawNonPluginEntries() {
+		NonPluginEntryModel[] result = getNonPluginEntryModels();
+		if (result.length == 0)
+			return new INonPluginEntry[0];
+		else
+			return (INonPluginEntry[]) result;
+	}
+
+	/**
+	 * Returns the count of referenced non-plug-in entries.
+	 * 
+	 * @see IFeature#getNonPluginEntryCount()
+	 * @since 2.0
+	 */
+	public int getNonPluginEntryCount() {
+		return getNonPluginEntryModels().length;
+	}
+
+	/**
+	 * Returns an array of feature references included by this feature
+	 * 
+	 * @return an erray of feature references, or an empty array.
+	 * @since 2.0
+	 */
+	public IIncludedFeatureReference[] getRawIncludedFeatureReferences()
+		throws CoreException {
+		if (includedFeatureReferences == null)
+			initializeIncludedReferences();
+
+		if (includedFeatureReferences.size() == 0)
+			return new IncludedFeatureReference[0];
+
+		return (IIncludedFeatureReference[]) includedFeatureReferences.toArray(
+			new IIncludedFeatureReference[includedFeatureReferences.size()]);
+	}
+	/**
+	 * Returns the download size of the feature, if it can be determined.
+	 * 
+	 * @see IFeature#getDownloadSize()
+	 * @since 2.0
+	 */
+	public long getDownloadSize() {
+		try {
+			Set allPluginEntries = new HashSet();
+			Set allNonPluginEntries = new HashSet();
+
+			IPluginEntry[] plugins = getPluginEntries();
+			allPluginEntries.addAll(Arrays.asList(plugins));
+			INonPluginEntry[] nonPlugins = getNonPluginEntries();
+			allNonPluginEntries.addAll(Arrays.asList(nonPlugins));
+
+			IFeatureReference[] children = getIncludedFeatureReferences();
+			for (int i = 0; i < children.length; i++) {
+				plugins = children[i].getFeature(null).getPluginEntries();
+				allPluginEntries.addAll(Arrays.asList(plugins));
+				nonPlugins = children[i].getFeature(null).getNonPluginEntries();
+				allNonPluginEntries.addAll(Arrays.asList(nonPlugins));
+			}
+
+			IPluginEntry[] totalPlugins =
+				new IPluginEntry[allPluginEntries.size()];
+			INonPluginEntry[] totalNonPlugins =
+				new INonPluginEntry[allNonPluginEntries.size()];
+			if (allPluginEntries.size() != 0) {
+				allPluginEntries.toArray(totalPlugins);
+			}
+			if (allNonPluginEntries.size() != 0) {
+				allNonPluginEntries.toArray(totalNonPlugins);
+			}
+
+			return getFeatureContentProvider().getDownloadSizeFor(
+				totalPlugins,
+				totalNonPlugins);
+
+		} catch (CoreException e) {
+			UpdateCore.warn(null, e);
+			return ContentEntryModel.UNKNOWN_SIZE;
+		}
+	}
+
+	/**
+	 * Returns the install size of the feature, if it can be determined.
+	 * 
+	 * @see IFeature#getInstallSize()
+	 * @since 2.0
+	 */
+	public long getInstallSize() {
+		try {
+			Set allPluginEntries = new HashSet();
+			Set allNonPluginEntries = new HashSet();
+
+			IPluginEntry[] plugins = getPluginEntries();
+			allPluginEntries.addAll(Arrays.asList(plugins));
+			INonPluginEntry[] nonPlugins = getNonPluginEntries();
+			allNonPluginEntries.addAll(Arrays.asList(nonPlugins));
+
+			IFeatureReference[] children = getIncludedFeatureReferences();
+			for (int i = 0; i < children.length; i++) {
+				plugins = children[i].getFeature(null).getPluginEntries();
+				allPluginEntries.addAll(Arrays.asList(plugins));
+				nonPlugins = children[i].getFeature(null).getNonPluginEntries();
+				allNonPluginEntries.addAll(Arrays.asList(nonPlugins));
+			}
+
+			IPluginEntry[] totalPlugins =
+				new IPluginEntry[allPluginEntries.size()];
+			INonPluginEntry[] totalNonPlugins =
+				new INonPluginEntry[allNonPluginEntries.size()];
+			if (allPluginEntries.size() != 0) {
+				allPluginEntries.toArray(totalPlugins);
+			}
+			if (allNonPluginEntries.size() != 0) {
+				allNonPluginEntries.toArray(totalNonPlugins);
+			}
+
+			return getFeatureContentProvider().getInstallSizeFor(
+				totalPlugins,
+				totalNonPlugins);
+
+		} catch (CoreException e) {
+			UpdateCore.warn(null, e);
+			return ContentEntryModel.UNKNOWN_SIZE;
+		}
+	}
+
+	/**
+	 * Returns the content provider for this feature.
+	 * 
+	 * @see IFeature#getFeatureContentProvider()
+	 * @since 2.0
+	 */
+	public IFeatureContentProvider getFeatureContentProvider()
+		throws CoreException {
+		if (featureContentProvider == null) {
+			throw Utilities.newCoreException(
+				NLS.bind(Messages.Feature_NoContentProvider, (new String[] { getVersionedIdentifier().toString() })),
+				null);	
+		}
+		return this.featureContentProvider;
+	}
+
+	/**
+	 * Returns the content consumer for this feature.
+	 * 
+	 * @see IFeature#getFeatureContentConsumer()
+	 * @since 2.0
+	 */
+	public IFeatureContentConsumer getFeatureContentConsumer()
+		throws CoreException {
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * Sets the site for this feature.
+	 * 
+	 * @see IFeature#setSite(ISite)
+	 * @since 2.0
+	 */
+	public void setSite(ISite site) throws CoreException {
+		if (this.site != null) {
+			String featureURLString =
+				(getURL() != null) ? getURL().toExternalForm() : ""; //$NON-NLS-1$
+			throw Utilities.newCoreException(
+				NLS.bind(Messages.Feature_SiteAlreadySet, (new String[] { featureURLString })),
+				null);
+		}
+		this.site = site;
+	}
+
+	/**
+	 * Sets the content provider for this feature.
+	 * 
+	 * @see IFeature#setFeatureContentProvider(IFeatureContentProvider)
+	 * @since 2.0
+	 */
+	public void setFeatureContentProvider(IFeatureContentProvider featureContentProvider) {
+		this.featureContentProvider = featureContentProvider;
+		featureContentProvider.setFeature(this);
+	}
+
+	/**
+	 * Return the string representation of this fetaure
+	 * 
+	 * @return feature as string
+	 * @since 2.0
+	 */
+	public String toString() {
+		String URLString =
+			(getURL() == null)
+				? Messages.Feature_NoURL
+				: getURL().toExternalForm();
+
+		String verString =
+			NLS.bind(Messages.Feature_FeatureVersionToString, (new String[] { URLString, getVersionedIdentifier().toString() }));
+		String label = getLabel() == null ? "" : getLabel(); //$NON-NLS-1$
+		return verString + " [" + label + "]"; //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	/*
+	 * Installation has been cancelled, abort and revert
+	 */
+	private void abort() throws CoreException {
+		String msg = Messages.Feature_InstallationCancelled; 
+		throw new InstallAbortedException(msg, null);
+	}
+
+	/*
+	 * Initializes includes feature references
+	 * If the included feature reference is found on the site, add it to the List
+	 * Otherwise attempt to instanciate it using the same type as this feature and
+	 * using the default location on the site.
+	 */
+	private void initializeIncludedReferences() throws CoreException {
+		includedFeatureReferences = new ArrayList();
+
+		IIncludedFeatureReference[] nestedFeatures = getFeatureIncluded();
+		if (nestedFeatures.length == 0)
+			return;
+
+		ISite site = getSite();
+		if (site == null)
+			return;
+
+		for (int i = 0; i < nestedFeatures.length; i++) {
+			IIncludedFeatureReference include = nestedFeatures[i];
+			IIncludedFeatureReference newRef =
+				getPerfectIncludeFeature(site, include);
+			includedFeatureReferences.add(newRef);
+		}
+	}
+
+	/*
+	 * 
+	 */
+	private IIncludedFeatureReference getPerfectIncludeFeature(
+		ISite site,
+		IIncludedFeatureReference include)
+		throws CoreException {
+
+		// [20367] no site, cannot initialize nested references
+		ISiteFeatureReference[] refs = site.getFeatureReferences();
+		VersionedIdentifier identifier = include.getVersionedIdentifier();
+
+		// too long to compute if not a file system
+		// other solution would be to parse feature.xml
+		// when parsing file system to create archive features/FeatureId_Ver.jar
+		if ("file".equals(site.getURL().getProtocol())) { //$NON-NLS-1$
+			// check if declared on the Site
+			if (refs != null) {
+				for (int ref = 0; ref < refs.length; ref++) {
+					if (refs[ref] != null) {
+						VersionedIdentifier id =
+							refs[ref].getVersionedIdentifier();
+						if (identifier.equals(id)) {
+							// found a ISiteFeatureReference that matches our IIncludedFeatureReference
+							IncludedFeatureReference newRef =
+								new IncludedFeatureReference(refs[ref]);
+							newRef.isOptional(include.isOptional());
+							if (include instanceof FeatureReferenceModel)
+								newRef.setLabel(
+									((FeatureReferenceModel) include)
+										.getLabel());
+							newRef.setSearchLocation(
+								include.getSearchLocation());
+							return newRef;
+						}
+					}
+				}
+			}
+		}
+
+        // instantiate by mapping it based on the site.xml
+        // in future we may ask for a factory to create the feature ref
+        IncludedFeatureReference newRef = new UpdateSiteIncludedFeatureReference(include);
+        newRef.setSite(getSite());
+        IFeatureReference parentRef = getSite().getFeatureReference(this);
+        if (parentRef instanceof FeatureReference) {
+         newRef.setType(((FeatureReference) parentRef).getType());
+        }
+        String featureID = Site.DEFAULT_FEATURE_PATH + identifier.toString();
+        if(this instanceof TargetFeature)
+         featureID = featureID + "/"; //$NON-NLS-1$
+        else
+         featureID = featureID + ".jar"; //$NON-NLS-1$
+		URL featureURL =
+			getSite().getSiteContentProvider().getArchiveReference(featureID);
+		newRef.setURL(featureURL);
+		newRef.setFeatureIdentifier(identifier.getIdentifier());
+		newRef.setFeatureVersion(identifier.getVersion().toString());
+		try {
+			newRef.resolve(getSite().getURL(), null);
+			// no need to get the bundle
+			return newRef;
+		} catch (Exception e) {
+			throw Utilities.newCoreException(
+				NLS.bind(Messages.Feature_UnableToInitializeFeatureReference, (new String[] { identifier.toString() })),
+				e);
+		}
+	}
+
+	/*
+	 * 
+	 */
+	private void debug(String trace) {
+		//DEBUG
+		if (UpdateCore.DEBUG && UpdateCore.DEBUG_SHOW_INSTALL) {
+			UpdateCore.debug(trace);
+		}
+	}
+
+	/*
+	 * 
+	 */
+	private void setMonitorTaskName(
+		IProgressMonitor monitor,
+		String taskName) {
+		if (monitor != null)
+			monitor.setTaskName(taskName);
+	}
+
+	/*
+	 *
+	 */
+	private void monitorWork(IProgressMonitor monitor, int tick)
+		throws CoreException {
+		if (monitor != null) {
+			monitor.worked(tick);
+			if (monitor.isCanceled()) {
+				abort();
+			}
+		}
+	}
+
+	/*
+	 * 
+	 */
+	private void verifyReferences(
+		IVerifier verifier,
+		ContentReference[] references,
+		InstallMonitor monitor,
+		IVerificationListener verificationListener,
+		boolean isFeature)
+		throws CoreException {
+		IVerificationResult vr = null;
+		if (verifier != null) {
+			for (int j = 0; j < references.length; j++) {
+				vr = verifier.verify(this, references[j], isFeature, monitor);
+				if (vr != null) {
+					if (verificationListener == null)
+						return;
+
+					int result = verificationListener.prompt(vr);
+
+					if (result == IVerificationListener.CHOICE_ABORT) {
+						String msg = Messages.JarVerificationService_CancelInstall; 
+						Exception e = vr.getVerificationException();
+						throw new InstallAbortedException(msg, e);
+					}
+					if (result == IVerificationListener.CHOICE_ERROR) {
+						throw Utilities
+							.newCoreException(
+								Messages.JarVerificationService_UnsucessfulVerification,	
+						vr.getVerificationException());
+					}
+				}
+			}
+		}
+	}
+
+	/*
+	 * returns reference if the same feature is installed on the site
+	 * [18867]
+	 */
+	private IFeatureReference featureAlreadyInstalled(ISite targetSite) {
+
+		ISiteFeatureReference[] references = targetSite.getFeatureReferences();
+		IFeatureReference currentReference = null;
+		for (int i = 0; i < references.length; i++) {
+			currentReference = references[i];
+			// do not compare URL
+			try {
+				if (this.equals(currentReference.getFeature(null)))
+					return currentReference; // 18867
+			} catch (CoreException e) {
+				UpdateCore.warn(null, e);
+			}
+		}
+
+		UpdateCore.warn(
+			"ValidateAlreadyInstalled:Feature " //$NON-NLS-1$
+				+ this
+				+ " not found on site:" //$NON-NLS-1$
+				+ this.getURL());
+		return null;
+	}
+
+	/*
+	 * re initialize children of the feature, invalidate the cache
+	 * @param result FeatureReference to reinitialize.
+	 */
+	private void reinitializeFeature(IFeatureReference referenceToReinitialize) {
+
+		if (referenceToReinitialize == null)
+			return;
+
+		if (UpdateCore.DEBUG && UpdateCore.DEBUG_SHOW_CONFIGURATION)
+			UpdateCore.debug(
+				"Re initialize feature reference:" + referenceToReinitialize); //$NON-NLS-1$
+
+		IFeature feature = null;
+		try {
+			feature = referenceToReinitialize.getFeature(null);
+			if (feature != null && feature instanceof Feature) {
+				((Feature) feature).initializeIncludedReferences();
+			}
+			// bug 24981 - recursively go into hierarchy
+			// only if site if file 
+			ISite site = referenceToReinitialize.getSite();
+			if (site == null)
+				return;
+			URL url = site.getURL();
+			if (url == null)
+				return;
+			if ("file".equals(url.getProtocol())) { //$NON-NLS-1$
+				IFeatureReference[] included =
+					feature.getIncludedFeatureReferences();
+				for (int i = 0; i < included.length; i++) {
+					reinitializeFeature(included[i]);
+				}
+			}
+		} catch (CoreException e) {
+			UpdateCore.warn("", e); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * @see org.eclipse.update.core.IFeature#getRawIncludedFeatureReferences()
+	 */
+	public IIncludedFeatureReference[] getIncludedFeatureReferences()
+		throws CoreException {
+		return filterFeatures(getRawIncludedFeatureReferences());
+	}
+
+	/*
+	 * Method filterFeatures.
+	 * Also implemented in Site
+	 * 
+	 * @param list
+	 * @return List
+	 */
+	private IIncludedFeatureReference[] filterFeatures(IIncludedFeatureReference[] allIncluded) {
+		List list = new ArrayList();
+		if (allIncluded != null) {
+			for (int i = 0; i < allIncluded.length; i++) {
+				IIncludedFeatureReference included = allIncluded[i];
+				if (UpdateManagerUtils.isValidEnvironment(included))
+					list.add(included);
+				else {
+					if (UpdateCore.DEBUG && UpdateCore.DEBUG_SHOW_WARNINGS) {
+						UpdateCore.warn(
+							"Filtered out feature reference:" + included); //$NON-NLS-1$
+					}
+				}
+			}
+		}
+
+		IIncludedFeatureReference[] result =
+			new IIncludedFeatureReference[list.size()];
+		if (!list.isEmpty()) {
+			list.toArray(result);
+		}
+
+		return result;
+	}
+
+	/**
+	 * @see org.eclipse.update.core.IFeature#getRawNonPluginEntries()
+	 */
+	public INonPluginEntry[] getNonPluginEntries() {
+		return filterNonPluginEntry(getRawNonPluginEntries());
+	}
+
+	/**
+	 * Method filterPluginEntry.
+	 * @param all
+	 * @return INonPluginEntry[]
+	 */
+	private INonPluginEntry[] filterNonPluginEntry(INonPluginEntry[] all) {
+		List list = new ArrayList();
+		if (all != null) {
+			for (int i = 0; i < all.length; i++) {
+				if (UpdateManagerUtils.isValidEnvironment(all[i]))
+					list.add(all[i]);
+			}
+		}
+
+		INonPluginEntry[] result = new INonPluginEntry[list.size()];
+		if (!list.isEmpty()) {
+			list.toArray(result);
+		}
+
+		return result;
+	}
+
+	/**
+	 * @see org.eclipse.update.core.IFeature#getRawPluginEntries()
+	 */
+	public IPluginEntry[] getPluginEntries() {
+		return filterPluginEntry(getRawPluginEntries());
+	}
+
+	/**
+	 * @see org.eclipse.update.core.IFeature#getImports()
+	 */
+	public IImport[] getImports() {
+		return filterImports(getRawImports());
+	}
+
+	/**
+	 * Method filterImports.
+	 * @param all
+	 * @return IImport[]
+	 */
+	private IImport[] filterImports(IImport[] all) {
+		List list = new ArrayList();
+		if (all != null) {
+			for (int i = 0; i < all.length; i++) {
+				if (UpdateManagerUtils.isValidEnvironment(all[i]))
+					list.add(all[i]);
+			}
+		}
+
+		IImport[] result = new IImport[list.size()];
+		if (!list.isEmpty()) {
+			list.toArray(result);
+		}
+
+		return result;
+	}
+
+}
\ No newline at end of file
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/FeatureContentProvider.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/FeatureContentProvider.java
new file mode 100644
index 0000000..0ceea5a
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/FeatureContentProvider.java
@@ -0,0 +1,589 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.update.core.model.ContentEntryModel;
+import org.eclipse.update.core.model.InstallAbortedException;
+import org.eclipse.update.core.model.NonPluginEntryModel;
+import org.eclipse.update.core.model.PluginEntryModel;
+import org.eclipse.update.internal.core.FatalIOException;
+import org.eclipse.update.internal.core.FeatureDownloadException;
+import org.eclipse.update.internal.core.FileFragment;
+import org.eclipse.update.internal.core.InternalSiteManager;
+import org.eclipse.update.internal.core.LockManager;
+import org.eclipse.update.internal.core.Messages;
+import org.eclipse.update.internal.core.UpdateCore;
+import org.eclipse.update.internal.core.UpdateManagerUtils;
+
+/**
+ * Base implementation of a feature content provider. This class provides a set
+ * of helper methods useful for implementing feature content providers. In
+ * particular, methods dealing with downloading and caching of feature files.
+ * <p>
+ * This class must be subclassed by clients.
+ * </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 org.eclipse.update.core.IFeatureContentProvider
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public abstract class FeatureContentProvider implements IFeatureContentProvider {
+
+	/**
+	 *  
+	 */
+	public class FileFilter {
+
+		private IPath filterPath = null;
+
+		/**
+		 * Constructor for FileFilter.
+		 */
+		public FileFilter(String filter) {
+			super();
+			this.filterPath = new Path(filter);
+		}
+
+		/**
+		 * returns true if the name matches the rule
+		 */
+		public boolean accept(String name) {
+
+			if (name == null)
+				return false;
+
+			// no '*' pattern matching
+			// must be equals
+			IPath namePath = new Path(name);
+			if (filterPath.lastSegment().indexOf('*') == -1) {
+				return filterPath.equals(namePath);
+			}
+
+			// check same file extension if extension exists (a.txt/*.txt)
+			// or same file name (a.txt,a.*)
+			String extension = filterPath.getFileExtension();
+			if (extension != null && !extension.equals("*")) { //$NON-NLS-1$
+				if (!extension.equalsIgnoreCase(namePath.getFileExtension()))
+					return false;
+			} else {
+				IPath noExtension = filterPath.removeFileExtension();
+				String fileName = noExtension.lastSegment();
+				if (!fileName.equals("*")) { //$NON-NLS-1$
+					if (!namePath.lastSegment().startsWith(fileName))
+						return false;
+				}
+			}
+
+			// check same path
+			IPath p1 = namePath.removeLastSegments(1);
+			IPath p2 = filterPath.removeLastSegments(1);
+			return p1.equals(p2);
+		}
+
+	}
+
+	private URL base;
+	private IFeature feature;
+	private File tmpDir; // local work area for each provider
+	public static final String JAR_EXTENSION = ".jar"; //$NON-NLS-1$	
+
+	private static final String DOT_PERMISSIONS = "permissions.properties"; //$NON-NLS-1$
+	private static final String EXECUTABLES = "permissions.executable"; //$NON-NLS-1$
+
+	/**
+	 * Feature content provider constructor
+	 * 
+	 * @param base
+	 *            feature URL. The interpretation of this URL is specific to
+	 *            each content provider.
+	 * @since 2.0
+	 */
+	public FeatureContentProvider(URL base) {
+		this.base = base;
+		this.feature = null;
+	}
+
+	/**
+	 * Returns the feature url.
+	 * 
+	 * @see IFeatureContentProvider#getURL()
+	 */
+	public URL getURL() {
+		return base;
+	}
+
+	/**
+	 * Returns the feature associated with this content provider.
+	 * 
+	 * @see IFeatureContentProvider#getFeature()
+	 */
+	public IFeature getFeature() {
+		return feature;
+	}
+
+	/**
+	 * Sets the feature associated with this content provider.
+	 * 
+	 * @see IFeatureContentProvider#setFeature(IFeature)
+	 */
+	public void setFeature(IFeature feature) {
+		this.feature = feature;
+	}
+
+	/**
+	 * Returns the specified reference as a local file system reference. If
+	 * required, the file represented by the specified content reference is
+	 * first downloaded to the local system
+	 * 
+	 * @param ref
+	 *            content reference
+	 * @param monitor
+	 *            progress monitor, can be <code>null</code>
+	 * @exception IOException
+	 * @exception CoreException
+	 * @since 2.0
+	 */
+	public ContentReference asLocalReference(ContentReference ref, InstallMonitor monitor) throws IOException, CoreException {
+
+		// check to see if this is already a local reference
+		if (ref.isLocalReference())
+			return ref;
+
+		// check to see if we already have a local file for this reference
+		String key = ref.toString();
+
+		// need to synch as another thread my have created the file but
+		// is still copying into it
+		File localFile = null;
+		FileFragment localFileFragment = null;
+		Object keyLock = LockManager.getLock(key);
+		synchronized (keyLock) {
+			localFile = Utilities.lookupLocalFile(key);
+			if (localFile != null) {
+				// check if the cached file is still valid (no newer version on
+				// server)
+				try {
+				if (UpdateManagerUtils.isSameTimestamp(ref.asURL(), localFile.lastModified()))
+					return ref.createContentReference(ref.getIdentifier(), localFile);
+				} catch(FatalIOException e) {
+					throw e;
+				} catch(IOException e) {
+					throw new FeatureDownloadException(NLS.bind(Messages.FeatureContentProvider_ExceptionDownloading, (new Object[] {getURL().toExternalForm()})), e);
+				}
+			}
+
+			if (localFile == null) {
+				localFileFragment = UpdateManagerUtils.lookupLocalFileFragment(key);
+			}
+			// 
+			// download the referenced file into local temporary area
+			InputStream is = null;
+			OutputStream os = null;
+			long bytesCopied = 0;
+			long inputLength = 0;
+			boolean success = false;
+			if (monitor != null) {
+				monitor.saveState();
+				monitor.setTaskName(Messages.FeatureContentProvider_Downloading);
+				monitor.subTask(ref.getIdentifier() + " "); //$NON-NLS-1$
+				try {
+					monitor.setTotalCount(ref.getInputSize());
+				} catch (FatalIOException e) {
+					throw e;
+				} catch (IOException e) {
+					throw new FeatureDownloadException(NLS.bind(Messages.FeatureContentProvider_ExceptionDownloading, (new Object[] {getURL().toExternalForm()})), e);
+				}
+				monitor.showCopyDetails(true);
+			}
+
+			try {
+				//long startTime = System.nanoTime();
+				if (localFileFragment != null && "http".equals(ref.asURL().getProtocol())) { //$NON-NLS-1$
+					localFile = localFileFragment.getFile();
+					try {
+						// get partial input stream
+						is = ref.getPartialInputStream(localFileFragment.getSize());
+						inputLength = ref.getInputSize() - localFileFragment.getSize();
+						// get output stream to append to file fragment
+						os = new BufferedOutputStream(
+						// PAL foundation
+								//new FileOutputStream(localFile, true));
+								new FileOutputStream(localFile.getPath(), true));
+					} catch (FatalIOException e) {
+						throw e;
+					} catch (IOException e) {
+						try {
+							if (is != null)
+								is.close();
+						} catch (IOException ioe) {
+						}
+						is = null;
+						os = null;
+						localFileFragment = null;
+						throw new FeatureDownloadException(NLS.bind(Messages.FeatureContentProvider_ExceptionDownloading, (new Object[] {getURL().toExternalForm()})), e);
+					}
+				}
+				if (is == null) {
+					// must download from scratch
+					localFile = Utilities.createLocalFile(getWorkingDirectory(), null);
+					try {
+						is = ref.getInputStream();
+						inputLength = ref.getInputSize();
+					} catch (FatalIOException e) {
+						throw Utilities.newCoreException(NLS.bind(Messages.FeatureContentProvider_UnableToRetrieve, (new Object[] {ref})), e);
+					} catch (IOException e) {
+						throw new FeatureDownloadException(NLS.bind(Messages.FeatureContentProvider_ExceptionDownloading, (new Object[] {getURL().toExternalForm()})), e);
+					}
+
+					try {
+						os = new BufferedOutputStream(new FileOutputStream(localFile));
+					} catch (FileNotFoundException e) {
+						throw Utilities.newCoreException(NLS.bind(Messages.FeatureContentProvider_UnableToCreate, (new Object[] {localFile})), e);
+					}
+				}
+
+				Date start = new Date();
+				if (localFileFragment != null) {
+					bytesCopied = localFileFragment.getSize();
+					if (monitor != null) {
+						monitor.setCopyCount(bytesCopied);
+					}
+				}
+
+				// Transfer as many bytes as possible from input to output stream
+				long offset = UpdateManagerUtils.copy(is, os, monitor, inputLength);
+				if (offset != -1) {
+					bytesCopied += offset;
+					if (bytesCopied > 0) {
+						// preserve partially downloaded file
+						UpdateManagerUtils.mapLocalFileFragment(key, new FileFragment(localFile, bytesCopied));
+					}
+					if (monitor != null && monitor.isCanceled()) {
+						String msg = Messages.Feature_InstallationCancelled;
+						throw new InstallAbortedException(msg, null);
+					} else {
+						throw new FeatureDownloadException(NLS.bind(Messages.FeatureContentProvider_ExceptionDownloading, (new Object[] {getURL().toExternalForm()})), new IOException());
+					}
+				} else {
+					UpdateManagerUtils.unMapLocalFileFragment(key);
+				}
+
+				Date stop = new Date();
+				long timeInseconds = (stop.getTime() - start.getTime()) / 1000;
+				// time in milliseconds /1000 = time in seconds
+				InternalSiteManager.downloaded(
+					ref.getInputSize(),
+					(timeInseconds),
+					ref.asURL());
+
+				success = true;
+				//long endTime = System.nanoTime();
+				// file is downloaded succesfully, map it
+				Utilities.mapLocalFile(key, localFile);
+				
+				/*if (ref.asURL().toExternalForm().endsWith("jar")) {
+					synchronized(this.getClass()) {
+						timer += (endTime - startTime);
+						if (first == 0) {
+							first = endTime - startTime;
+						}
+					}
+				}*/
+			} catch (ClassCastException e) {
+				throw Utilities.newCoreException(
+					NLS.bind(Messages.FeatureContentProvider_UnableToCreate, (new Object[] { localFile })),
+					e);
+			} finally {
+				//Do not close IS if user cancel,
+				//closing IS will read the entire Stream until the end
+				if (success && is != null)
+					try {
+						is.close();
+					} catch (IOException e) {
+					}
+				if (os != null)
+					try {
+						os.close(); // should flush buffer stream
+					} catch (IOException e) {
+					}
+
+				if (success || bytesCopied > 0) {
+					// set the timestamp on the temp file to match the remote
+					// timestamp
+					localFile.setLastModified(ref.getLastModified());
+				}
+				if (monitor != null)
+					monitor.restoreState();
+			}
+			LockManager.returnLock(key);
+		} // end lock
+		ContentReference reference =
+			ref.createContentReference(ref.getIdentifier(), localFile);
+		
+		UpdateCore.getPlugin().getUpdateSession().markVisited(ref.asURL());
+		
+		return reference;
+	}
+
+	/**
+	 * Returns the specified reference as a local file. If required, the file
+	 * represented by the specified content reference is first downloaded to
+	 * the local system
+	 * 
+	 * @param ref
+	 *            content reference
+	 * @param monitor
+	 *            progress monitor, can be <code>null</code>
+	 * @exception IOException
+	 * @exception CoreException
+	 * @since 2.0
+	 */
+	public File asLocalFile(ContentReference ref, InstallMonitor monitor) throws IOException, CoreException {
+		File file = ref.asFile();
+		ContentReference localRef = asLocalReference(ref, monitor);
+		file = localRef.asFile();
+		return file;
+	}
+
+	/**
+	 * Returns working directory for this content provider
+	 * 
+	 * @return working directory
+	 * @exception IOException
+	 * @since 2.0
+	 */
+	protected File getWorkingDirectory() throws IOException {
+		if (tmpDir == null)
+			tmpDir = Utilities.createWorkingDirectory();
+		return tmpDir;
+	}
+
+	/**
+	 * Returns the total size of all archives required for the specified
+	 * plug-in and non-plug-in entries (the "packaging" view).
+	 * 
+	 * @see IFeatureContentProvider#getDownloadSizeFor(IPluginEntry[],
+	 *      INonPluginEntry[])
+	 */
+	public long getDownloadSizeFor(IPluginEntry[] pluginEntries, INonPluginEntry[] nonPluginEntries) {
+		long result = 0;
+
+		// if both are null or empty, return UNKNOWN size
+		if ((pluginEntries == null || pluginEntries.length == 0) && (nonPluginEntries == null || nonPluginEntries.length == 0)) {
+			return ContentEntryModel.UNKNOWN_SIZE;
+		}
+
+		// loop on plugin entries
+		long size = 0;
+		if (pluginEntries != null)
+			for (int i = 0; i < pluginEntries.length; i++) {
+				size = ((PluginEntryModel) pluginEntries[i]).getDownloadSize();
+				if (size == ContentEntryModel.UNKNOWN_SIZE) {
+					return ContentEntryModel.UNKNOWN_SIZE;
+				}
+				result += size;
+			}
+
+		// loop on non plugin entries
+		if (nonPluginEntries != null)
+			for (int i = 0; i < nonPluginEntries.length; i++) {
+				size = ((NonPluginEntryModel) nonPluginEntries[i]).getDownloadSize();
+				if (size == ContentEntryModel.UNKNOWN_SIZE) {
+					return ContentEntryModel.UNKNOWN_SIZE;
+				}
+				result += size;
+			}
+
+		return result;
+	}
+
+	/**
+	 * Returns the total size of all files required for the specified plug-in
+	 * and non-plug-in entries (the "logical" view).
+	 * 
+	 * @see IFeatureContentProvider#getInstallSizeFor(IPluginEntry[],
+	 *      INonPluginEntry[])
+	 */
+	public long getInstallSizeFor(IPluginEntry[] pluginEntries, INonPluginEntry[] nonPluginEntries) {
+		long result = 0;
+
+		// if both are null or empty, return UNKNOWN size
+		if ((pluginEntries == null || pluginEntries.length == 0) && (nonPluginEntries == null || nonPluginEntries.length == 0)) {
+			return ContentEntryModel.UNKNOWN_SIZE;
+		}
+
+		// loop on plugin entries
+		long size = 0;
+		if (pluginEntries != null)
+			for (int i = 0; i < pluginEntries.length; i++) {
+				size = ((PluginEntryModel) pluginEntries[i]).getInstallSize();
+				if (size == ContentEntryModel.UNKNOWN_SIZE) {
+					return ContentEntryModel.UNKNOWN_SIZE;
+				}
+				result += size;
+			}
+
+		// loop on non plugin entries
+		if (nonPluginEntries != null)
+			for (int i = 0; i < nonPluginEntries.length; i++) {
+				size = ((NonPluginEntryModel) nonPluginEntries[i]).getInstallSize();
+				if (size == ContentEntryModel.UNKNOWN_SIZE) {
+					return ContentEntryModel.UNKNOWN_SIZE;
+				}
+				result += size;
+			}
+
+		return result;
+	}
+
+	/**
+	 * Returns the path identifier for a plugin entry. <code>plugins/&lt;pluginId>_&lt;pluginVersion>.jar</code>
+	 * 
+	 * @return the path identifier
+	 */
+	protected String getPathID(IPluginEntry entry) {
+		return Site.DEFAULT_PLUGIN_PATH + entry.getVersionedIdentifier().toString() + JAR_EXTENSION;
+	}
+
+	/**
+	 * Returns the path identifer for a non plugin entry. <code>features/&lt;featureId>_&lt;featureVersion>/&lt;dataId></code>
+	 * 
+	 * @return the path identifier
+	 */
+	protected String getPathID(INonPluginEntry entry) {
+		String nonPluginBaseID = Site.DEFAULT_FEATURE_PATH + feature.getVersionedIdentifier().toString() + "/"; //$NON-NLS-1$
+		return nonPluginBaseID + entry.getIdentifier();
+	}
+
+	/**
+	 * Sets the permission of all the ContentReferences Check for the
+	 * .permissions contentReference and use it to set the permissions of other
+	 * ContentReference
+	 */
+	protected void validatePermissions(ContentReference[] references) {
+
+		if (references == null || references.length == 0)
+			return;
+
+		Map permissions = getPermissions(references);
+		if (permissions.isEmpty())
+			return;
+
+		for (int i = 0; i < references.length; i++) {
+			ContentReference contentReference = references[i];
+			String id = contentReference.getIdentifier();
+			Object value = null;
+			if ((value = matchesOneRule(id, permissions)) != null) {
+				Integer permission = (Integer) value;
+				contentReference.setPermission(permission.intValue());
+			}
+		}
+	}
+
+	/**
+	 * Returns the value of the matching rule or <code>null</code> if none
+	 * found. A rule is matched if the id is equals to a key, or if the id is
+	 * resolved by a key. if the id is <code>/path/file.txt</code> it is
+	 * resolved by <code>/path/*</code> or <code>/path/*.txt</code>
+	 * 
+	 * @param id
+	 *            the identifier
+	 * @param permissions
+	 *            list of rules
+	 * @return Object the value of the matching rule or <code>null</code>
+	 */
+	private Object matchesOneRule(String id, Map permissions) {
+
+		Set keySet = permissions.keySet();
+		Iterator iter = keySet.iterator();
+		while (iter.hasNext()) {
+			FileFilter rule = (FileFilter) iter.next();
+			if (rule.accept(id)) {
+				return permissions.get(rule);
+			}
+		}
+
+		return null;
+	}
+
+	/*
+	 * returns the permission MAP
+	 */
+	private Map getPermissions(ContentReference[] references) {
+
+		Map result = new HashMap();
+		// search for .permissions
+		boolean notfound = true;
+		ContentReference permissionReference = null;
+		for (int i = 0; i < references.length && notfound; i++) {
+			ContentReference contentReference = references[i];
+			if (DOT_PERMISSIONS.equals(contentReference.getIdentifier())) {
+				notfound = false;
+				permissionReference = contentReference;
+			}
+		}
+		if (notfound)
+			return result;
+
+		Properties prop = new Properties();
+		InputStream propertyStream = null;
+		try {
+			try {
+				propertyStream = permissionReference.getInputStream();
+				prop.load(propertyStream);
+			} finally {
+				if (propertyStream != null)
+					propertyStream.close();
+			}
+		} catch (IOException e) {
+			UpdateCore.warn("", e); //$NON-NLS-1$
+		}
+
+		String executables = prop.getProperty(EXECUTABLES);
+		if (executables == null)
+			return result;
+
+		StringTokenizer tokenizer = new StringTokenizer(executables, ","); //$NON-NLS-1$
+		Integer defaultExecutablePermission = new Integer(ContentReference.DEFAULT_EXECUTABLE_PERMISSION);
+		while (tokenizer.hasMoreTokens()) {
+			FileFilter filter = new FileFilter(tokenizer.nextToken());
+			result.put(filter, defaultExecutablePermission);
+		}
+
+		return result;
+	}
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/FeatureReference.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/FeatureReference.java
new file mode 100644
index 0000000..520081c
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/FeatureReference.java
@@ -0,0 +1,296 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.update.core.model.FeatureReferenceModel;
+import org.eclipse.update.core.model.SiteModel;
+import org.eclipse.update.internal.core.FeatureTypeFactory;
+import org.eclipse.update.internal.core.Messages;
+import org.eclipse.update.internal.core.UpdateCore;
+
+/**
+ * Convenience implementation of a feature reference.
+ * <p>
+ * This class may be instantiated or subclassed by clients.
+ * </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 org.eclipse.update.core.IFeatureReference
+ * @see org.eclipse.update.core.model.FeatureReferenceModel
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class FeatureReference extends FeatureReferenceModel implements IFeatureReference, IPlatformEnvironment {
+
+	private VersionedIdentifier versionId;
+
+	//PERF: new instance variable
+	private IFeature exactFeature;
+
+	/**
+	 * Feature reference default constructor
+	 */
+	public FeatureReference() {
+		super();
+	}
+
+	/**
+	 * Constructor FeatureReference.
+	 * @param ref the reference to copy
+	 */
+	public FeatureReference(IFeatureReference ref) {
+		super((FeatureReferenceModel) ref);
+		try {
+			setURL(ref.getURL());
+		} catch (CoreException e) {
+			UpdateCore.warn("", e); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Constructor FeatureReference.
+	 * @param ref the reference to copy
+	 */
+	public FeatureReference(FeatureReferenceModel ref) {
+		super(ref);
+		try {
+			setURL(ref.getURL());
+		} catch (CoreException e) {
+			UpdateCore.warn("", e); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Returns the feature this reference points to 
+	 * @return the feature on the Site
+	 * @deprecated use getFeaure(IProgressMonitor)
+	 */
+	public IFeature getFeature() throws CoreException {
+		return getFeature(null);
+	}
+
+	/**
+	 * Returns the feature this reference points to 
+	 *  @return the feature on the Site
+	 */
+	public IFeature getFeature(IProgressMonitor monitor) throws CoreException {
+
+		if (exactFeature != null)
+			return exactFeature;
+		exactFeature = getFeature(this,monitor);
+		return exactFeature;
+	}
+
+	/**
+	 * Returns the feature the reference points to 
+	 * @param ref the feature reference
+	 * @return the feature on the Site
+	 */
+	protected IFeature getFeature(IFeatureReference ref,IProgressMonitor monitor) throws CoreException {
+
+		IFeature feature = null;
+		URL refURL = ref.getURL();
+		feature = createFeature(refURL,monitor);
+		return feature;
+	}
+
+	/*
+	 * create an instance of a concrete feature corresponding to this reference
+	 */
+	private IFeature createFeature(URL url,IProgressMonitor monitor) throws CoreException {
+		String type = getType();
+		ISite site = getSite();
+		// if the site exists, use the site factory
+		if (site != null) {
+			return site.createFeature(type, url, monitor);
+		}
+		
+		IFeatureFactory factory = FeatureTypeFactory.getInstance().getFactory(type);
+		return factory.createFeature(url, site, monitor);
+	}
+
+	/**
+	 * Returns the update site for the referenced feature
+	 * 
+	 * @see IFeatureReference#getSite()
+	 * @since 2.0 
+	 */
+	public ISite getSite() {
+		return (ISite) getSiteModel();
+	}
+
+	/** 
+	 * Sets the feature reference URL.
+	 * This is typically performed as part of the feature reference creation
+	 * operation. Once set, the url should not be reset.
+	 * 
+	 * @see IFeatureReference#setURL(URL)
+	 * @since 2.0 
+	 */
+	public void setURL(URL url) throws CoreException {
+		if (url != null) {
+			setURLString(url.toExternalForm());
+			try {
+				resolve(url, null);
+			} catch (MalformedURLException e) {
+				throw Utilities.newCoreException(NLS.bind(Messages.FeatureReference_UnableToResolveURL, (new String[] { url.toExternalForm() })), e);
+			}
+		}
+	}
+
+	/**
+	 * Associates a site with the feature reference.
+	 * This is typically performed as part of the feature reference creation
+	 * operation. Once set, the site should not be reset.
+	 * 
+	 * @see IFeatureReference#setSite(ISite)
+	 * @since 2.0 
+	 */
+	public void setSite(ISite site) {
+		setSiteModel((SiteModel) site);
+	}
+
+	/**
+	* Returns the feature identifier.
+	* 
+	* @see IFeatureReference#getVersionedIdentifier()
+	* @since 2.0
+	*/
+	public VersionedIdentifier getVersionedIdentifier() {
+
+		if (versionId != null)
+			return versionId;
+
+		String id = getFeatureIdentifier();
+		String ver = getFeatureVersion();
+		if (id != null && ver != null) {
+			try {
+				versionId = new VersionedIdentifier(id, ver);
+				return versionId;
+			} catch (Exception e) {
+				UpdateCore.warn("Unable to create versioned identifier:" + id + ":" + ver); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		}
+
+		// we need the exact match or we may have an infinite loop
+		versionId = new VersionedIdentifier(getURL().toExternalForm(), null);
+		try {
+			versionId = getFeature(null).getVersionedIdentifier();
+		} catch (CoreException e) {
+			UpdateCore.warn("", e); //$NON-NLS-1$
+		}
+		return versionId;
+	}
+
+	/**
+	 * @see org.eclipse.update.core.IFeatureReference#getName()
+	 */
+	public String getName() {
+		if (super.getLabel() != null)
+			return super.getLabel();
+		try {
+			return getFeature(null).getLabel();
+		} catch (CoreException e) {
+			return getVersionedIdentifier().toString();
+		}
+	}
+
+	/**
+	 * Get optional operating system specification as a comma-separated string.
+	 *
+	 * @return the operating system specification string, or <code>null</code>.
+	 * @since 2.1
+	 */
+	public String getOS() {
+		if (super.getOS() == null && getURL()!=null)
+			try {
+				return getFeature(null).getOS();
+			} catch (CoreException e) {
+				return null;
+			}
+		return super.getOS();
+	}
+
+	/**
+	 * Get optional windowing system specification as a comma-separated string.
+	 *
+	 * @return the windowing system specification string, or <code>null</code>.
+	 * @since 2.1
+	 */
+	public String getWS() {
+		if (super.getWS() == null && getURL()!=null)
+			try {
+				return getFeature(null).getWS();
+			} catch (CoreException e) {
+				return null;
+			}
+		return super.getWS();
+	}
+
+	/**
+	 * Get optional system architecture specification as a comma-separated string.
+	 *
+	 * @return the system architecture specification string, or <code>null</code>.
+	 * @since 2.1
+	 */
+	public String getOSArch() {
+		if (super.getOSArch() == null && getURL()!=null)
+			try {
+				return getFeature(null).getOSArch();
+			} catch (CoreException e) {
+				return null;
+			}
+		return super.getOSArch();
+	}
+
+	/**
+	 * Get optional locale specification as a comma-separated string.
+	 *
+	 * @return the locale specification string, or <code>null</code>.
+	 * @since 2.1
+	 */
+	public String getNL() {
+		if (super.getNL() == null && getURL()!=null)
+			try {
+				return getFeature(null).getNL();
+			} catch (CoreException e) {
+				return null;
+			}
+		return super.getNL();
+	}
+
+	/**
+	 * Returns <code>true</code> if this feature is patching another feature,
+	 * <code>false</code> otherwise
+	 * @return boolean
+	 */
+	public boolean isPatch() {
+		if (super.getPatch() == null)
+			try {
+				return getFeature(null).isPatch();
+			} catch (CoreException e) {
+				return false;
+			}
+		return "true".equalsIgnoreCase(super.getPatch()); //$NON-NLS-1$
+	}
+
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/IArchiveReference.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/IArchiveReference.java
new file mode 100644
index 0000000..776226c
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/IArchiveReference.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.net.URL;
+
+import org.eclipse.core.runtime.IAdaptable;
+
+/**
+ * Site archive interface.
+ * Site archive is a representation of a packaged archive (file) located
+ * on an update site. It allows a "symbolic" path used to identify
+ * a plug-in or non-plug-in feature entry to be explicitly mapped
+ * to a specific URL. 
+ * <p>
+ * Clients may implement this interface. However, in most cases clients should 
+ * directly instantiate or subclass the provided implementation of this 
+ * interface.
+ * </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 org.eclipse.update.core.ArchiveReference
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IArchiveReference extends IAdaptable {
+
+	/** 
+	 * 
+	 * @return the archive "symbolic" path, or <code>null</code>
+	 * @since 2.0 
+	 */
+	public String getPath();
+
+	/**
+	 * Retrieve the site archive URL 
+	 * 
+	 * @return the archive URL, or <code>null</code>
+	 * @since 2.0 
+	 */
+	public URL getURL();
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/ICategory.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/ICategory.java
new file mode 100644
index 0000000..c3ac959
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/ICategory.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import org.eclipse.core.runtime.IAdaptable;
+
+/**
+ * Feature category definition.
+ * A site can organize its features into categories. Categories
+ * can be further organized into hierarchies. Each category name
+ * is a composed of the name of its parent and a simple identifier
+ * separated by a slash ("/"). For example <code>tools/utilities/print</code>
+ * defines a category that is a child of <code>tools/utilities</code> and
+ * grandchild of <code>tools</code>.
+ * <p>
+ * Clients may implement this interface. However, in most cases clients should 
+ * directly instantiate or subclass the provided implementation of this 
+ * interface.
+ * </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 org.eclipse.update.core.Category
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface ICategory  extends IAdaptable{
+
+	/** 
+	 * Retrieve the name of the category. The name can be a simple
+	 * token (root category) or a number of slash-separated ("/") 
+	 * tokens.
+	 * 
+	 * @return the category name
+	 * @since 2.0 
+	 */
+	public String getName();
+
+	/**
+	 * Retrieve the displayable label for the category
+	 * 
+	 * @return displayable category label, or <code>null</code>
+	 * @since 2.0 
+	 */
+	public String getLabel();
+
+	/** 
+	 * Retrieve the detailed category description
+	 * 
+	 * @return category description, or <code>null</code>
+	 * @since 2.0 
+	 */
+	public IURLEntry getDescription();
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/IContentConsumer.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/IContentConsumer.java
new file mode 100644
index 0000000..74fc952
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/IContentConsumer.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * Generic content consumer.
+ * A generic content consumer is used to store plug-in and non-plug-in files
+ * for a feature.
+ * <p>
+ * Clients may implement this interface. However, in most cases clients 
+ * will only use the content consumer provided by the feature type(s)
+ * implemented by the platform.
+ * </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 org.eclipse.update.core.IFeatureContentConsumer
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IContentConsumer {
+
+	/**
+	 * Stores a file.
+	 * 
+	 * @see IFeatureContentConsumer#open(IPluginEntry)
+	 * @see IFeatureContentConsumer#open(INonPluginEntry)
+	 * @param contentReference reference to the file to store
+	 * @param monitor progress monitor, can be <code>null</code>
+	 * @exception CoreException
+	 * @since 2.0 
+	 */
+	public void store(ContentReference contentReference, IProgressMonitor monitor)
+		throws CoreException;
+
+	/**
+	 * Indicates successful completion of the store operations for this
+	 * consumer
+	 * 
+	 * @exception CoreException
+	 * @since 2.0 
+	 */
+	public void close() throws CoreException;
+
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/IFeature.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/IFeature.java
new file mode 100644
index 0000000..8af1af9
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/IFeature.java
@@ -0,0 +1,483 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.update.core;
+
+import java.net.URL;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.update.core.model.InstallAbortedException;
+
+/**
+ * Feature defines the packaging "container" for a group of related plug-ins,
+ * plug-in fragments, and optionally non-plug-in files. 
+ * <p>
+ * Features are treated purely as an installation and packaging construct. 
+ * They do not play a role during Eclipse plug-in execution.
+ * They are simply an inclusive "manifest" of the plug-ins, fragments 
+ * and other files that make up that feature. If features are logically made 
+ * up of plug-ins from "sub-features", the top-level feature "manifest"
+ * must be fully resolved at packaging time.
+ * </p>
+ * <p>
+ * Clients may implement this interface. However, in most cases clients should 
+ * directly instantiate or subclass the provided implementation of this 
+ * interface.
+ * </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 org.eclipse.update.core.Feature
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IFeature extends IAdaptable, IPlatformEnvironment {
+
+	/**
+	 * Indicates a 'happy' feature
+	 * A feature is considered to be 'happy' in the context of a local site
+	 * if all the plug-ins referenced by the feature are installed on the site and no other
+	 * version of any of the plug-ins are installed on any other site of the local site.
+	 * 
+	 * @see org.eclipse.update.configuration.IConfiguredSite#getBrokenStatus(IFeature)
+	 * @since 2.0
+	 */
+	public static final int STATUS_HAPPY = 0;
+
+	/**
+	 * Indicates a 'happy' feature
+	 * A feature is considered to be 'ambiguous' in the context of a local site
+	 * if all the plug-ins referenced by the feature are installed on the site and other
+	 * version of any of the plug-ins are installed on any other site of the local site.
+	 * 
+	 * @see org.eclipse.update.configuration.IConfiguredSite#getBrokenStatus(IFeature)
+	 */	
+	public static final int STATUS_AMBIGUOUS = 1;
+	
+	/**
+	 * Indicates an 'unhappy' feature
+	 * A feature is considered to be 'unhappy' in the context of this site,
+	 * if some of the plug-ins referenced by the feature are not installed on this site.
+	 * 
+	 * @see org.eclipse.update.configuration.IConfiguredSite#getBrokenStatus(IFeature)
+	 * @since 2.0
+	 */	
+	public static final int STATUS_UNHAPPY = 2;
+	
+	
+	/**
+	 * Indicates a disable feature
+	 * 
+	 * @see org.eclipse.update.configuration.IConfiguredSite#getBrokenStatus(IFeature)
+	 * @since 2.0.2
+	 */	
+	public static final int STATUS_DISABLED = -1;
+		
+	/**
+	 * Indicates the one-click update will search the 
+	 * location of the nesting root feature.
+	 * 
+	 * @since 2.0.1
+	 */	
+	public static final int SEARCH_LOCATION_DEFAULT = 0;	
+
+	/**
+	 * Indicates the one-click update will search the 
+	 * location defined by the feature.
+	 * 
+	 * @since 2.0.1
+	 */	
+	public static final int SEARCH_LOCATION_FEATURE = 1;	
+
+	/**
+	 * Indicates the one-click update will search both the 
+	 * location of the nesting root feature and the 
+	 * location defined by the feature.
+	 * 
+	 * @since 2.0.1
+	 */	
+	public static final int SEARCH_LOCATION_BOTH = 2;	
+
+	
+	/**
+	 * Returns the feature identifier.
+	 * 
+	 * @return the feature identifier.
+	 * @since 2.0 
+	 */
+	public VersionedIdentifier getVersionedIdentifier();
+
+	/**
+	 * Returns the site this feature is associated with.
+	 * 
+	 * @return the site for this feature
+	 * @since 2.0 
+	 */
+	public ISite getSite();
+
+	/**
+	 * Returns the displayable label of the feature.
+	 * 
+	 * @return feature label, or <code>null</code>.
+	 * @since 2.0 
+	 */
+	public String getLabel();
+
+	/**
+	 * Returns the feature URL.
+	 * This is the URL that was used to create the feature. The interpretation
+	 * of the URL is dependent on the concrete feature implementation.  * 
+	 * @return feature URL
+	 * @since 2.0 
+	 */
+	public URL getURL();
+
+	/**
+	 * Returns an information entry referencing the location of the
+	 * feature update site. The update site can be accessed to obtain
+	 * feature updates for this feature.
+	 * 
+	 * @return update site entry, or <code>null</code>.
+	 * @since 2.0 
+	 */
+	public IURLEntry getUpdateSiteEntry();
+
+	/**
+	 * Return an array of information entries referencing locations of other
+	 * update sites. This mechanism can be used by features to distribute
+	 * location information about general update sites to clients.
+	 * 
+	 * @return an array of site entries, or an empty array.
+	 * @since 2.0 
+	 */
+	public IURLEntry[] getDiscoverySiteEntries();
+
+	/**
+	 * Returns a displayable label identifying the provider of this feature
+	 * 
+	 * @return provider label, or <code>null</code>.
+	 * @since 2.0 
+	 */
+	public String getProvider();
+
+	/**
+	 * Returns and optional custom install handler entry.
+	 * 
+	 * @return install handler entry, or <code>null</code> if
+	 * none was specified
+	 * @since 2.0
+	 */
+	public IInstallHandlerEntry getInstallHandlerEntry();
+
+	/**
+	 * Returns the feature description.
+	 * 
+	 * @return feature description, or <code>null</code>.
+	 * @since 2.0 
+	 */
+	public IURLEntry getDescription();
+
+	/**
+	 * Returns the copyright information for the feature.
+	 * 
+	 * @return copyright information, or <code>null</code>.
+	 * @since 2.0 
+	 */
+	public IURLEntry getCopyright();
+
+	/**
+	 * Returns the license information for the feature.
+	 * 
+	 * @return feature license, or <code>null</code>.
+	 * @since 2.0 
+	 */
+	public IURLEntry getLicense();
+
+	/**
+	 * Return optional image for the feature.
+	 * 
+	 * @return the URL pointing to the image, , or <code>null</code>.
+	 * @since 2.0 
+	 */
+	public URL getImage();
+
+	/**
+	 * Return a list of plug-in dependencies for this feature. A plug-in
+	 * dependency is a reference to a plug-in required for feature execution
+	 * that is not packaged as part of the feature.
+	 * filtered by the operating system, windowing system and architecture system
+	 * set in <code>SiteManager</code>
+	 * 
+	 * @return the list of required plug-in dependencies, or an empty array.
+	 * @since 2.0 
+	 */
+	public IImport[] getImports();
+
+	/**
+	 * Return a list of plug-in dependencies for this feature. A plug-in
+	 * dependency is a reference to a plug-in required for feature execution
+	 * that is not packaged as part of the feature.
+ 	 * No filtering occurs
+	 * 
+	 * @return the list of required plug-in dependencies, or an empty array.
+	 * @since 2.1
+	 */
+	public IImport[] getRawImports();
+	
+	/**
+	 * Return the identifier of the primary plugin associated to this feature
+	 * or <code>null</code> if the feature is not a primary feature.
+	 * If the primary plugin id is not specified and the feature is a primary
+	 * feature, returns the feature identifier.
+	 * 
+	 * @return the identifier of the associated primary plugin or <code>null</code>
+	 * @since 2.1 
+	 */
+	public String getPrimaryPluginID();
+
+
+	/**
+	 * Install the contents of this feature into the specified target feature.
+	 * All optional features will be installed
+	 * 
+	 * @param targetFeature
+	 * @param verificationListener
+	 * @param monitor
+	 * @exception InstallAbortedException when the user cancels the install
+	 * @exception CoreException
+	 * @since 2.0
+	 */
+	public IFeatureReference install(
+		IFeature targetFeature,
+		IVerificationListener verificationListener,
+		IProgressMonitor monitor)
+		throws InstallAbortedException,CoreException;
+
+	/**
+	 * Install the contents of this feature into the specified target feature.
+	 * Only the listed optional features will be installed.
+	 * 
+	 * @param targetFeature
+	 * @param optionalFeatures the optional features to be installed
+	 * @param verificationListener
+	 * @param monitor
+	 * @exception InstallAbortedException when the user cancels the install
+	 * @exception CoreException
+	 * @since 2.0.1
+	 */
+	public IFeatureReference install(
+		IFeature targetFeature,
+		IFeatureReference[] optionalFeatures,
+		IVerificationListener verificationListener,
+		IProgressMonitor monitor)
+		throws InstallAbortedException,CoreException;
+
+	/**
+	 * Returns an array of feature references included by this feature
+	 * filtered by the operating system, windowing system and architecture system
+	 * set in <code>SiteManager</code>
+	 * 
+	 * @return an array of feature references, or an empty array.
+	 * @since 2.0
+	 */
+	public IIncludedFeatureReference[] getIncludedFeatureReferences() throws CoreException;
+
+	/**
+	 * Returns an array of feature references included by this feature
+	 * No filtering occurs
+	 * 
+	 * @return an array of feature references, or an empty array.
+	 * @since 2.0
+	 */
+	public IIncludedFeatureReference[] getRawIncludedFeatureReferences() throws CoreException;
+
+	/**
+	 * Returns an array of plug-in entries referenced by this feature
+	 * filtered by the operating system, windowing system and architecture system
+	 * set in <code>SiteManager</code>
+	 * 
+	 * @return an array of plug-in entries, or an empty array.
+	 * @since 2.0
+	 */
+	public IPluginEntry[] getPluginEntries();
+
+	/**
+	 * Returns an array of plug-in entries referenced by this feature
+	 * No filtering occurs
+	 * 
+	 * @return an array of plug-in entries, or an empty array.
+	 * @since 2.1
+	 */
+	public IPluginEntry[] getRawPluginEntries();
+
+	/**
+	 * Returns the count of referenced plug-in entries.
+	 * 
+	 * @return plug-in entry count
+	 * @since 2.0
+	 */
+	public int getPluginEntryCount();
+
+	/**
+	 * Returns an array of non-plug-in entries referenced by this feature
+	 * filtered by the operating system, windowing system and architecture system
+	 * set in <code>SiteManager</code>
+	 * 
+	 * @return an array of non-plug-in entries, or an empty array.
+	 * @since 2.0
+	 */
+	public INonPluginEntry[] getNonPluginEntries();
+
+	/**
+	 * Returns an array of non-plug-in entries referenced by this feature
+	 * No filtering occurs
+	 * 
+	 * @return an array of non-plug-in entries, or an empty array.
+	 * @since 2.1
+	 */
+	public INonPluginEntry[] getRawNonPluginEntries();
+
+	/**
+	 * Returns the count of referenced non-plug-in entries.
+	 * 
+	 * @return non-plug-in entry count
+	 * @since 2.0
+	 */
+	public int getNonPluginEntryCount();
+
+	/**
+	 * Returns the download size of the feature, if it can be determined.
+	 * 
+	 * @see org.eclipse.update.core.model.ContentEntryModel#UNKNOWN_SIZE
+	 * @return download size of the feature in KiloBytes, or an indication 
+	 * the size could not be determined
+	 * @since 2.0 
+	 */
+	public long getDownloadSize();
+
+	/**
+	 * Returns the install size of the feature, if it can be determined.
+	 * 
+	 * @see org.eclipse.update.core.model.ContentEntryModel#UNKNOWN_SIZE
+	 * @return install size of the feature in KiloBytes, or an indication 
+	 * the size could not be determined
+	 * @since 2.0 
+	 */
+	public long getInstallSize();
+
+	/**
+	 * Indicates whether the feature can be used as a primary feature.
+	 * 
+	 * @return <code>true</code> if this is a primary feature, 
+	 * otherwise <code>false</code>
+	 * @since 2.0 
+	 */
+	public boolean isPrimary();
+	
+	/**
+	 * Indicates whether the feature must be processed alone during installation
+	 * and configuration. Features that are not exclusive can be installed in a
+	 * batch.
+	 * 
+	 * @return <code>true</code> if feature requires exclusive processing,
+	 * <code>false</code> otherwise.
+	 * @since 2.1
+	 */
+	public boolean isExclusive();
+
+	/**
+	 * Returns an optional identifier of an application to be used when
+	 * starting up the platform with this feature as the primary feature.
+	 * The application identifier must represent a valid application registered
+	 * in the <code>org.eclipse.core.runtime.applications</code> extension point.
+	 * 
+	 * @return application identifier, or <code>null</code>
+	 * @since 2.0 
+	 */
+	public String getApplication();
+	
+	/**
+	 * Returns an optional identifier of a co-location affinity feature.
+	 * 
+	 * @return feature identifier, or <code>null</code>.
+	 * @since 2.0
+	 */
+	public String getAffinityFeature();
+
+	/**
+	 * Returns the content provider for this feature. A content provider
+	 * is an abstraction of each feature internal packaging structure.
+	 * It allows the feature content to be accessed in a standard way
+	 * regardless of the internal packaging. All concrete features
+	 * need to be able to return a content provider.
+	 * 
+	 * @return feature content provider
+	 * @exception CoreException
+	 * @since 2.0
+	 */
+	public IFeatureContentProvider getFeatureContentProvider()
+		throws CoreException;
+
+	/**
+	 * Returns the content consumer for this feature. A content consumer
+	 * is an abstraction of each feature internal packaging mechanism.
+	 * It allows content to be stored into a feature in a standard way
+	 * regardless of the packaging mechanism used. Only concrete features
+	 * that support storing need to implement a content consumer. The platform
+	 * implements at least one feature type supporting content consumer.
+	 * This is the feature type representing a locally-installed
+	 * feature.
+	 * 
+	 * @return feature content consumer
+	 * @exception CoreException
+	 * @exception UnsupportedOperationException
+	 * @since 2.0
+	 */
+	public IFeatureContentConsumer getFeatureContentConsumer()
+		throws CoreException;
+
+	/**
+	 * Sets the site for this feature. This is typically performed as part
+	 * of the feature creation operation. Once set, the site
+	 * should not be reset.
+	 * 
+	 * @param site the site
+	 * @throws CoreException site for this feature is already set
+	 * @since 2.0 
+	 */
+	public void setSite(ISite site) throws CoreException;
+
+	/**
+	 * Sets the content provider for this feature. This is typically
+	 * performed as part of the feature creation operation. Once set, the 
+	 * provider should not be reset.
+	 * 
+	 * @param featureContentProvider content provider
+	 * @since 2.0
+	 */
+	public void setFeatureContentProvider(IFeatureContentProvider featureContentProvider);
+
+	/**
+	 * Returns <code>true</code> if this feature is patching another feature,
+	 * <code>false</code> otherwise
+	 * @return boolean
+	 * @since 2.1
+	 */
+	public boolean isPatch();
+
+
+}
\ No newline at end of file
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/IFeatureContentConsumer.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/IFeatureContentConsumer.java
new file mode 100644
index 0000000..116d3dd
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/IFeatureContentConsumer.java
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * Feature content consumer.
+ * A feature content consumer is an abstraction of each feature internal
+ * packaging mechanism. It allows content to be stored into a feature in
+ * a standard way regardless of the packaging mechanism used. Only concrete
+ * features that support storing need to implement a content consumer. 
+ * The platform implements at least one feature type supporting content
+ * consumer. This is the feature type representing a locally-installed
+ * feature.
+ * <p>
+ * A feature content consumer delegates the storage of plug-in and 
+ * non-plug-in files to a generic content consumer.
+ * </p>
+ * <p>
+ * Clients may implement this interface. However, in most cases clients 
+ * will only use the feature content consumer provided by the feature type(s)
+ * implemented by the platform.
+ * </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 org.eclipse.update.core.IContentConsumer
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IFeatureContentConsumer {
+
+	
+	/**
+	 * Store a feature file.
+	 * Note that only the feature definition files should be stored using
+	 * this method. Plug-in files and non-plug-in data files should be
+	 * stored using the content consumers corresponding to their respective
+	 * entries.
+	 * 
+	 * @see #open(IPluginEntry)
+	 * @see #open(INonPluginEntry)	 
+	 * @param contentReference content reference to feature file
+	 * @param monitor progress monitor, can be <code>null</code>
+	 * @exception CoreException
+	 * @since 2.0 
+	 */
+	public void store(ContentReference contentReference, IProgressMonitor monitor)
+		throws CoreException;
+
+	/**
+	 * Opens a generic content consumer for the specified plug-in entry.
+	 * Plug-in files corresponding to this entry should be stored
+	 * using this content consumer.
+	 * 
+	 * @param pluginEntry plug-in entry
+	 * @return generic content consumer for the entry
+	 * @exception CoreException
+	 * @since 2.0 
+	 */
+	public IContentConsumer open(IPluginEntry pluginEntry) throws CoreException;
+
+	/**
+	 * Opens a generic content consumer for the specified non-plug-in entry.
+	 * Non-plug-in files corresponding to this entry should be stored
+	 * using this content consumer.
+	 * 
+	 * @param nonPluginEntry non-plug-in entry
+	 * @return generic content consumer for the entry
+	 * @exception CoreException
+	 * @since 2.0 
+	 */
+	public IContentConsumer open(INonPluginEntry nonPluginEntry)
+		throws CoreException;
+
+	/**
+	 * Closes this content consumer. This indicates a successful completion
+	 * of the store operations. The content consumer commits any changes
+	 * made by this consumer.
+	 * 
+	 * @return reference to the newly populated feature
+	 * @exception CoreException
+	 * @since 2.0 
+	 */
+	public IFeatureReference close() throws CoreException;
+
+	/**
+	 * Closes this content consumer, indicating the store operations should
+	 * be aborted. The content consumer attempts to back out any changes
+	 * made by this content consumer.
+	 * 
+	 * @exception CoreException
+	 * @since 2.0 
+	 */
+	public void abort() throws CoreException;
+
+	/**
+	 * Sets the feature for this content consumer.
+	 * In general, this method should only be called as part of
+	 * feature creation. Once set, the feature should not be reset.
+	 * 
+	 * @param feature feature for this content consumer
+	 * @since 2.0
+	 */
+	public void setFeature(IFeature feature);
+
+	/**
+	 * Returns the feature for this content consumer.
+	 *
+	 * @return the feature for this content consumer
+	 * @since 2.0
+	 */
+	public IFeature getFeature();
+
+	/**
+	 * Sets the parent for this content consumer.
+	 * In general, this method should only be called as part of
+	 * feature creation. Once set, the feature should not be reset.
+	 * 
+	 * @param parent parent feature content consumer.
+	 * @since 2.0 
+	 */
+	public void setParent(IFeatureContentConsumer parent);
+
+	/**
+	 * Returns the feature content consumer that opened
+	 * this feature content consumer, or <code>null</code>
+	 * if this feature content consumer is a root feature
+	 * content consumer.
+	 *
+	 * @return the parent feature content consumer, or null.
+	 * @since 2.0
+	 */
+	public IFeatureContentConsumer getParent();
+
+	/**
+	 * Link the content consumer of the feature as a child
+	 * content consumer
+	 * 
+	 * @param feature the child feature.
+	 * @throws CoreException 
+	 * @since 2.0 
+	 */
+	public void addChild(IFeature feature) throws CoreException;
+
+	/**
+	 * Returns the feature content consumers that
+	 * this feature content consumer opened
+	 *
+	 * @return an array of feature content consumer, or en empty array.
+	 * @since 2.0
+	 */
+	public IFeatureContentConsumer[] getChildren();
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/IFeatureContentProvider.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/IFeatureContentProvider.java
new file mode 100644
index 0000000..d09f6f1
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/IFeatureContentProvider.java
@@ -0,0 +1,270 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.net.URL;
+
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * Feature content provider.
+ * A feature content provider is an abstraction of each feature internal 
+ * packaging structure. It allows the feature content to be accessed in
+ * a standard way regardless of the internal packaging. All concrete feature
+ * implementations need to implement a feature content provider.
+ * <p>
+ * There are two ways of looking at a feature content:
+ * <ol>
+ * <li>the "logical" view, which is a representation of the actual files that
+ * make up the feature. These include any files that describe the feature
+ * itself, files that are the actual implementation of referenced plug-ins,
+ * and files that are the non-plug-in data files associated with the feature
+ * <li>the "packaged" view, which is a set of related archive files that
+ * contain the "logical" files.
+ * </ol>
+ * It is the responsibility of a feature content provider to manage the
+ * mapping between the "packaged" and "logical" views.
+ * </p>
+ * <p>
+ * Clients may implement this interface. However, in most cases clients should 
+ * directly instantiate or subclass the provided implementation of this 
+ * interface.
+ * </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 org.eclipse.update.core.FeatureContentProvider
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IFeatureContentProvider {
+
+	/**
+	 * Returns the feature url. 
+	 * The exact interpretation of this URL is specific to each content
+	 * provider. Typically, the URL is a reference to a file that can be 
+	 * used directly, or indirectly, to determine the content of the feature.
+	 * 
+	 * @return feature url
+	 * @since 2.0
+	 */
+	public URL getURL();
+
+	/**
+	 * Returns a content reference to the feature manifest. The feature manifest
+	 * is an xml file, whose format is specified by the platform. Typically
+	 * a feature will contain the manifest as one of the packaged files.
+	 * For features that do not contain the manifest, or contain a manifest
+	 * that does not follow the specified format, this method returns
+	 * a reference to a computed manifest in the appropriate platform
+	 * format.
+	 * 
+	 * @param monitor progress monitor, can be <code>null</code>
+	 * @return feature manifest reference, or <code>null</code> if the manifest cannot be found.
+	 * @since 2.0
+	 */
+	public ContentReference getFeatureManifestReference(InstallMonitor monitor)
+		throws CoreException;
+
+	/**
+	 * Returns an array of content references of all the "packaged"
+	 * archives that make up this feature. 
+	 * <p>
+	 * The number of returned references is dependent on each feature 
+	 * content provider (i.e is dependent on the packaging mechanism used
+	 * by the particular feature type).
+	 * </p>
+	 * 
+	 * @param monitor progress monitor, can be <code>null</code>
+	 * @return an array of references, or an empty array if no references
+	 * are found
+	 * @exception CoreException
+	 * @since 2.0 
+	 */
+	public ContentReference[] getArchiveReferences(InstallMonitor monitor)
+		throws CoreException;
+
+	/**
+	 * Returns an array of content references of the "packaged"
+	 * archives that contain the feature descriptive information.
+	 * <p>
+	 * In general, the feature descriptive information should be packaged
+	 * separately from the "bulk" of the actual feature content.
+	 * The feature entry archive(s) must be downloaded from an update
+	 * site in order to present information about the feature to the
+	 * client. Consequently, keeping the number and size of the feature
+	 * entry archive(s) to a minimum will speed up the responsiveness of the
+	 * user interface.
+	 * </p>
+	 * <p>
+	 * The number of returned references is dependent on each feature
+	 * content provider (i.e is dependent on the packaging mechanism used
+	 * by the particular feature type).
+	 * </p>
+	 * 
+	 * @see IFeatureContentProvider#getFeatureEntryContentReferences(InstallMonitor)
+	 * @param monitor progress monitor, can be <code>null</code>
+	 * @return an array of references, or an empty array if no references
+	 * are found
+	 * @exception CoreException
+	 * @since 2.0 
+	 */
+	public ContentReference[] getFeatureEntryArchiveReferences(InstallMonitor monitor)
+		throws CoreException;
+
+	/**
+	 * Returns an array of content references of the "packaged"
+	 * archives that contain the files for the specified plug-in entry.
+	 * <p>
+	 * The number of returned references is dependent on each feature
+	 * content provider (i.e is dependent on the packaging mechanism used
+	 * by the particular feature type).
+	 * </p>
+	 * 
+	 * @see IFeatureContentProvider#getPluginEntryContentReferences(IPluginEntry, InstallMonitor)
+	 * @param pluginEntry plug-in entry
+	 * @param monitor progress monitor, can be <code>null</code>
+	 * @return an array of references, or an empty array if no references
+	 * are found
+	 * @exception CoreException
+	 * @since 2.0 
+	 */
+	public ContentReference[] getPluginEntryArchiveReferences(
+		IPluginEntry pluginEntry,
+		InstallMonitor monitor)
+		throws CoreException;
+
+	/**
+	 * Returns an array of content references of the "packaged"
+	 * archives that contain the files for the specified non-plug-in entry.
+	 * <p>
+	 * The number of returned references is dependent on each feature
+	 * content provider (i.e is dependent on the packaging mechanism used
+	 * by the particular feature type).
+	 * </p>
+	 * <p>
+	 * Note, that the platform does not interpret non-plug-in entries in any 
+	 * way, other that performing any required downloads. Non-plug-in entries
+	 * are handled by custom install handlers that must be specified for
+	 * the feature. Consequently, this interface does not make a distinction
+	 * between the "logical" and "packaged" views for non-plug-in entries.
+	 * The "packaged" view (returning references to the non-plug-in archives)
+	 * is the only one supported. It is the responsibility of the custom install
+	 * handler to understand the "logical" view of non-plug-in archives.
+	 * </p>
+	 * 
+	 * @param monitor progress monitor, can be <code>null</code>
+	 * @return an array of references, or an empty array if no references
+	 * are found
+	 * @exception CoreException
+	 * @since 2.0 
+	 */
+	public ContentReference[] getNonPluginEntryArchiveReferences(
+		INonPluginEntry nonPluginEntry,
+		InstallMonitor monitor)
+		throws CoreException;
+
+	/**
+	 * Returns an array of content references to the feature definition files
+	 * (i.e the "logical" view of the files defining the feature). These
+	 * are the files required to present information about the feature to the
+	 * client, and in general, should not contain references to plug-in and 
+	 * non-plug-in files.
+	 * 
+	 * @see IFeatureContentProvider#getFeatureEntryArchiveReferences(InstallMonitor)
+	 * @param monitor progress monitor, can be <code>null</code>
+	 * @return an array of ContentReference or an empty array if no references are found
+	 * @exception CoreException when an error occurs
+	 * @since 2.0 
+	 */
+	public ContentReference[] getFeatureEntryContentReferences(InstallMonitor monitor)
+		throws CoreException;
+
+	/**
+	 * Returns an array of content references to the files implementing
+	 * the specified plug-in. (i.e the "logical" view of the plug-in).
+	 * 
+	 * @see IFeatureContentProvider#getPluginEntryArchiveReferences(IPluginEntry, InstallMonitor)
+	 * @param monitor progress monitor, can be <code>null</code>
+	 * @return an array of ContentReference or an empty array if no references are found
+	 * @exception CoreException
+	 * @since 2.0 
+	 */
+	public ContentReference[] getPluginEntryContentReferences(
+		IPluginEntry pluginEntry,
+		InstallMonitor monitor)
+		throws CoreException;
+
+	/**
+	 * Returns the total size of all archives required for the
+	 * specified plug-in and non-plug-in entries (the "packaging" view).
+	 * 
+	 * @param pluginEntries an array of plug-in entries
+	 * @param nonPluginEntries an array of non-plug-in entries
+	 * @return total download size, or an indication that size could not be
+	 * determined
+	 * @see org.eclipse.update.core.model.ContentEntryModel#UNKNOWN_SIZE
+	 * @since 2.0
+	 */
+	public long getDownloadSizeFor(
+		IPluginEntry[] pluginEntries,
+		INonPluginEntry[] nonPluginEntries);
+
+	/**
+	 * Returns the total size of all files required for the
+	 * specified plug-in and non-plug-in entries (the "logical" view).
+	 * 
+	 * @param pluginEntries an array of plug-in entries
+	 * @param nonPluginEntries an array of non-plug-in entries
+	 * @return total download size, or an indication that size could not be
+	 * determined
+	 * @see org.eclipse.update.core.model.ContentEntryModel#UNKNOWN_SIZE
+	 * @since 2.0
+	 */
+	public long getInstallSizeFor(
+		IPluginEntry[] pluginEntries,
+		INonPluginEntry[] nonPluginEntries);
+
+	/**
+	 * Returns the verifier for this feature.
+	 * If provided, the verifier is called at various point during
+	 * installation processing to verify downloaded archives. The
+	 * type of verification provided is dependent on the content
+	 * provider implementation.
+	 * 
+	 * @return verifier
+	 * @exception CoreException
+	 * @since 2.0
+	 */
+	public IVerifier getVerifier() throws CoreException;
+
+	/**
+	 * Returns the feature associated with this content provider.
+	 * 
+	 * @return feature for this content provider
+	 * @since 2.0
+	 */
+	public IFeature getFeature();
+
+	/**
+	 * Sets the feature associated with this content provider.
+	 * In general, this method should only be called as part of
+	 * feature creation. Once set, the feature should not be reset.
+	 * 
+	 * @param feature feature for this content provider
+	 * @since 2.0
+	 */
+	public void setFeature(IFeature feature);
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/IFeatureFactory.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/IFeatureFactory.java
new file mode 100644
index 0000000..7e0736d
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/IFeatureFactory.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.net.URL;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * Feature factory interface.
+ * A feature factory is used to construct new instances of concrete
+ * features. 
+ * <p>
+ * Clients may implement this interface. However, in most cases clients should 
+ * directly instantiate or subclass the provided implementation of this 
+ * interface.
+ * </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 org.eclipse.update.core.BaseFeatureFactory
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IFeatureFactory {
+
+	/**
+	 * Returns a feature defined by the supplied URL. The feature
+	 * is associated with the specified site.
+	 * <p>
+	 * The actual interpretation of the URL is feature-type specific.
+	 * In most cases the URL will point to some feature-specific
+	 * file that can be used (directly or indirectly) to construct
+	 * the feature object.
+	 * </p>
+	 * @param url URL interpreted by the feature
+	 * @param site site to be associated with the feature
+	 * @return concrete feature object
+	 * @exception CoreException
+	 * @deprecated use createFeature(URL, ISite, IProgressMonitor) instead
+	 * @since 2.0 
+	 */
+	public IFeature createFeature(URL url, ISite site) throws CoreException;
+	
+	/**
+	 * Returns a feature defined by the supplied URL. The feature
+	 * is associated with the specified site.
+	 * <p>
+	 * The actual interpretation of the URL is feature-type specific.
+	 * In most cases the URL will point to some feature-specific
+	 * file that can be used (directly or indirectly) to construct
+	 * the feature object.
+	 * </p>
+	 * @param url URL interpreted by the feature
+	 * @param site site to be associated with the feature
+	 * @return concrete feature object
+	 * @exception CoreException
+	 * @since 2.1 
+	 */
+	public IFeature createFeature(URL url, ISite site, IProgressMonitor monitor) throws CoreException;	
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/IFeatureReference.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/IFeatureReference.java
new file mode 100644
index 0000000..e8bd3a3
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/IFeatureReference.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.net.URL;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * Feature reference.
+ * A reference to a feature.
+ * <p>
+ * Clients may implement this interface. However, in most cases clients should 
+ * directly instantiate or subclass the provided implementation of this 
+ * interface.
+ * </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 org.eclipse.update.core.FeatureReference
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IFeatureReference extends IAdaptable,IPlatformEnvironment {
+
+	/**
+	 * Returns the referenced feature URL.
+	 * 
+	 * @return feature URL 
+	 * @since 2.0 
+	 */
+	public URL getURL();
+
+	/**
+	 * Returns the update site for the referenced feature
+	 * 
+	 * @return feature site
+	 * @since 2.0 
+	 */
+	public ISite getSite();
+
+	/**
+	 * Returns the label for the referenced feature
+	 *
+	 * @return the label
+	 * @since 2.1
+	 */
+	public String getName();
+
+
+	/**
+	 * Returns the referenced feature.
+	 * This is a factory method that creates the full feature object.
+	 * 
+	 * @return the referenced feature
+	 * @deprecated use getFeature(IProgressMonitor) instead
+	 * @since 2.0 
+	 */
+	public IFeature getFeature() throws CoreException;
+
+	/**
+	 * Returns the referenced feature.
+	 * This is a factory method that creates the full feature object.
+	 * 
+	 * @param monitor the progress monitor
+	 * @return the referenced feature
+	 * @since 2.1 
+	 */
+	public IFeature getFeature(IProgressMonitor monitor) throws CoreException;
+
+
+	/**
+	 * Returns the feature identifier.
+	 * 
+	 * @return the feature identifier.
+	 * @exception CoreException
+	 * @since 2.0 
+	 */
+	public VersionedIdentifier getVersionedIdentifier() throws CoreException;
+
+	/**
+	 * Sets the feature reference URL.
+	 * This is typically performed as part of the feature reference creation
+	 * operation. Once set, the url should not be reset.
+	 * 
+	 * @param url reference URL
+	 * @since 2.0 
+	 */
+	public void setURL(URL url) throws CoreException;
+
+	/**
+	 * Associates a site with the feature reference.
+	 * This is typically performed as part of the feature reference creation
+	 * operation. Once set, the site should not be reset.
+	 * 
+	 * @param site site for the feature reference
+	 * @since 2.0 
+	 */
+	public void setSite(ISite site);
+	
+	/**
+	 * Returns <code>true</code> if this feature is patching another feature,
+	 * <code>false</code> otherwise
+	 * @return boolean
+	 * @since 2.1
+	 */
+	public boolean isPatch();
+	
+	
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/IImport.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/IImport.java
new file mode 100644
index 0000000..4dc6c70
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/IImport.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+
+import org.eclipse.core.runtime.IAdaptable;
+
+/**
+ * Plug-in dependency entry.
+ * Describes a feature dependency on a particular plug-in. The dependency 
+ * can specify a specific plug-in version and a matching rule for 
+ * satisfying the dependency.
+ * <p>
+ * Clients may implement this interface. However, in most cases clients should 
+ * directly instantiate or subclass the provided implementation of this 
+ * interface.
+ * </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 org.eclipse.update.core.Import
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IImport extends IAdaptable, IUpdateConstants, IPlatformEnvironment {
+
+	/**
+	 * The import relates to a plugin
+	 * @since 2.0.2
+	 */
+	public static final int KIND_PLUGIN = 0;
+	
+	/**
+	 * The import relates to a feature
+	 * @since 2.0.2
+	 */
+	public static final int KIND_FEATURE = 1;
+
+	/** 
+	 * Returns an identifier of the dependent plug-in.
+	 * 
+	 * @return plug-in identifier
+	 * @since 2.0 
+	 */
+	public VersionedIdentifier getVersionedIdentifier();
+
+	/**
+	 * Returns the matching rule for the dependency.
+	 * 
+	 * @return matching rule
+	 * @since 2.0 
+	 */
+	public int getRule();
+	
+	/**
+	 * Returns the matching rule for the dependency identifier.
+	 * 
+	 * @return matching id rule
+	 * @since 2.1 
+	 */
+	public int getIdRule();
+	
+	/**
+	 * Returns the dependency kind
+	 * 
+	 * @see #KIND_PLUGIN
+	 * @see #KIND_FEATURE
+	 * @return KIND_PLUGIN if the dependency relates to a plugin, 
+	 * KIND_FEATURE if the dependency relates to a feature.
+	 */
+	public int getKind();
+	
+	/**
+	 * Returns the patch mode. If the import is in patch mode,
+	 * the referenced feature is considered a patch target,
+	 * and the feature that owns the import is patch carrier.
+	 * Patch carrier and patched feature are linked in a
+	 * distinct way: if a patched feature is disabled,
+	 * all the patches are disabled with it.
+	 * @return true if the element represents a patch
+	 * reference, false otherwise.
+	 */
+	public boolean isPatch();
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/IIncludedFeatureReference.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/IIncludedFeatureReference.java
new file mode 100644
index 0000000..7511a62
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/IIncludedFeatureReference.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.update.configuration.IConfiguredSite;
+
+
+
+/**
+ * Included Feature reference.
+ * A reference to a included feature.
+ * <p>
+ * Clients may implement this interface. However, in most cases clients should 
+ * directly instantiate or subclass the provided implementation of this 
+ * interface.
+ * </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 org.eclipse.update.core.FeatureReference
+ * @since 2.0.1
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IIncludedFeatureReference extends IFeatureReference, IAdaptable {
+
+	/**
+	 * Returns the referenced feature.
+	 * This is a factory method that creates the full feature object.
+	 * equivalent to getFeature(false,null);
+	 * 
+	 * @return the referenced feature
+	 * @deprecated use getFeature(IProgressMonitor)
+	 * @since 2.0 
+	 */
+	public IFeature getFeature() throws CoreException;
+
+	/**
+	 * Returns the referenced feature.
+	 * This is a factory method that creates the full feature object.
+	 * 
+	 * @param perfectMatch <code>true</code> if the perfect match feature feature should be returned
+	 * <code>false</code> if the best match feature should be returned.
+	 * @param configuredSite the configured site to search for the Feature. If 
+	 * the configured site is <code>null</code> the search will be done in the current configured site.
+	 * @return the referenced feature
+	 * instead
+	 * @since 2.0.2
+	 * <b>Note:</b> This method 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.
+	 * @deprecated use getFeature(IProgressMonitor)
+	 */
+	public IFeature getFeature(boolean perfectMatch,IConfiguredSite configuredSite) throws CoreException;
+
+	/**
+	 * Returns the referenced feature.
+	 * This is a factory method that creates the full feature object.
+	 * 
+	 * @param perfectMatch <code>true</code> if the perfect match feature feature should be returned
+	 * <code>false</code> if the best match feature should be returned.
+	 * @param configuredSite the configured site to search for the Feature. If 
+	 * the configured site is <code>null</code> the search will be done in the current configured site.
+	 * @param monitor the progress monitor
+	 * @return the referenced feature
+	 * @since 2.1
+	 * <b>Note:</b> This method 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.
+	 * @deprecated use getFeature(IProgressMonitor)
+	 */
+	public IFeature getFeature(boolean perfectMatch,IConfiguredSite configuredSite, IProgressMonitor monitor) throws CoreException;
+
+
+	/**
+	 * Returns <code>true</code> if the feature is optional, <code>false</code> otherwise.
+	 * 
+	 * @return boolean
+	 * @since 2.0.1
+	 */
+	public boolean isOptional();
+
+	/**
+	 * Returns the matching rule for this included feature.
+	 * The rule will determine the ability of the included feature to move version 
+	 * without causing the overall feature to appear broken.
+	 * 
+	 * The default is <code>RULE_PERFECT</code>
+	 * 
+	 * @see IUpdateConstants#RULE_PERFECT
+	 * @see IUpdateConstants#RULE_EQUIVALENT
+	 * @see IUpdateConstants#RULE_COMPATIBLE
+	 * @see IUpdateConstants#RULE_GREATER_OR_EQUAL
+	 * @return int representation of feature matching rule.
+	 * @since 2.0.2
+	 * @deprecated since 3.0 included feature version is exactly specified
+	 */
+	public int getMatch();
+	
+	/**
+	 * Returns the search location for this included feature.
+	 * The location will be used to search updates for this feature.
+	 * 
+	 * The default is <code>SEARCH_ROOT</code>
+	 * 
+	 * @see IUpdateConstants#SEARCH_ROOT
+	 * @see IUpdateConstants#SEARCH_SELF
+	 * @return int representation of feature searching rule.
+	 * @since 2.0.2
+	 */
+
+	public int getSearchLocation();
+
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/IInstallHandler.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/IInstallHandler.java
new file mode 100644
index 0000000..a18790a
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/IInstallHandler.java
@@ -0,0 +1,247 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * Custom install handler.
+ * Custom install handlers can optionally be associated with a feature.
+ * The actual install handler implementation can be physically delivered
+ * as part of the feature package, or can already be installed on the client
+ * machine and registered via the <code>org.eclipse.update.core.installHandlers</code>
+ * extension point. The install handler methods are called at predetermined
+ * point during update actions.
+ * <p>
+ * Clients may implement this interface. However, in most cases clients should 
+ * directly subclass the provided implementation of this interface.
+ * </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 org.eclipse.update.core.BaseInstallHandler
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IInstallHandler {
+
+	/**
+	 * Indicates the handler is being initialized for feature install.
+	 * @since 2.0
+	 */
+	public static final int HANDLER_ACTION_INSTALL = 1;
+
+	/**
+	 * Indicates the handler is being initialized for feature configure.
+	 * @since 2.0
+	 */
+	public static final int HANDLER_ACTION_CONFIGURE = 2;
+
+	/**
+	 * Indicates the handler is being initialized for feature unconfigure.
+	 * @since 2.0
+	 */
+	public static final int HANDLER_ACTION_UNCONFIGURE = 3;
+
+	/**
+	 * Indicates the handler is being initialized for feature uninstall.
+	 * @since 2.0
+	 */
+	public static final int HANDLER_ACTION_UNINSTALL = 4;
+
+	/**
+	 * Initialize the install handler.
+	 * Install handlers are always constructed using the default constructor.
+	 * The are initialized immediately following construction.
+	 * 
+	 * @param type update action type
+	 * @param feature the target of the action
+	 * @param entry model entry that defines this handler
+	 * @param monitor optional progress monitor, can be <code>null</code>
+	 * @exception CoreException
+	 * @since 2.0
+	 */
+	public void initialize(
+		int type,
+		IFeature feature,
+		IInstallHandlerEntry entry,
+		InstallMonitor monitor)
+		throws CoreException;
+
+	/**
+	 * Called at the start of the install action. At this point, no install
+	 * processing has taken place.
+	 * 
+	 * @see #HANDLER_ACTION_INSTALL
+	 * @exception CoreException terminates the action
+	 * @since 2.0
+	 */
+	public void installInitiated() throws CoreException;
+
+	/**
+	 * Called after files corresponding to plug-in entries have been downloaded,
+	 * but before they are actully unpacked and installed.
+	 * 
+	 * @see #HANDLER_ACTION_INSTALL
+	 * @param plugins downloaded plug-in entries. Note this may be a subset
+	 * of the plug-ins actually references by the feature.
+	 * @exception CoreException terminates the action
+	 * @since 2.0
+	 */
+	public void pluginsDownloaded(IPluginEntry[] plugins) throws CoreException;
+
+	/**
+	 * Called after files corresponding to non-plug-in entries have been 
+	 * downloaded. The custom install handler can perform any custom
+	 * verification of the non-plug-in entries (these are not interpreted
+	 * in any way by the platform (beyond downloading)).
+	 * 
+	 * @see #HANDLER_ACTION_INSTALL
+	 * @param nonPluginData downloaded non-plug-in entries.
+	 * @param listener verification listener, may be <code>null</code>.
+	 * @exception CoreException terminates the action
+	 * @since 2.0
+	 */
+	public void nonPluginDataDownloaded(
+		INonPluginEntry[] nonPluginData,
+		IVerificationListener listener)
+		throws CoreException;
+
+	/**
+	 * Called after the feature files and any downloaded plug-ins have
+	 * been installed. Typically this is the point where the custom
+	 * install handler can install any non-plug-in entries (these are not 
+	 * interpreted in any way by the platform (beyond downloading)).
+	 * 
+	 * @see #HANDLER_ACTION_INSTALL
+	 * @param consumer content consumer for the feature. The install handler
+	 * can choose to use this consumer to install the non-plug-in data,
+	 * or can handle the data in any other way. If using the consumer,
+	 * the install handler should only call 
+	 * @see IFeatureContentConsumer#store(ContentReference, IProgressMonitor)
+	 * and @see IFeatureContentConsumer#open(INonPluginEntry)
+	 * methods of the consumer. 
+	 * @exception CoreException terminates the action
+	 * @since 2.0
+	 */
+	public void completeInstall(IFeatureContentConsumer consumer)
+		throws CoreException;
+
+	/**
+	 * Called at the end of the install action.
+	 * 
+	 * @see #HANDLER_ACTION_INSTALL
+	 * @param success indicates action success. 
+	 * @exception CoreException terminates the action
+	 * @since 2.0
+	 */
+	public void installCompleted(boolean success) throws CoreException;
+
+	/**
+	 * Called at the start of the configure action
+	 * 
+	 * @see #HANDLER_ACTION_CONFIGURE
+	 * @exception CoreException terminates the action
+	 * @since 2.0
+	 */
+	public void configureInitiated() throws CoreException;
+
+	/**
+	 * Called after the feature has been configured. The install handler
+	 * should perform any completion tasks. No arguments are passed
+	 * to the method. If needed, the install handler can use arguments
+	 * passed on the initialization call.
+	 * 
+	 * @see #HANDLER_ACTION_CONFIGURE
+	 * @exception CoreException terminates the action
+	 * @since 2.0
+	 */
+	public void completeConfigure() throws CoreException;
+
+	/**
+	 * Called at the end of the configure action.
+	 * 
+	 * @see #HANDLER_ACTION_CONFIGURE
+	 * @param success indicates action success. 
+	 * @exception CoreException terminates the action
+	 * @since 2.0
+	 */
+	public void configureCompleted(boolean success) throws CoreException;
+
+	/**
+	 * Called at the start of the unconfigure action
+	 * 
+	 * @see #HANDLER_ACTION_UNCONFIGURE
+	 * @exception CoreException terminates the action
+	 * @since 2.0
+	 */
+	public void unconfigureInitiated() throws CoreException;
+
+	/**
+	 * Called after the feature has been unconfigured. The install handler
+	 * should perform any completion tasks. No arguments are passed
+	 * to the method. If needed, the install handler can use arguments
+	 * passed on the initialization call.
+	 * 
+	 * @see #HANDLER_ACTION_UNCONFIGURE
+	 * @exception CoreException terminates the action
+	 * @since 2.0
+	 */
+	public void completeUnconfigure() throws CoreException;
+
+	/**
+	 * Called at the end of the unconfigure action.
+	 * 
+	 * @see #HANDLER_ACTION_UNCONFIGURE
+	 * @param success indicates action success. 
+	 * @exception CoreException terminates the action
+	 * @since 2.0
+	 */
+	public void unconfigureCompleted(boolean success) throws CoreException;
+
+	/**
+	 * Called at the start of the uninstall action
+	 * 
+	 * @see #HANDLER_ACTION_UNINSTALL
+	 * @exception CoreException terminates the action
+	 * @since 2.0
+	 */
+	public void uninstallInitiated() throws CoreException;
+
+	/**
+	 * Called after the feature has been uninstalled. The install handler
+	 * should perform any completion tasks. No arguments are passed
+	 * to the method. If needed, the install handler can use arguments
+	 * passed on the initialization call. Note, that at this point
+	 * the feature files and any unreferenced plug-ins have been
+	 * removed.
+	 * 
+	 * @see #HANDLER_ACTION_UNINSTALL
+	 * @exception CoreException terminates the action
+	 * @since 2.0
+	 */
+	public void completeUninstall() throws CoreException;
+
+	/**
+	 * Called at the end of the uninstall action.
+	 * 
+	 * @see #HANDLER_ACTION_UNINSTALL
+	 * @param success indicates action success. 
+	 * @exception CoreException terminates the action
+	 * @since 2.0
+	 */
+	public void uninstallCompleted(boolean success) throws CoreException;
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/IInstallHandlerEntry.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/IInstallHandlerEntry.java
new file mode 100644
index 0000000..206cece
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/IInstallHandlerEntry.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.net.URL;
+
+import org.eclipse.core.runtime.IAdaptable;
+
+/**
+ * Install handler entry.
+ * Associates an optional custom install handler with the feature.
+ * Install handlers must implement the IInstallHandler interface.
+ * <p>
+ * Clients may implement this interface. However, in most cases clients should 
+ * directly instantiate or subclass the provided implementation of this 
+ * interface.
+ * </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 org.eclipse.update.core.InstallHandlerEntry
+ * @see org.eclipse.update.core.IInstallHandler
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IInstallHandlerEntry extends IAdaptable {
+
+	/**
+	 * Returns optional URL used for browser-triggered installation handling.
+	 * 
+	 * @return url
+	 * @since 2.0 
+	 */
+	public URL getURL();
+
+	/**
+	 * Returns optional name of a library containing the install
+	 * handler classes. If specified, the referenced library
+	 * must be contained in the feature archive.
+	 * 
+	 * @return install handler library name
+	 * @since 2.0 
+	 */
+	public String getLibrary();
+
+	/**
+	 * Returns install handler name.
+	 * It is interpreted depending on the value of the library
+	 * specification. If library is not specified, the name
+	 * is intepreted as an identifier of a "global" install
+	 * handler registered in the <code>org.eclipse.update.core.installHandlers</code> 
+	 * extension point. If library is specified, the name is interpreted
+	 * as a fully qualified name of a class contained in the
+	 * library. In both cases, the resulting class must
+	 * implement IInstallHandler. The class is dynamically loaded and
+	 * called at specific points during feature processing.
+	 * The handler has visibility to the API classes from the update plug-in,
+	 * and plug-ins required by the update plugin. 
+	 * 
+	 * @see IInstallHandler
+	 * @return handler name
+	 * @since 2.0 
+	 */
+	public String getHandlerName();
+
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/IInstallHandlerWithFilter.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/IInstallHandlerWithFilter.java
new file mode 100644
index 0000000..30ae8ea
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/IInstallHandlerWithFilter.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+/**
+ * Custom install handler.
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IInstallHandlerWithFilter extends IInstallHandler{
+
+		public boolean acceptNonPluginData(INonPluginEntry data);
+		
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/INonPluginEntry.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/INonPluginEntry.java
new file mode 100644
index 0000000..7bd158d
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/INonPluginEntry.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import org.eclipse.core.runtime.IAdaptable;
+
+/**
+ * Non-plug-in entry defines an arbitrary non-plug-in data file packaged
+ * as part of a feature. Non-plug-in entries are not interpreted by the
+ * platform (other than being downloaded as part of an install action).
+ * They require a custom install handler to be specified as part of the
+ * feature. Note, that defining a non-plug-in entry does not necessarily
+ * indicate the non-plug-in file is packaged together with any other
+ * feature files. The actual packaging details are determined by the
+ * feature content provider for the feature.
+ * <p>
+ * Clients may implement this interface. However, in most cases clients should 
+ * directly instantiate or subclass the provided implementation of this 
+ * interface.
+ * </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 org.eclipse.update.core.NonPluginEntry
+ * @see org.eclipse.update.core.FeatureContentProvider
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface INonPluginEntry extends IPlatformEnvironment, IAdaptable {
+
+	/** 
+	 * Returns the identifier of this data entry. 
+	 * 
+	 * @return data entry identifier
+	 * @since 2.0 
+	 */
+	public String getIdentifier();
+
+	/**
+	 * Returns the download size of the entry, if it can be determined.
+	 * 
+	 * @see org.eclipse.update.core.model.ContentEntryModel#UNKNOWN_SIZE
+	 * @return download size of the feature in KiloBytes, or an indication 
+	 * the size could not be determined
+	 * @since 2.0 
+	 */
+	public long getDownloadSize();
+
+	/**
+	 * Returns the install size of the feature, if it can be determined.
+	 * 
+	 * @see org.eclipse.update.core.model.ContentEntryModel#UNKNOWN_SIZE
+	 * @return install size of the feature in KiloBytes, or an indication 
+	 * the size could not be determined
+	 * @since 2.0 
+	 */
+	public long getInstallSize();
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/IPlatformEnvironment.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/IPlatformEnvironment.java
new file mode 100644
index 0000000..bad0bfb
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/IPlatformEnvironment.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import org.eclipse.core.runtime.*;
+
+/**
+ * Plug-in entry defines a packaging reference from a feature to a plug-in.
+ * It indicates that the referenced plug-in is to be considered as
+ * part of the feature. Note, that this does not necessarily indicate
+ * that the plug-in files are packaged together with any other
+ * feature files. The actual packaging details are determined by the
+ * feature content provider for the feature.
+ * <p>
+ * Clients may implement this interface. However, in most cases clients should 
+ * directly instantiate or subclass the provided implementation of this 
+ * interface.
+ * </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 org.eclipse.update.core.PluginEntry
+ * @see org.eclipse.update.core.FeatureContentProvider
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IPlatformEnvironment extends IAdaptable {
+
+
+	/**
+	 * Returns optional operating system specification.
+	 * A comma-separated list of os designators defined by the platform.
+	 * Indicates this entry should only be installed on one of the specified
+	 * os systems. If this attribute is not specified, or is <code>*</code>, the
+	 * entry can be installed on all systems (portable implementation). If the
+
+	 * This information is used as a hint by the installation and update
+	 * support.
+	 *
+	 * @return the operating system specification, or <code>null</code>.
+	 * @since 2.0 
+	 */
+	public String getOS();
+
+	/**
+	 * Returns optional system architecture specification. 
+	 * A comma-separated list of arch designators defined by the platform.
+	 * Indicates this entry should only be installed on one of the specified
+	 * systems. If this attribute is not specified, or is <code>*</code>, the
+	 * entry can be installed on all systems (portable implementation).
+	 * 
+	 * This information is used as a hint by the installation and update
+	 * support.
+	 * 
+	 * @return system architecture specification, or <code>null</code>.
+	 * @since 2.0 
+	 */
+	public String getWS();
+
+	/**
+	 * Returns optional system architecture specification. 
+	 * A comma-separated list of arch designators defined by the platform.
+	 * Indicates this entry should only be installed on one of the specified
+	 * systems. If this attribute is not specified, or is <code>*</code>, the
+	 * entry can be installed on all systems (portable implementation).
+	 * 
+	 * This information is used as a hint by the installation and update
+	 * support.
+	 * 
+	 * @return system architecture specification, or <code>null</code>.
+	 * @since 2.0 
+	 */
+	public String getOSArch();
+
+	/**
+	 * Returns optional locale specification. 
+	 * A comma-separated list of locale designators defined by Java.
+	 * Indicates this entry should only be installed on a system running
+	 * with a compatible locale (using Java locale-matching rules).
+	 * If this attribute is not specified, or is <code>*</code>, the entry can
+	 * be installed on all systems (language-neutral implementation).
+	 * 
+	 * This information is used as a hint by the installation and update
+	 *  support.
+	 * 
+	 * @return the locale specification, or <code>null</code>.
+	 * @since 2.0 
+	 */
+	public String getNL();
+
+
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/IPluginEntry.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/IPluginEntry.java
new file mode 100644
index 0000000..d3c2eb0
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/IPluginEntry.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import org.eclipse.core.runtime.*;
+
+/**
+ * Plug-in entry defines a packaging reference from a feature to a plug-in.
+ * It indicates that the referenced plug-in is to be considered as
+ * part of the feature. Note, that this does not necessarily indicate
+ * that the plug-in files are packaged together with any other
+ * feature files. The actual packaging details are determined by the
+ * feature content provider for the feature.
+ * <p>
+ * Clients may implement this interface. However, in most cases clients should 
+ * directly instantiate or subclass the provided implementation of this 
+ * interface.
+ * </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 org.eclipse.update.core.PluginEntry
+ * @see org.eclipse.update.core.FeatureContentProvider
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IPluginEntry extends IPlatformEnvironment,IAdaptable {
+
+	/** 
+	 * Returns the identifier of this plugin entry
+	 * 
+	 * @return plugin entry identifier
+	 * @since 2.0 
+	 */
+	public VersionedIdentifier getVersionedIdentifier();
+
+	/**
+	 * Returns an indication whethyer this entry represents a fragment.
+	 * 
+	 * @return <code>true</code> if the entry represents a plug-in fragment, 
+	 * <code>false</code> if the entry represents a plug-in
+	 * @since 2.0 
+	 */
+	public boolean isFragment();
+
+	/**
+	 * Returns the download size of the entry, if it can be determined.
+	 * 
+	 * @see org.eclipse.update.core.model.ContentEntryModel#UNKNOWN_SIZE
+	 * @return download size of the feature in KiloBytes, or an indication 
+	 * the size could not be determined
+	 * @since 2.0 
+	 */
+	public long getDownloadSize();
+
+	/**
+	 * Returns the install size of the feature, if it can be determined.
+	 * 
+	 * @see org.eclipse.update.core.model.ContentEntryModel#UNKNOWN_SIZE
+	 * @return install size of the feature in KiloBytes, or an indication 
+	 * the size could not be determined
+	 * @since 2.0 
+	 */
+	public long getInstallSize();
+
+	/** 
+	 * Sets the identifier of this plugin entry. 
+	 * This is typically performed as part of the plug-in entry creation
+	 * operation. Once set, the identifier should not be reset.
+	 * 
+	 * @param identifier plugin entry identifier
+	 * @since 2.0 
+	 */
+	public void setVersionedIdentifier(VersionedIdentifier identifier);
+
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/ISite.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/ISite.java
new file mode 100644
index 0000000..663bf80
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/ISite.java
@@ -0,0 +1,330 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+import java.net.*;
+
+import org.eclipse.core.runtime.*;
+import org.eclipse.update.configuration.*;
+import org.eclipse.update.core.model.*;
+
+/**
+ * Site represents a location containing some number of features (packaged
+ * or installed). Sites are treated purely as an installation and packaging
+ * construct. They do not play a role during Eclipse plug-in execution. 
+ * <p>
+ * Clients may implement this interface. However, in most cases clients should 
+ * directly instantiate or subclass the provided implementation of this 
+ * interface.
+ * </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 org.eclipse.update.core.Site
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface ISite extends IAdaptable {
+
+	/**
+	 * Default type for an installed feature. Different concrete feature
+	 * implementations can be registered together with their corresponding type
+	 * using the <code>org.eclipse.update.core.featureTypes</code> 
+	 * extension point.
+	 * 
+	 * @since 2.0
+	 */
+	public static final String DEFAULT_INSTALLED_FEATURE_TYPE = "org.eclipse.update.core.installed"; //$NON-NLS-1$		
+
+	/**
+	 * Default type for a packaged feature. Different concrete feature
+	 * implementations can be registered together with their corresponding type
+	 * using the <code>org.eclipse.update.core.featureTypes</code> 
+	 * extension point.
+	 * 
+	 * @since 2.0
+	 */
+	public static final String DEFAULT_PACKAGED_FEATURE_TYPE = "org.eclipse.update.core.packaged"; //$NON-NLS-1$		
+
+	/**
+	 * If we are unable to access a site, the returned CoreException will contain
+	 * this return code.
+	 * 
+	 * @since 2.0.1
+	 */
+	public static final int SITE_ACCESS_EXCEPTION = 42;
+
+	/**
+	 * Returns the site URL
+	 * 
+	 * @return site URL
+	 * @since 2.0 
+	 */
+	public URL getURL();
+
+	/**
+	 * Return the site type. Different concrete site implementations can be
+	 * registered together with their corresponding type using the
+	 * <code>org.eclipse.update.core.siteTypes</code> extension point.
+	 * 
+	 * @return site type, or <code>null</code>.
+	 * @since 2.0 
+	 */
+	public String getType();
+
+	/**
+	 * Returns the site description.
+	 * 
+	 * @return site description, or <code>null</code>.
+	 * @since 2.0 
+	 */
+	public IURLEntry getDescription();
+
+	/**
+	 * Returns an array of categories defined by the site.
+	 * 
+	 * @return array of site categories, or an empty array.
+	 * @since 2.0 
+	 */
+	public ICategory[] getCategories();
+
+	/**
+	 * Returns the named site category.
+	 * 
+	 * @param name category name
+	 * @return named category, or <code>null</code> ifit does not exist
+	 * @since 2.0
+	 */
+	public ICategory getCategory(String name);
+
+	/**
+	 * Returns an array of references to features on this site.
+	 * 
+	 * @return an array of feature references, or an empty array.
+	 * @since 2.0 
+	 */
+	public ISiteFeatureReference[] getFeatureReferences();
+
+	/**
+	 * Returns an array of references to features on this site.
+	 * No filtering occurs.
+	 * 
+	 * @return an array of feature references, or an empty array..
+	 * @since 2.1
+	 */
+	public ISiteFeatureReference[] getRawFeatureReferences();
+	
+	/**
+	 * Returns a reference to the specified feature if 
+	 * it is installed on this site.
+	 * filtered by the operating system, windowing system and architecture
+	 * system set in <code>Sitemanager</code>
+	 * 
+	 * @param feature feature
+	 * @return feature reference, or <code>null</code> if this feature
+	 * cannot be located on this site.
+	 * @since 2.0
+	 */
+	public ISiteFeatureReference getFeatureReference(IFeature feature);
+
+	/**
+	 * Returns an array of plug-in and non-plug-in archives located
+	 * on this site
+	 * 
+	 * @return an array of archive references, or an empty array if there are
+	 * no archives known to this site. Note, that an empty array does not
+	 * necessarily indicate there are no archives accessible on this site.
+	 * It simply indicates the site has no prior knowledge of such archives.
+	 * @since 2.0 
+	 */
+	public IArchiveReference[] getArchives();
+
+	/**
+	 * Returns the content provider for this site. A content provider
+	 * is an abstraction of each site organization. It allows the 
+	 * content of the site to be accessed in a standard way
+	 * regardless of the organization. All concrete sites
+	 * need to be able to return a content provider.
+	 * 
+	 * @return site content provider
+	 * @exception CoreException
+	 * @since 2.0
+	 */
+	public ISiteContentProvider getSiteContentProvider() throws CoreException;
+
+	/**
+	 * Returns the default type for a packaged feature supported by this site
+	 * 
+	 * @return feature type, as registered in the
+	 * <code>org.eclipse.update.core.featureTypes</code> extension point.
+	 * @since 2.0
+	 */
+	public String getDefaultPackagedFeatureType();
+
+	/**
+	 * Returns an array of entries corresponding to plug-ins installed
+	 * on this site.
+	 * 
+	 * @return array of plug-in entries,or an empty array.
+	 * @since 2.0
+	 */
+	public IPluginEntry[] getPluginEntries();
+
+	/**
+	 * Returns the number of plug-ins installed on this site
+	 * 
+	 * @return number of installed plug-ins
+	 * @since 2.0
+	 */
+	public int getPluginEntryCount();
+
+	/**
+	 * Adds a new plug-in entry to this site.
+	 * 
+	 * @param pluginEntry plug-in entry
+	 * @since 2.0
+	 */
+	public void addPluginEntry(IPluginEntry pluginEntry);
+
+	/**
+	 * Returns an array of entries corresponding to plug-ins that are
+	 * installed on this site and are referenced only by the specified
+	 * feature. These are plug-ins that are not shared with any other
+	 * feature.
+	 * 
+	 * @param feature feature
+	 * @return an array of plug-in entries, or an empty array.
+	 * @exception CoreException
+	 * @since 2.0
+	 */
+	public IPluginEntry[] getPluginEntriesOnlyReferencedBy(IFeature feature) throws CoreException;
+
+	/**
+	 * Returns the size of the files that need to be downloaded in order
+	 * to install the specified feature on this site, if it can be determined.
+	 * This method takes into account any plug-ins that are already
+	 * available on this site.
+	 * 
+	 * @see org.eclipse.update.core.model.ContentEntryModel#UNKNOWN_SIZE
+	 * @param feature candidate feature
+	 * @return download size of the feature in KiloBytes, or an indication 
+	 * the size could not be determined
+	 * @since 2.0 
+	 */
+	public long getDownloadSizeFor(IFeature feature);
+
+	/**
+	 * Returns the size of the files that need to be installed
+	 * for the specified feature on this site, if it can be determined.
+	 * This method takes into account any plug-ins that are already
+	 * installed on this site.
+	 * 
+	 * @see org.eclipse.update.core.model.ContentEntryModel#UNKNOWN_SIZE
+	 * @param feature candidate feature
+	 * @return install size of the feature in KiloBytes, or an indication 
+	 * the size could not be determined
+	 * @since 2.0 
+	 */
+	public long getInstallSizeFor(IFeature feature);
+
+	/**
+	 * Installs the specified feature on this site.
+	 * 
+	 * @param feature feature to install
+	 * @param verificationListener install verification listener
+	 * @param monitor install monitor, can be <code>null</code>
+	 * @exception InstallAbortedException when the user cancels the install
+	 * @exception CoreException
+	 * @since 2.0 
+	 */
+	public IFeatureReference install(IFeature feature, IVerificationListener verificationListener, IProgressMonitor monitor) throws InstallAbortedException, CoreException;
+
+	/**
+	 * Installs the specified feature on this site.
+	 * Only optional features passed as parameter will be installed.
+	 * 
+	 * @param feature feature to install
+	 * @param optionalfeatures list of optional features to be installed
+	 * @param verificationListener install verification listener
+	 * @param monitor install monitor, can be <code>null</code>
+	 * @exception InstallAbortedException when the user cancels the install
+	 * @exception CoreException
+	 * @since 2.0 
+	 */
+	public IFeatureReference install(IFeature feature, IFeatureReference[] optionalfeatures, IVerificationListener verificationListener, IProgressMonitor monitor) throws InstallAbortedException, CoreException;
+
+	/**
+	 * Removes (uninstalls) the specified feature from this site. This method
+	 * takes into account plug-in entries referenced by the specified fetaure
+	 * that continue to be required by other features installed on this site.
+	 * 
+	 * @param feature feature to remove
+	 * @param monitor progress monitor
+	 * @exception CoreException
+	 * @since 2.0 
+	 */
+	public void remove(IFeature feature, IProgressMonitor monitor) throws CoreException;
+
+	/**
+	 * Sets the site content provider. This is typically performed
+	 * as part of the site creation operation. Once set, the 
+	 * provider should not be reset.
+	 * 
+	 * @param siteContentProvider site content provider
+	 * @since 2.0
+	 */
+	public void setSiteContentProvider(ISiteContentProvider siteContentProvider);
+
+	/** 
+	 * Returns the <code>IConfiguredSite</code> for this site in the current 
+	 * configuration or <code>null</code> if none found.
+	 * 
+	 * @since 2.0.2
+	 */
+	public IConfiguredSite getCurrentConfiguredSite();
+
+	/**
+	* Creates a new feature object. The feature must exist on this site
+	* or a core exception will be thrown. Concrete implementations 
+	* may elect to cache instances, in which case subsequent calls 
+	* to create a feature with the same URL will
+	* return the same instance.
+	* param type the feature type that will be used to select the factory. If
+	* <code>null</code> is passed, default feature type will be used.
+	* param url URL of the feature archive as listed in the site.
+	* return newly created feature object, or a cached value if
+	* caching is implemented by this site.
+	* @deprecated use createFeature(String,URL,IProgressMonitor) instead
+	* @since 2.0.2
+	*/
+	IFeature createFeature(String type, URL url) throws CoreException;
+
+	/**
+	* Creates a new feature object. The feature must exist on this site
+	* or a core exception will be thrown. Concrete implementations 
+	* may elect to cache instances, in which case subsequent calls 
+	* to create a feature with the same URL will
+	* return the same instance.
+	* param type the feature type that will be used to select the factory. If
+	* <code>null</code> is passed, default feature type will be used.
+	* param url URL of the feature archive as listed in the site.
+	* return newly created feature object, or a cached value if
+	* caching is implemented by this site.
+	* @param monitor the progress monitor
+	* @since 2.1
+	*/
+	IFeature createFeature(String type, URL url,IProgressMonitor monitor) throws CoreException;
+
+
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/ISiteContentProvider.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/ISiteContentProvider.java
new file mode 100644
index 0000000..be7c97b
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/ISiteContentProvider.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+ 
+import java.net.*;
+
+import org.eclipse.core.runtime.*;
+
+/**
+ * Site content provider.
+ * A site content provider is an abstraction of each site internal 
+ * organization. It allows the site content to be accessed in
+ * a standard way regardless of the internal organization. All concrete site
+ * implementations need to implement a site content provider.
+ * <p>
+ * Clients may implement this interface. However, in most cases clients should 
+ * directly instantiate or subclass the provided implementation of this 
+ * interface.
+ * </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 org.eclipse.update.core.SiteContentProvider
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface ISiteContentProvider {
+	
+	/**
+	 * Returns the URL of this site
+	 * 
+	 * @return site URL
+	 * @since 2.0
+	 */	
+	public URL getURL();
+			
+	
+	/**
+	 * Returns a URL for the identified archive 
+	 * 
+	 * @param id archive identifier
+	 * @return archive URL, or <code>null</code>.
+	 * @exception CoreException 
+	 * @since 2.0 
+	 */
+	public URL getArchiveReference(String id)  throws CoreException;
+
+	/**
+	 * Returns the site for this provider
+	 * 
+	 * @return provider site
+	 * @since 2.0
+	 */
+	public ISite getSite();	
+	
+	/**
+	 * Sets the site for this provider.
+	 * In general, this method should only be called as part of
+	 * site creation. Once set, the site should not be reset.
+	 * 
+	 * @param site provider site
+	 * @since 2.0
+	 */
+	public void setSite(ISite site);
+}
+
+
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/ISiteFactory.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/ISiteFactory.java
new file mode 100644
index 0000000..9d908eb
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/ISiteFactory.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.net.*;
+
+import org.eclipse.core.runtime.*;
+import org.eclipse.update.core.model.*;
+
+/**
+ * Site factory interface.
+ * A site factory is used to construct new instances of concrete
+ * sites. 
+ * <p>
+ * Clients may implement this interface. However, in most cases clients should 
+ * directly instantiate or subclass the provided implementation of this 
+ * interface.
+ * </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 org.eclipse.update.core.BaseSiteFactory
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface ISiteFactory {
+
+	/**
+	 * Returns a site defined by the supplied URL. 
+	 * <p>
+	 * The actual interpretation of the URL is site-type specific.
+	 * In most cases the URL will point to some site-specific
+	 * file that can be used (directly or indirectly) to construct
+	 * the site object.
+	 * </p>
+	 * @param url URL interpreted by the site
+	 * @return site object
+	 * @exception CoreException
+	 * @exception InvalidSiteTypeException the referenced site type is
+	 * not a supported type for this factory 
+	 * @since 2.0 
+	 */
+	public ISite createSite(URL url)
+		throws CoreException, InvalidSiteTypeException;
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/ISiteFactoryExtension.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/ISiteFactoryExtension.java
new file mode 100644
index 0000000..b0422b6
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/ISiteFactoryExtension.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.net.*;
+
+import org.eclipse.core.runtime.*;
+import org.eclipse.update.core.model.*;
+
+/**
+ * <p>
+ * This is an extension to the standard ISiteFactory interface.
+ * If a factory implements this interface and is handling
+ * URL connections, a progress monitor can be passed to 
+ * allow canceling of frozen connections. 
+ * </p>
+ * <p>Input stream is obtained from the connection on
+ * a separate thread. When connection is canceled, 
+ * the thread is still active. It is allowed to terminate
+ * when the connection times out on its own.
+ * </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 org.eclipse.update.core.BaseSiteFactory
+ * @since 2.1
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface ISiteFactoryExtension {
+	/**
+	 * Returns a site defined by the supplied URL. 
+	 * <p>
+	 * The actual interpretation of the URL is site-type specific.
+	 * In most cases the URL will point to some site-specific
+	 * file that can be used (directly or indirectly) to construct
+	 * the site object.
+	 * </p>
+	 * @param url URL interpreted by the site
+	 * @param monitor a progress monitor that can be canceled
+	 * @return site object
+	 * @exception CoreException
+	 * @exception InvalidSiteTypeException the referenced site type is
+	 * not a supported type for this factory 
+	 * @since 2.0 
+	 */
+	public ISite createSite(URL url, IProgressMonitor monitor)
+		throws CoreException, InvalidSiteTypeException;
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/ISiteFeatureReference.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/ISiteFeatureReference.java
new file mode 100644
index 0000000..0ba2c01
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/ISiteFeatureReference.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import org.eclipse.core.runtime.*;
+
+/**
+ * Site Feature reference.
+ * A reference to a feature on a particular update site.
+ * <p>
+ * Clients may implement this interface. However, in most cases clients should 
+ * directly instantiate or subclass the provided implementation of this 
+ * interface.
+ * </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 org.eclipse.update.core.SiteFeatureReference
+ * @since 2.1
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface ISiteFeatureReference extends IFeatureReference, IAdaptable {
+
+	/**
+	 * Returns an array of categories the referenced feature belong to.
+	 * 
+	 * @return an array of categories, or an empty array
+	 * @since 2.1 
+	 */
+	public ICategory[] getCategories();
+
+	/**
+	 * Adds a category to the referenced feature.
+	 * 
+	 * @param category new category
+	 * @since 2.1 
+	 */
+	public void addCategory(ICategory category);
+
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/ISiteWithMirrors.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/ISiteWithMirrors.java
new file mode 100644
index 0000000..7a0ec9c
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/ISiteWithMirrors.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import org.eclipse.core.runtime.*;
+
+/**
+ * An extension of ISite that supports mirrors.
+ * The regular update site contains features (optionally grouped by categories), while
+ * a mirrored site can define zero or more updates sites (mirrors) with the same content.
+ * This allows users to pick their own update site, for performance purposes.
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface ISiteWithMirrors extends ISite {
+
+	/**
+	 * Returns an array of mirror sites that contain the same features/plugins.
+	 * @return array of mirror sites, or empty array
+	 * @throws CoreException
+	 * @since 3.1
+	 */
+	IURLEntry[] getMirrorSiteEntries() throws CoreException;
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/IURLEntry.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/IURLEntry.java
new file mode 100644
index 0000000..93ebf0f
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/IURLEntry.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.net.*;
+
+import org.eclipse.core.runtime.*;
+
+/**
+ * URL entry is an annotated URL object. It allows descriptive text to be
+ * associated with a URL. When used as description object, the annotation
+ * typically corresponds to short descriptive text, with the URL reference
+ * pointing to full browsable description.
+ * <p>
+ * Clients may implement this interface. However, in most cases clients should 
+ * directly instantiate or subclass the provided implementation of this 
+ * interface.
+ * </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 org.eclipse.update.core.URLEntry
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IURLEntry extends IAdaptable {
+
+	public static final int UPDATE_SITE = 0;
+	public static final int WEB_SITE = 1;	
+
+	/** 
+	 * Returns the URL annotation or <code>null</code> if none
+	 * 
+	 * @return url annotation or <code>null</code> if none
+	 * @since 2.0 
+	 */
+	public String getAnnotation();
+
+	/**
+	 * Returns the actual URL.
+	 * 
+	 * @return url.
+	 * @since 2.0 
+	 */
+	public URL getURL();
+	
+	/**
+	 * Returns the type of the URLEntry
+	 * 
+	 * @see #UPDATE_SITE
+	 * @see #WEB_SITE
+	 * @return type
+	 * @since 2.0 
+	 */
+	public int getType();	
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/IUpdateConstants.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/IUpdateConstants.java
new file mode 100644
index 0000000..c4a1381
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/IUpdateConstants.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+ 
+/**
+ * Manages a list of static constants.
+ * 
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @since 2.0.2
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IUpdateConstants {
+	
+		/**
+	 * No matching rule specified 
+	 * @since 2.0
+	 */
+	public static final int RULE_NONE = 0;
+
+	/**
+	 * Dependency can be satisfied only with plug-in version matching 
+	 * exactly the specified version.
+	 * @since 2.0
+	 */
+	public static final int RULE_PERFECT = 1;
+
+	/**
+	 * Dependency can be satisfied only with plug-in version that is 
+	 * equivalent to the specified version (same major and minor version
+	 * identifier, greater than or equal service identifier).
+	 * @since 2.0
+	 */
+	public static final int RULE_EQUIVALENT = 2;
+
+	/**
+	 * Dependency can be satisfied only with plug-in version that is 
+	 * compatible with the specified version (either is equivalent,
+	 * or greater minor identifier (but same major identifier)).
+	 * @since 2.0
+	 */
+	public static final int RULE_COMPATIBLE = 3;
+
+	/**
+	 * Dependency can be satisfied only with plug-in version that is 
+	 * greater or equal to the specified version.
+	 * @since 2.0
+	 */
+	public static final int RULE_GREATER_OR_EQUAL = 4;
+	
+	/**
+	 * Dependency can be satisfied only if the required identifier
+	 * is a prefix of the specified identifier.
+	 * @since 2.1
+	 */
+	public static final int RULE_PREFIX = 1;
+
+	/**
+	 * The search location for updates is defined by the root feature.
+	 * @since 2.0.2
+	 */
+	public static final int SEARCH_ROOT = 1<<1;
+	
+	/**
+	 * The search location for updates is defined by this feature.
+	 * @since 2.0.2
+	 */
+	public static final int SEARCH_SELF = 1<<2;
+	
+
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/IVerificationListener.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/IVerificationListener.java
new file mode 100644
index 0000000..16ac847
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/IVerificationListener.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+ 
+/**
+ * Verification listener. This interface abstract the user interaction
+ * that may be required as a result of feature installation. In particular,
+ * as feature archives are downloaded and verified, the user may need to 
+ * indicate whether to accept any one of the archives, or abort the 
+ * installation.
+ * <p>
+ * Clients may implement this interface.
+ * </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 org.eclipse.update.core.IVerificationResult
+ * @see org.eclipse.update.core.IVerifier
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IVerificationListener {
+	
+	/**
+	 * Indicate the action that resulted in this notification should be aborted.
+	 * 
+	 * @since 2.0
+	 */
+	public static final int CHOICE_ABORT = 0;
+	
+	/**
+	 * Indicate there was an error in processing the request.
+	 * The action that resulted in this notification should be aborted.
+	 * 
+	 * @since 2.0
+	 */
+	public static final int CHOICE_ERROR = 1;
+	
+	/**
+	 * Indicate that the target of the verification should be accepted,
+	 * but the information supplied with the verification result
+	 * should be trusted only for this request.
+	 * 
+	 * @since 2.0
+	 */
+	public static final int CHOICE_INSTALL_TRUST_ONCE = 2;
+	
+	/**
+	 * Indicate that the target of the verification should be accepted,
+	 * and the information supplied with the verification result
+	 * should be trusted for this request, and subsequent requests.
+	 * 
+	 * @since 2.0
+	 */
+	public static final int CHOICE_INSTALL_TRUST_ALWAYS = 3;
+	
+	/**
+	 * Determine if we should continue with the current action
+	 * based on the indicated verification results. Typically,
+	 * the implementation of this method will prompt the user
+	 * for the appropriate answer. However, other respose 
+	 * implementations can be provided.
+	 * 
+	 * @param result verification result 
+	 * @since 2.0
+	 */
+	public int prompt(IVerificationResult result);
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/IVerificationResult.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/IVerificationResult.java
new file mode 100644
index 0000000..8ceacc5
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/IVerificationResult.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+/**
+ * Verification result. An object implementing this interface represents
+ * a token passed between the update framework and the verifier and verification
+ * listener. The verifier uses the token to capture the result of the file
+ * verification. It is then passed to the verification listener
+ * to optionally present this information to the user (in an 
+ * implementation-specific way). The verification listener in turn
+ * uses this token to capture the desired response.
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IVerificationResult {
+
+	/**
+	 * Indicates the file type is recognized but the file is not signed
+	 * 
+	 * @see #TYPE_ENTRY_UNRECOGNIZED
+	 * @since 2.0
+	 */
+	public static final int TYPE_ENTRY_NOT_SIGNED = 1;
+
+	/**
+	 * Indicates the file has been modified since it was signed
+	 * 
+	 * @since 2.0
+	 */
+	public static final int TYPE_ENTRY_CORRUPTED = 2;
+
+	/**
+	 * Indicates the file is signed by a known signer
+	 * 
+	 * @since 2.0
+	 */
+	public static final int TYPE_ENTRY_SIGNED_RECOGNIZED = 3;
+
+	/**
+	 * Indicates the file is signed but the signer is not known
+	 * 
+	 * @since 2.0
+	 */
+	public static final int TYPE_ENTRY_SIGNED_UNRECOGNIZED = 5;
+
+	/**
+	 * Error occurred during verification
+	 * 
+	 * @since 2.0
+	 */
+	public static final int UNKNOWN_ERROR = 6;
+
+	/**
+	 * Verification was cancelled
+	 * 
+	 * @since 2.0
+	 */
+	public static final int VERIFICATION_CANCELLED = 7;
+
+	/**
+	 * Could not perform verification due to unrecognized file
+	 * 
+	 * @see #TYPE_ENTRY_NOT_SIGNED
+	 * @since 2.0
+	 */
+	public static final int TYPE_ENTRY_UNRECOGNIZED = 8;
+
+	/**
+	 * Returns the content reference that is the target of the verification.
+	 * 
+	 * @return content reference
+	 * @since 2.0
+	 */
+	public ContentReference getContentReference();
+
+	/**
+	 * Returns the feature the referenced file is part of.
+	 * 
+	 * @return feature
+	 * @since 2.0
+	 */
+	public IFeature getFeature();
+
+	/**
+	 * Returns the verification code.
+	 * 
+	 * @return verification code, as defined in this interface.
+	 * @since 2.0
+	 */
+	public int getVerificationCode();
+
+	/**
+	 * Returns any exception caught during verification
+	 * 
+	 * @return exception, or <code>null</code>.
+	 * @since 2.0
+	 */
+	public Exception getVerificationException();
+
+	/**
+	 * Returns display text describing the result of the verification.
+	 * 
+	 * @return result text, or <code>null</code>.
+	 * @since 2.0
+	 */
+	public String getText();
+
+	/**
+	 * Returns text describing the signer
+	 * 
+	 * @return signer information, or <code>null</code>.
+	 * @since 2.0
+	 */
+	public String getSignerInfo();
+
+	/**
+	 * Returns text describing the authority that verified/ certified 
+	 * the signer
+	 * 
+	 * @return verifier information, or <code>null</code>.
+	 * @since 2.0
+	 */
+	public String getVerifierInfo();
+
+	/**
+	 * Indicates whether the referenced file is part of the overall feature
+	 * definition, or one of its component plug-in or non-plug-in entries.
+	 * 
+	 * @return <code>true</code> if reference is a feature file, 
+	 * <code>false</code> if reference is a plug-in or non-plug-in file
+	 * @since 2.0
+	 */
+	public boolean isFeatureVerification();
+	
+	/**
+	 * Indicates whether the signer and verifier info have already been accepted by the user
+	 * during a previous verification of one of the file of the feature.
+	 * 
+	 * @return <code>true</code> if the result has already been accepted, <code>false</code>
+	 * if the result has not yet been accepted by the user
+	 * @since 2.0
+	 */
+	public boolean alreadySeen();
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/IVerifier.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/IVerifier.java
new file mode 100644
index 0000000..61d835a
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/IVerifier.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import org.eclipse.core.runtime.*;
+
+/**
+ * Verifier. This interface abstracts the archive verification step
+ * performed by specific feature implementations. The actual details
+ * of the verification are the responsibility of the concrete implementation.
+ * <p>
+ * Clients may implement this interface.
+ * </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 org.eclipse.update.core.IVerificationResult
+ * @see org.eclipse.update.core.IFeatureContentProvider#getVerifier()
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public interface IVerifier {
+
+	/**
+	 * Perform verification of the specified archive.
+	 * 
+	 * @param feature feature containing this archive
+	 * @param reference actual archive reference
+	 * @param isFeatureVerification <code>true</code> indicates the specified
+	 * reference should be considered as part of the feature description
+	 * information (ie. verifying the overall feature), 
+	 * <code>false</code> indicates the specified reference is a plug-in
+	 * or a non-plug-in archive file (ie. verifying a component of the
+	 * feature)
+	 * @param monitor progress monitor, can be <code>null</code>
+	 * @return verification result
+	 * @exception CoreException
+	 * @since 2.0
+	 */
+	public IVerificationResult verify(
+		IFeature feature,
+		ContentReference reference,
+		boolean isFeatureVerification,
+		InstallMonitor monitor)
+		throws CoreException;
+		
+	/**
+	 * Sets the parent verifier.
+	 * 
+	 * The parent verifier can only be set once by the parent feature.
+	 * It may used for different verification strategies. 
+	 * (for instance, you may decide that both the parent and current verifier
+	 * must sucessfully verify the content reference, or that only one of them must verify)
+	 * @param parentVerifier the parent verifier.
+	 */
+	public void setParent(IVerifier parentVerifier);
+	
+	/**
+	 * Returns the parent verifier
+	 * 
+	 * @return the parent verifier
+	 * @since 2.0
+	 */
+	public IVerifier getParent();
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/Import.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/Import.java
new file mode 100644
index 0000000..156b006
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/Import.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import org.eclipse.update.core.model.ImportModel;
+import org.eclipse.update.internal.core.UpdateCore;
+import org.eclipse.update.internal.core.UpdateManagerUtils;
+
+/**
+ * Convenience implementation of a plug-in dependency.
+ * <p>
+ * This class may be instantiated or subclassed by clients.
+ * </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 org.eclipse.update.core.IImport
+ * @see org.eclipse.update.core.model.ImportModel
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class Import extends ImportModel implements IImport {
+
+	//PERF: new instance variable
+	private VersionedIdentifier versionId;
+
+	/**
+	 * Returns an identifier of the dependent plug-in.
+	 * @see IImport#getVersionedIdentifier()
+	 */
+	public VersionedIdentifier getVersionedIdentifier() {
+		if (versionId != null)
+			return versionId;
+
+		String id = getIdentifier();
+		String ver = getVersion();
+		if (id != null && ver != null) {
+			try {
+				versionId = new VersionedIdentifier(id, ver);
+				return versionId;
+			} catch (Exception e) {
+				UpdateCore.warn("Unable to create versioned identifier:" + id + ":" + ver); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		}
+
+		
+		versionId = new VersionedIdentifier("",null); //$NON-NLS-1$
+		return versionId;		
+	}
+
+	/**
+	 * Returns the matching rule for the dependency.
+	 * @see IImport#getRule()
+	 */
+	public int getRule() {
+		return UpdateManagerUtils.getMatchingRule(getMatchingRuleName());
+	}
+	
+	/**
+	 * Returns the matching rule for the dependency identifier.
+	 * @see IImport#getIdRule()
+	 */
+	public int getIdRule() {
+		return UpdateManagerUtils.getMatchingIdRule(getMatchingIdRuleName());
+	}
+	
+	/**
+	 * 
+	 * @see org.eclipse.update.core.IImport#getKind()
+	 */
+
+	/**
+	 * Returns the dependency kind
+	 * @see org.eclipse.update.core.IImport#getKind()
+	 */
+	public int getKind() {
+		return isFeatureImport()?KIND_FEATURE:KIND_PLUGIN;
+	}
+
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/IncludedFeatureReference.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/IncludedFeatureReference.java
new file mode 100644
index 0000000..7b8ee28
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/IncludedFeatureReference.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     James D Miles (IBM Corp.) - bug 182625, Missing constructor
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.update.configuration.IConfiguredSite;
+import org.eclipse.update.core.model.IncludedFeatureReferenceModel;
+import org.eclipse.update.internal.core.Messages;
+import org.eclipse.update.internal.core.UpdateCore;
+
+/**
+ * This is a utility class representing the options of a nested feature.
+ * Feature will include other features. This class will represent the options of the inclusion.
+ * <p>
+ * Clients may instantiate; not intended to be subclassed by clients.
+ * </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 org.eclipse.update.core.VersionedIdentifier
+ * @since 2.0.1
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class IncludedFeatureReference
+	extends IncludedFeatureReferenceModel
+	implements IIncludedFeatureReference {
+
+	/**
+	 * Construct a included feature reference
+	 * 
+	 * @since 2.1
+	 */
+	public IncludedFeatureReference() {
+		super();
+	}
+
+	/**
+	 * Construct a feature options 
+	 * 
+	 * @param includedFeatureRef reference to clone
+	 * @since 2.0.2
+	 */
+	public IncludedFeatureReference(IIncludedFeatureReference includedFeatureRef) {
+		super((IncludedFeatureReferenceModel) includedFeatureRef);
+	}
+
+	/**
+	 * Constructor IncludedFeatureReference.
+	 * @param featureReference
+	 */
+	public IncludedFeatureReference(IFeatureReference featureReference) {
+		super(featureReference);
+	}
+	
+	public IncludedFeatureReference(IncludedFeatureReferenceModel includedFeatureRefModel){
+		super(includedFeatureRefModel);
+	}
+
+	/*
+	 * Method isDisabled.
+	 * @return boolean
+	 */
+	private boolean isDisabled() {
+		IConfiguredSite cSite = getSite().getCurrentConfiguredSite();
+		if (cSite == null)
+			return false;
+		IFeatureReference[] configured = cSite.getConfiguredFeatures();
+		for (int i = 0; i < configured.length; i++) {
+			if (this.equals(configured[i]))
+				return false;
+		}
+		return true;
+		//		// FIXME: the above code was commented out and returned false. 
+		//		// Should this be commented out again?
+		//		return false;
+	}
+
+	/*
+	 * Method isInstalled.
+	 * @return boolean
+	 */
+	private boolean isUninstalled() {
+		if (!isDisabled())
+			return false;
+		IFeatureReference[] installed = getSite().getFeatureReferences();
+		for (int i = 0; i < installed.length; i++) {
+			if (this.equals(installed[i]))
+				return false;
+		}
+		// if we reached this point, the configured site exists and it does not
+		// contain this feature reference, so clearly the feature is uninstalled
+		return true;
+	}
+
+	/**
+	 * @see org.eclipse.update.core.IIncludedFeatureReference#getFeature(boolean,
+	 * IConfiguredSite)
+	 * @deprecated use getFeature(IProgressMonitor)
+	 */
+	public IFeature getFeature(
+		boolean perfectMatch,
+		IConfiguredSite configuredSite)
+		throws CoreException {
+		return getFeature(null);
+	}
+
+	/**
+	 * @see org.eclipse.update.core.IIncludedFeatureReference#getFeature(boolean,
+	 * IConfiguredSite,IProgressMonitor)
+	 * @deprecated use getFeature(IProgressMonitor)
+	 */
+	public IFeature getFeature(
+		boolean perfectMatch,
+		IConfiguredSite configuredSite,
+		IProgressMonitor monitor)
+		throws CoreException {
+			return getFeature(monitor);
+	}
+
+	/**
+	 * @see org.eclipse.update.core.IFeatureReference#getFeature()
+	 * @deprecated use getFeature(IProgressMonitor)
+	 */
+	public IFeature getFeature() throws CoreException {
+		return getFeature(null);
+	}
+	/**
+	 * @see org.eclipse.update.core.IFeatureReference#getFeature
+	 * (IProgressMonitor)
+	 */
+	public IFeature getFeature(IProgressMonitor monitor) throws CoreException {
+		if (isUninstalled())
+			throw new CoreException(new Status(IStatus.ERROR, UpdateCore.getPlugin().getBundle().getSymbolicName(), IStatus.OK, NLS.bind(Messages.IncludedFeatureReference_featureUninstalled, (new String[] { getFeatureIdentifier() })), null));
+		else
+			return super.getFeature(monitor);
+	}
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/InstallHandlerEntry.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/InstallHandlerEntry.java
new file mode 100644
index 0000000..900254b
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/InstallHandlerEntry.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import org.eclipse.update.core.model.InstallHandlerEntryModel;
+
+/**
+ * Convenience implementation of an install handler entry.
+ * <p>
+ * This class may be instantiated or subclassed by clients.
+ * </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 org.eclipse.update.core.IInstallHandlerEntry
+ * @see org.eclipse.update.core.model.InstallHandlerEntryModel
+ * @see org.eclipse.update.core.IInstallHandler
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class InstallHandlerEntry
+	extends InstallHandlerEntryModel
+	implements IInstallHandlerEntry {
+
+	/**
+	 * Constructor for InstallHandlerEntry.
+	 * @since 2.0
+	 */
+	public InstallHandlerEntry() {
+		super();
+	}
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/InstallMonitor.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/InstallMonitor.java
new file mode 100644
index 0000000..b722575
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/InstallMonitor.java
@@ -0,0 +1,279 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.util.Stack;
+
+import org.eclipse.core.runtime.*;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.update.internal.core.Messages;
+
+/**
+ * Install progress monitor
+ * Delegating wrapper for IProgressMonitor used for installation handling.
+ * 
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class InstallMonitor implements IProgressMonitor {
+
+	protected IProgressMonitor monitor;
+	protected Stack tasks;
+
+	protected String taskString;
+	protected String subTaskString;
+	protected boolean showDetails;
+	protected long totalCopyCount;
+	protected	long currentCount = 0;
+
+	protected class MonitorState {
+
+		private String taskString;
+		private String subTaskString;
+		private boolean showDetails;
+		private long totalCopyCount;
+        private long currentCount;
+
+		private MonitorState(
+			String taskString,
+			String subTaskString,
+			boolean showDetails,
+            long currentCount,
+			long totalCopyCount) {
+			this.taskString = taskString;
+			this.subTaskString = subTaskString;
+			this.showDetails = showDetails;
+            this.currentCount = currentCount;
+			this.totalCopyCount = totalCopyCount;
+		}
+
+		private String getTaskString() {
+			return this.taskString;
+		}
+
+		private String getSubTaskString() {
+			return this.subTaskString;
+		}
+
+		private boolean getShowDetails() {
+			return this.showDetails;
+		}
+
+        private long getCurrentCount() {
+            return this.currentCount;
+        }
+        
+		private long getTotalCopyCount() {
+			return this.totalCopyCount;
+		}
+	}
+	
+	protected InstallMonitor() {
+	}
+
+	/**
+	 * Install monitor constructor
+	 * 
+	 * @param monitor base install monitor
+	 * @since 2.0
+	 */
+	public InstallMonitor(IProgressMonitor monitor) {
+		this.monitor = monitor;
+		this.tasks = new Stack();
+		this.taskString = ""; //$NON-NLS-1$
+		this.subTaskString = ""; //$NON-NLS-1$
+		this.showDetails = false;
+		this.totalCopyCount = 0;
+	}
+
+	/**
+	 * Begin new monitor task.
+	 * 
+	 * @see IProgressMonitor#beginTask(String, int)
+	 * @since 2.0
+	 */
+	public void beginTask(String name, int totalWork) {
+		taskString = name;
+		monitor.beginTask(name, totalWork);
+	}
+
+	/**
+	 * Indicate completion of monitor activity.
+	 * 
+	 * @see IProgressMonitor#done()
+	 * @since 2.0
+	 */
+	public void done() {
+		monitor.done();
+	}
+
+	/**
+	 * Indicate monitor progress.
+	 * 
+	 * @see IProgressMonitor#internalWorked(double)
+	 * @since 2.0
+	 */
+	public void internalWorked(double work) {
+		monitor.internalWorked(work);
+	}
+
+	/**
+	 * Check is use indicated that the operation be cancelled.
+	 * 
+	 * @see IProgressMonitor#isCanceled()
+	 * @since 2.0
+	 */
+	public boolean isCanceled() {
+		return monitor.isCanceled();
+	}
+
+	/**
+	 * Set the cancellation state.
+	 * 
+	 * @see IProgressMonitor#setCanceled(boolean)
+	 * @since 2.0
+	 */
+	public void setCanceled(boolean value) {
+		monitor.setCanceled(value);
+	}
+
+	/**
+	 * Set task name.
+	 * 
+	 * @see IProgressMonitor#setTaskName(String)
+	 * @since 2.0
+	 */
+	public void setTaskName(String name) {
+		this.taskString = name;
+		this.subTaskString = ""; //$NON-NLS-1$
+		this.showDetails = false;
+		this.totalCopyCount = 0;
+		monitor.subTask(""); //$NON-NLS-1$
+		monitor.setTaskName(name);
+	}
+
+	/**
+	 * Set subtask name.
+	 * 
+	 * @see IProgressMonitor#subTask(String)
+	 * @since 2.0
+	 */
+	public void subTask(String name) {
+		this.subTaskString = name;
+		this.showDetails = false;
+		this.totalCopyCount = 0;
+		monitor.subTask(name);
+	}
+
+	/**
+	 * Indicate monitor progress.
+	 * 
+	 * @see IProgressMonitor#worked(int)
+	 * @since 2.0
+	 */
+	public void worked(int work) {
+		monitor.worked(work);
+	}
+
+	/**
+	 * Save the current monitor state.
+	 * The states are saved on a push-down stack. Prior states
+	 * can be restored by calling restorState()
+	 * 
+	 * @see #restoreState()
+	 * @since 2.0
+	 */
+	public void saveState() {
+		tasks.push(
+			new MonitorState(taskString, subTaskString, showDetails, currentCount, totalCopyCount));
+	}
+
+	/**
+	 * Restore the monitor state.
+	 * 
+	 * @see #saveState()
+	 * @since 2.0
+	 */
+	public void restoreState() {
+		if (tasks.size() > 0) {
+			MonitorState state = (MonitorState) tasks.pop();
+			setTaskName(state.getTaskString());
+			subTask(state.getSubTaskString());
+			this.showDetails = state.getShowDetails();
+            this.currentCount = state.getCurrentCount();
+			this.totalCopyCount = state.getTotalCopyCount();
+		}
+	}
+
+	/**
+	 * Indicate whether the monitor subtask message should include
+	 * copy progress counts.
+	 * 
+	 * @see #setCopyCount(long)
+	 * @see #setTotalCount(long)
+	 * @param setting <code>true</code> to show the copy count,
+	 * <code>false</code> otherwise
+	 * @since 2.0
+	 */
+	public void showCopyDetails(boolean setting) {
+		this.showDetails = setting;
+	}
+
+	/**
+	 * Sets the total number of bytes to copy.
+	 * 
+	 * @see #showCopyDetails(boolean)
+	 * @see #setCopyCount(long)
+	 * @param count total number of bytes to copy.
+	 * @since 2.0
+	 */
+	public void setTotalCount(long count) {
+		this.totalCopyCount = count;
+	}
+
+	/**
+	 * Sets the number of bytes already copied.
+	 * 
+	 * @see #showCopyDetails(boolean)
+	 * @see #setTotalCount(long)
+	 * @param count number of bytes already copied.
+	 * @since 2.0
+	 */
+	public void setCopyCount(long count) {
+		if (showDetails && count > 0) {
+			currentCount = count;
+			long countK = count / 1024;
+			long totalK = totalCopyCount / 1024;
+			String msg =
+				(totalK <= 0)
+					? NLS.bind(Messages.InstallMonitor_DownloadSize, (new String[] { Long.toString(countK) }))
+					: NLS.bind(Messages.InstallMonitor_DownloadSizeLong, (new String[] { Long.toString(countK), Long.toString(totalK) }));
+			monitor.subTask(subTaskString + msg);
+		}
+	}
+	
+	/**
+	 * Increments the number of bytes copied.
+	 * 
+	 * @param increment number of new bytes  copied.
+	 * @since 3.0
+	 */
+	public void incrementCount(long increment) {
+		setCopyCount(currentCount + increment);
+	}
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/JarContentReference.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/JarContentReference.java
new file mode 100644
index 0000000..1ea7f3a
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/JarContentReference.java
@@ -0,0 +1,370 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.io.*;
+import java.net.*;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.jar.*;
+
+import org.eclipse.update.core.model.*;
+import org.eclipse.update.internal.core.*;
+
+/**
+ * Local .jar file content reference.
+ * <p>
+ * This class may be instantiated or subclassed by clients.
+ * </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 org.eclipse.update.core.ContentReference
+ * @see org.eclipse.update.core.JarEntryContentReference
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class JarContentReference extends ContentReference {
+
+	//private static ArrayList referenceList = new ArrayList();
+	private JarFile jarFile;
+
+	/**
+	 * Content selector used in .jar operations.
+	 * Default implementation causes all file entries to be selected with
+	 * generated identifiers being the same as the original .jar entry name.
+	 * 
+	 * @since 2.0
+	 */
+	public static class ContentSelector {
+
+		/**
+		 * Indicates whether the .jar entry should be selected.
+		 * Default behavior is to select all non-directory entries.
+		 * 
+		 * @param entry .jar entry
+		 * @return <code>true</code> if entry is to be selected, 
+		 * <code>false</code> otherwise
+		 * @since 2.0
+		 */
+		public boolean include(JarEntry entry) {
+			return entry == null ? false : !entry.isDirectory();
+		}
+
+		/**
+		 * Defines the "symbolic" path identifier for the 
+		 * entry. Default identifier is the same as the jar entry name.
+		 * 
+		 * @param entry .jar entry
+		 * @return "symbolic" path identifier
+		 * @since 2.0
+		 */
+		public String defineIdentifier(JarEntry entry) {
+			return entry == null ? null : entry.getName();
+		}
+	}
+
+	/**
+	 * Create jar content reference from URL.
+	 * 
+	 * @param id "symbolic" path identifier
+	 * @param url actual referenced URL
+	 * @since 2.0
+	 */
+	public JarContentReference(String id, URL url) {
+		super(id, url);
+		this.jarFile = null;
+		//referenceList.add(this); // keep track of archives
+	}
+
+	/**
+	 * Create jar content reference from file.
+	 * 
+	 * @param id "symbolic" path identifier
+	 * @param file actual referenced file
+	 * @since 2.0
+	 */
+	public JarContentReference(String id, File file) {
+		super(id, file);
+		this.jarFile = null;
+		//referenceList.add(this); // keep track of archives
+	}
+
+	/**
+	 * A factory method to create a jar content reference.
+	 * 
+	 * @param id "symbolic" path identifier
+	 * @param file actual referenced file
+	 * @return jar content reference
+	 * @since 2.0
+	 */
+	public ContentReference createContentReference(String id, File file) {
+		return new JarContentReference(id, file,true);
+	}
+	/**
+	 * Constructor JarContentReference.
+	 * @param id
+	 * @param file
+	 * @param b
+	 */
+	public JarContentReference(String id, File file, boolean b) {
+		this(id,file);
+		setTempLocal(b);
+	}
+
+	/**
+	 * Returns the content reference as a jar file. Note, that this method
+	 * <b>does not</b> cause the file to be downloaded if it
+	 * is not already local.
+	 * 
+	 * @return reference as jar file
+	 * @exception IOException reference cannot be returned as jar file
+	 * @since 2.0
+	 */
+	protected JarFile asJarFile() throws IOException {
+		if (this.jarFile == null) {
+			File file = asFile();
+			if (UpdateCore.DEBUG && UpdateCore.DEBUG_SHOW_INSTALL)
+				UpdateCore.debug("asJarFile :" + file); //$NON-NLS-1$
+			if (file != null && !file.exists()) {
+				UpdateCore.warn("JarFile does not exits:" + file); //$NON-NLS-1$
+				throw new FileNotFoundException(file.getAbsolutePath());
+			}
+			this.jarFile = new JarFile(file);
+		}
+		return jarFile;
+	}
+
+	/**
+	 * Unpacks the referenced jar archive into the specified location.
+	 * Returns content references to the unpacked files.
+	 * 
+	 * @param dir location to unpack the jar into
+	 * @param selector selector, used to select entries to unpack, and to define
+	 * "symbolic" path identifiers for the entries.
+	 * @param monitor progress monitor 
+	 * @exception IOException
+	 * @exception InstallAbortedException
+	 * @since 2.0
+	 */
+	public ContentReference[] unpack(File dir, ContentSelector selector, InstallMonitor monitor) throws IOException, InstallAbortedException {
+
+		// make sure we have a selector
+		if (selector == null)
+			selector = new ContentSelector();
+
+		// get archive content
+		JarFile jarArchive = this.asJarFile();
+		List content = new ArrayList();
+		Enumeration entries = jarArchive.entries();
+
+		// run through the entries and unjar
+		String entryId;
+		JarEntry entry;
+		InputStream is;
+		OutputStream os;
+		File localFile;
+		try {
+			if (monitor != null) {
+				monitor.saveState();
+				monitor.setTaskName(Messages.JarContentReference_Unpacking);	
+				monitor.subTask(this.getIdentifier());
+				monitor.showCopyDetails(false);
+			}
+			while (entries.hasMoreElements()) {
+				entry = (JarEntry) entries.nextElement();
+				if (entry != null && selector.include(entry)) {
+					is = null;
+					os = null;
+					entryId = selector.defineIdentifier(entry);
+					localFile = Utilities.createLocalFile(dir, entryId); // create temp file 
+					if (!entry.isDirectory()) {
+						try {
+							is = jarArchive.getInputStream(entry);
+							os = new FileOutputStream(localFile);
+							Utilities.copy(is, os, monitor);
+						} finally {
+							if (is != null)
+								try {
+									is.close();
+								} catch (IOException e) {
+								}
+							if (os != null)
+								try {
+									os.close();
+								} catch (IOException e) {
+								}
+						}
+						content.add(new ContentReference(entryId, localFile));
+					}
+				}
+			}
+		} finally {
+			if (monitor != null)
+				monitor.restoreState();
+		}
+		return (ContentReference[]) content.toArray(new ContentReference[0]);
+	}
+
+	/**
+	 * Unpacks the named jar entry into the specified location.
+	 * Returns content reference to the unpacked file.
+	 * 
+	 * @param dir location to unpack the jar into
+	 * @param entryName name of the jar entry
+	 * @param selector selector, used to define "symbolic" path identifier
+	 * for the entry
+	 * @param monitor progress monitor 
+	 * @exception IOException
+	 * @exception InstallAbortedException
+	 * @since 2.0
+	 */
+	public ContentReference unpack(File dir, String entryName, ContentSelector selector, InstallMonitor monitor) throws IOException, InstallAbortedException {
+
+		// make sure we have a selector
+		if (selector == null)
+			selector = new ContentSelector();
+
+		// unjar the entry
+		JarFile jarArchive = this.asJarFile();
+		entryName = entryName.replace(File.separatorChar, '/');
+		JarEntry entry = jarArchive.getJarEntry(entryName);
+		String entryId;
+		if (entry != null) {
+			InputStream is = null;
+			OutputStream os = null;
+			entryId = selector.defineIdentifier(entry);
+			File localFile = Utilities.createLocalFile(dir, entryId); // create temp file
+			if (!entry.isDirectory()) {
+				try {
+					is = jarArchive.getInputStream(entry);
+					os = new FileOutputStream(localFile);
+					Utilities.copy(is, os, monitor);
+				} finally {
+					if (is != null)
+						try {
+							is.close();
+						} catch (IOException e) {
+						}
+					if (os != null)
+						try {
+							os.close();
+						} catch (IOException e) {
+						}
+				}
+				return new ContentReference(entryId, localFile);
+			} else
+				return null; // entry was a directory
+		} else
+			throw new FileNotFoundException(this.asFile().getAbsolutePath() + " " + entryName);	//$NON-NLS-1$
+	}
+
+	/**
+	 * Peeks into the referenced jar archive.
+	 * Returns content references to the jar entries within the jar file.
+	 * 
+	 * @param selector selector, used to select entries to return, and to define
+	 * "symbolic" path identifiers for the entries.
+	 * @param monitor progress monitor 
+	 * @exception IOException
+	 * @since 2.0
+	 */
+	public ContentReference[] peek(ContentSelector selector, InstallMonitor monitor) throws IOException {
+
+		// make sure we have a selector
+		if (selector == null)
+			selector = new ContentSelector();
+
+		// get archive content
+		JarFile jarArchive = this.asJarFile();
+		List content = new ArrayList();
+		Enumeration entries = jarArchive.entries();
+
+		// run through the entries and create content references
+		JarEntry entry;
+		String entryId;
+		while (entries.hasMoreElements()) {
+			entry = (JarEntry) entries.nextElement();
+			if (selector.include(entry)) {
+				entryId = selector.defineIdentifier(entry);
+				content.add(new JarEntryContentReference(entryId, this, entry));
+			}
+		}
+		return (ContentReference[]) content.toArray(new ContentReference[0]);
+	}
+
+	/**
+	 * Peeks into the referenced jar archive looking for the named entry.
+	 * Returns content reference to the jar entry within the jar file.
+	 * 
+	 * @param entryName name of the jar entry
+	 * @param selector selector, used to define "symbolic" path identifier
+	 * for the entry
+	 * @param monitor progress monitor 
+	 * @return the content reference ofr <code>null</null> if the entry doesn't exist
+	 * @exception IOException
+	 * @since 2.0
+	 */
+	public ContentReference peek(String entryName, ContentSelector selector, InstallMonitor monitor) throws IOException {
+
+		// make sure we have a selector
+		if (selector == null)
+			selector = new ContentSelector();
+
+		// assume we have a reference that represents a jar archive.
+		JarFile jarArchive = this.asJarFile();
+		entryName = entryName.replace(File.separatorChar, '/');
+		JarEntry entry = jarArchive.getJarEntry(entryName);
+		if (entry == null)
+			return null;
+
+		String entryId = selector.defineIdentifier(entry);
+		return new JarEntryContentReference(entryId, this, entry);
+	}
+
+	/**
+	 * Closes the jar archive corresponding to this reference.
+	 * 
+	 * @exception IOException
+	 * @since 2.0
+	 */
+	public void closeArchive() throws IOException {
+		if (this.jarFile != null) {
+			this.jarFile.close();
+			this.jarFile = null;
+		}
+	}
+
+	/**
+	 * Perform shutdown processing for jar archive handling.
+	 * This method is called when platform is shutting down.
+	 * It is not intended to be called at any other time under
+	 * normal circumstances. A side-effect of calling this method
+	 * is that all jars referenced by JarContentReferences are closed.
+	 * 
+	 * @since 2.0
+	 */
+	public static void shutdown() {
+		/*for (int i = 0; i < referenceList.size(); i++) {
+			JarContentReference ref = (JarContentReference) referenceList.get(i);
+			try {
+				ref.closeArchive(); // ensure we are not leaving open jars
+			} catch (IOException e) {
+				// we tried, nothing we can do ...
+			}
+		}*/
+	}
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/JarEntryContentReference.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/JarEntryContentReference.java
new file mode 100644
index 0000000..336532c
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/JarEntryContentReference.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.io.*;
+import java.net.*;
+import java.util.jar.*;
+
+/**
+ * .jar file entry content reference.
+ * <p>
+ * This class may be instantiated or subclassed by clients.
+ * </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 org.eclipse.update.core.ContentReference
+ * @see org.eclipse.update.core.JarContentReference
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class JarEntryContentReference extends ContentReference {
+
+	private JarContentReference jarContentReference;
+	private JarEntry entry;
+
+	/**
+	 * Create jar entry content reference.
+	 * 
+	 * @param id "symbolic" path identifier
+	 * @param jarContentReference jar file content reference
+	 * @param entry jar entry
+	 * @since 2.0
+	 */
+	public JarEntryContentReference(
+		String id,
+		JarContentReference jarContentReference,
+		JarEntry entry) {
+		super(id, (File) null);
+		this.jarContentReference = jarContentReference;
+		this.entry = entry;
+	}
+	
+	/**
+	 * Creates an input stream for the reference.
+	 * 
+	 * @return input stream
+	 * @exception IOException unable to create stream
+	 * @since 2.0
+	 */
+	public InputStream getInputStream() throws IOException {
+		return jarContentReference.asJarFile().getInputStream(entry);
+	}	
+	
+	/**
+	 * Returns the size of the referenced entry.
+	 * 
+	 * @return input size
+	 * @since 2.0
+	 */
+	public long getInputSize() {
+		return entry.getSize();
+	}
+	
+	/**
+	 * Indicates whether the reference is to a an entry within a local jar.
+	 * 
+	 * @return <code>true</code> if the reference is local, 
+	 * otherwise <code>false</code>
+	 * @since 2.0
+	 */
+	public boolean isLocalReference() {
+		return jarContentReference.isLocalReference();
+	}	
+		
+	/**
+	 * Returns the content reference as a URL.
+	 * 
+	 * @return reference as URL
+	 * @exception IOException reference cannot be returned as URL
+	 * @since 2.0
+	 */
+	public URL asURL() throws IOException {
+		String fileName =
+			jarContentReference.asFile().getAbsolutePath().replace(File.separatorChar, '/');
+		return new URL("jar:file:" + fileName + "!/" + entry.getName());	//$NON-NLS-1$ //$NON-NLS-2$
+	}
+			
+	/**
+	 * Return string representation of this reference.
+	 * 
+	 * @return string representation
+	 * @since 2.0
+	 */
+	public String toString() {
+		URL url;
+		try {
+			url = asURL();
+		} catch (IOException e) {
+			url = null;
+		}
+		if (url != null)
+			return url.toExternalForm();
+		else
+			return getClass().getName() + "@" + hashCode(); //$NON-NLS-1$
+	}
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/NonPluginEntry.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/NonPluginEntry.java
new file mode 100644
index 0000000..f854de1
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/NonPluginEntry.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import org.eclipse.update.core.model.*;
+
+/**
+ * Convenience implementation of non-plug-in entry.
+ * <p>
+ * This class may be instantiated or subclassed by clients.
+ * </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 org.eclipse.update.core.INonPluginEntry
+ * @see org.eclipse.update.core.model.NonPluginEntryModel
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class NonPluginEntry
+	extends NonPluginEntryModel
+	implements INonPluginEntry {
+
+	/**
+	 * Non-plug-in entry default constructor
+	 */
+	public NonPluginEntry() {
+		super();
+	}
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/PluginEntry.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/PluginEntry.java
new file mode 100644
index 0000000..3a92eb9
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/PluginEntry.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import org.eclipse.update.core.model.*;
+import org.eclipse.update.internal.core.*;
+
+/**
+ * Convenience implementation of plug-in entry.
+ * <p>
+ * This class may be instantiated or subclassed by clients.
+ * </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 org.eclipse.update.core.IPluginEntry
+ * @see org.eclipse.update.core.model.PluginEntryModel
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class PluginEntry extends PluginEntryModel implements IPluginEntry {
+	
+	// PERF: new instance variable
+	private VersionedIdentifier versionId;
+
+	/**
+	 * Plug-in entry default constructor
+	 */
+	public PluginEntry() {
+		super();
+	}
+
+	/**
+	 * Returns the identifier of this plugin entry
+	 * 
+	 * @see IPluginEntry#getVersionedIdentifier()
+	 * @since 2.0
+	 */
+	public VersionedIdentifier getVersionedIdentifier() {
+		if (versionId != null)
+			return versionId;
+
+		String id = getPluginIdentifier();
+		String ver = getPluginVersion();
+		if (id != null && ver != null) {
+			try {
+				versionId = new VersionedIdentifier(id, ver);
+				return versionId;
+			} catch (Exception e) {
+				UpdateCore.warn("Unable to create versioned identifier:" + id + ":" + ver); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		}
+
+		versionId = new VersionedIdentifier("",null); //$NON-NLS-1$
+		return versionId;
+	}
+
+	/**
+	 * Sets the identifier of this plugin entry. 
+	 * 
+	 * @see IPluginEntry#setVersionedIdentifier(VersionedIdentifier)
+	 * @since 2.0
+	 */
+	public void setVersionedIdentifier(VersionedIdentifier identifier) {
+		setPluginIdentifier(identifier.getIdentifier());
+		setPluginVersion(identifier.getVersion().toString());
+	}	
+
+	/**
+	 * Compares two plugin entries for equality
+	 * 
+	 * @param object plugin entry object to compare with
+	 * @return <code>true</code> if the two entries are equal, 
+	 * <code>false</code> otherwise
+	 * @since 2.0
+	 */
+	public boolean equals(Object object) {
+		if (!(object instanceof IPluginEntry))
+			return false;
+		IPluginEntry e = (IPluginEntry) object;
+		return getVersionedIdentifier().equals(e.getVersionedIdentifier());
+	}
+
+}
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
new file mode 100644
index 0000000..2c6b211
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/Site.java
@@ -0,0 +1,562 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     James D Miles (IBM Corp.) - bug 191783, NullPointerException in FeatureDownloader
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.net.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.*;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.update.configuration.*;
+import org.eclipse.update.core.model.*;
+import org.eclipse.update.internal.core.*;
+
+/**
+ * Convenience implementation of a site.
+ * <p>
+ * This class may be instantiated or subclassed by clients.
+ * </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 org.eclipse.update.core.ISite
+ * @see org.eclipse.update.core.model.SiteModel
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class Site extends SiteModel implements ISiteWithMirrors {
+
+	/**
+	 * Default installation path for features
+	 * 
+	 * @since 2.0
+	 */
+	public static final String DEFAULT_INSTALLED_FEATURE_PATH = "features/"; //$NON-NLS-1$
+
+	/**
+	 * Default installation path for plug-ins and plug-in fragments
+	 * 
+	 * @since 2.0
+	 */
+	public static final String DEFAULT_PLUGIN_PATH = "plugins/"; //$NON-NLS-1$
+
+	/**
+	 * Default path on a site where packaged features are located
+	 * 
+	 * @since 2.0
+	 */
+	public static final String DEFAULT_FEATURE_PATH = "features/"; //$NON-NLS-1$
+
+	/**
+	 * Default site manifest file name
+	 * 
+	 * @since 2.0
+	 */
+	public static final String SITE_FILE = "site"; //$NON-NLS-1$
+
+	/**
+	 * Default site manifest extension
+	 * 
+	 * @since 2.0
+	 */
+	public static final String SITE_XML = SITE_FILE + ".xml"; //$NON-NLS-1$
+
+	private ISiteContentProvider siteContentProvider;
+	
+	private Map featureCache = Collections.synchronizedMap(new HashMap()); // key=URLKey value=IFeature
+	
+	/**
+	 * Constructor for Site
+	 */
+	public Site() {
+		super();
+	}
+
+	/**
+	 * Compares two sites for equality
+	 * 
+	 * @param obj site object to compare with
+	 * @return <code>true</code> if the two sites are equal, 
+	 * <code>false</code> otherwise
+	 * @since 2.0
+	 */
+	public boolean equals(Object obj) {
+		if (!(obj instanceof ISite))
+			return false;
+		if (getURL() == null)
+			return false;
+		ISite otherSite = (ISite) obj;
+
+		return UpdateManagerUtils.sameURL(getURL(), otherSite.getURL());
+	}
+
+	/**
+	 * Returns the site URL
+	 * 
+	 * @see ISite#getURL()
+	 * @since 2.0
+	 */
+	public URL getURL() {
+		URL url = null;
+		try {
+			url = getSiteContentProvider().getURL();
+		} catch (CoreException e) {
+			UpdateCore.warn(null, e);
+		}
+		return url;
+	}
+
+	/**
+	 * Returns the site description.
+	 * 
+	 * @see ISite#getDescription()
+	 * @since 2.0
+	 */
+	public IURLEntry getDescription() {
+		return (IURLEntry) getDescriptionModel();
+	}
+
+	/**
+	 * Returns an array of categories defined by the site.
+	 * 
+	 * @see ISite#getCategories()
+	 * @since 2.0
+	 */
+	public ICategory[] getCategories() {
+		CategoryModel[] result = getCategoryModels();
+		if (result.length == 0)
+			return new ICategory[0];
+		else
+			return (ICategory[]) result;
+	}
+
+	/**
+	 * Returns the named site category.
+	 * 
+	 * @see ISite#getCategory(String)
+	 * @since 2.0
+	 */
+	public ICategory getCategory(String key) {
+		ICategory result = null;
+		boolean found = false;
+		int length = getCategoryModels().length;
+
+		for (int i = 0; i < length; i++) {
+			if (getCategoryModels()[i].getName().equals(key)) {
+				result = (ICategory) getCategoryModels()[i];
+				found = true;
+				break;
+			}
+		}
+
+		//DEBUG:
+		if (!found) {
+			String URLString = (this.getURL() != null) ? this.getURL().toExternalForm() : "<no site url>"; //$NON-NLS-1$
+			UpdateCore.warn(NLS.bind(Messages.Site_CannotFindCategory, (new String[] { key, URLString })));
+			if (getCategoryModels().length <= 0)
+				UpdateCore.warn(Messages.Site_NoCategories);	
+		}
+
+		return result;
+	}
+
+	/**
+	 * Returns an array of references to features on this site.
+	 * 
+	 * @see ISite#getFeatureReferences()
+	 * @since 2.0
+	 */
+	public ISiteFeatureReference[] getRawFeatureReferences() {
+		FeatureReferenceModel[] result = getFeatureReferenceModels();
+		if (result.length == 0)
+			return new ISiteFeatureReference[0];
+		else
+			return (ISiteFeatureReference[]) result;
+	}
+
+	/**
+	 * @see org.eclipse.update.core.ISite#getFeatureReferences()
+	 */
+	public ISiteFeatureReference[] getFeatureReferences() {
+		// only filter local site
+		if (getCurrentConfiguredSite()!=null)
+			return filterFeatures(getRawFeatureReferences());
+		else 
+			return getRawFeatureReferences();
+		
+	}
+
+	/*
+	 * Method filterFeatures.
+	 * Also implemented in Feature
+	 *  
+	 * @param list
+	 * @return List
+	 */
+	private ISiteFeatureReference[] filterFeatures(ISiteFeatureReference[] allIncluded) {
+		List list = new ArrayList();
+		if (allIncluded!=null){
+			for (int i = 0; i < allIncluded.length; i++) {
+				ISiteFeatureReference included = allIncluded[i];
+				if (UpdateManagerUtils.isValidEnvironment(included))
+					list.add(included);
+				else{
+					if (UpdateCore.DEBUG && UpdateCore.DEBUG_SHOW_WARNINGS){
+						UpdateCore.warn("Filtered out feature reference:"+included); //$NON-NLS-1$
+					}
+				}
+			}
+		}
+		
+		ISiteFeatureReference[] result = new ISiteFeatureReference[list.size()];
+		if (!list.isEmpty()){
+			list.toArray(result);
+		}
+		
+		return result;	
+	}
+
+	/**
+	 * Returns a reference to the specified feature on this site.
+	 * 
+	 * @see ISite#getFeatureReference(IFeature)
+	 * @since 2.0
+	 */
+	public ISiteFeatureReference getFeatureReference(IFeature feature) {
+
+		if (feature == null) {
+			UpdateCore.warn("Site:getFeatureReference: The feature is null"); //$NON-NLS-1$
+			return null;
+		}
+
+		ISiteFeatureReference[] references = getFeatureReferences();
+		ISiteFeatureReference currentReference = null;
+		for (int i = 0; i < references.length; i++) {
+			currentReference = references[i];
+			//if (UpdateManagerUtils.sameURL(feature.getURL(), currentReference.getURL()))
+			//	return currentReference;
+			try {
+				if (feature.getVersionedIdentifier().equals(currentReference.getVersionedIdentifier()))
+					return currentReference;
+			} catch (CoreException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+		}
+
+		UpdateCore.warn("Feature " + feature + " not found on site" + this.getURL()); //$NON-NLS-1$ //$NON-NLS-2$
+		return null;
+	}
+
+	/**
+	 * Returns an array of plug-in and non-plug-in archives located
+	 * on this site
+	 * 
+	 * @see ISite#getArchives()
+	 * @since 2.0
+	 */
+	public IArchiveReference[] getArchives() {
+		ArchiveReferenceModel[] result = getArchiveReferenceModels();
+		if (result.length == 0)
+			return new IArchiveReference[0];
+		else
+			return (IArchiveReference[]) result;
+	}
+
+	/**
+	 * Returns the content provider for this site.
+	 * 
+	 * @see ISite#getSiteContentProvider()
+	 * @since 2.0
+	 */
+	public ISiteContentProvider getSiteContentProvider() throws CoreException {
+		if (siteContentProvider == null) {
+			throw Utilities.newCoreException(Messages.Site_NoContentProvider, null);	
+		}
+		return siteContentProvider;
+	}
+
+	/**
+	 * Returns the default type for a packaged feature supported by this site
+	 * 
+	 * @see ISite#getDefaultPackagedFeatureType()
+	 * @since 2.0
+	 */
+	public String getDefaultPackagedFeatureType() {
+		return DEFAULT_PACKAGED_FEATURE_TYPE;
+	}
+
+	/**
+	 * Returns an array of entries corresponding to plug-ins installed
+	 * on this site.
+	 * 
+	 * @see ISite#getPluginEntries()
+	 * @since 2.0
+	 */
+	public IPluginEntry[] getPluginEntries() {
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * Returns the number of plug-ins installed on this site
+	 * 
+	 * @see ISite#getPluginEntryCount()
+	 * @since 2.0
+	 */
+	public int getPluginEntryCount() {
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * Returns an array of entries corresponding to plug-ins that are
+	 * installed on this site and are referenced only by the specified
+	 * feature. 
+	 * 
+	 * @see ISite#getPluginEntriesOnlyReferencedBy(IFeature)	 * 
+	 * @since 2.0
+	 */
+	public IPluginEntry[] getPluginEntriesOnlyReferencedBy(IFeature feature) throws CoreException {
+
+		IPluginEntry[] pluginsToRemove = new IPluginEntry[0];
+		if (feature == null)
+			return pluginsToRemove;
+
+		// get the plugins from the feature
+		IPluginEntry[] entries = feature.getPluginEntries();
+		if (entries != null) {
+			// get all the other plugins from all the other features
+			Set allPluginID = new HashSet();
+			ISiteFeatureReference[] features = getFeatureReferences();
+			if (features != null) {
+				for (int indexFeatures = 0; indexFeatures < features.length; indexFeatures++) {
+					IFeature featureToCompare = null;
+					try {
+						featureToCompare = features[indexFeatures].getFeature(null);
+					} catch (CoreException e) {
+						UpdateCore.warn(null, e);
+					}
+					if (!feature.equals(featureToCompare)) {
+						IPluginEntry[] pluginEntries = features[indexFeatures].getFeature(null).getPluginEntries();
+						if (pluginEntries != null) {
+							for (int indexEntries = 0; indexEntries < pluginEntries.length; indexEntries++) {
+								allPluginID.add(pluginEntries[indexEntries].getVersionedIdentifier());
+							}
+						}
+					}
+				}
+			}
+
+			// create the delta with the plugins that may be still used by other configured or unconfigured feature
+			List plugins = new ArrayList();
+			for (int indexPlugins = 0; indexPlugins < entries.length; indexPlugins++) {
+				if (!allPluginID.contains(entries[indexPlugins].getVersionedIdentifier())) {
+					plugins.add(entries[indexPlugins]);
+				}
+			}
+
+			// move List into Array
+			if (!plugins.isEmpty()) {
+				pluginsToRemove = new IPluginEntry[plugins.size()];
+				plugins.toArray(pluginsToRemove);
+			}
+		}
+
+		return pluginsToRemove;
+	}
+
+	/**
+	 * Adds a new plug-in entry to this site.
+	 * This implementation always throws UnsupportedOperationException
+	 * because this implementation does not support the install action.
+	 * 
+	 * @see ISite#addPluginEntry(IPluginEntry)
+	 * @exception java.lang.UnsupportedOperationException
+	 * @since 2.0
+	 */
+	public void addPluginEntry(IPluginEntry pluginEntry) {
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * Get download size for the specified feature on this site.
+	 * This implementation always throws UnsupportedOperationException
+	 * because this implementation does not support the install action.
+	 * 
+	 * @see ISite#getDownloadSizeFor(IFeature)
+	 * @exception java.lang.UnsupportedOperationException
+	 * @since 2.0
+	 */
+	public long getDownloadSizeFor(IFeature feature) {
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * Get install size for the specified feature on this site.
+	 * This implementation always throws UnsupportedOperationException
+	 * because this implementation does not support the install action.
+	 * 
+	 * @see ISite#getInstallSizeFor(IFeature)
+	 * @exception java.lang.UnsupportedOperationException
+	 * @since 2.0
+	 */
+	public long getInstallSizeFor(IFeature feature) {
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * Install the specified feature and all optional features on this site.
+	 * This implementation always throws UnsupportedOperationException
+	 * because this implementation does not support the install action.
+	 * 
+	 * @see ISite#install(IFeature, IVerificationListener, IProgressMonitor)
+	 * @exception InstallAbortedException when the user cancels the install
+	 * @exception CoreException
+	 * @exception java.lang.UnsupportedOperationException
+	 * @since 2.0
+	 */
+	public IFeatureReference install(IFeature sourceFeature, IVerificationListener verificationListener, IProgressMonitor progress) throws InstallAbortedException, CoreException {
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * Install the specified feature and listed optional features on this site.
+	 * This implementation always throws UnsupportedOperationException
+	 * because this implementation does not support the install action.
+	 * 
+	 * @see ISite#install(IFeature, IVerificationListener, IProgressMonitor)
+	 * @exception InstallAbortedException when the user cancels the install
+	 * @exception CoreException
+	 * @exception java.lang.UnsupportedOperationException
+	 * @since 2.0
+	 */
+	public IFeatureReference install(IFeature sourceFeature, IFeatureReference[] optionalFeatures, IVerificationListener verificationListener, IProgressMonitor progress) throws InstallAbortedException, CoreException {
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * Install the specified feature on this site using the content consumer as 
+	 * a context to install the feature in.
+	 * This implementation always throws UnsupportedOperationException
+	 * because this implementation does not support the install action.
+	 * 
+	 * @param sourceFeature feature to install
+	 * @param parentContentConsumer content consumer of the parent feature
+	 * @param parentVerifier verifier of the parent feature
+	 * @param verificationListener install verification listener
+	 * @param progress install monitor, can be <code>null</code>
+	 * @exception InstallAbortedException when the user cancels the install
+	 * @exception CoreException
+	 * @exception java.lang.UnsupportedOperationException 
+	 * @since 2.0 
+	 */
+	public IFeatureReference install(IFeature sourceFeature, IFeatureReference[] optionalFeatures, IFeatureContentConsumer parentContentConsumer, IVerifier parentVerifier, IVerificationListener verificationListener, IProgressMonitor progress)
+		throws CoreException {
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * Remove (uninstall) the specified feature from this site.
+	 * This implementation always throws UnsupportedOperationException
+	 * because this implementation does not support the remove action.
+	 * 
+	 * @see ISite#remove(IFeature, IProgressMonitor)
+	 * @exception java.lang.UnsupportedOperationException
+	 * @since 2.0
+	 */
+	public void remove(IFeature feature, IProgressMonitor progress) throws CoreException {
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * Sets the site content provider.
+	 * 
+	 * @see ISite#setSiteContentProvider(ISiteContentProvider)
+	 * @since 2.0
+	 */
+	public void setSiteContentProvider(ISiteContentProvider siteContentProvider) {
+		this.siteContentProvider = siteContentProvider;
+	}
+	/**
+	 * @see ISite#getCurrentConfiguredSite()
+	 */
+	public IConfiguredSite getCurrentConfiguredSite() {
+		return (IConfiguredSite) getConfiguredSiteModel();
+	}
+
+	/**
+	 * @see org.eclipse.update.core.ISite#createFeature(String, URL)
+	 * @deprecated
+	 */
+	public IFeature createFeature(String type, URL url) throws CoreException {
+		return createFeature(type,url,null);
+	}
+
+	/**
+	 * @see org.eclipse.update.core.ISite#createFeature(String, URL,
+	 * IProgressMonitor)
+	 */
+	public IFeature createFeature(String type, URL url, IProgressMonitor monitor) throws CoreException {
+
+		if(url == null) {
+			UpdateCore.warn("The feature URL passed is null");
+			return null;
+		}
+		
+		// First check the cache
+		URLKey key = new URLKey(url);
+		IFeature feature = (IFeature) featureCache.get(key);
+		if (feature != null) return feature;
+
+		// Create a new one
+		if (type == null || type.equals("")) { //$NON-NLS-1$
+			// ask the Site for the default type
+			type = getDefaultPackagedFeatureType();
+		}
+
+		IFeatureFactory factory = FeatureTypeFactory.getInstance().getFactory(type);
+		feature = factory.createFeature(url, this, monitor);
+		if (feature != null) {
+			// Add the feature to the cache
+			featureCache.put(key, feature);
+		}
+		return feature;
+	}
+
+	protected void removeFeatureFromCache(URL featureURL) {
+		URLKey key = new URLKey(featureURL);
+		featureCache.remove(key);
+	}
+
+	/**
+	 * Return an array of mirror update sites.
+	 * 
+	 * @return an array of mirror update sites
+	 * @since 2.0
+	 */
+	public IURLEntry[] getMirrorSiteEntries() {
+		URLEntryModel[] result = getMirrorSiteEntryModels();
+		if (result.length == 0)
+			return new IURLEntry[0];
+		else
+			return (IURLEntry[]) result;
+	}
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/SiteContentProvider.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/SiteContentProvider.java
new file mode 100644
index 0000000..8f38779
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/SiteContentProvider.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+ 
+import java.net.*;
+
+import org.eclipse.core.runtime.*;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.update.internal.core.Messages;
+import org.eclipse.update.internal.core.UpdateCore;
+
+/**
+ * Base site content provider
+ * <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>
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public abstract class SiteContentProvider implements ISiteContentProvider {
+
+	private URL base;
+	private ISite site;
+
+	/**
+	 * Constructor for SiteContentProvider
+	 */
+	public SiteContentProvider(URL url) {
+		super();
+		this.base = url;
+	}
+
+	/**
+	 * Returns the URL of this site
+	 * 
+	 * @see ISiteContentProvider#getURL()
+	 * @since 2.0
+	 */
+	public URL getURL() {
+		return base;
+	}
+
+	/**
+	 * Returns a URL for the identified archive
+	 * 
+	 * @see ISiteContentProvider#getArchiveReference(String)
+	 * @since 2.0
+	 */
+	private URL getArchiveReference1(String archiveID) throws CoreException {
+		try {
+			return new URL(getURL(), archiveID);
+		} catch (MalformedURLException e) {
+			throw Utilities.newCoreException(
+					NLS.bind(Messages.SiteContentProvider_ErrorCreatingURLForArchiveID, (new String[] { archiveID, getURL().toExternalForm() })),
+					e);
+		}
+	}
+
+	/**
+	 * Returns the site for this provider
+	 * 
+	 * @see ISiteContentProvider#getSite()
+	 * @since 2.0
+	 */
+	public ISite getSite() {
+		return site;
+	}
+
+	/**
+	 * Sets the site for this provider
+	 * 
+	 * @param site site for this provider
+	 * @since 2.0
+	 */
+	public void setSite(ISite site) {
+		this.site = site;
+	}
+
+	public URL getArchiveReference(String archiveId) throws CoreException {
+		URL contentURL = null;
+		
+		contentURL = getArchiveURLfor(archiveId);
+		// if there is no mapping in the site.xml
+		// for this archiveId, use the default one
+		if (contentURL==null) {
+			return getArchiveReference1(archiveId);
+		}
+		
+		return contentURL;
+	}
+
+	/**
+	 * return the URL associated with the id of teh archive for this site
+	 * return null if the archiveId is null, empty or 
+	 * if teh list of archives on the site is null or empty
+	 * of if there is no URL associated with the archiveID for this site
+	 */
+	private URL getArchiveURLfor(String archiveId) {
+		URL result = null;
+		boolean found = false;
+	
+		IArchiveReference[] siteArchives = getSite().getArchives();
+		if (siteArchives.length > 0) {
+			for (int i = 0; i < siteArchives.length && !found; i++) {
+				if (UpdateCore.DEBUG && UpdateCore.DEBUG_SHOW_INSTALL)
+					UpdateCore.debug("GetArchiveURL for:"+archiveId+" compare to "+siteArchives[i].getPath()); //$NON-NLS-1$ //$NON-NLS-2$
+				if (archiveId.trim().equalsIgnoreCase(siteArchives[i].getPath())) {
+					result = siteArchives[i].getURL();
+					found = true;
+					break;
+				}
+			}
+		}
+		return result;
+	}
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/SiteFeatureReference.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/SiteFeatureReference.java
new file mode 100644
index 0000000..7876b03
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/SiteFeatureReference.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.update.internal.core.Messages;
+import org.eclipse.update.internal.core.UpdateCore;
+
+/**
+ * Convenience implementation of a feature reference.
+ * <p>
+ * This class may be instantiated or subclassed by clients.
+ * </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 org.eclipse.update.core.IFeatureReference
+ * @see org.eclipse.update.core.model.FeatureReferenceModel
+ * @see org.eclipse.update.core.ISiteFeatureReference
+ * @see org.eclipse.update.core.SiteFeatureReferenceModel 
+ * @since 2.1
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class SiteFeatureReference extends SiteFeatureReferenceModel implements ISiteFeatureReference {
+
+	private List categories;
+
+	/**
+	 * Feature reference default constructor
+	 */
+	public SiteFeatureReference() {
+		super();
+	}
+
+	/**
+	 * Constructor FeatureReference.
+	 * @param ref the reference to copy
+	 */
+	public SiteFeatureReference(ISiteFeatureReference ref) {
+		super(ref);
+	}
+
+	/**
+	 * Returns an array of categories the referenced feature belong to.
+	 * 
+	 * @see ISiteFeatureReference#getCategories()
+	 * @since 2.1 
+	 */
+	public ICategory[] getCategories() {
+
+		if (categories == null) {
+			categories = new ArrayList();
+			String[] categoriesAsString = getCategoryNames();
+			for (int i = 0; i < categoriesAsString.length; i++) {
+				ICategory siteCat = getSite().getCategory(categoriesAsString[i]);
+				if (siteCat != null)
+					categories.add(siteCat);
+				else {
+					String siteURL = getSite().getURL() != null ? getSite().getURL().toExternalForm() : null;
+					UpdateCore.warn("Category " + categoriesAsString[i] + " not found in Site:" + siteURL); //$NON-NLS-1$ //$NON-NLS-2$
+				}
+			}
+		}
+
+		if (categories.size() == 0) {
+			//there was no category defined
+			//so we add the default "Other" category
+			ICategory category = new Category(Messages.SiteCategory_other_label, Messages.SiteCategory_other_description);
+			categories.add(category);
+		}
+		
+		ICategory[] result = new ICategory[0];
+
+		if (!(categories == null || categories.isEmpty())) {
+			result = new ICategory[categories.size()];
+			categories.toArray(result);
+		}
+		return result;
+	}
+
+	/**
+	 * Adds a category to the referenced feature.
+	 * 
+	 * @see ISiteFeatureReference#addCategory(ICategory)
+	 * @since 2.1 
+	 */
+	public void addCategory(ICategory category) {
+		this.addCategoryName(category.getName());
+	}
+
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/SiteFeatureReferenceModel.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/SiteFeatureReferenceModel.java
new file mode 100644
index 0000000..671c69e
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/SiteFeatureReferenceModel.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Site Feature reference model object.
+ * <p>
+ * This class may be instantiated or subclassed by clients. However, in most 
+ * cases clients should instead instantiate or subclass the provided 
+ * concrete implementation of this model.
+ * </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 org.eclipse.update.core.FeatureReference
+ * @since 2.1
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class SiteFeatureReferenceModel extends FeatureReference {
+
+	private List /* of String*/
+	categoryNames;
+
+
+	/**
+	 * Creates an uninitialized feature reference model object.
+	 * 
+	 * @since 2.0
+	 */
+	public SiteFeatureReferenceModel() {
+		super();
+	}
+
+	/**
+	 * Constructor FeatureReferenceModel.
+	 * @param ref
+	 */
+	public SiteFeatureReferenceModel(ISiteFeatureReference ref) {
+		super(ref);
+		if (ref instanceof SiteFeatureReferenceModel) {
+			SiteFeatureReferenceModel refModel = (SiteFeatureReferenceModel) ref;
+			setCategoryNames(refModel.getCategoryNames());
+		}
+	}
+
+
+	/**
+	 * Returns the names of categories the referenced feature belongs to.
+	 * 
+	 * @return an array of names, or an empty array.
+	 * @since 2.0
+	 */
+	public String[] getCategoryNames() {
+		if (categoryNames == null)
+			return new String[0];
+
+		return (String[]) categoryNames.toArray(new String[0]);
+	}
+
+	/**
+	 * Sets the names of categories this feature belongs to.
+	 * Throws a runtime exception if this object is marked read-only.
+	 * 
+	 * @param categoryNames an array of category names
+	 * @since 2.0
+	 */
+	public void setCategoryNames(String[] categoryNames) {
+		assertIsWriteable();
+		if (categoryNames == null)
+			this.categoryNames = null;
+		else
+			this.categoryNames = new ArrayList(Arrays.asList(categoryNames));
+	}
+
+	/**
+	 * Adds the name of a category this feature belongs to.
+	 * Throws a runtime exception if this object is marked read-only.
+	 * 
+	 * @param categoryName category name
+	 * @since 2.0
+	 */
+	public void addCategoryName(String categoryName) {
+		assertIsWriteable();
+		if (this.categoryNames == null)
+			this.categoryNames = new ArrayList();
+		if (!this.categoryNames.contains(categoryName))
+			this.categoryNames.add(categoryName);
+	}
+	
+	/**
+	 * Removes the name of a categorys this feature belongs to.
+	 * Throws a runtime exception if this object is marked read-only.
+	 * 
+	 * @param categoryName category name
+	 * @since 2.0
+	 */
+	public void removeCategoryName(String categoryName) {
+		assertIsWriteable();
+		if (this.categoryNames != null)
+			this.categoryNames.remove(categoryName);
+	}
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/SiteManager.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/SiteManager.java
new file mode 100644
index 0000000..8aeebcf
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/SiteManager.java
@@ -0,0 +1,342 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Laurent Fourrier (laurent@fourrier.nom.fr) - HTTP Proxy code and NetAccess Plugin
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.net.URL;
+
+import org.eclipse.core.net.proxy.IProxyData;
+import org.eclipse.core.net.proxy.IProxyService;
+import org.eclipse.core.runtime.*;
+import org.eclipse.update.configuration.ILocalSite;
+import org.eclipse.update.internal.core.InternalSiteManager;
+import org.eclipse.update.internal.core.UpdateCore;
+
+/**
+ * Site Manager.
+ * A helper class used for creating site instance. 
+ * Site manager is a singleton class. It cannot be instantiated; 
+ * all functionality is provided by static methods.
+ * 
+ * <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 org.eclipse.update.core.ISite
+ * @see org.eclipse.update.configuration.ILocalSite
+ * @see org.eclipse.update.configuration.IConfiguredSite
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class SiteManager {
+
+	private static String os;
+	private static String ws;
+	private static String arch;
+	private static String nl;
+
+	private SiteManager() {
+	}
+
+	/** 
+	 * Returns a site object for the site specified by the argument URL.
+	 * Typically, the URL references a site manifest file on an update 
+	 * site. An update site acts as a source of features for installation
+	 * actions.
+	 * 
+	 * @param siteURL site URL
+	 * @return site object for the url
+	 * @exception CoreException
+	 * @deprecated use getSite(URL,IPogressMonitor) instead
+	 * @since 2.0 
+	 */
+	public static ISite getSite(URL siteURL) throws CoreException {
+		return InternalSiteManager.getSite(siteURL, true,null);
+	}
+
+	/** 
+	 * Returns a site object for the site specified by the argument URL.
+	 * Typically, the URL references a site manifest file on an update 
+	 * site. An update site acts as a source of features for installation
+	 * actions.
+	 * 
+	 * @param siteURL site URL
+	 * @param monitor the progress monitor
+	 * @return site object for the url or <samp>null</samp> in case a 
+	 * user canceled the connection in the progress monitor.
+	 * @exception CoreException
+	 * @since 2.1 
+	 */
+	public static ISite getSite(URL siteURL, IProgressMonitor monitor) throws CoreException {
+		return InternalSiteManager.getSite(siteURL, true, monitor);
+	}
+
+	/** 
+	 * Returns a site object for the site specified by the argument URL.
+	 * Typically, the URL references a site manifest file on an update 
+	 * site. An update site acts as a source of features for installation
+	 * actions.
+	 * 
+	 * @param siteURL site URL
+	 * @param usesCache <code>false</code> if the cache should be refreshed, and the site entirely reparsed, <code>false</code> otherwise.
+	 * @return site object for the url
+	 * @exception CoreException
+	 * @deprecated use getSite(URL,boolean,IPogressMonitor) instead
+	 * @since 2.0 
+	 */
+	public static ISite getSite(URL siteURL, boolean usesCache) throws CoreException {
+		return InternalSiteManager.getSite(siteURL, usesCache,null);
+	}
+
+	/** 
+	 * Returns a site object for the site specified by the argument URL.
+	 * Typically, the URL references a site manifest file on an update 
+	 * site. An update site acts as a source of features for installation
+	 * actions.
+	 * 
+	 * @param siteURL site URL
+	 * @param usesCache <code>false</code> if the cache should be refreshed, and the site entirely reparsed, <code>false</code> otherwise.
+	 * @param monitor the progress monitor
+	 * @return site object for the url or <samp>null</samp> in case a 
+	 * user canceled the connection in the progress monitor.
+	 * @exception CoreException
+	 * @since 2.1
+	 */
+	public static ISite getSite(URL siteURL, boolean usesCache, IProgressMonitor monitor) throws CoreException {
+		return InternalSiteManager.getSite(siteURL, usesCache, monitor);
+	}
+
+
+	/**
+	 * Returns the "local site". A local site is a logical collection
+	 * of configuration information plus one or more file system 
+	 * installation directories, represented as intividual sites. 
+	 * These are potential targets for installation actions.
+	 * 
+	 * @return the local site
+	 * @exception CoreException
+	 * @since 2.0 
+	 */
+	public static ILocalSite getLocalSite() throws CoreException {
+		return InternalSiteManager.getLocalSite();
+	}
+
+	/**
+	 * Trigger handling of newly discovered features. This method
+	 * can be called by the executing application whenever it
+	 * is invoked with the -newUpdates command line argument.
+	 * 
+	 * @throws CoreException if an error occurs.
+	 * @since 2.0
+	 * @deprecated Do not use this method
+	 */
+	public static void handleNewChanges() throws CoreException {
+	}
+	/**
+	 * Returns system architecture specification. A comma-separated list of arch
+	 * designators defined by the platform. 
+	 * 
+	 * This information is used as a hint by the installation and update
+	 * support.
+	 * 
+	 * @return system architecture specification
+	 * @since 2.1
+	 */
+	public static String getOSArch() {
+		if (arch == null)
+			arch = Platform.getOSArch();
+		return arch;
+	}
+
+	/**
+	 * Returns operating system specification. A comma-separated list of os
+	 * designators defined by the platform.
+	 * 
+	 * This information is used as a hint by the installation and update
+	 * support.
+	 *
+	 * @return the operating system specification.
+	 * @since 2.1
+	 */
+	public static String getOS() {
+		if (os == null)
+			os = Platform.getOS();
+		return os;
+	}
+
+	/**
+	 * Returns system architecture specification. A comma-separated list of arch
+	 * designators defined by the platform. 
+	 * 
+	 * This information is used as a hint by the installation and update
+	 * support.
+	 * @return system architecture specification.
+	 * @since 2.1
+	 */
+	public static String getWS() {
+		if (ws == null)
+			ws = Platform.getWS();
+		return ws;
+	}
+
+	/**
+	 * Sets the arch.
+	 * @param arch The arch to set
+	 */
+	public static void setOSArch(String arch) {
+		SiteManager.arch = arch;
+	}
+
+	/**
+	 * Sets the os.
+	 * @param os The os to set
+	 */
+	public static void setOS(String os) {
+		SiteManager.os = os;
+	}
+
+	/**
+	 * Sets the ws.
+	 * @param ws The ws to set
+	 */
+	public static void setWS(String ws) {
+		SiteManager.ws = ws;
+	}
+
+	/**
+	 * Sets the nl.
+	 * @param nl The nl to set
+	 */
+	public static void setNL(String nl) {
+		SiteManager.nl = nl;
+	}
+	
+	/**
+	 * Returns an estimate of bytes per second transfer rate for this URL
+	 * @param site the URL of the site
+	 * @return long a bytes per second estimate rate
+	 * @since 2.1
+ 	 */	
+	public static long getEstimatedTransferRate(URL site) {
+		if (site == null)
+			return 0;
+		return InternalSiteManager.getEstimatedTransferRate(site.getHost());
+	}
+
+	/**
+	 * Returns current locale
+	 * 
+	 * @return the string name of the current locale or <code>null</code>
+	 * @since 2.1
+	 */
+	public static String getNL() {
+		if (nl == null)
+			nl = Platform.getNL();
+		return nl;
+	}
+
+	/**
+	 * Returns the HTTP Proxy Server or <code>null</code> if none.
+	 * @return the HTTP proxy Server 
+	 * @deprecated clients should access the {@link IProxyService} directly
+	 */
+	public static String getHttpProxyServer() {
+		IProxyService service = UpdateCore.getPlugin().getProxyService();
+		if (service != null && service.isProxiesEnabled()) {
+			IProxyData data = service.getProxyData(IProxyData.HTTP_PROXY_TYPE);
+			if (data != null)
+				return data.getHost();
+			
+		}
+		return null;
+	}
+	/**
+	 * Returns the HTTP Proxy Port or <code>null</code> if none
+	 * @return the HTTP proxy Port
+	 * @deprecated clients should access the {@link IProxyService} directly
+	 */
+	public static String getHttpProxyPort() {
+		IProxyService service = UpdateCore.getPlugin().getProxyService();
+		if (service != null && service.isProxiesEnabled()) {
+			IProxyData data = service.getProxyData(IProxyData.HTTP_PROXY_TYPE);
+			if (data != null) {
+				if (data.getPort() == -1)
+					return "80";
+				return String.valueOf(data.getPort());
+			}
+			
+		}
+		return null;
+	}
+	
+	/**
+	 * Returns <code>true</code> if the connection should use the 
+	 * http proxy server, <code>false</code> otherwise
+	 * @return is the http proxy server enable
+	 * @deprecated clients should access the {@link IProxyService} directly
+	 */
+	public static boolean isHttpProxyEnable() {
+		IProxyService service = UpdateCore.getPlugin().getProxyService();
+		if (service != null && service.isProxiesEnabled()) {
+			IProxyData data = service.getProxyData(IProxyData.HTTP_PROXY_TYPE);
+			return (data != null && data.getHost() != null);
+		}
+		return false;
+	}
+	/**
+	 * Sets the HTTP Proxy information
+	 * Sets the HTTP proxy server for the HTTP proxy server 
+	 * Sets the HTTP proxy port for the HTTP proxy server 
+	 * If the proxy name is <code>null</code> or the proxy port is
+	 * <code>null</code> the connection will not use HTTP proxy server.
+	 * 
+	 * @param enable <code>true</code> if the connection should use an http
+	 * proxy server, <code>false </code> otherwise.
+	 * @param httpProxyServer the HTTP proxy server name or IP address
+	 * @param httpProxyPort the HTTP proxy port
+	 * 
+	 * @deprecated clients should use the {@link IProxyService} directly
+	 */
+	public static void setHttpProxyInfo(boolean enable, String httpProxyServer, String httpProxyPort) {
+		IProxyService service = UpdateCore.getPlugin().getProxyService();
+		if (service == null)
+			return;
+		// Make sure that the proxy service is enabled if needed but don't disable the
+		// service if the http proxy is being disabled
+		if (enable && !service.isProxiesEnabled())
+			service.setProxiesEnabled(enable);
+
+		if (service.isProxiesEnabled()) {
+			IProxyData data = service.getProxyData(IProxyData.HTTP_PROXY_TYPE);
+			if (data != null) {
+				data.setHost(httpProxyServer);
+				if (httpProxyPort == null || httpProxyPort.equals("80")) {
+					data.setPort(-1);
+				} else {
+					try {
+						int port = Integer.parseInt(httpProxyPort);
+						data.setPort(port);
+					} catch (NumberFormatException e) {
+						UpdateCore.log(e);
+					}
+				}
+				try {
+					service.setProxyData(new IProxyData[] { data });
+				} catch (CoreException e) {
+					UpdateCore.log(e);
+				}
+			}
+		}
+	}
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/URLEntry.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/URLEntry.java
new file mode 100644
index 0000000..21342b7
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/URLEntry.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import org.eclipse.update.core.model.*;
+import org.eclipse.update.internal.core.*;
+
+/**
+ * Convenience implementation of an annotated URL.
+ * <p>
+ * This class may be instantiated or subclassed by clients.
+ * </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 org.eclipse.update.core.IURLEntry
+ * @see org.eclipse.update.core.model.URLEntryModel
+ * @since 2.0
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class URLEntry extends URLEntryModel implements IURLEntry {
+
+	/**
+	 * Default constructor for annotated URL
+	 * 
+	 * @since 2.0
+	 */
+	public URLEntry() {
+		super();
+	}
+
+	/**
+	 * Returns a string representation of an annotated URL.
+	 * 
+	 * @return annotated url as String
+	 * @since 2.0
+	 */
+	public String toString() {
+		String result = "IURLEntry: "; //$NON-NLS-1$
+		String URLString =
+			(getURL() == null) ? Messages.Feature_NoURL : getURL().toExternalForm();	
+		result =
+			result
+				+ ((getAnnotation() == null) ? URLString : getAnnotation() + " : " + URLString); //$NON-NLS-1$
+		return result;
+	}
+}
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/Utilities.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/Utilities.java
new file mode 100644
index 0000000..ccde29f
--- /dev/null
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/Utilities.java
@@ -0,0 +1,353 @@
+/*******************************************************************************
+ *  Copyright (c) 2000, 2010 IBM Corporation and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.update.core;
+
+import java.io.*;
+import java.text.DateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+import org.eclipse.core.runtime.*;
+import org.eclipse.update.core.model.*;
+import org.eclipse.update.internal.core.*;
+
+/**
+ * This class is a collection of utility functions that can be 
+ * used for install processing
+ * <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>
+ * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
+ * This API will be deleted in a future release. See bug 311590 for details.
+ */
+public class Utilities {
+
+	private static Map entryMap;
+	private static final DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.getDefault());
+	private static long tmpseed = (new Date()).getTime();
+	private static String dirRoot = null;
+
+	/**
+	 * Returns a new working directory (in temporary space). Ensures
+	 * the directory exists. Any directory levels that had to be created
+	 * are marked for deletion on exit.
+	 * 
+	 * @return working directory
+	 * @exception IOException
+	 * @since 2.0
+	 */
+	public static synchronized File createWorkingDirectory() throws IOException {
+
+		if (dirRoot == null) {
+			dirRoot = System.getProperty("java.io.tmpdir"); //$NON-NLS-1$
+			// in Linux, returns '/tmp', we must add '/'
+			if (!dirRoot.endsWith(File.separator))
+				dirRoot += File.separator;
+
+			// on Unix/Linux, the temp dir is shared by many users, so we need to ensure 
+			// that the top working directory is different for each user
+			if (!Platform.getOS().equals("win32")) { //$NON-NLS-1$
+				String home = System.getProperty("user.home"); //$NON-NLS-1$
+				home = Integer.toString(home.hashCode());
+				dirRoot += home + File.separator;
+			}
+			dirRoot += "eclipse" + File.separator + ".update" + File.separator + Long.toString(tmpseed) + File.separator; //$NON-NLS-1$ //$NON-NLS-2$
+		}
+
+		String tmpName = dirRoot + Long.toString(++tmpseed) + File.separator;
+
+		File tmpDir = new File(tmpName);
+		verifyPath(tmpDir, false);
+		if (!tmpDir.exists())
+			throw new FileNotFoundException(tmpName);
+		return tmpDir;
+	}
+
+	/**
+	 * Create a new working file. The file is marked for deletion on exit.
+	 * 
+	 * @see #lookupLocalFile(String)
+	 * @param tmpDir directory location for new file. Any missing directory
+	 * levels are created (and marked for deletion on exit)
+	 * @param name optional file name, or <code>null</code>. If name is not
+	 * specified, a temporary name is generated.
+	 * @return created working file
+	 * @exception IOException
+	 * @since 2.0
+	 */
+	public static synchronized File createLocalFile(File tmpDir, String name) throws IOException {
+		// create the local file
+		File temp;
+		String filePath;
+		if (name != null) {
+			// create file with specified name
+			filePath = name.replace('/', File.separatorChar);
+			if (filePath.startsWith(File.separator))
+				filePath = filePath.substring(1);
+			temp = new File(tmpDir, filePath);
+		} else {
+			// create file with temp name
+			temp = File.createTempFile("eclipse", null, tmpDir); //$NON-NLS-1$
+		}
+		temp.deleteOnExit();
+		verifyPath(temp, true);
+
+		return temp;
+	}
+
+	/**
+	 * The file is associated with a lookup key.
+	 * @param key optional lookup key, or <code>null</code>.
+	 * @param temp the local working file
+	 * @since 2.0.2
+	 */
+	public synchronized static void mapLocalFile(String key, File temp) {
+		// create file association 
+		if (key != null) {
+			if (entryMap == null)
+				entryMap = new HashMap();
+			entryMap.put(key, temp);
+		}
+	}
+
+	/**
+	 * Returns a previously cached local file (in temporary area) matching the
+	 * specified key. 
+	 * 
+	 * @param key lookup key
+	 * @return cached file, or <code>null</code>.
+	 * @since 2.0
+	 */
+	public static synchronized File lookupLocalFile(String key) {
+		if (entryMap == null)
+			return null;
+		return (File) entryMap.get(key);
+	}
+
+	/**
+	 * Flushes all the keys from the local file map.
+	 * Reinitialize the cache.
+     *
+	 * @since 2.1
+	 */
+	public synchronized static void flushLocalFile() {
+		entryMap = null;
+	}
+
+	/**
+	 * Removes the specified key from the local file map. The file is
+	 * not actually deleted until VM termination.
+	 * 
+	 * @param key lookup key
+	 * @since 2.0
+	 */
+	public static synchronized void removeLocalFile(String key) {
+		if (entryMap != null)
+			entryMap.remove(key);
+	}
+
+	/**
+	 * Copies specified input stream to the output stream. Neither stream
+	 * is closed as part of this operation.
+	 *