diff --git a/update/org.eclipse.update.core/META-INF/MANIFEST.MF b/update/org.eclipse.update.core/META-INF/MANIFEST.MF
index 19640bd..e314611 100644
--- a/update/org.eclipse.update.core/META-INF/MANIFEST.MF
+++ b/update/org.eclipse.update.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.update.core; singleton:=true
-Bundle-Version: 3.2.400.qualifier
+Bundle-Version: 3.2.500.qualifier
 Bundle-Activator: org.eclipse.update.internal.core.UpdateCore
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -25,10 +25,9 @@
 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)"
-Eclipse-LazyStart: true
+Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: J2SE-1.4,
- CDC-1.0/Foundation-1.0,
- J2SE-1.3
+ CDC-1.1/Foundation-1.1
 Import-Package: javax.xml.parsers,
  org.w3c.dom,
  org.xml.sax,
diff --git a/update/org.eclipse.update.core/Scrapbook.jpage b/update/org.eclipse.update.core/Scrapbook.jpage
deleted file mode 100644
index c2633ae..0000000
--- a/update/org.eclipse.update.core/Scrapbook.jpage
+++ /dev/null
@@ -1,431 +0,0 @@
-		java.util.Enumeration enum =  System.getProperties().keys();
-		String key = null;
-		while (enum.hasMoreElements()){
-			key = (String)enum.nextElement();
-			System.out.print(key);
-			for (int i =0;i<(30-key.length());i++)System.out.print(" ");
-			System.out.println("->"+System.getProperty(key));
-		}
-
-
-new java.net.URL("file://C:/temp/org.eclipse.update.core.feature1_1.0.0/org.eclipse.update.core.feature1.plugin1_1.1.1.jar").openStream()
-
-(new java.io.File("C:\\chris chris\hello\\")).mkdirs();
-
-java.net.URL a =  new java.net.URL("http","www.oti.com","/feature/blah.jar");
-java.net.URL b =  new java.net.URL("jar",null,a.toExternalForm()+"!/hello.txt");
-b
-
-new java.net.URL("file",null,System.getProperty("java.io.tmpdir"));
-new java.net.URL("file",null,System.getProperty("user.home"));
-
-String tempDir = "c:\\TEMP\\features2.jar";
-java.net.URL TEMP_SITE = new java.net.URL("file",null,tempDir);
-java.net.URL file = new java.net.URL("jar",null,TEMP_SITE.toExternalForm()+"!/feature.xml");
-file.openStream();
-file
-
-java.io.File f =  new java.io.File("c:\\temp\\xtf\\file.jar");
-f.mkdirs()
-
-java.util.Locale.getDefault()
-java.util.ResourceBundle
-
-java.net.URL url = new java.net.URL("file",null,"C:\\path"+java.io.File.separator);
-url.getPath().endsWith("/");
-url
-
-java.net.URL url = new java.net.URL("http://machine:8080/path space/file.abc#hello");
-java.net.URL url2 = new java.net.URL(url,"/ ");
-url2.getPath()
-
-java.lang.ClassLoader l = new java.net.URLClassLoader(new java.net.URL[] {new java.net.URL("file",null,"c:\\oti\\wsw205\\eclipse\\install\\features\\org.eclipse.help.feature_1.0.4/") }, null);
-java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("feature", java.util.Locale.getDefault(), l);
-bundle
-
-String[] ss = {"a", "b"}; 
-java.util.List list = new java.util.ArrayList(0);
-list.addAll(java.util.Arrays.asList(ss)); 
-list.add("c");
-list.size();
-
-java.util.List list = new java.util.ArrayList(0);
-list.add("1");
-list.add("2");
-list.add("3");
-list.add("4");
-list.add("5");
-list.add("6");
-list.add("7");
-while (list.size()>5){
-	list.remove(0);
-}
-list.get(0)
-
-
-org.eclipse.update.internal.security.KeyStores k = new org.eclipse.update.internal.security.KeyStores();
-while (k.hasNext()){
-	org.eclipse.update.internal.security.KeystoreHandle handle = (org.eclipse.update.internal.security.KeystoreHandle) k.next();
-	System.out.println("KeyStore:"+handle.getLocation()+":"+handle.getType());
-}
-
-int i = (13/3);
-i
-
-*****************************************
-OLD Feature Code
-
-
-	/**
-	 */
-	private void downloadArchivesLocally(ISite tempSite, String[] archiveIDToInstall, IProgressMonitor monitor) throws CoreException, IOException {
-
-		URL sourceURL;
-		String newFile;
-		URL newURL;
-
-		if (monitor != null) {
-			monitor.beginTask("Download archives bundles to Temporary Space", archiveIDToInstall.length);
-		}
-		for (int i = 0; i < archiveIDToInstall.length; i++) {
-
-			// transform the id by asking the site to map them to real URL inside the SITE
-			if (getSite() != null) {
-				sourceURL = getSite().getSiteContentProvider().getArchivesReferences(archiveIDToInstall[i]);
-				if (monitor != null) {
-					monitor.subTask("..." + archiveIDToInstall[i]);
-				}
-				// the name of the file in the temp directory
-				// should be the regular plugins/pluginID_ver as the Temp site is OUR site
-				newFile = Site.DEFAULT_PLUGIN_PATH + archiveIDToInstall[i];
-				newURL = UpdateManagerUtils.resolveAsLocal(sourceURL, newFile, monitor);
-
-				// transfer the possible mapping to the temp site						
-				 ((Site) tempSite).addArchive(new URLEntry(archiveIDToInstall[i], newURL));
-				if (monitor != null) {
-					monitor.worked(1);
-					if (monitor.isCanceled()) {
-						throw CANCEL_EXCEPTION;
-					}
-				}
-			}
-		}
-
-		// the site of this feature now becomes the TEMP directory
-		// FIXME: make sure there is no other issue
-		// like asking for stuff that hasn't been copied
-		// or reusing this feature
-		// of having an un-manageable temp site
-
-		this.setSite(tempSite);
-
-	}
-
-	/**
-	 */
-	private void downloadDataLocally(IFeature targetFeature, INonPluginEntry[] dataToInstall, IProgressMonitor monitor) throws CoreException, IOException {
-
-		URL sourceURL;
-		// any other data
-		INonPluginEntry[] entries = getNonPluginEntries();
-		if (entries != null) {
-			if (monitor != null) {
-				monitor.beginTask("Installing Other Data information", dataToInstall.length);
-				if (monitor.isCanceled()) {
-					throw CANCEL_EXCEPTION;
-				}
-			}
-
-			for (int j = 0; j < entries.length; j++) {
-				String name = dataToInstall[j].getIdentifier();
-				if (monitor != null) {
-					monitor.subTask("..." + name);
-				}
-
-				// the id is URL format with "/"
-				String dataEntryId = Site.DEFAULT_FEATURE_PATH + getIdentifier().toString() + "/" + name;
-				// transform the id by asking the site to map them to real URL inside the SITE
-				if (getSite() != null) {
-					sourceURL = getSite().getSiteContentProvider().getArchivesReferences(dataEntryId);
-					((Site) targetFeature.getSite()).storeFeatureInfo(getIdentifier(), name, sourceURL.openStream());
-					if (monitor != null) {
-						monitor.worked(1);
-						if (monitor.isCanceled()) {
-							throw CANCEL_EXCEPTION;
-						}
-					}
-				}// getSite==null
-			}
-		}
-	}
-	
-	
-		/**
-		 * Method install.
-		 * @param targetFeature
-		 * @param monitor
-		 * @throws CoreException
-		 */
-	public void old_install(IFeature targetFeature, IProgressMonitor monitor) throws CoreException {
-
-		IPluginEntry[] sourceFeaturePluginEntries = getPluginEntries();
-		IPluginEntry[] targetSitePluginEntries = targetFeature.getSite().getPluginEntries();
-		Site tempSite = (Site) SiteManager.getTempSite();
-
-		// determine list of plugins to install
-		// find the intersection between the two arrays of IPluginEntry...
-		// The one teh site contains and teh one the feature contains
-		IPluginEntry[] pluginsToInstall = intersection(sourceFeaturePluginEntries, targetSitePluginEntries);
-
-		// private abstract - Determine list of content references id /archives id /bundles id that 
-		// map the list of plugins to install
-		String[] archiveIDToInstall = getContentReferenceToInstall(pluginsToInstall);
-
-		try {
-			// download and install data bundles
-			// before we set the site of teh feature to the TEMP site
-			INonPluginEntry[] dataEntries = getNonPluginEntries();
-			if (dataEntries.length > 0) {
-				downloadDataLocally(targetFeature, dataEntries, monitor);
-			}
-
-			// optmization, may be private to implementation
-			// copy *blobs/content references/archives/bundles* in TEMP space
-			if (((Site) getSite()).optimize()) {
-				if (archiveIDToInstall != null) {
-					downloadArchivesLocally(tempSite, archiveIDToInstall, monitor);
-				}
-			}
-
-			// obtain the list of *Streamable Storage Unit*
-			// from the archive
-			if (monitor != null) {
-				int total = pluginsToInstall == null ? 1 : pluginsToInstall.length + 1;
-				monitor.beginTask("Install feature " + getLabel(), total);
-			}
-			if (pluginsToInstall != null) {
-				InputStream inStream = null;
-				for (int i = 0; i < pluginsToInstall.length; i++) {
-					if (monitor != null) {
-						monitor.subTask("Installing plug-in: " + pluginsToInstall[i]);
-						if (monitor.isCanceled()) {
-							throw CANCEL_EXCEPTION;
-						}
-					}
-
-					open(pluginsToInstall[i]);
-					String[] names = getStorageUnitNames(pluginsToInstall[i]);
-					if (names != null) {
-						for (int j = 0; j < names.length; j++) {
-							if ((inStream = getInputStreamFor(pluginsToInstall[i], names[j])) != null)
-								targetFeature.store(pluginsToInstall[i], names[j], inStream);
-						}
-					}
-					close(pluginsToInstall[i]);
-					if (monitor != null) {
-						monitor.worked(1);
-						if (monitor.isCanceled()) {
-							throw CANCEL_EXCEPTION;
-						}
-					}
-
-				}
-			}
-
-			// install the Feature info
-			InputStream inStream = null;
-			String[] names = getStorageUnitNames(this);
-			if (names != null) {
-				openFeature();
-				if (monitor != null) {
-					monitor.subTask("Installing Feature information");
-					if (monitor.isCanceled()) {
-						throw CANCEL_EXCEPTION;
-					}
-				}
-
-				for (int j = 0; j < names.length; j++) {
-					if ((inStream = getInputStreamFor(this, names[j])) != null)
-						 ((Site) targetFeature.getSite()).storeFeatureInfo(getIdentifier(), names[j], inStream);
-				}
-				closeFeature();
-				if (monitor != null) {
-					monitor.worked(1);
-					if (monitor.isCanceled()) {
-						throw CANCEL_EXCEPTION;
-					}
-				}
-
-			}
-
-		} catch (IOException e) {
-			String id = UpdateManagerPlugin.getPlugin().getDescriptor().getUniqueIdentifier();
-			IStatus status = new Status(IStatus.ERROR, id, IStatus.OK, "Error during Install", e);
-			throw new CoreException(status);
-		} finally {
-			//do not clean up TEMP drive
-			// as other feature may be there... clean up when exiting the plugin
-		}
-	}
-	
-	
-		/**
-	 * @see IPluginContainer#store(IPluginEntry, String, InputStream)
-	 */
-	public void store(IPluginEntry pluginEntry, String contentKey, InputStream inStream) throws CoreException {
-		// check if pluginEntry already exists before passing to the site
-		// anything else ?
-		boolean found = false;
-		int i = 0;
-		IPluginEntry[] entries = getPluginEntries();
-		while (i < entries.length && !found) {
-			if (entries[i].equals(pluginEntry)) {
-				found = true;
-			}
-			i++;
-		}
-		if (!found) {
-			String id = UpdateManagerPlugin.getPlugin().getDescriptor().getUniqueIdentifier();
-			IStatus status = new Status(IStatus.ERROR, id, IStatus.OK, "The plugin:" + pluginEntry.getIdentifier().toString() + " is not part of the plugins of the feature:" + this.getIdentifier().toString(), null);
-			throw new CoreException(status);
-		}
-		getSite().store(pluginEntry, contentKey, inStream);
-	}
-	
-		/**
-	 * perform pre processing before opening a plugin archive
-	 * @param entry the plugin about to be opened
-	 */
-	protected void open(IPluginEntry entry) {
-	};
-
-	/**
-	 * perform post processing to close a plugin archive
-	 * @param entry the plugin about to be closed
-	 */
-	protected void close(IPluginEntry entry) throws IOException {
-	};
-
-	/**
-	 * perform pre processing before opening the feature archive
-	 */
-	protected void openFeature() {
-	};
-
-	/**
-	 * perform post processing to close a feature archive
-	 */
-	public void closeFeature() throws IOException {
-	};
-	
-	
-		/**
-	 * return the list of FILE to be transfered for a Plugin
-	 */
-	protected abstract String[] getStorageUnitNames(IPluginEntry pluginEntry) throws CoreException;
-
-	/**
-	 * return the list of FILE to be transfered from within the Feature
-	 */
-	protected abstract String[] getStorageUnitNames(IFeature feature) throws CoreException;
-
-	/**
-	 * return the Stream of the FILE to be transfered for a Plugin
-	 */
-	protected abstract InputStream getInputStreamFor(IPluginEntry pluginEntry, String name) throws CoreException;
-
-	/**
-	 * return the Stream of FILE to be transfered from within the Feature
-	 */
-	protected abstract InputStream getInputStreamFor(IFeature feature, String name) throws IOException, CoreException;
-
-	/**
-	 * returns the list of archive to transfer/install
-	 * in order to install the list of plugins
-	 * 
-	 * @param pluginsToInstall list of plugin to install 
-	 */
-	protected abstract String[] getContentReferenceToInstall(IPluginEntry[] pluginsToInstall);
-	
-	
-		/**
-	 * remove myself...
-	 */
-	public void old_remove(IProgressMonitor monitor) throws CoreException {
-
-		// remove the feature and the plugins if they are not used and not activated
-
-		// get the plugins from the feature
-		IPluginEntry[] pluginsToRemove = ((SiteLocal) SiteManager.getLocalSite()).getDeltaPluginEntries(this);
-
-		try {
-
-			// obtain the list of *Streamable Storage Unit*
-			// from the archive
-			if (monitor != null) {
-				int total = pluginsToRemove == null ? 1 : pluginsToRemove.length + 1;
-				monitor.beginTask("Uninstall feature " + getLabel(), total);
-			}
-			if (pluginsToRemove != null) {
-				for (int i = 0; i < pluginsToRemove.length; i++) {
-					if (monitor != null) {
-						monitor.subTask("Removing plug-in: " + pluginsToRemove[i]);
-						if (monitor.isCanceled()) {
-							throw CANCEL_EXCEPTION;
-						}
-					}
-
-					remove(pluginsToRemove[i]);
-
-					if (monitor != null) {
-						monitor.worked(1);
-						if (monitor.isCanceled()) {
-							throw CANCEL_EXCEPTION;
-						}
-					}
-
-				}
-			}
-
-			// remove the Feature info
-			String[] names = getStorageUnitNames(this);
-			if (names != null) {
-				if (monitor != null) {
-					monitor.subTask("Removing Feature information");
-					if (monitor.isCanceled()) {
-						throw CANCEL_EXCEPTION;
-					}
-				}
-
-				((Site) this.getSite()).removeFeatureInfo(getIdentifier());
-
-				closeFeature();
-				if (monitor != null) {
-					monitor.worked(1);
-					if (monitor.isCanceled()) {
-						throw CANCEL_EXCEPTION;
-					}
-				}
-
-			}
-
-		} catch (IOException e) {
-			String id = UpdateManagerPlugin.getPlugin().getDescriptor().getUniqueIdentifier();
-			IStatus status = new Status(IStatus.ERROR, id, IStatus.OK, "Error during Uninstall", e);
-			throw new CoreException(status);
-		}
-	}
-	
-	System.getProperty("java.io.tmpdir")(java.lang.String) /tmp
-	
-	true^false
-	true^true
-
-	
-org.eclipse.core.runtime.IPath p1= (new org.eclipse.core.runtime.Path("/path1/path2/*.txt"));
-org.eclipse.core.runtime.IPath p2= (new org.eclipse.core.runtime.Path("/path1/path2/a.txt"));
-p1.equals(p2);
-
-
-org.eclipse.update.internal.core.URLEncoder.encode(new java.net.URL("http://www.ourwebsite.com/servlet/update?jar=somefeaturejarfile"));(java.net.URL) http://www.ourwebsite.com/servlet/update?jar=somefeaturejarfile
-
diff --git a/update/org.eclipse.update.core/plugin.properties b/update/org.eclipse.update.core/plugin.properties
index ad909fd..baa2ab4 100644
--- a/update/org.eclipse.update.core/plugin.properties
+++ b/update/org.eclipse.update.core/plugin.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
+# 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
