Initial work for the ct tests
diff --git a/gemini.management.releng/.project b/gemini.management.releng/.project
index 74f243e..37ff578 100644
--- a/gemini.management.releng/.project
+++ b/gemini.management.releng/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>gemini.mgmt.releng</name>
+	<name>gemini.management.releng</name>
 	<comment></comment>
 	<projects>
 	</projects>
diff --git a/gemini.management.releng/pom.xml b/gemini.management.releng/pom.xml
index 634a687..f62b2c7 100644
--- a/gemini.management.releng/pom.xml
+++ b/gemini.management.releng/pom.xml
@@ -4,7 +4,7 @@
 
 	<groupId>org.eclipse.gemini.management</groupId>
 	<artifactId>org.eclipse.gemini.management_parent</artifactId>
-	<version>2.0.0-SNAPSHOT</version>
+	<version>2.0.0.RELEASE</version>
 	<packaging>pom</packaging>
 	<name>Gemini Management Parent POM</name>
 
@@ -37,7 +37,7 @@
 						<artifact>
 							<groupId>org.eclipse.gemini.management</groupId>
 							<artifactId>target-platform</artifactId>
-							<version>2.0.0-SNAPSHOT</version>
+							<version>2.0.0.RELEASE</version>
 							<classifier>gemini-management</classifier>
 						</artifact>
 					</target>
diff --git a/gemini.management.repository/.project b/gemini.management.repository/.project
index 3697839..20ce796 100644
--- a/gemini.management.repository/.project
+++ b/gemini.management.repository/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>gemini.mgmt.repository</name>
+	<name>gemini.management.repository</name>
 	<comment></comment>
 	<projects>
 	</projects>
diff --git a/gemini.management.repository/pom.xml b/gemini.management.repository/pom.xml
index a5e24b7..35ff953 100644
--- a/gemini.management.repository/pom.xml
+++ b/gemini.management.repository/pom.xml
@@ -5,7 +5,7 @@
 	<parent>
 		<groupId>org.eclipse.gemini.management</groupId>
 		<artifactId>org.eclipse.gemini.management_parent</artifactId>
-		<version>2.0.0-SNAPSHOT</version>
+		<version>2.0.0.RELEASE</version>
 		<relativePath>../gemini.management.releng/pom.xml</relativePath>
 	</parent>
 
@@ -14,8 +14,8 @@
 	<name>Gemini Management Update Site</name>
 
 	<properties>
-		<site-folder-name>nightly</site-folder-name>
-		<zip-folder-name>nightly-zips</zip-folder-name>
+		<site-folder-name>release</site-folder-name>
+		<zip-folder-name>release-zips</zip-folder-name>
 	</properties>
 
 	<build>
diff --git a/gemini.management.repository/site.xml b/gemini.management.repository/site.xml
index 9681d8e..628d367 100644
--- a/gemini.management.repository/site.xml
+++ b/gemini.management.repository/site.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <site>
-   <feature url="features/org.eclipse.gemini.management.feature_0.0.0.jar" id="org.eclipse.gemini.management.feature" version="0.0.0">
+   <feature url="features/org.eclipse.gemini.management.feature_2.0.0.RELEASE.jar" id="org.eclipse.gemini.management.feature" version="2.0.0.RELEASE">
       <category name="gemini.management"/>
    </feature>
    <category-def name="gemini.management" label="Gemini Management"/>
diff --git a/org.eclipse.gemini.management.feature/.project b/org.eclipse.gemini.management.feature/.project
index a0225b8..42be35c 100644
--- a/org.eclipse.gemini.management.feature/.project
+++ b/org.eclipse.gemini.management.feature/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>org.eclipse.gemini.mgmt.feature</name>
+	<name>org.eclipse.gemini.management.feature</name>
 	<comment></comment>
 	<projects>
 	</projects>
diff --git a/org.eclipse.gemini.management.feature/feature.xml b/org.eclipse.gemini.management.feature/feature.xml
index aa9799b..866e6c7 100644
--- a/org.eclipse.gemini.management.feature/feature.xml
+++ b/org.eclipse.gemini.management.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.gemini.management.feature"
       label="Feature"
-      version="2.0.0.qualifier">
+      version="2.0.0.RELEASE">
 
    <description url="http://www.example.com/description">
       [Enter Feature Description here.]
diff --git a/org.eclipse.gemini.management.feature/pom.xml b/org.eclipse.gemini.management.feature/pom.xml
index 00a0788..b0675e3 100644
--- a/org.eclipse.gemini.management.feature/pom.xml
+++ b/org.eclipse.gemini.management.feature/pom.xml
@@ -5,7 +5,7 @@
 	<parent>
 		<groupId>org.eclipse.gemini.management</groupId>
 		<artifactId>org.eclipse.gemini.management_parent</artifactId>
-		<version>2.0.0-SNAPSHOT</version>
+		<version>2.0.0.RELEASE</version>
 		<relativePath>../gemini.management.releng/pom.xml</relativePath>
 	</parent>
 	
diff --git a/org.eclipse.gemini.management.target/pom.xml b/org.eclipse.gemini.management.target/pom.xml
index 545f29f..2306022 100755
--- a/org.eclipse.gemini.management.target/pom.xml
+++ b/org.eclipse.gemini.management.target/pom.xml
@@ -6,7 +6,7 @@
 	<parent>
 		<groupId>org.eclipse.gemini.management</groupId>
 		<artifactId>org.eclipse.gemini.management_parent</artifactId>
-		<version>2.0.0-SNAPSHOT</version>
+		<version>2.0.0.RELEASE</version>
 		<relativePath>../gemini.management.releng/pom.xml</relativePath>
 	</parent>
 
diff --git a/org.eclipse.gemini.management.tests/.project b/org.eclipse.gemini.management.tests/.project
index e4ddbc0..691ae49 100644
--- a/org.eclipse.gemini.management.tests/.project
+++ b/org.eclipse.gemini.management.tests/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>

 <projectDescription>

-	<name>org.eclipse.gemini.mgmt.tests</name>

+	<name>org.eclipse.gemini.management.tests</name>

 	<comment></comment>

 	<projects>

 	</projects>

diff --git a/org.eclipse.gemini.management.tests/META-INF/MANIFEST.MF b/org.eclipse.gemini.management.tests/META-INF/MANIFEST.MF
index b744cfe..1b353af 100644
--- a/org.eclipse.gemini.management.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.gemini.management.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: Gemini Management Tests
 Bundle-SymbolicName: org.eclipse.gemini.management.tests
-Bundle-Version: 2.0.0.qualifier
+Bundle-Version: 2.0.0.RELEASE
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Import-Package: javax.management,
  javax.management.remote,
diff --git a/org.eclipse.gemini.management.tests/pom.xml b/org.eclipse.gemini.management.tests/pom.xml
index 734fe39..5ba6210 100644
--- a/org.eclipse.gemini.management.tests/pom.xml
+++ b/org.eclipse.gemini.management.tests/pom.xml
@@ -5,7 +5,7 @@
 	<parent>
 		<groupId>org.eclipse.gemini.management</groupId>
 		<artifactId>org.eclipse.gemini.management_parent</artifactId>
-		<version>2.0.0-SNAPSHOT</version>
+		<version>2.0.0.RELEASE</version>
 		<relativePath>../gemini.management.releng/pom.xml</relativePath>
 	</parent>
 
diff --git a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/AbstractOSGiMBeanTest.java b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/AbstractOSGiMBeanTest.java
index 71ea963..365d245 100644
--- a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/AbstractOSGiMBeanTest.java
+++ b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/AbstractOSGiMBeanTest.java
@@ -22,16 +22,22 @@
 import org.eclipse.gemini.management.Activator;
 import org.junit.BeforeClass;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
 import org.osgi.framework.FrameworkUtil;
 import org.osgi.framework.ServiceReference;
 
-public class AbstractOSGiMBeanTest {
+public abstract class AbstractOSGiMBeanTest {
+
+	private static BundleContext bc;
 
 	protected String mBeanObjectName;
 	
+	protected boolean addFrameworkAndUUID = false;
+	
 	@BeforeClass
 	public static void setup(){
 		BundleContext bc = FrameworkUtil.getBundle(Activator.class).getBundleContext();
+		AbstractOSGiMBeanTest.bc = bc;
 		ServiceReference<MBeanServer> ref = bc.getServiceReference(MBeanServer.class);
 		if (ref == null) {
 			bc.registerService(MBeanServer.class.getCanonicalName(), ManagementFactory.getPlatformMBeanServer(), null);
@@ -44,7 +50,7 @@
 		JMXServiceURL jmxURL = new JMXServiceURL(url);
 		connector = JMXConnectorFactory.connect(jmxURL);
 		MBeanServerConnection connection = connector.getMBeanServerConnection();
-		ObjectName name = new ObjectName(mBeanObjectName);
+		ObjectName name = new ObjectName(getMBeanObjectName());
 		Object result = connection.invoke(name, operation, arguments, types);
 		return returnType.cast(result);
 	}
@@ -55,9 +61,19 @@
 		JMXServiceURL jmxURL = new JMXServiceURL(url);
 		connector = JMXConnectorFactory.connect(jmxURL);
 		MBeanServerConnection connection = connector.getMBeanServerConnection();
-		ObjectName name = new ObjectName(mBeanObjectName);
+		ObjectName name = new ObjectName(getMBeanObjectName());
 		Object result = connection.getAttribute(name, attribute);
 		return returnType.cast(result);
 	}
 	
+	private String getMBeanObjectName(){
+		String newObjectName = this.mBeanObjectName;
+		if(this.addFrameworkAndUUID){
+			newObjectName = newObjectName + 
+					",framework=" + AbstractOSGiMBeanTest.bc.getBundle(0).getSymbolicName() + 
+					",uuid=" + AbstractOSGiMBeanTest.bc.getBundle(0).getBundleContext().getProperty(Constants.FRAMEWORK_UUID);
+		}
+		return newObjectName;
+	}
+	
 }
diff --git a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/BundleStateTest.java b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/BundleStateTest.java
index 02a1aed..6401248 100644
--- a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/BundleStateTest.java
+++ b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/BundleStateTest.java
@@ -77,6 +77,7 @@
 	

 	public BundleStateTest() {

 		super.mBeanObjectName = BundleStateMBean.OBJECTNAME;

+		super.addFrameworkAndUUID = true;

 	}

 	

 	@Before

@@ -244,13 +245,13 @@
 

     private Long[] getRequiredBundles(Bundle bundle) {

         BundleWiring wiring = bundle.adapt(BundleWiring.class);

-        List<BundleWire> requiredWires = wiring.getRequiredWires(BundleRevision.BUNDLE_NAMESPACE);

+        List<BundleWire> requiredWires = wiring.getRequiredWires(null);//BundleRevision.BUNDLE_NAMESPACE);

         return bundleWiresToProviderIds(requiredWires);

     }

 

     private Long[] getRequiringBundles(Bundle bundle) {

         BundleWiring wiring = bundle.adapt(BundleWiring.class);

-        List<BundleWire> providedWires = wiring.getProvidedWires(BundleRevision.BUNDLE_NAMESPACE);

+        List<BundleWire> providedWires = wiring.getProvidedWires(null);//BundleRevision.BUNDLE_NAMESPACE);

         return bundleWiresToRequirerIds(providedWires);

     }

 

diff --git a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/BundleWiringStateTest.java b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/BundleWiringStateTest.java
index 82537ef..e51a505 100644
--- a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/BundleWiringStateTest.java
+++ b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/BundleWiringStateTest.java
@@ -47,6 +47,7 @@
 
 	public BundleWiringStateTest() {
 		super.mBeanObjectName = BundleWiringStateMBean.OBJECTNAME;
+		super.addFrameworkAndUUID = true;
 	}
 	
 	@Before
diff --git a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/FrameworkTest.java b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/FrameworkTest.java
index bfb21e7..02d6f40 100644
--- a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/FrameworkTest.java
+++ b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/FrameworkTest.java
@@ -24,6 +24,7 @@
 	
 	public FrameworkTest() {
 		super.mBeanObjectName = FrameworkMBean.OBJECTNAME;
+		super.addFrameworkAndUUID = true;
 	}
 	
 	@Test
diff --git a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/ServiceStateTest.java b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/ServiceStateTest.java
index e0683b8..26ca58b 100644
--- a/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/ServiceStateTest.java
+++ b/org.eclipse.gemini.management.tests/src/org/eclipse/gemini/management/integration/tests/ServiceStateTest.java
@@ -45,6 +45,7 @@
 	
 	public ServiceStateTest() {
 		super.mBeanObjectName = ServiceStateMBean.OBJECTNAME;
+		super.addFrameworkAndUUID = true;
 	}
 	
 	@Before
diff --git a/org.eclipse.gemini.management/.project b/org.eclipse.gemini.management/.project
index 4375a9f..bd4183e 100644
--- a/org.eclipse.gemini.management/.project
+++ b/org.eclipse.gemini.management/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>

 <projectDescription>

-	<name>org.eclipse.gemini.mgmt</name>

+	<name>org.eclipse.gemini.management</name>

 	<comment></comment>

 	<projects>

 	</projects>

diff --git a/org.eclipse.gemini.management/META-INF/MANIFEST.MF b/org.eclipse.gemini.management/META-INF/MANIFEST.MF
index b7239d2..edac088 100644
--- a/org.eclipse.gemini.management/META-INF/MANIFEST.MF
+++ b/org.eclipse.gemini.management/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: Gemini Management
 Bundle-SymbolicName: org.eclipse.gemini.management
-Bundle-Version: 2.0.0.qualifier
+Bundle-Version: 2.0.0.RELEASE
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-Activator: org.eclipse.gemini.management.Activator
 Import-Package: javax.management,
diff --git a/org.eclipse.gemini.management/pom.xml b/org.eclipse.gemini.management/pom.xml
index f5479ca..72de671 100644
--- a/org.eclipse.gemini.management/pom.xml
+++ b/org.eclipse.gemini.management/pom.xml
@@ -5,7 +5,7 @@
 	<parent>
 		<groupId>org.eclipse.gemini.management</groupId>
 		<artifactId>org.eclipse.gemini.management_parent</artifactId>
-		<version>2.0.0-SNAPSHOT</version>
+		<version>2.0.0.RELEASE</version>
 		<relativePath>../gemini.management.releng/pom.xml</relativePath>
 	</parent>
 
diff --git a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/Activator.java b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/Activator.java
index b58762d..a5b8588 100644
--- a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/Activator.java
+++ b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/Activator.java
@@ -16,7 +16,6 @@
 package org.eclipse.gemini.management;

 

 import java.lang.management.ManagementFactory;

-import java.util.Hashtable;

 import java.util.List;

 import java.util.concurrent.CopyOnWriteArrayList;

 import java.util.concurrent.atomic.AtomicBoolean;

@@ -43,6 +42,7 @@
 import org.osgi.framework.Bundle;

 import org.osgi.framework.BundleActivator;

 import org.osgi.framework.BundleContext;

+import org.osgi.framework.Constants;

 import org.osgi.framework.ServiceReference;

 import org.osgi.jmx.framework.BundleStateMBean;

 import org.osgi.jmx.framework.FrameworkMBean;

@@ -69,12 +69,20 @@
 public class Activator implements BundleActivator {

 

 	private static final String REGION_KEY = "region";

+

+	private static final String FRAMEWORK_KEY = "framework";

+

+	private static final String UUID_KEY = "uuid";

 	

 	private static final String REGION_SUPPORT = "org.eclipse.gemini.management.region.support";

 		

 	private final List<MBeanServer> mbeanServers = new CopyOnWriteArrayList<MBeanServer>();

 	

 	private final AtomicBoolean servicesRegistered = new AtomicBoolean(false);

+	

+	private final Object myLock = new Object();

+	

+	private final AtomicBoolean shuttingdown = new AtomicBoolean(false);

 		

 	private ObjectName frameworkName;

 	

@@ -136,15 +144,15 @@
 

 	private void createObjectNames() {

 		try {

-			frameworkName = translateObjectName(FrameworkMBean.OBJECTNAME);

-			bundleStateName = translateObjectName(BundleStateMBean.OBJECTNAME);

-			bundleWiringStateName = translateObjectName(BundleWiringStateMBean.OBJECTNAME);

-			serviceStateName = translateObjectName(CustomServiceStateMBean.OBJECTNAME);

-			packageStateName = translateObjectName(PackageStateMBean.OBJECTNAME);

-			configAdminName = translateObjectName(ConfigurationAdminMBean.OBJECTNAME);

-			permissionAdminName = translateObjectName(PermissionAdminMBean.OBJECTNAME);

-			provisioningServiceName = translateObjectName(ProvisioningServiceMBean.OBJECTNAME);

-			userAdminName = translateObjectName(UserAdminMBean.OBJECTNAME);		

+			frameworkName = translateObjectName(FrameworkMBean.OBJECTNAME, true);

+			bundleStateName = translateObjectName(BundleStateMBean.OBJECTNAME, true);

+			bundleWiringStateName = translateObjectName(BundleWiringStateMBean.OBJECTNAME, true);

+			serviceStateName = translateObjectName(CustomServiceStateMBean.OBJECTNAME, true);

+			packageStateName = translateObjectName(PackageStateMBean.OBJECTNAME, false);

+			configAdminName = translateObjectName(ConfigurationAdminMBean.OBJECTNAME, false);

+			permissionAdminName = translateObjectName(PermissionAdminMBean.OBJECTNAME, false);

+			provisioningServiceName = translateObjectName(ProvisioningServiceMBean.OBJECTNAME, false);

+			userAdminName = translateObjectName(UserAdminMBean.OBJECTNAME, false);

 		} catch (Exception e) {

 			throw new IllegalStateException("Unable to start Gemini Management, Object name creation failed.", e);

 		}

@@ -154,6 +162,7 @@
 	 * {@inheritDoc}

 	 */

 	public void start(BundleContext bundleContext) throws Exception {

+		this.bundleContext = bundleContext;

 		logServiceTracker = new ServiceTracker<LogService, Object>(bundleContext, LogService.class, new LogServiceTracker());

 		logServiceTracker.open();        

 		String regionSupportProperty = bundleContext.getProperty(REGION_SUPPORT);

@@ -165,26 +174,22 @@
 			this.regionName = null;

 		}

         createObjectNames();

-		this.bundleContext = bundleContext;

 		registerDefaultMBeanServer();

 		this.mbeanServiceTracker = new ServiceTracker<MBeanServer, Object>(this.bundleContext, MBeanServer.class, new MBeanServiceTracker());

 		log(LogService.LOG_INFO, "Awaiting initial MBeanServer service registration");

 		this.mbeanServiceTracker.open();

 	}

 	

-    private ObjectName translateObjectName(String objectName) throws MalformedObjectNameException {

-    	ObjectName originalName = new ObjectName(objectName);

-    	if(this.regionName != null){

-    		Hashtable<String, String> keyPropertyList = originalName.getKeyPropertyList();

-    		keyPropertyList.put(REGION_KEY, regionName);

-    		try {

-    			return new ObjectName(originalName.getDomain(), keyPropertyList);

-    		} catch (Exception e) {

-    			throw new RuntimeException("Error modifying ObjectName for '" + originalName.getCanonicalName() + "'", e);

-    		}

-    	}else{

-    		return originalName;

+    private ObjectName translateObjectName(String objectName, boolean addFrameworkAndUUID) throws MalformedObjectNameException {

+    	StringBuilder builder = new StringBuilder(objectName);

+    	if(addFrameworkAndUUID){

+    		builder.append("," + FRAMEWORK_KEY + "=" + this.bundleContext.getBundle(0).getSymbolicName());

+    		builder.append("," + UUID_KEY + "=" + this.bundleContext.getBundle(0).getBundleContext().getProperty(Constants.FRAMEWORK_UUID));

     	}

+    	if(this.regionName != null){

+    		builder.append("," + REGION_KEY + "=" + regionName);

+    	}

+    	return new ObjectName(builder.toString());

     }

     

     private void registerDefaultMBeanServer () {

@@ -203,9 +208,12 @@
 	 * {@inheritDoc}

 	 */

 	public void stop(BundleContext arg0) throws Exception {

+		this.shuttingdown.set(true);

 		mbeanServiceTracker.close();

-		for (MBeanServer mbeanServer : mbeanServers) {

-			deregisterServices(mbeanServer);

+		synchronized (myLock) {

+			for (MBeanServer mbeanServer : mbeanServers) {

+				deregisterServices(mbeanServer);

+			}

 		}

 		mbeanServers.clear();

 		logServiceTracker.close();

@@ -222,7 +230,9 @@
 		}

 		log(LogService.LOG_INFO, "Deregistering framework with MBeanServer: " + mbeanServer);

 		try {

-			mbeanServer.unregisterMBean(frameworkName);

+			if(mbeanServer.isRegistered(frameworkName)){

+				mbeanServer.unregisterMBean(frameworkName);

+			}

 		} catch (InstanceNotFoundException e) {

 			log(LogService.LOG_INFO, "FrameworkMBean not found on deregistration", e);

 		} catch (MBeanRegistrationException e) {

@@ -232,7 +242,9 @@
 

 		log(LogService.LOG_INFO, "Deregistering bundle state with MBeanServer: " + mbeanServer);

 		try {

-			mbeanServer.unregisterMBean(bundleStateName);

+			if(mbeanServer.isRegistered(bundleStateName)){

+				mbeanServer.unregisterMBean(bundleStateName);

+			}

 		} catch (InstanceNotFoundException e) {

 			log(LogService.LOG_INFO, "OSGi BundleStateMBean not found on deregistration", e);

 		} catch (MBeanRegistrationException e) {

@@ -242,7 +254,9 @@
 

 		log(LogService.LOG_INFO, "Deregistering bundle wiring state with MBeanServer: " + mbeanServer);

 		try {

-			mbeanServer.unregisterMBean(bundleWiringStateName);

+			if(mbeanServer.isRegistered(bundleWiringStateName)){

+				mbeanServer.unregisterMBean(bundleWiringStateName);

+			}

 		} catch (InstanceNotFoundException e) {

 			log(LogService.LOG_DEBUG, "OSGi BundleWiringStateMBean not found on deregistration", e);

 		} catch (MBeanRegistrationException e) {

@@ -252,7 +266,9 @@
 		

 		log(LogService.LOG_INFO, "Deregistering services monitor with MBeanServer: " + mbeanServer);

 		try {

-			mbeanServer.unregisterMBean(serviceStateName);

+			if(mbeanServer.isRegistered(serviceStateName)){

+				mbeanServer.unregisterMBean(serviceStateName);

+			}

 		} catch (InstanceNotFoundException e) {

 			log(LogService.LOG_DEBUG, "OSGi ServiceStateMBean not found on deregistration", e);

 		} catch (MBeanRegistrationException e) {

@@ -262,7 +278,9 @@
 

 		log(LogService.LOG_INFO, "Deregistering packages monitor with MBeanServer: " + mbeanServer);

 		try {

-			mbeanServer.unregisterMBean(packageStateName);

+			if(mbeanServer.isRegistered(packageStateName)){

+				mbeanServer.unregisterMBean(packageStateName);

+			}

 		} catch (InstanceNotFoundException e) {

 			log(LogService.LOG_DEBUG, "OSGi PackageStateMBean not found on deregistration", e);

 		} catch (MBeanRegistrationException e) {

@@ -273,7 +291,9 @@
 		log(LogService.LOG_INFO, "Deregistering config admin with MBeanServer: " + mbeanServer);

 		configAdminTracker.close();

 		try {

-			mbeanServer.unregisterMBean(configAdminName);

+			if(mbeanServer.isRegistered(configAdminName)){

+				mbeanServer.unregisterMBean(configAdminName);

+			}

 		} catch (InstanceNotFoundException e) {

 			log(LogService.LOG_DEBUG, "OSGi ConfigAdminMBean not found on deregistration", e);

 		} catch (MBeanRegistrationException e) {

@@ -284,7 +304,9 @@
 		log(LogService.LOG_INFO, "Deregistering permission admin with MBeanServer: " + mbeanServer);

 		permissionAdminTracker.close();

 		try {

-			mbeanServer.unregisterMBean(permissionAdminName);

+			if(mbeanServer.isRegistered(permissionAdminName)){

+				mbeanServer.unregisterMBean(permissionAdminName);

+			}

 		} catch (InstanceNotFoundException e) {

 			log(LogService.LOG_DEBUG, "OSGi PermissionAdminMBean not found on deregistration", e);

 		} catch (MBeanRegistrationException e) {

@@ -295,7 +317,9 @@
 		log(LogService.LOG_INFO, "Deregistering provisioning service admin with MBeanServer: " + mbeanServer);

 		provisioningServiceTracker.close();

 		try {

-			mbeanServer.unregisterMBean(provisioningServiceName);

+			if(mbeanServer.isRegistered(provisioningServiceName)){

+				mbeanServer.unregisterMBean(provisioningServiceName);

+			}

 		} catch (InstanceNotFoundException e) {

 			log(LogService.LOG_DEBUG, "OSGi ProvisioningServiceMBean not found on deregistration", e);

 		} catch (MBeanRegistrationException e) {

@@ -306,7 +330,9 @@
 		log(LogService.LOG_INFO, "Deregistering user admin with MBeanServer: " + mbeanServer);

 		userAdminTracker.close();

 		try {

-			mbeanServer.unregisterMBean(userAdminName);

+			if(mbeanServer.isRegistered(userAdminName)){

+				mbeanServer.unregisterMBean(userAdminName);

+			}

 		} catch (InstanceNotFoundException e) {

 			log(LogService.LOG_DEBUG, "OSGi UserAdminMBean not found on deregistration", e);

 		} catch (MBeanRegistrationException e) {

@@ -322,6 +348,9 @@
 	 * @param mbeanServer MBean Server to register the MBeans in

      */

 	private synchronized void registerServices(MBeanServer mbeanServer) {

+		if(shuttingdown.get()){

+			return;

+		}

 		try {

 			framework = new StandardMBean(new Framework(bundleContext), FrameworkMBean.class);

 		} catch (NotCompliantMBeanException e) {

@@ -743,14 +772,12 @@
 		}

 

 		@Override

-		public void modifiedService(ServiceReference<LogService> reference,

-				Object service) {

+		public void modifiedService(ServiceReference<LogService> reference, Object service) {

 			// no op

 		}

 

 		@Override

-		public void removedService(ServiceReference<LogService> reference,

-				Object service) {

+		public void removedService(ServiceReference<LogService> reference, Object service) {

 			logger = null;

 		}

 		

diff --git a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/BundleState.java b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/BundleState.java
index 41ba1bf..c8b3d22 100644
--- a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/BundleState.java
+++ b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/BundleState.java
@@ -100,8 +100,7 @@
 			for (Bundle bundle : bundleContext.getBundles()) {

 				bundles.add(new OSGiBundle(bundle));

 			}

-			TabularData table = OSGiBundle.tableFrom(bundles, bundleTypeItems);

-			return table;

+			return OSGiBundle.tableFrom(bundles, bundleTypeItems);          

 		} catch (Throwable e) {

 			throw new IOException(e);

 		}

@@ -185,8 +184,8 @@
 	/**

 	 * {@inheritDoc}

 	 */

-	public long[] getServicesInUse(long bundleIdentifier) throws IOException {

-		ServiceReference<?>[] servicesInUse = retrieveBundle(bundleIdentifier).getServicesInUse();

+	public long[] getServicesInUse(long bundleId) throws IOException {

+		ServiceReference<?>[] servicesInUse = retrieveBundle(bundleId).getServicesInUse();

 		return convertToPrimativeArray(OSGiBundle.serviceIds(servicesInUse));

 	}

 	

@@ -194,18 +193,14 @@
 	 * {@inheritDoc}

 	 */

 	public long[] getRequiringBundles(long bundleId) throws IOException {

-        BundleWiring wiring = retrieveBundle(bundleId).adapt(BundleWiring.class);

-        List<BundleWire> providedWires = wiring.getProvidedWires(BundleRevision.BUNDLE_NAMESPACE);

-        return convertToPrimativeArray(OSGiBundle.bundleWiresToRequirerIds(providedWires));

+        return convertToPrimativeArray(BundleUtil.getRequiringBundles(retrieveBundle(bundleId)));

     }

 

 	/**

 	 * {@inheritDoc}

 	 */

-	public long[] getRequiredBundles(long bundleIdentifier) throws IOException {

-        BundleWiring wiring = retrieveBundle(bundleIdentifier).adapt(BundleWiring.class);

-        List<BundleWire> requiredWires = wiring.getRequiredWires(BundleRevision.BUNDLE_NAMESPACE);

-        return convertToPrimativeArray(OSGiBundle.bundleWiresToProviderIds(requiredWires));

+	public long[] getRequiredBundles(long bundleId) throws IOException {

+        return convertToPrimativeArray(BundleUtil.getRequiredBundles(retrieveBundle(bundleId)));

     }

 

 	/**

@@ -289,8 +284,14 @@
 	}

 	

 	private long[] convertToPrimativeArray(Long[] src){

+		if(src == null || src.length == 0){

+			return new long[0];

+		}

 		long[] dest = new long[src.length];

-        System.arraycopy(src, 0, dest, 0, src.length);

+		int i = 0;

+		for (Long long1 : src) {

+			dest[i++] = long1;

+		}

         return dest;

 	}

 	

diff --git a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/BundleWiringState.java b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/BundleWiringState.java
index 420acc0..3384757 100644
--- a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/BundleWiringState.java
+++ b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/BundleWiringState.java
@@ -77,7 +77,7 @@
 		BundleWiring wiring = getBundle(bundleId).adapt(BundleWiring.class);
 		OSGiBundleRevisionIdTracker revisionTracker = new OSGiBundleRevisionIdTracker();
 		if(wiring != null){
-			return new OSGiBundleWiring(wiring).asCompositeData(namespace, revisionTracker);
+			return new OSGiBundleWiring(wiring).asCompositeData(namespace, bundleId, revisionTracker);
 		}else{
 			return null;
 		}
@@ -140,7 +140,7 @@
 		for (BundleRevision bundleRevision : bundleRevisions) {
 			BundleWiring wiring = bundleRevision.getWiring();
 			if(wiring != null){
-				table.put(new OSGiBundleWiring(wiring).asCompositeData(namespace, revisionTracker));
+				table.put(new OSGiBundleWiring(wiring).asCompositeData(namespace, bundleId, revisionTracker));
 			}
 		}
 		return table;
diff --git a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/Framework.java b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/Framework.java
index 4cbe35d..5ce5ec9 100644
--- a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/Framework.java
+++ b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/Framework.java
@@ -248,11 +248,7 @@
 			try {

 				bundle(bundleIdentifiers[i]).adapt(BundleStartLevel.class).setStartLevel(newlevels[i]);

 			} catch (Throwable e) {

-				Long[] completed = new Long[i];

-				System.arraycopy(bundleIdentifiers, 0, completed, 0, completed.length);

-				Long[] remaining = new Long[bundleIdentifiers.length - i - 1];

-				System.arraycopy(bundleIdentifiers, i + 1, remaining, 0, remaining.length);

-				return new BundleBatchActionResult(e.toString(), completed, bundleIdentifiers[i], remaining).asCompositeData();

+				return this.handleUpdateException(bundleIdentifiers, i, e);

 			}

 		}

 		return new BundleBatchActionResult().asCompositeData();

@@ -317,11 +313,7 @@
 			try {

 				bundle(bundleIdentifiers[i]).start();

 			} catch (Throwable e) {

-				Long[] completed = new Long[i];

-				System.arraycopy(bundleIdentifiers, 0, completed, 0, completed.length);

-				Long[] remaining = new Long[bundleIdentifiers.length - i - 1];

-				System.arraycopy(bundleIdentifiers, i + 1, remaining, 0, remaining.length);

-				return new BundleBatchActionResult(e.toString(), completed, bundleIdentifiers[i], remaining).asCompositeData();

+				return this.handleUpdateException(bundleIdentifiers, i, e);

 			}

 		}

 		return new BundleBatchActionResult().asCompositeData();

@@ -349,11 +341,7 @@
 			try {

 				bundle(bundleIdentifiers[i]).stop();

 			} catch (Throwable e) {

-				Long[] completed = new Long[i];

-				System.arraycopy(bundleIdentifiers, 0, completed, 0, completed.length);

-				Long[] remaining = new Long[bundleIdentifiers.length - i - 1];

-				System.arraycopy(bundleIdentifiers, i + 1, remaining, 0, remaining.length);

-				return new BundleBatchActionResult(e.toString(), completed, bundleIdentifiers[i], remaining).asCompositeData();

+				return this.handleUpdateException(bundleIdentifiers, i, e);

 			}

 		}

 		return new BundleBatchActionResult().asCompositeData();

@@ -381,11 +369,7 @@
 			try {

 				bundle(bundleIdentifiers[i]).uninstall();

 			} catch (Throwable e) {

-				Long[] completed = new Long[i];

-				System.arraycopy(bundleIdentifiers, 0, completed, 0, completed.length);

-				Long[] remaining = new Long[bundleIdentifiers.length - i - 1];

-				System.arraycopy(bundleIdentifiers, i + 1, remaining, 0, remaining.length);

-				return new BundleBatchActionResult(e.toString(), completed, bundleIdentifiers[i], remaining).asCompositeData();

+				return this.handleUpdateException(bundleIdentifiers, i, e);

 			}

 		}

 		return new BundleBatchActionResult().asCompositeData();

@@ -433,11 +417,7 @@
 			try {

 				bundle(bundleIdentifiers[i]).update();

 			} catch (Throwable e) {

-				Long[] completed = new Long[i];

-				System.arraycopy(bundleIdentifiers, 0, completed, 0, completed.length);

-				Long[] remaining = new Long[bundleIdentifiers.length - i - 1];

-				System.arraycopy(bundleIdentifiers, i + 1, remaining, 0, remaining.length);

-				return new BundleBatchActionResult(e.toString(), completed, bundleIdentifiers[i], remaining).asCompositeData();

+				return this.handleUpdateException(bundleIdentifiers, i, e);

 			}

 		}

 		return new BundleBatchActionResult().asCompositeData();

@@ -456,11 +436,7 @@
 				is = new URL(urls[i]).openStream();

 				bundle(bundleIdentifiers[i]).update(is);

 			} catch (Throwable e) {

-				Long[] completed = new Long[i];

-				System.arraycopy(bundleIdentifiers, 0, completed, 0, completed.length);

-				Long[] remaining = new Long[bundleIdentifiers.length - i - 1];

-				System.arraycopy(bundleIdentifiers, i + 1, remaining, 0, remaining.length);

-				return new BundleBatchActionResult(e.toString(), completed, bundleIdentifiers[i], remaining).asCompositeData();

+				return this.handleUpdateException(bundleIdentifiers, i, e);

 			} finally {

 				if (is != null) {

 					try {

@@ -472,6 +448,15 @@
 		}

 		return new BundleBatchActionResult().asCompositeData();

 	}

+	

+	private CompositeData handleUpdateException(long[] bundleIdentifiers, int currentPostion, Throwable e){

+		Long[] completed = this.convertToNonPrimativeArray(bundleIdentifiers, currentPostion);

+		Long[] remaining = new Long[bundleIdentifiers.length - currentPostion - 1];

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

+			remaining[j] = bundleIdentifiers[currentPostion + 1 + j];	

+		}

+		return new BundleBatchActionResult(e.toString(), completed, bundleIdentifiers[currentPostion], remaining).asCompositeData();

+	}

 

 	/**

 	 * {@inheritDoc}

@@ -492,8 +477,7 @@
 		long[] result = new long[bundles.size()];

 		int i = 0;

 		for (Bundle bundle : bundles) {

-			result[i] = bundle.getBundleId();

-			i++;

+			result[i++] = bundle.getBundleId();

 		}

 		return result;

 	}

@@ -513,8 +497,7 @@
 		long[] result = new long[removalPendingBundles.size()];

 		int i = 0;

 		for (Bundle bundle : removalPendingBundles) {

-			result[i] = bundle.getBundleId();

-			i++;

+			result[i++] = bundle.getBundleId();

 		}

 		return result;

 	}

@@ -534,12 +517,13 @@
 	 * {@inheritDoc}

 	 */

 	public CompositeData refreshBundlesAndWait(long[] bundleIdentifiers) throws IOException {

-		Collection<Bundle> bundles = bundleIdentifiers == null ? null : this.getBundles(bundleIdentifiers);

+		if(bundleIdentifiers == null){

+			return new BundleBatchResolveResult(new Long[0], true).asCompositeData();

+		}

+		Collection<Bundle> bundles = this.getBundles(bundleIdentifiers);

 		StandardFrameworkListener standardFrameworkListener = new StandardFrameworkListener();

 		this.frameworkWiring.refreshBundles(bundles, standardFrameworkListener);

-		Long[] completedBundles = new Long[bundleIdentifiers.length];

-		System.arraycopy(bundleIdentifiers, 0, completedBundles, 0, bundleIdentifiers.length);

-		return new BundleBatchResolveResult(completedBundles, standardFrameworkListener.getResult()).asCompositeData();

+		return new BundleBatchResolveResult(convertToNonPrimativeArray(bundleIdentifiers), standardFrameworkListener.getResult()).asCompositeData();

 	}

 

 	/**

@@ -549,21 +533,20 @@
 		boolean result;

 		Long[] completedBundles;

 		if(bundleIdentifiers == null){

-			Collection<Long> unresolvedBundles = new HashSet<Long>();

 			Bundle[] allBundles = this.bundleContext.getBundles();

+			long[] tmpBundles = new long[allBundles.length];

+			int i = 0;

 			for (Bundle bundle : allBundles) {

 				if(bundle.getState() == Bundle.INSTALLED){

-					unresolvedBundles.add(bundle.getBundleId());

+					tmpBundles[i++] = bundle.getBundleId();

 				}

 			}

-			completedBundles = new Long[unresolvedBundles.size()];

-			unresolvedBundles.toArray(completedBundles);

+			completedBundles = convertToNonPrimativeArray(tmpBundles);

 			result = this.frameworkWiring.resolveBundles(null);	

 		}else{

 			Collection<Bundle> bundles = this.getBundles(bundleIdentifiers);

 			result = this.frameworkWiring.resolveBundles(bundles);

-			completedBundles = new Long[bundleIdentifiers.length];

-			System.arraycopy(bundleIdentifiers, 0, completedBundles, 0, bundleIdentifiers.length);

+			completedBundles = convertToNonPrimativeArray(bundleIdentifiers);

 		}

 		return new BundleBatchResolveResult(completedBundles, result).asCompositeData();

 	}

@@ -583,6 +566,21 @@
 		}

 		return b;

 	}

+

+	private Long[] convertToNonPrimativeArray(long[] src, int length){

+		if(src == null || src.length == 0){

+			return new Long[0];

+		}

+		Long[] dest = new Long[length];

+		for (int i = 0; i < length; i++) {

+			dest[i] = src[i];	

+		}

+        return dest;

+	}

+	

+	private Long[] convertToNonPrimativeArray(long[] src){

+		return this.convertToNonPrimativeArray(src, src.length);

+	}

 	

 	/**

 	 * 

diff --git a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/internal/OSGiBundle.java b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/internal/OSGiBundle.java
index eec6f20..7b3be2c 100644
--- a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/internal/OSGiBundle.java
+++ b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/internal/OSGiBundle.java
@@ -350,9 +350,7 @@
 	 * @throws IOException 

 	 */

 	private Long[] getRequiredBundles() throws IOException {

-        BundleWiring wiring = bundle.adapt(BundleWiring.class);

-        List<BundleWire> requiredWires = wiring.getRequiredWires(BundleRevision.BUNDLE_NAMESPACE);

-        return OSGiBundle.bundleWiresToProviderIds(requiredWires);

+        return BundleUtil.getRequiredBundles(bundle);

 	}

 

 	/**

@@ -360,9 +358,7 @@
 	 * @throws IOException 

 	 */

 	private Long[] getRequiringBundles() throws IOException {

-        BundleWiring wiring = bundle.adapt(BundleWiring.class);

-        List<BundleWire> providedWires = wiring.getProvidedWires(BundleRevision.BUNDLE_NAMESPACE);

-        return OSGiBundle.bundleWiresToRequirerIds(providedWires);

+        return BundleUtil.getRequiringBundles(bundle);

 	}

 

 	/**

@@ -459,11 +455,14 @@
 		if (refs == null) {

 			return new Long[0];

 		}

-		Long[] ids = new Long[refs.length];

+		List<Long> idsList = new ArrayList<Long>();

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

-			ids[i] = (Long) refs[i].getProperty(Constants.SERVICE_ID);

+			Object serviceIdProperty = refs[i].getProperty(Constants.SERVICE_ID);

+			if(serviceIdProperty != null){

+				idsList.add((Long) serviceIdProperty);

+			}

 		}

-		return ids;

+		return idsList.toArray(new Long[idsList.size()]);

 	}

 	

 }

diff --git a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/internal/OSGiBundleWiring.java b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/internal/OSGiBundleWiring.java
index 7a5a38c..a856e22 100644
--- a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/internal/OSGiBundleWiring.java
+++ b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/framework/internal/OSGiBundleWiring.java
@@ -43,25 +43,6 @@
 	/**
 	 * 
 	 * @param namespace
-	 * @param revisionCounter
-	 * @return
-	 */
-	public CompositeData asCompositeData(String namespace, OSGiBundleRevisionIdTracker revisionTracker) {
-		Map<String, Object> items = new HashMap<String, Object>();
-		int myRevisionId = revisionTracker.getRevisionId(wiring.getRevision());
-		this.addCapabilityAndRequirementItems(items, namespace);
-		this.addRevisionedProvidedAndRequiredWireItems(items, namespace, revisionTracker);
-		items.put(BundleWiringStateMBean.BUNDLE_REVISION_ID, myRevisionId);
-		try {
-			return new CompositeDataSupport(BundleWiringStateMBean.BUNDLE_WIRING_TYPE, items);
-		} catch (OpenDataException e) {
-			throw new IllegalStateException("Cannot form bundle revisions wiring open data", e);
-		}
-	}
-
-	/**
-	 * 
-	 * @param namespace
 	 * @param bundleId
 	 * @param revisionCounter
 	 * @return
@@ -76,7 +57,7 @@
 		try {
 			return new CompositeDataSupport(BundleWiringStateMBean.BUNDLE_WIRING_TYPE, items);
 		} catch (OpenDataException e) {
-			throw new IllegalStateException("Cannot form bundle revisions wiring closures open data", e);
+			throw new IllegalStateException("Cannot form bundle revisions wiring closures open data (" + e.getMessage() + ")", e);
 		}
 	}
 
diff --git a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/internal/BundleUtil.java b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/internal/BundleUtil.java
index 3799aae..a74a512 100644
--- a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/internal/BundleUtil.java
+++ b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/internal/BundleUtil.java
@@ -15,9 +15,11 @@
 

 package org.eclipse.gemini.management.internal;

 

+import java.io.IOException;

 import java.util.ArrayList;

 import java.util.List;

 

+import org.eclipse.gemini.management.framework.internal.OSGiBundle;

 import org.osgi.framework.Bundle;

 import org.osgi.framework.Constants;

 import org.osgi.framework.startlevel.BundleStartLevel;

@@ -68,10 +70,10 @@
 		if (wiring == null) {

 			return new String[0];

 		}

-		List<BundleWire> providedWires = wiring.getRequiredWires(BundleRevision.PACKAGE_NAMESPACE);

+		List<BundleWire> requiredWires = wiring.getRequiredWires(BundleRevision.PACKAGE_NAMESPACE);

         List<String> packages = new ArrayList<String>();

-        for(BundleWire wire: providedWires){

-            String packageName = String.format("%s;%s", wire.getCapability().getAttributes().get(BundleRevision.PACKAGE_NAMESPACE), wire.getCapability().getAttributes().get(Constants.VERSION_ATTRIBUTE));

+        for(BundleWire requiredWire: requiredWires){

+            String packageName = String.format("%s;%s", requiredWire.getCapability().getAttributes().get(BundleRevision.PACKAGE_NAMESPACE), requiredWire.getCapability().getAttributes().get(Constants.VERSION_ATTRIBUTE));

             if(!packages.contains(packageName)){

                 packages.add(packageName);

             }

@@ -154,6 +156,32 @@
 		BundleStartLevel startLevel = bundle.adapt(BundleStartLevel.class);

 		return startLevel.isActivationPolicyUsed();

 	}

+	

+	/**

+	 * @return the list of identifiers of bundles required by this bundle

+	 * @throws IOException 

+	 */

+	public static Long[] getRequiredBundles(Bundle bundle) throws IOException {

+        BundleWiring wiring = bundle.adapt(BundleWiring.class);

+        if(wiring == null){

+        	return new Long[0];

+        }

+        List<BundleWire> requiredWires = wiring.getRequiredWires(null);//BundleRevision.BUNDLE_NAMESPACE);

+        return OSGiBundle.bundleWiresToProviderIds(requiredWires);

+	}

+

+	/**

+	 * @return the list of identifiers of bundles which require this bundle

+	 * @throws IOException 

+	 */

+	public static Long[] getRequiringBundles(Bundle bundle) throws IOException {

+        BundleWiring wiring = bundle.adapt(BundleWiring.class);

+        if(wiring == null){

+        	return new Long[0];

+        }

+        List<BundleWire> providedWires = wiring.getProvidedWires(null);//BundleRevision.BUNDLE_NAMESPACE);

+        return OSGiBundle.bundleWiresToRequirerIds(providedWires);

+	}

 

 	/**

 	 * Answer true if the bundle is required

@@ -165,7 +193,7 @@
 	public static boolean isRequired(Bundle bundle) {

 		BundleWiring wiring = bundle.adapt(BundleWiring.class);

 		if (wiring != null) {

-			return wiring.getProvidedWires(BundleRevision.BUNDLE_NAMESPACE).size() > 0;

+			return wiring.getProvidedWires(null/*BundleRevision.BUNDLE_NAMESPACE*/).size() > 0;

 		} else {

 			return false;

 		}

diff --git a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/internal/OSGiProperties.java b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/internal/OSGiProperties.java
index a0845dc..5736416 100644
--- a/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/internal/OSGiProperties.java
+++ b/org.eclipse.gemini.management/src/main/java/org/eclipse/gemini/management/internal/OSGiProperties.java
@@ -264,7 +264,9 @@
 				builder.append(',');

 			}

 		}

-		builder.deleteCharAt(builder.length()-1);

+		if(builder.length() > 0){

+			builder.deleteCharAt(builder.length()-1);

+		}

 		return propertyData(key, builder.toString(), JmxConstants.ARRAY_OF + typeOf(componentClazz));

 	}