*** empty log message ***
diff --git a/bundles/org.eclipse.core.boot/src/org/eclipse/core/internal/boot/InternalBootLoader.java b/bundles/org.eclipse.core.boot/src/org/eclipse/core/internal/boot/InternalBootLoader.java
index f807809..73810f4 100644
--- a/bundles/org.eclipse.core.boot/src/org/eclipse/core/internal/boot/InternalBootLoader.java
+++ b/bundles/org.eclipse.core.boot/src/org/eclipse/core/internal/boot/InternalBootLoader.java
@@ -524,13 +524,13 @@
 	// load any debug options

 	loadOptions();

 

-	// load platform configuration and consume configuration-related arguments

-	appArgs = PlatformConfiguration.startup(appArgs, pluginPathLocation/*R1.0 compatibility*/, applicationR10/*R1.0 compatibility*/);

-

 	// initialize eclipse URL handling

 	PlatformURLHandlerFactory.startup(baseLocation + File.separator + META_AREA);

 	PlatformURLBaseConnection.startup(getInstallURL()); // past this point we can use eclipse:/platform/ URLs

 

+	// load platform configuration and consume configuration-related arguments (must call after URL handler initialization)

+	appArgs = PlatformConfiguration.startup(appArgs, pluginPathLocation/*R1.0 compatibility*/, applicationR10/*R1.0 compatibility*/);

+

 	// create and configure platform class loader

 	loader = configurePlatformLoader();

 

diff --git a/bundles/org.eclipse.core.boot/src/org/eclipse/core/internal/boot/PlatformConfiguration.java b/bundles/org.eclipse.core.boot/src/org/eclipse/core/internal/boot/PlatformConfiguration.java
index 6423c6c..a0682f2 100644
--- a/bundles/org.eclipse.core.boot/src/org/eclipse/core/internal/boot/PlatformConfiguration.java
+++ b/bundles/org.eclipse.core.boot/src/org/eclipse/core/internal/boot/PlatformConfiguration.java
@@ -109,7 +109,8 @@
 	

 	public class SiteEntry implements IPlatformConfiguration.ISiteEntry {

 

-		private URL url;

+		private URL url; // this is the external URL for the site

+		private URL resolvedURL; // this is the resolved URL used internally

 		private ISitePolicy policy;

 		private boolean updateable = true;

 		private ArrayList features;

@@ -143,6 +144,13 @@
 			this.parent = parent;

 			this.features = null;

 			this.plugins = null;

+			this.resolvedURL = this.url;

+			if (url.getProtocol().equals(PlatformURLHandler.PROTOCOL)) {

+				try {

+					resolvedURL = ((PlatformURLConnection)url.openConnection()).getResolvedURL();

+				} catch(IOException e) {

+				}

+			}

 		}

 

 		/*

@@ -244,7 +252,7 @@
 			

 			features = new ArrayList();

 				

-			if (!supportsDetection(url))

+			if (!supportsDetection(resolvedURL))

 				return new String[0];

 

 			// locate feature entries on site

@@ -252,7 +260,7 @@
 			if (DEBUG)

 				start = (new Date()).getTime();

 			File root =

-				new File(url.getFile().replace('/', File.separatorChar) + FEATURES);

+				new File(resolvedURL.getFile().replace('/', File.separatorChar) + FEATURES);

 			String[] list = root.list();

 			String path;

 			File plugin;

@@ -266,7 +274,7 @@
 			}

 			if (DEBUG) {

 				long end = (new Date()).getTime();

-				debug(url.toString()+" located  "+features.size()+" feature(s) in "+(end-start)+"ms");

+				debug(resolvedURL.toString()+" located  "+features.size()+" feature(s) in "+(end-start)+"ms");

 			}				

 				

 			return (String[])features.toArray(new String[0]);

@@ -282,7 +290,7 @@
 			

 			plugins = new ArrayList();

 			

-			if (!supportsDetection(url))

+			if (!supportsDetection(resolvedURL))

 				return new String[0];

 								

 			// locate plugin entries on site

@@ -290,7 +298,7 @@
 			if (DEBUG)

 				start = (new Date()).getTime();

 			File root =

-				new File(url.getFile().replace('/', File.separatorChar) + PLUGINS);

+				new File(resolvedURL.getFile().replace('/', File.separatorChar) + PLUGINS);

 			String[] list = root.list();

 			String path;

 			File plugin;

@@ -307,7 +315,7 @@
 			}

 			if (DEBUG) {

 				long end = (new Date()).getTime();

-				debug(url.toString()+" located  "+plugins.size()+" plugin(s) in "+(end-start)+"ms");

+				debug(resolvedURL.toString()+" located  "+plugins.size()+" plugin(s) in "+(end-start)+"ms");

 			}								

 				

 			return (String[])plugins.toArray(new String[0]);

@@ -327,10 +335,14 @@
 				return (String[])plugins.toArray(new String[0]);

 		}

 		

+		private URL getResolvedURL() {

+			return resolvedURL;

+		}

+		

 		private void computeChangeStamp() {

 			computeFeaturesChangeStamp();

 			computePluginsChangeStamp();

-			changeStamp = url.hashCode() ^ featuresChangeStamp ^ pluginsChangeStamp;

+			changeStamp = resolvedURL.hashCode() ^ featuresChangeStamp ^ pluginsChangeStamp;

 			changeStampIsValid = true;

 		}

 		

@@ -342,7 +354,7 @@
 			featuresChangeStamp = computeStamp(features);

 			featuresChangeStampIsValid = true;

 			if (DEBUG) 

-				debug(url.toString()+" feature stamp: "+featuresChangeStamp+((featuresChangeStamp==lastFeaturesChangeStamp)?" [no changes]":" [was "+lastFeaturesChangeStamp+"]"));

+				debug(resolvedURL.toString()+" feature stamp: "+featuresChangeStamp+((featuresChangeStamp==lastFeaturesChangeStamp)?" [no changes]":" [was "+lastFeaturesChangeStamp+"]"));

 		}

 		

 		private void computePluginsChangeStamp() {

@@ -353,13 +365,13 @@
 			pluginsChangeStamp = computeStamp(plugins);

 			pluginsChangeStampIsValid = true;

 			if (DEBUG) 

-				debug(url.toString()+" plugin stamp: "+pluginsChangeStamp+((pluginsChangeStamp==lastPluginsChangeStamp)?" [no changes]":" [was "+lastPluginsChangeStamp+"]"));

+				debug(resolvedURL.toString()+" plugin stamp: "+pluginsChangeStamp+((pluginsChangeStamp==lastPluginsChangeStamp)?" [no changes]":" [was "+lastPluginsChangeStamp+"]"));

 		}

 		

 		private long computeStamp(String[] targets) {

 			

 			long result = 0;

-			if (!supportsDetection(url)) {

+			if (!supportsDetection(resolvedURL)) {

 				// FIXME: this path should not be executed until we support running

 				//        from an arbitrary URL (in particular from http server). For

 				//        now just compute stamp across the list of names. Eventually

@@ -368,10 +380,12 @@
 				//        code executes early on the startup sequence we need to be

 				//        extremely mindful of performance issues.

 				for (int i=0; i<targets.length; i++)

-					result ^= targets[i].hashCode();				

+					result ^= targets[i].hashCode();

+				if (DEBUG)

+					debug("*WARNING* computing stamp using URL hashcodes only");				

 			} else {

 				// compute stamp across local targets		

-				String rootPath = url.getFile().replace('/',File.separatorChar);

+				String rootPath = resolvedURL.getFile().replace('/',File.separatorChar);

 				if (rootPath.endsWith(File.separator))

 					rootPath += File.separator;

 				File rootFile = new File(rootPath);

@@ -750,7 +764,7 @@
 			String[] plugins = sites[i].getPlugins();

 			for (int j=0; j<plugins.length; j++) {

 				try {

-					pathURL = new URL(sites[i].getURL(),plugins[j]);

+					pathURL = new URL(((SiteEntry)sites[i]).getResolvedURL(),plugins[j]);

 					path.add(pathURL);

 					if (DEBUG)

 						debug("   "+pathURL.toString());

@@ -761,7 +775,7 @@
 			}

 			// add fragments entry for each site for 1.0 compatibility

 			try {

-				pathURL = new URL(sites[i].getURL(),"fragments/");

+				pathURL = new URL(((SiteEntry)sites[i]).getResolvedURL(),"fragments/");

 				path.add(pathURL);

 				if (DEBUG)

 					debug("   "+pathURL.toString());

@@ -932,18 +946,7 @@
 		// create current configuration

 		if (currentPlatformConfiguration == null)

 			currentPlatformConfiguration = new PlatformConfiguration(cmdConfiguration);

-		

-		// determine current feature

-		// * -feature

-		// * from configuration

-		//

-		// determine current application

-		// * -application/ r10app

-		// * -feature -> its application

-		// * default from configuration

-		// * eclipse workbench

-		//

-		

+				

 		return passthruArgs;

 	}

 		

@@ -1037,7 +1040,13 @@
 		// for the default case) 

 		

 		ISitePolicy defaultPolicy = createSitePolicy(DEFAULT_POLICY_TYPE, DEFAULT_POLICY_LIST);

-		ISiteEntry defaultSite = createSiteEntry(BootLoader.getInstallURL(), defaultPolicy);

+		URL siteURL = null;

+		try {

+			siteURL = new URL(PlatformURLBaseConnection.PLATFORM_URL_STRING); // try using platform-relative URL

+		} catch (MalformedURLException e) {

+			siteURL = BootLoader.getInstallURL(); // ensure we come up ... use absolute file URL

+		}

+		ISiteEntry defaultSite = createSiteEntry(siteURL, defaultPolicy);

 		configureSite(defaultSite);

 		configLocation = commonURL;

 		if (DEBUG)

@@ -1707,7 +1716,19 @@
 	}

 	

 	private static boolean supportsDetection(URL url) {

-		return url.getProtocol().equals("file");

+		String protocol = url.getProtocol();

+		if (protocol.equals("file"))

+			return true;

+		else if (protocol.equals(PlatformURLHandler.PROTOCOL)) {

+			URL resolved = null;

+			try {

+				resolved = ((PlatformURLConnection)url.openConnection()).getResolvedURL();

+			} catch(IOException e) {

+				return false; // we tried but failed to resolve the platform URL

+			}

+			return resolved.getProtocol().equals("file");

+		} else

+			return false;

 	}

 

 	private static void debug(String s) {