diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/ConfigurationActivator.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/ConfigurationActivator.java
index d693dbd..c16f331 100644
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/ConfigurationActivator.java
+++ b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/ConfigurationActivator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
+ * Copyright (c) 2003, 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
@@ -10,6 +10,8 @@
  *******************************************************************************/
 package org.eclipse.update.internal.configurator;
 
+import org.osgi.framework.InvalidSyntaxException;
+
 import java.io.*;
 import java.net.*;
 import java.util.*;
@@ -32,41 +34,41 @@
 	public static final String NAME_SPACE = "org.eclipse.update"; //$NON-NLS-1$
 	public static final String UPDATE_PREFIX = "update@"; //$NON-NLS-1$
 	private static final String INITIAL_PREFIX = "initial@"; //$NON-NLS-1$
-	
+
 	// debug options
 	public static String OPTION_DEBUG = PI_CONFIGURATOR + "/debug"; //$NON-NLS-1$
 	// debug values
 	public static boolean DEBUG = false;
-	
+
 	private static BundleContext context;
 	private ServiceRegistration configurationFactorySR;
 	private ServiceRegistration bundleGroupProviderSR;
 	private PlatformConfiguration configuration;
-	
+
 	// Location of the configuration data
 	private Location configLocation;
-	
+
 	//Need to store that because it is not provided by the platformConfiguration
 	private long lastTimeStamp;
 
 	// The expected states timestamp
 	private long lastStateTimeStamp;
-	
+
 	// Singleton
 	private static ConfigurationActivator configurator;
 
 	public ConfigurationActivator() {
 		configurator = this;
 	}
-	
+
 	public void start(BundleContext ctx) throws Exception {
 		context = ctx;
 		loadOptions();
 		acquireFrameworkLogService();
 		initialize();
-		
+
 		//Short cut, if the configuration has not changed
-		if (canRunWithCachedData()) {		
+		if (canRunWithCachedData()) {
 			Utils.debug("Running with cached data"); //$NON-NLS-1$
 			registerBundleGroupProvider();
 			return;
@@ -81,24 +83,36 @@
 	}
 
 	private void registerBundleGroupProvider() {
-		bundleGroupProviderSR = getBundleContext().registerService(IBundleGroupProvider.class.getName(), this, null);
+		final String serviceName = IBundleGroupProvider.class.getName();
+		try {
+			//don't register the service if this bundle has already registered it declaratively
+			ServiceReference[] refs = getBundleContext().getServiceReferences(serviceName, null);
+			if (refs != null) {
+				for (int i = 0; i < refs.length; i++)
+					if (PI_CONFIGURATOR.equals(refs[i].getBundle().getSymbolicName()))
+						return;
+			}
+		} catch (InvalidSyntaxException e) {
+			//can't happen because we don't pass a filter
+		}
+		bundleGroupProviderSR = getBundleContext().registerService(serviceName, this, null);
 	}
-	
+
 	private void initialize() throws Exception {
 		// TODO this test is not really needed any more than any plugin has 
 		// to test to see if the runtime is running.  It was there from earlier days
 		// where startup was much more disjoint.  Some day that level of decoupling
 		// will return but for now...
 		if (!Utils.isRunning())
-			throw new Exception(Messages.ConfigurationActivator_initialize); 
-		
+			throw new Exception(Messages.ConfigurationActivator_initialize);
+
 		configLocation = Utils.getConfigurationLocation();
 		// create the name space directory for update (configuration/org.eclipse.update)
 		if (!configLocation.isReadOnly()) {
 			try {
 				URL privateURL = new URL(configLocation.getURL(), NAME_SPACE);
 				File f = new File(privateURL.getFile());
-				if(!f.exists())
+				if (!f.exists())
 					f.mkdirs();
 			} catch (MalformedURLException e1) {
 				// ignore
@@ -107,11 +121,11 @@
 		configurationFactorySR = context.registerService(IPlatformConfigurationFactory.class.getName(), new PlatformConfigurationFactory(), null);
 		configuration = getPlatformConfiguration(Utils.getInstallURL(), configLocation);
 		if (configuration == null)
-			throw Utils.newCoreException(NLS.bind(Messages.ConfigurationActivator_createConfig, (new String[] { configLocation.getURL().toExternalForm() })), null);
+			throw Utils.newCoreException(NLS.bind(Messages.ConfigurationActivator_createConfig, (new String[] {configLocation.getURL().toExternalForm()})), null);
 
 		DataInputStream stream = null;
 		try {
-			stream = new DataInputStream(new URL(configLocation.getURL(),NAME_SPACE+'/'+LAST_CONFIG_STAMP).openStream());
+			stream = new DataInputStream(new URL(configLocation.getURL(), NAME_SPACE + '/' + LAST_CONFIG_STAMP).openStream());
 			lastTimeStamp = stream.readLong();
 			lastStateTimeStamp = stream.readLong();
 		} catch (Exception e) {
@@ -127,7 +141,6 @@
 		}
 	}
 
-
 	public void stop(BundleContext ctx) throws Exception {
 		// quick fix (hack) for bug 47861
 		try {
@@ -156,32 +169,32 @@
 		}
 		if (startLevel < 1)
 			startLevel = 4;
-		
+
 		StartLevel start = null;
 		if (reference != null)
 			start = (StartLevel) context.getService(reference);
 		try {
 			// Get the list of cached bundles and compare with the ones to be installed.
 			// Uninstall all the cached bundles that do not appear on the new list
-			Bundle[] cachedBundles = context.getBundles();		
+			Bundle[] cachedBundles = context.getBundles();
 			URL[] plugins = configuration.getPluginPath();
-				
+
 			// starts the list of bundles to refresh with all currently unresolved bundles (see bug 50680)
 			List toRefresh = getUnresolvedBundles();
 
 			Bundle[] bundlesToUninstall = getBundlesToUninstall(cachedBundles, plugins);
-			for (int i=0; i<bundlesToUninstall.length; i++) {
+			for (int i = 0; i < bundlesToUninstall.length; i++) {
 				try {
 					if (DEBUG)
 						Utils.debug("Uninstalling " + bundlesToUninstall[i].getLocation()); //$NON-NLS-1$
 					// include every bundle being uninstalled in the list of bundles to refresh (see bug 82393)					
-					toRefresh.add(bundlesToUninstall[i]);					
+					toRefresh.add(bundlesToUninstall[i]);
 					bundlesToUninstall[i].uninstall();
 				} catch (Exception e) {
-					Utils.log(NLS.bind(Messages.ConfigurationActivator_uninstallBundle, (new String[] { bundlesToUninstall[i].getLocation() })));
+					Utils.log(NLS.bind(Messages.ConfigurationActivator_uninstallBundle, (new String[] {bundlesToUninstall[i].getLocation()})));
 				}
 			}
-			
+
 			// Get the urls to install
 			String[] bundlesToInstall = getBundlesToInstall(cachedBundles, plugins);
 			ArrayList lazyActivationBundles = new ArrayList(bundlesToInstall.length);
@@ -189,9 +202,9 @@
 				try {
 					if (DEBUG)
 						Utils.debug("Installing " + bundlesToInstall[i]); //$NON-NLS-1$
-					URL bundleURL = new URL("reference:file:"+bundlesToInstall[i]); //$NON-NLS-1$
+					URL bundleURL = new URL("reference:file:" + bundlesToInstall[i]); //$NON-NLS-1$
 					//Bundle target = context.installBundle(bundlesToInstall[i]);
-					Bundle target = context.installBundle(UPDATE_PREFIX+bundlesToInstall[i], bundleURL.openStream());
+					Bundle target = context.installBundle(UPDATE_PREFIX + bundlesToInstall[i], bundleURL.openStream());
 					// any new bundle should be refreshed as well
 					toRefresh.add(target);
 					if (start != null)
@@ -201,7 +214,7 @@
 						lazyActivationBundles.add(target);
 				} catch (Exception e) {
 					if (!Utils.isAutomaticallyStartedBundle(bundlesToInstall[i]))
-						Utils.log(NLS.bind(Messages.ConfigurationActivator_installBundle, (new String[] { bundlesToInstall[i] })) + "   " + e.getMessage()); //$NON-NLS-1$
+						Utils.log(NLS.bind(Messages.ConfigurationActivator_installBundle, (new String[] {bundlesToInstall[i]})) + "   " + e.getMessage()); //$NON-NLS-1$
 				}
 			}
 			context.ungetService(reference);
@@ -216,7 +229,7 @@
 				} catch (BundleException e) {
 					if ((toActivate.getState() & Bundle.RESOLVED) != 0)
 						// only log errors if the bundle is resolved
-						Utils.log(NLS.bind(Messages.ConfigurationActivator_installBundle, (new String[] { toActivate.getLocation() })) + "   " + e.getMessage()); //$NON-NLS-1$
+						Utils.log(NLS.bind(Messages.ConfigurationActivator_installBundle, (new String[] {toActivate.getLocation()})) + "   " + e.getMessage()); //$NON-NLS-1$
 				}
 			}
 			// keep track of the last config successfully processed
@@ -224,7 +237,7 @@
 			return true;
 		} catch (Exception e) {
 			return false;
-		} 
+		}
 	}
 
 	private static boolean hasLazyActivationPolicy(Bundle target) {
@@ -268,10 +281,10 @@
 	private void removeInitialBundles(List bundles, Bundle[] cachedBundles) {
 		String[] initialSymbolicNames = getInitialSymbolicNames(cachedBundles);
 		Iterator iter = bundles.iterator();
-		while(iter.hasNext()) {
+		while (iter.hasNext()) {
 			Bundle bundle = (Bundle) iter.next();
 			String symbolicName = bundle.getSymbolicName();
-			for(int i = 0; i < initialSymbolicNames.length; i++) {
+			for (int i = 0; i < initialSymbolicNames.length; i++) {
 				if (initialSymbolicNames[i].equals(symbolicName)) {
 					iter.remove();
 					break;
@@ -295,7 +308,7 @@
 
 	private List getUnresolvedBundles() {
 		Bundle[] allBundles = context.getBundles();
-		List unresolved = new ArrayList(); 
+		List unresolved = new ArrayList();
 		for (int i = 0; i < allBundles.length; i++)
 			if (allBundles[i].getState() == Bundle.INSTALLED)
 				unresolved.add(allBundles[i]);
@@ -306,21 +319,21 @@
 		// First, create a map of the cached bundles, for faster lookup
 		HashSet cachedBundlesSet = new HashSet(cachedBundles.length);
 		int offset = UPDATE_PREFIX.length();
-		for (int i=0; i<cachedBundles.length; i++) {
+		for (int i = 0; i < cachedBundles.length; i++) {
 			if (cachedBundles[i].getBundleId() == 0)
 				continue; // skip the system bundle
 			String bundleLocation = cachedBundles[i].getLocation();
 			// Ignore bundles not installed by us
 			if (!bundleLocation.startsWith(UPDATE_PREFIX))
 				continue;
-			
+
 			bundleLocation = bundleLocation.substring(offset);
 			cachedBundlesSet.add(bundleLocation);
 			// On windows, we will be doing case insensitive search as well, so lower it now
 			if (Utils.isWindows)
 				cachedBundlesSet.add(bundleLocation.toLowerCase());
 		}
-		
+
 		ArrayList bundlesToInstall = new ArrayList(newPlugins.length);
 		for (int i = 0; i < newPlugins.length; i++) {
 			String location = Utils.makeRelative(Utils.getInstallURL(), newPlugins[i]).getFile();
@@ -329,28 +342,27 @@
 				continue;
 			if (Utils.isWindows && cachedBundlesSet.contains(location.toLowerCase()))
 				continue;
-			
+
 			bundlesToInstall.add(location);
 		}
-		return (String[])bundlesToInstall.toArray(new String[bundlesToInstall.size()]);	
+		return (String[]) bundlesToInstall.toArray(new String[bundlesToInstall.size()]);
 	}
-	
-	
+
 	private Bundle[] getBundlesToUninstall(Bundle[] cachedBundles, URL[] newPlugins) {
 		// First, create a map for faster lookups
 		HashSet newPluginsSet = new HashSet(newPlugins.length);
-		for (int i=0; i<newPlugins.length; i++) {
-			
+		for (int i = 0; i < newPlugins.length; i++) {
+
 			String pluginLocation = Utils.makeRelative(Utils.getInstallURL(), newPlugins[i]).getFile();
 			newPluginsSet.add(pluginLocation);
 			// On windows, we will be doing case insensitive search as well, so lower it now
 			if (Utils.isWindows)
 				newPluginsSet.add(pluginLocation.toLowerCase());
 		}
-		
+
 		ArrayList bundlesToUninstall = new ArrayList();
 		int offset = UPDATE_PREFIX.length();
-		for (int i=0; i<cachedBundles.length; i++) {
+		for (int i = 0; i < cachedBundles.length; i++) {
 			if (cachedBundles[i].getBundleId() == 0)
 				continue; // skip the system bundle
 			String cachedBundleLocation = cachedBundles[i].getLocation();
@@ -363,12 +375,11 @@
 				continue;
 			if (Utils.isWindows && newPluginsSet.contains(cachedBundleLocation.toLowerCase()))
 				continue;
-			
+
 			bundlesToUninstall.add(cachedBundles[i]);
 		}
-		return (Bundle[])bundlesToUninstall.toArray(new Bundle[bundlesToUninstall.size()]);
+		return (Bundle[]) bundlesToUninstall.toArray(new Bundle[bundlesToUninstall.size()]);
 	}
-	
 
 	/**
 	 * Creates and starts the platform configuration.
@@ -429,17 +440,17 @@
 		context.removeFrameworkListener(listener);
 		context.ungetService(packageAdminRef);
 	}
-	
+
 	private void writePlatformConfigurationTimeStamp() {
 		DataOutputStream stream = null;
 		try {
 			if (configLocation.isReadOnly())
 				return;
-			
+
 			String configArea = configLocation.getURL().getFile();
 			lastTimeStamp = configuration.getChangeStamp();
 			lastStateTimeStamp = Utils.getStateStamp();
-			stream = new DataOutputStream(new FileOutputStream(configArea +File.separator+ NAME_SPACE+ File.separator+ LAST_CONFIG_STAMP));
+			stream = new DataOutputStream(new FileOutputStream(configArea + File.separator + NAME_SPACE + File.separator + LAST_CONFIG_STAMP));
 			stream.writeLong(lastTimeStamp);
 			stream.writeLong(lastStateTimeStamp);
 		} catch (Exception e) {
@@ -469,49 +480,47 @@
 			context.ungetService(reference);
 		}
 	}
-	
+
 	private boolean canRunWithCachedData() {
-		return  !"true".equals(context.getProperty("osgi.checkConfiguration")) && //$NON-NLS-1$ //$NON-NLS-2$
-				lastTimeStamp==configuration.getChangeStamp() &&
-				lastStateTimeStamp==Utils.getStateStamp();
+		return !"true".equals(context.getProperty("osgi.checkConfiguration")) && //$NON-NLS-1$ //$NON-NLS-2$
+				lastTimeStamp == configuration.getChangeStamp() && lastStateTimeStamp == Utils.getStateStamp();
 	}
-				
+
 	public static BundleContext getBundleContext() {
 		return context;
 	}
-		
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.core.runtime.IBundleGroupProvider#getName()
 	 */
 	public String getName() {
-		return Messages.BundleGroupProvider; 
+		return Messages.BundleGroupProvider;
 	}
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.core.runtime.IBundleGroupProvider#getBundleGroups()
 	 */
 	public IBundleGroup[] getBundleGroups() {
 		if (configuration == null)
 			return new IBundleGroup[0];
-		
+
 		IPlatformConfiguration.IFeatureEntry[] features = configuration.getConfiguredFeatureEntries();
 		ArrayList bundleGroups = new ArrayList(features.length);
-		for (int i=0; i<features.length; i++) {
-			if (features[i] instanceof FeatureEntry 
-				&& ((FeatureEntry)features[i]).hasBranding())
+		for (int i = 0; i < features.length; i++) {
+			if (features[i] instanceof FeatureEntry && ((FeatureEntry) features[i]).hasBranding())
 				bundleGroups.add(features[i]);
 		}
-		return (IBundleGroup[])bundleGroups.toArray(new IBundleGroup[bundleGroups.size()]);
+		return (IBundleGroup[]) bundleGroups.toArray(new IBundleGroup[bundleGroups.size()]);
 	}
 
 	public static ConfigurationActivator getConfigurator() {
 		return configurator;
 	}
-	
-	private void acquireFrameworkLogService() throws Exception{
+
+	private void acquireFrameworkLogService() throws Exception {
 		ServiceReference logServiceReference = context.getServiceReference(FrameworkLog.class.getName());
 		if (logServiceReference == null)
 			return;
-		Utils.log  = (FrameworkLog) context.getService(logServiceReference);
+		Utils.log = (FrameworkLog) context.getService(logServiceReference);
 	}
-}	
-
+}
