diff --git a/org.eclipse.gemini.mgmt.tests/.classpath b/org.eclipse.gemini.mgmt.tests/.classpath
index 9aa40d0..e15292d 100644
--- a/org.eclipse.gemini.mgmt.tests/.classpath
+++ b/org.eclipse.gemini.mgmt.tests/.classpath
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry excluding="**/.svn/*" kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="target"/>
+</classpath>
diff --git a/org.eclipse.gemini.mgmt.tests/build.properties b/org.eclipse.gemini.mgmt.tests/build.properties
index 0db7570..9064190 100644
--- a/org.eclipse.gemini.mgmt.tests/build.properties
+++ b/org.eclipse.gemini.mgmt.tests/build.properties
@@ -1,3 +1,3 @@
 source.. = src/
-output.. = bin/
+output.. = target/
 bin.includes = META-INF/,.
diff --git a/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/AbstractOSGiMBeanTest.java b/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/AbstractOSGiMBeanTest.java
new file mode 100644
index 0000000..917280f
--- /dev/null
+++ b/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/AbstractOSGiMBeanTest.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * 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:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.gemini.mgmt;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.MBeanServer;
+import javax.management.MBeanServerConnection;
+import javax.management.ObjectName;
+import javax.management.openmbean.TabularData;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+
+import org.junit.BeforeClass;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+
+public class AbstractOSGiMBeanTest {
+
+	protected String mBeanObjectName;
+	
+	@BeforeClass
+	public static void setup(){
+		BundleContext bc = FrameworkUtil.getBundle(Activator.class).getBundleContext();
+		ServiceReference<MBeanServer> ref = bc.getServiceReference(MBeanServer.class);
+		if (ref == null) {
+			bc.registerService(MBeanServer.class.getCanonicalName(), ManagementFactory.getPlatformMBeanServer(), null);
+		}
+	}
+
+	protected TabularData jmxInvokeBundleState(String operation, Object[] arguments, String[] types) throws Exception {
+		JMXConnector connector;
+		String url = "service:jmx:rmi:///jndi/rmi://localhost:21045/jmxrmi";
+		JMXServiceURL jmxURL = new JMXServiceURL(url);
+		connector = JMXConnectorFactory.connect(jmxURL);
+		MBeanServerConnection connection = connector.getMBeanServerConnection();
+		ObjectName name = new ObjectName(mBeanObjectName);
+		return (TabularData) connection.invoke(name, operation, arguments, types);
+	}
+	
+}
diff --git a/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/framework/BundleStateTest.java b/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/framework/BundleStateTest.java
deleted file mode 100644
index de6d1e5..0000000
--- a/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/framework/BundleStateTest.java
+++ /dev/null
@@ -1,393 +0,0 @@
-package org.eclipse.gemini.mgmt.framework;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.io.IOException;
-import java.lang.management.ManagementFactory;
-import java.net.MalformedURLException;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import javax.management.InstanceNotFoundException;
-import javax.management.MBeanException;
-import javax.management.MBeanServer;
-import javax.management.MBeanServerConnection;
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectName;
-import javax.management.ReflectionException;
-import javax.management.openmbean.CompositeData;
-import javax.management.openmbean.TabularData;
-import javax.management.openmbean.TabularDataSupport;
-import javax.management.remote.JMXConnector;
-import javax.management.remote.JMXConnectorFactory;
-import javax.management.remote.JMXServiceURL;
-
-import org.junit.Test;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.startlevel.BundleStartLevel;
-import org.osgi.jmx.framework.BundleStateMBean;
-
-import org.eclipse.gemini.mgmt.Activator;
-import org.eclipse.gemini.mgmt.framework.internal.OSGiBundle;
-import org.eclipse.gemini.mgmt.framework.BundleState;
-import org.eclipse.gemini.mgmt.internal.BundleUtil;
-
-public class BundleStateTest {
-	
-	@Test
-	public void nameAndVersionTest() throws Exception {
-		BundleContext bc = FrameworkUtil.getBundle(Activator.class).getBundleContext();
-		ServiceReference<MBeanServer> ref = bc.getServiceReference(MBeanServer.class);
-		if (ref == null) {
-			bc.registerService(MBeanServer.class.getCanonicalName(), ManagementFactory.getPlatformMBeanServer(), null);
-		}
-		CompositeData bundleInfo;
-		String symbolicName;
-		String version;
-		Object key;
-		Object[] keysArray;
-		Bundle bundle;
-		int mask = BundleState.SYMBOLIC_NAME + BundleState.IDENTIFIER + BundleState.VERSION;
-		long start = System.currentTimeMillis();
-		TabularDataSupport table = jmxInvokeListBundles(mask);
-		long end = System.currentTimeMillis();
-		assertTrue((end - start) < 1000);
-		Set<?> keys = table.keySet();
-		Iterator<?> iter = keys.iterator();
-		while (iter.hasNext()) {
-			key = iter.next();
-			keysArray = ((Collection<?>) key).toArray();
-			bundleInfo = (CompositeData) table.get(keysArray);
-			symbolicName = (String) bundleInfo.get(BundleStateMBean.SYMBOLIC_NAME);
-			version = (String) bundleInfo.get(BundleStateMBean.VERSION);
-			bundle = bc.getBundle((Long) keysArray[0]);
-			assertEquals(symbolicName, bundle.getSymbolicName());
-			assertEquals(version, bundle.getVersion().toString());
-		}
-	}
-
-	@SuppressWarnings("unchecked")
-	@Test
-	public void fullMaskTest() throws Exception {
-		CompositeData bundleInfo;
-		String location;
-		String symbolicName;
-		String version;
-		int startLevel;
-		String state;
-		long lastModified;
-		boolean persistenlyStarted;
-		boolean removalPending;
-		boolean required;
-		boolean fragment;
-		Long[] registeredServices;
-		Long[] servicesInUse;
-		Map<String, CompositeData> headers;
-		String[] exportedPackages;
-		String[] importedPackages;
-		Long[] fragments;
-		Long[] hosts;
-		Long[] requiringBundles;
-		Long[] requiredBundles;
-		Object key;
-		Object[] keysArray;
-		Bundle bundle;
-		int mask = BundleState.LOCATION + BundleState.IDENTIFIER
-				+ BundleState.SYMBOLIC_NAME + BundleState.VERSION
-				+ BundleState.START_LEVEL + BundleState.STATE
-				+ BundleState.LAST_MODIFIED + BundleState.PERSISTENTLY_STARTED
-				+ BundleState.REMOVAL_PENDING + BundleState.REQUIRED
-				+ BundleState.FRAGMENT + BundleState.REGISTERED_SERVICES
-				+ BundleState.SERVICES_IN_USE + BundleState.HEADERS
-				+ BundleState.EXPORTED_PACKAGES + BundleState.IMPORTED_PACKAGES
-				+ BundleState.FRAGMENTS + BundleState.HOSTS
-				+ BundleState.REQUIRING_BUNDLES + BundleState.REQUIRED_BUNDLES;
-		TabularDataSupport table = jmxInvokeListBundles(mask);
-		Set<?> keys = table.keySet();
-		Iterator<?> iter = keys.iterator();
-		BundleContext bc = FrameworkUtil.getBundle(BundleState.class).getBundleContext();
-		while (iter.hasNext()) {
-			key = iter.next();
-			keysArray = ((Collection<?>) key).toArray();
-			bundleInfo = (CompositeData) table.get(keysArray);
-
-			location = (String) bundleInfo.get(BundleStateMBean.LOCATION);
-			symbolicName = (String) bundleInfo.get(BundleStateMBean.SYMBOLIC_NAME);
-			version = (String) bundleInfo.get(BundleStateMBean.VERSION);
-			startLevel = ((Integer) bundleInfo.get(BundleStateMBean.START_LEVEL)).intValue();
-			state = (String) bundleInfo.get(BundleStateMBean.STATE);
-			lastModified = ((Long) bundleInfo.get(BundleStateMBean.LAST_MODIFIED)).longValue();
-			persistenlyStarted = ((Boolean) bundleInfo.get(BundleStateMBean.PERSISTENTLY_STARTED)).booleanValue();
-			removalPending = ((Boolean) bundleInfo.get(BundleStateMBean.REMOVAL_PENDING)).booleanValue();
-			required = ((Boolean) bundleInfo.get(BundleStateMBean.REQUIRED)).booleanValue();
-			fragment = ((Boolean) bundleInfo.get(BundleStateMBean.FRAGMENT)).booleanValue();
-			registeredServices = (Long[]) bundleInfo.get(BundleStateMBean.REGISTERED_SERVICES);
-			servicesInUse = (Long[]) bundleInfo.get(BundleStateMBean.SERVICES_IN_USE);
-			headers = (Map<String, CompositeData>) bundleInfo.get(BundleStateMBean.HEADERS);
-			exportedPackages = (String[]) bundleInfo.get(BundleStateMBean.EXPORTED_PACKAGES);
-			importedPackages = (String[]) bundleInfo.get(BundleStateMBean.IMPORTED_PACKAGES);
-			fragments = (Long[]) bundleInfo.get(BundleStateMBean.FRAGMENTS);
-			hosts = (Long[]) bundleInfo.get(BundleStateMBean.HOSTS);
-			requiringBundles = (Long[]) bundleInfo.get(BundleStateMBean.REQUIRING_BUNDLES);
-			requiredBundles = (Long[]) bundleInfo.get(BundleStateMBean.REQUIRED_BUNDLES);
-
-			bundle = bc.getBundle((Long) keysArray[0]);
-			assertEquals(location, bundle.getLocation());
-			assertEquals(symbolicName, bundle.getSymbolicName());
-			assertEquals(version, bundle.getVersion().toString());
-			assertEquals(startLevel, bundle.adapt(BundleStartLevel.class).getStartLevel());
-			assertEquals(state, stateToString(bundle.getState()));
-			assertEquals(lastModified, bundle.getLastModified());
-			assertEquals(persistenlyStarted, BundleUtil.isBundlePersistentlyStarted(bundle));
-			assertEquals(removalPending, BundleUtil.isRemovalPending(bundle));
-			assertEquals(required, BundleUtil.isRequired(bundle));
-			assertEquals(fragment, BundleUtil.isBundleFragment(bundle));
-
-			long[] rs = new long[registeredServices.length];
-			for (int i = 0; i < registeredServices.length; i++) {
-				rs[i] = registeredServices[i].longValue();
-			}
-			long[] rs2 = BundleUtil.serviceIds(bundle.getRegisteredServices());
-			Arrays.sort(rs);
-			Arrays.sort(rs2);
-			assertTrue(Arrays.equals(rs, rs2));
-
-			long[] siu = new long[servicesInUse.length];
-			for (int i = 0; i < servicesInUse.length; i++) {
-				siu[i] = servicesInUse[i].longValue();
-			}
-			Arrays.sort(siu);
-			long[] siu2 = BundleUtil.serviceIds(bundle.getServicesInUse());
-			Arrays.sort(siu2);
-			assertTrue(Arrays.equals(siu, siu2));
-
-			assertEquals((TabularData) headers,	OSGiBundle.headerTable(BundleUtil.getBundleHeaders(bundle)));
-
-			String[] exportedPackages2 = BundleUtil.getBundleExportedPackages(bundle);
-			Arrays.sort(exportedPackages);
-			Arrays.sort(exportedPackages2);
-			assertTrue(Arrays.equals(exportedPackages, exportedPackages2));
-
-			String[] importedPackages2 = BundleUtil.getBundleImportedPackages(bundle);
-			Arrays.sort(importedPackages);
-			Arrays.sort(importedPackages2);
-			assertTrue(Arrays.equals(importedPackages, importedPackages2));
-
-			long[] frags = new long[fragments.length];
-			for (int i = 0; i < fragments.length; i++) {
-				frags[i] = fragments[i].longValue();
-			}
-			Arrays.sort(frags);
-			long[] frags2 = BundleUtil.getBundleFragments(bundle);
-			Arrays.sort(frags2);
-			assertTrue(Arrays.equals(frags, frags2));
-
-			long[] hst = new long[hosts.length];
-			for (int i = 0; i < hosts.length; i++) {
-				hst[i] = hosts[i].longValue();
-			}
-			Arrays.sort(hst);
-			long[] hst2 = BundleUtil.getBundleHosts(bundle);
-			Arrays.sort(hst2);
-			assertTrue(Arrays.equals(hst, hst2));
-
-			long[] reqB = new long[requiringBundles.length];
-			for (int i = 0; i < requiringBundles.length; i++) {
-				reqB[i] = requiringBundles[i].longValue();
-			}
-			Arrays.sort(reqB);
-			long[] reqB2 = BundleUtil.getRequiringBundles(bundle);
-			Arrays.sort(reqB2);
-			assertTrue(Arrays.equals(reqB, reqB2));
-
-			long[] requiredB = new long[requiredBundles.length];
-			for (int i = 0; i < requiredBundles.length; i++) {
-				requiredB[i] = requiredBundles[i].longValue();
-			}
-			Arrays.sort(requiredB);
-			long[] requiredB2 = BundleUtil.getRequiredBundles(bundle);
-			Arrays.sort(requiredB2);
-			assertTrue(Arrays.equals(requiredB, requiredB2));
-		}
-	}
-
-	@Test
-	public void randomMaskTest() throws Exception {
-		CompositeData bundleInfo;
-		String version;
-		String state;
-		long lastModified;
-		boolean persistenlyStarted;
-		boolean removalPending;
-		Long[] registeredServices;
-		Long[] servicesInUse;
-		String[] exportedPackages;
-		String[] importedPackages;
-		Long[] hosts;
-		Long[] requiringBundles;
-		Object key;
-		Object[] keysArray;
-		Bundle bundle;
-		int mask = BundleState.IDENTIFIER + BundleState.VERSION
-				+ BundleState.STATE + BundleState.LAST_MODIFIED
-				+ BundleState.PERSISTENTLY_STARTED + BundleState.REMOVAL_PENDING
-				+ BundleState.REGISTERED_SERVICES + BundleState.SERVICES_IN_USE
-				+ BundleState.EXPORTED_PACKAGES + BundleState.IMPORTED_PACKAGES
-				+ BundleState.HOSTS + BundleState.REQUIRING_BUNDLES;
-		TabularDataSupport table = jmxInvokeListBundles(mask);
-		Set<?> keys = table.keySet();
-		Iterator<?> iter = keys.iterator();
-		BundleContext bc = FrameworkUtil.getBundle(BundleState.class).getBundleContext();
-		while (iter.hasNext()) {
-			key = iter.next();
-			keysArray = ((Collection<?>) key).toArray();
-			bundleInfo = (CompositeData) table.get(keysArray);
-
-			version = (String) bundleInfo.get(BundleStateMBean.VERSION);
-			state = (String) bundleInfo.get(BundleStateMBean.STATE);
-			lastModified = ((Long) bundleInfo.get(BundleStateMBean.LAST_MODIFIED)).longValue();
-			persistenlyStarted = ((Boolean) bundleInfo.get(BundleStateMBean.PERSISTENTLY_STARTED)).booleanValue();
-			removalPending = ((Boolean) bundleInfo.get(BundleStateMBean.REMOVAL_PENDING)).booleanValue();
-			registeredServices = (Long[]) bundleInfo.get(BundleStateMBean.REGISTERED_SERVICES);
-			servicesInUse = (Long[]) bundleInfo.get(BundleStateMBean.SERVICES_IN_USE);
-			exportedPackages = (String[]) bundleInfo.get(BundleStateMBean.EXPORTED_PACKAGES);
-			importedPackages = (String[]) bundleInfo.get(BundleStateMBean.IMPORTED_PACKAGES);
-			hosts = (Long[]) bundleInfo.get(BundleStateMBean.HOSTS);
-			requiringBundles = (Long[]) bundleInfo.get(BundleStateMBean.REQUIRING_BUNDLES);
-			bundle = bc.getBundle((Long) keysArray[0]);
-
-			assertEquals(version, bundle.getVersion().toString());
-			assertEquals(state, stateToString(bundle.getState()));
-			assertEquals(lastModified, bundle.getLastModified());
-			assertEquals(persistenlyStarted, BundleUtil.isBundlePersistentlyStarted(bundle));
-			assertEquals(removalPending, BundleUtil.isRemovalPending(bundle));
-
-			long[] rs = new long[registeredServices.length];
-			for (int i = 0; i < registeredServices.length; i++) {
-				rs[i] = registeredServices[i].longValue();
-			}
-			long[] rs2 = BundleUtil.serviceIds(bundle.getRegisteredServices());
-			Arrays.sort(rs);
-			Arrays.sort(rs2);
-			assertTrue(Arrays.equals(rs, rs2));
-
-			long[] siu = new long[servicesInUse.length];
-			for (int i = 0; i < servicesInUse.length; i++) {
-				siu[i] = servicesInUse[i].longValue();
-			}
-			Arrays.sort(siu);
-			long[] siu2 = BundleUtil.serviceIds(bundle.getServicesInUse());
-			Arrays.sort(siu2);
-			assertTrue(Arrays.equals(siu, siu2));
-
-			String[] exportedPackages2 = BundleUtil.getBundleExportedPackages(bundle);
-			Arrays.sort(exportedPackages);
-			Arrays.sort(exportedPackages2);
-			assertTrue(Arrays.equals(exportedPackages, exportedPackages2));
-
-			String[] importedPackages2 = BundleUtil.getBundleImportedPackages(bundle);
-			Arrays.sort(importedPackages);
-			Arrays.sort(importedPackages2);
-			assertTrue(Arrays.equals(importedPackages, importedPackages2));
-
-			long[] hst = new long[hosts.length];
-			for (int i = 0; i < hosts.length; i++) {
-				hst[i] = hosts[i].longValue();
-			}
-			Arrays.sort(hst);
-			long[] hst2 = BundleUtil.getBundleHosts(bundle);
-			Arrays.sort(hst2);
-			assertTrue(Arrays.equals(hst, hst2));
-
-			long[] reqB = new long[requiringBundles.length];
-			for (int i = 0; i < requiringBundles.length; i++) {
-				reqB[i] = requiringBundles[i].longValue();
-			}
-			Arrays.sort(reqB);
-			long[] reqB2 = BundleUtil.getRequiringBundles(bundle);
-			Arrays.sort(reqB2);
-			assertTrue(Arrays.equals(reqB, reqB2));
-		}
-	}
-
-	private TabularDataSupport jmxInvokeListBundles(int mask)
-			throws MalformedURLException, IOException,
-			MalformedObjectNameException, InstanceNotFoundException,
-			MBeanException, ReflectionException {
-		JMXConnector connector;
-		String url = "service:jmx:rmi:///jndi/rmi://localhost:21045/jmxrmi";
-		JMXServiceURL jmxURL = new JMXServiceURL(url);
-		connector = JMXConnectorFactory.connect(jmxURL);
-		MBeanServerConnection connection = connector.getMBeanServerConnection();
-		ObjectName name = new ObjectName(CustomBundleStateMBean.OBJECTNAME);
-		TabularDataSupport table = (TabularDataSupport) connection.invoke(name,
-				"listBundles", new Object[] { new Integer(mask) },
-				new String[] { "int" });
-		return table;
-	}
-
-	@Test
-	public void illegalMaskTest() throws Exception {
-//		CompositeData bundleInfo;
-//		String version;
-//		String state;
-//		long lastModified;
-//		boolean persistenlyStarted;
-//		boolean removalPending;
-//		Long[] registeredServices;
-//		Long[] servicesInUse;
-//		String[] exportedPackages;
-//		String[] importedPackages;
-//		Long[] hosts;
-//		Long[] requiringBundles;
-//		Object key;
-//		Object[] keysArray;
-//		Bundle bundle;
-		int mask = 1048576;
-		try {
-			@SuppressWarnings("unused")
-			TabularDataSupport table = jmxInvokeListBundles(mask);
-			fail("Expected exception did not occur!");
-		} catch (Exception e) {
-			assertTrue(e.getCause() instanceof IllegalArgumentException);
-		}
-	}
-
-	private String stateToString(int state) {
-		String strState = null;
-		switch (state) {
-		case 1:
-			strState = "UNINSTALLED";
-			break;
-		case 2:
-			strState = "INSTALLED";
-			break;
-		case 4:
-			strState = "RESOLVED";
-			break;
-		case 8:
-			strState = "STARTING";
-			break;
-		case 16:
-			strState = "STOPPING";
-			break;
-		case 32:
-			strState = "ACTIVE";
-			break;
-		default:
-			strState = "UNKNOWN";
-			break;
-		}
-		return strState;
-	}
-	
-}
-
diff --git a/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/framework/BundleStateTests.java b/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/framework/BundleStateTests.java
new file mode 100644
index 0000000..b3670b6
--- /dev/null
+++ b/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/framework/BundleStateTests.java
@@ -0,0 +1,454 @@
+/*******************************************************************************
+ * Copyright (c) 2010 SAP.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Apache License v2.0 which accompanies this distribution. 
+ * The Eclipse Public License is available at
+ *     http://www.eclipse.org/legal/epl-v10.html
+ * and the Apache License v2.0 is available at 
+ *     http://www.opensource.org/licenses/apache2.0.php.
+ * You may elect to redistribute this code under either of these licenses.
+ *
+ * Contributors:
+ *     SAP employees 
+ ******************************************************************************/
+package org.eclipse.gemini.mgmt.framework;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.TabularData;
+
+import org.eclipse.gemini.mgmt.AbstractOSGiMBeanTest;
+import org.eclipse.gemini.mgmt.framework.internal.OSGiBundle;
+import org.eclipse.gemini.mgmt.internal.BundleUtil;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.startlevel.BundleStartLevel;
+import org.osgi.framework.wiring.BundleRevision;
+import org.osgi.framework.wiring.BundleWire;
+import org.osgi.framework.wiring.BundleWiring;
+import org.osgi.jmx.framework.BundleStateMBean;
+
+/**
+ * Integration tests for the {@link BundleState} implementation of {@link CustomBundleStateMBean} and {@link BundleStateMBean}
+ *
+ */
+public final class BundleStateTests extends AbstractOSGiMBeanTest{
+	
+	protected String mBeanObjectName = BundleStateMBean.OBJECTNAME;
+	
+	private CompositeData bundleInfo;
+	private String location;
+	private String symbolicName;
+	private String version;
+	private int startLevel;
+	private String state;
+	private long lastModified;
+	private boolean persistenlyStarted;
+	private boolean activationPolicyUsed;
+	private boolean removalPending;
+	private boolean required;
+	private boolean fragment;
+	private Long[] registeredServices;
+	private Long[] servicesInUse;
+	private Map<String, CompositeData> headers;
+	private String[] exportedPackages;
+	private String[] importedPackages;
+	private Long[] fragments;
+	private Long[] hosts;
+	private Long[] requiringBundles;
+	private Long[] requiredBundles;
+	private Object key;
+	private Object[] keysArray;
+	private Bundle bundle;
+	
+	@Before
+	public void before(){
+		this.bundleInfo = null;
+		this.location = null;
+		this.symbolicName = null;
+		this.version = null;
+		this.startLevel = 0;
+		this.state = null;
+		this.lastModified = 0L;
+		this.persistenlyStarted = false;
+		this.activationPolicyUsed = false;
+		this.removalPending = false;
+		this.required = false;
+		this.fragment = false;
+		this.registeredServices = null;
+		this.servicesInUse = null;
+		this.headers = null;
+		this.exportedPackages = null;
+		this.importedPackages = null;
+		this.fragments = null;
+		this.hosts = null;
+		this.requiringBundles = null;
+		this.requiredBundles = null;
+		this.key = null;
+		this.keysArray = null;
+		this.bundle = null;
+	}
+	
+	@Test
+	public void nameAndVersionTest() throws Exception {
+		int mask = BundleState.SYMBOLIC_NAME + BundleState.IDENTIFIER + BundleState.VERSION;
+		long start = System.currentTimeMillis();
+		TabularData table = jmxInvokeBundleState("listBundles", new Object[]{ new Integer(mask) }, new String[]{ "int" });
+		long end = System.currentTimeMillis();
+		assertTrue((end - start) < 1000);
+		Set<?> keys = table.keySet();
+		Iterator<?> iter = keys.iterator();
+		BundleContext bc = FrameworkUtil.getBundle(BundleState.class).getBundleContext();
+		while (iter.hasNext()) {
+			key = iter.next();
+			keysArray = ((Collection<?>) key).toArray();
+			bundleInfo = (CompositeData) table.get(keysArray);
+			symbolicName = (String) bundleInfo.get(BundleStateMBean.SYMBOLIC_NAME);
+			version = (String) bundleInfo.get(BundleStateMBean.VERSION);
+			bundle = bc.getBundle((Long) keysArray[0]);
+			assertEquals(symbolicName, bundle.getSymbolicName());
+			assertEquals(version, bundle.getVersion().toString());
+		}
+	}
+
+	@SuppressWarnings("unchecked")
+	@Test
+	public void listTest() throws Exception {
+		TabularData table = jmxInvokeBundleState("listBundles", new Object[]{}, new String[]{});
+		Set<?> keys = table.keySet();
+		Iterator<?> iter = keys.iterator();
+		BundleContext bc = FrameworkUtil.getBundle(BundleState.class).getBundleContext();
+		while (iter.hasNext()) {
+			key = iter.next();
+			keysArray = ((Collection<?>) key).toArray();
+			bundleInfo = table.get(keysArray);
+
+			location = (String) bundleInfo.get(BundleStateMBean.LOCATION);
+			symbolicName = (String) bundleInfo.get(BundleStateMBean.SYMBOLIC_NAME);
+			version = (String) bundleInfo.get(BundleStateMBean.VERSION);
+			startLevel = (Integer) bundleInfo.get(BundleStateMBean.START_LEVEL);
+			state = (String) bundleInfo.get(BundleStateMBean.STATE);
+			lastModified = (Long) bundleInfo.get(BundleStateMBean.LAST_MODIFIED);
+			persistenlyStarted = (Boolean) bundleInfo.get(BundleStateMBean.PERSISTENTLY_STARTED);
+			activationPolicyUsed = (Boolean) bundleInfo.get(CustomBundleStateMBean.ACTIVATION_POLICY_USED);
+			removalPending = (Boolean) bundleInfo.get(BundleStateMBean.REMOVAL_PENDING);
+			required = (Boolean) bundleInfo.get(BundleStateMBean.REQUIRED);
+			fragment = (Boolean) bundleInfo.get(BundleStateMBean.FRAGMENT);
+			registeredServices = (Long[]) bundleInfo.get(BundleStateMBean.REGISTERED_SERVICES);
+			servicesInUse = (Long[]) bundleInfo.get(BundleStateMBean.SERVICES_IN_USE);
+			headers = (Map<String, CompositeData>) bundleInfo.get(BundleStateMBean.HEADERS);
+			exportedPackages = (String[]) bundleInfo.get(BundleStateMBean.EXPORTED_PACKAGES);
+			importedPackages = (String[]) bundleInfo.get(BundleStateMBean.IMPORTED_PACKAGES);
+			fragments = (Long[]) bundleInfo.get(BundleStateMBean.FRAGMENTS);
+			hosts = (Long[]) bundleInfo.get(BundleStateMBean.HOSTS);
+			requiringBundles = (Long[]) bundleInfo.get(BundleStateMBean.REQUIRING_BUNDLES);
+			requiredBundles = (Long[]) bundleInfo.get(BundleStateMBean.REQUIRED_BUNDLES);
+
+			bundle = bc.getBundle((Long) keysArray[0]);
+			assertEquals(location, bundle.getLocation());
+			assertEquals(symbolicName, bundle.getSymbolicName());
+			assertEquals(version, bundle.getVersion().toString());
+			assertEquals(startLevel, bundle.adapt(BundleStartLevel.class).getStartLevel());
+			assertEquals(state, stateToString(bundle.getState()));
+			assertEquals(lastModified, bundle.getLastModified());
+			assertEquals(persistenlyStarted, BundleUtil.isBundlePersistentlyStarted(bundle));
+			assertEquals(activationPolicyUsed, BundleUtil.isBundleActivationPolicyUsed(bundle));
+			assertEquals(removalPending, BundleUtil.isRemovalPending(bundle));
+			assertEquals(required, BundleUtil.isRequired(bundle));
+			assertEquals(fragment, BundleUtil.isBundleFragment(bundle));
+
+			Long[] rs2 = serviceIds(bundle.getRegisteredServices());
+			Arrays.sort(registeredServices);
+			Arrays.sort(rs2);
+			assertTrue(Arrays.equals(registeredServices, rs2));
+
+			Long[] siu2 = serviceIds(bundle.getServicesInUse());
+			Arrays.sort(servicesInUse);
+			Arrays.sort(siu2);
+			assertTrue(Arrays.equals(servicesInUse, siu2));
+
+			assertEquals((TabularData) headers,	OSGiBundle.headerTable(bundle.getHeaders()));
+
+			String[] exportedPackages2 = BundleUtil.getBundleExportedPackages(bundle);
+			Arrays.sort(exportedPackages);
+			Arrays.sort(exportedPackages2);
+			assertTrue(Arrays.equals(exportedPackages, exportedPackages2));
+
+			String[] importedPackages2 = BundleUtil.getBundleImportedPackages(bundle);
+			Arrays.sort(importedPackages);
+			Arrays.sort(importedPackages2);
+			assertTrue(Arrays.equals(importedPackages, importedPackages2));
+
+			Long[] frags2 = getBundleFragments(bundle);
+			Arrays.sort(fragments);
+			Arrays.sort(frags2);
+			assertTrue(Arrays.equals(fragments, frags2));
+
+			Long[] hst2 = getBundleHosts(bundle);
+			Arrays.sort(hosts);
+			Arrays.sort(hst2);
+			assertTrue(Arrays.equals(hosts, hst2));
+
+			Long[] reqB2 = getRequiringBundles(bundle);
+			Arrays.sort(requiringBundles);
+			Arrays.sort(reqB2);
+			assertTrue(Arrays.equals(requiringBundles, reqB2));
+
+			Long[] requiredB2 = getRequiredBundles(bundle);
+			Arrays.sort(requiredBundles);
+			Arrays.sort(requiredB2);
+			assertTrue(Arrays.equals(requiredBundles, requiredB2));
+		}
+	}
+
+	@SuppressWarnings("unchecked")
+	@Test
+	public void fullMaskTest() throws Exception {
+		TabularData table = jmxInvokeBundleState("listBundles", new Object[]{ new Integer(CustomBundleStateMBean.DEFAULT) }, new String[]{ "int" });
+		Set<?> keys = table.keySet();
+		Iterator<?> iter = keys.iterator();
+		BundleContext bc = FrameworkUtil.getBundle(BundleState.class).getBundleContext();
+		while (iter.hasNext()) {
+			key = iter.next();
+			keysArray = ((Collection<?>) key).toArray();
+			bundleInfo = table.get(keysArray);
+
+			location = (String) bundleInfo.get(BundleStateMBean.LOCATION);
+			symbolicName = (String) bundleInfo.get(BundleStateMBean.SYMBOLIC_NAME);
+			version = (String) bundleInfo.get(BundleStateMBean.VERSION);
+			startLevel = (Integer) bundleInfo.get(BundleStateMBean.START_LEVEL);
+			state = (String) bundleInfo.get(BundleStateMBean.STATE);
+			lastModified = (Long) bundleInfo.get(BundleStateMBean.LAST_MODIFIED);
+			persistenlyStarted = (Boolean) bundleInfo.get(BundleStateMBean.PERSISTENTLY_STARTED);
+			activationPolicyUsed = (Boolean) bundleInfo.get(CustomBundleStateMBean.ACTIVATION_POLICY_USED);
+			removalPending = (Boolean) bundleInfo.get(BundleStateMBean.REMOVAL_PENDING);
+			required = (Boolean) bundleInfo.get(BundleStateMBean.REQUIRED);
+			fragment = (Boolean) bundleInfo.get(BundleStateMBean.FRAGMENT);
+			registeredServices = (Long[]) bundleInfo.get(BundleStateMBean.REGISTERED_SERVICES);
+			servicesInUse = (Long[]) bundleInfo.get(BundleStateMBean.SERVICES_IN_USE);
+			headers = (Map<String, CompositeData>) bundleInfo.get(BundleStateMBean.HEADERS);
+			exportedPackages = (String[]) bundleInfo.get(BundleStateMBean.EXPORTED_PACKAGES);
+			importedPackages = (String[]) bundleInfo.get(BundleStateMBean.IMPORTED_PACKAGES);
+			fragments = (Long[]) bundleInfo.get(BundleStateMBean.FRAGMENTS);
+			hosts = (Long[]) bundleInfo.get(BundleStateMBean.HOSTS);
+			requiringBundles = (Long[]) bundleInfo.get(BundleStateMBean.REQUIRING_BUNDLES);
+			requiredBundles = (Long[]) bundleInfo.get(BundleStateMBean.REQUIRED_BUNDLES);
+
+			bundle = bc.getBundle((Long) keysArray[0]);
+			assertEquals(location, bundle.getLocation());
+			assertEquals(symbolicName, bundle.getSymbolicName());
+			assertEquals(version, bundle.getVersion().toString());
+			assertEquals(startLevel, bundle.adapt(BundleStartLevel.class).getStartLevel());
+			assertEquals(state, stateToString(bundle.getState()));
+			assertEquals(lastModified, bundle.getLastModified());
+			assertEquals(persistenlyStarted, BundleUtil.isBundlePersistentlyStarted(bundle));
+			assertEquals(activationPolicyUsed, BundleUtil.isBundleActivationPolicyUsed(bundle));
+			assertEquals(removalPending, BundleUtil.isRemovalPending(bundle));
+			assertEquals(required, BundleUtil.isRequired(bundle));
+			assertEquals(fragment, BundleUtil.isBundleFragment(bundle));
+
+			Long[] rs2 = serviceIds(bundle.getRegisteredServices());
+			Arrays.sort(registeredServices);
+			Arrays.sort(rs2);
+			assertTrue(Arrays.equals(registeredServices, rs2));
+
+			Long[] siu2 = serviceIds(bundle.getServicesInUse());
+			Arrays.sort(servicesInUse);
+			Arrays.sort(siu2);
+			assertTrue(Arrays.equals(servicesInUse, siu2));
+
+			assertEquals((TabularData) headers,	OSGiBundle.headerTable(bundle.getHeaders()));
+
+			String[] exportedPackages2 = BundleUtil.getBundleExportedPackages(bundle);
+			Arrays.sort(exportedPackages);
+			Arrays.sort(exportedPackages2);
+			assertTrue(Arrays.equals(exportedPackages, exportedPackages2));
+
+			String[] importedPackages2 = BundleUtil.getBundleImportedPackages(bundle);
+			Arrays.sort(importedPackages);
+			Arrays.sort(importedPackages2);
+			assertTrue(Arrays.equals(importedPackages, importedPackages2));
+
+			Long[] frags2 = getBundleFragments(bundle);
+			Arrays.sort(fragments);
+			Arrays.sort(frags2);
+			assertTrue(Arrays.equals(fragments, frags2));
+
+			Long[] hst2 = getBundleHosts(bundle);
+			Arrays.sort(hosts);
+			Arrays.sort(hst2);
+			assertTrue(Arrays.equals(hosts, hst2));
+
+			Long[] reqB2 = getRequiringBundles(bundle);
+			Arrays.sort(requiringBundles);
+			Arrays.sort(reqB2);
+			assertTrue(Arrays.equals(requiringBundles, reqB2));
+
+			Long[] requiredB2 = getRequiredBundles(bundle);
+			Arrays.sort(requiredBundles);
+			Arrays.sort(requiredB2);
+			assertTrue(Arrays.equals(requiredBundles, requiredB2));
+		}
+	}
+
+	@Test
+	public void randomMaskTest() throws Exception {
+		int mask = BundleState.IDENTIFIER + BundleState.VERSION
+				+ BundleState.STATE + BundleState.LAST_MODIFIED
+				+ BundleState.PERSISTENTLY_STARTED + BundleState.REMOVAL_PENDING
+				+ BundleState.REGISTERED_SERVICES + BundleState.SERVICES_IN_USE
+				+ BundleState.EXPORTED_PACKAGES + BundleState.IMPORTED_PACKAGES
+				+ BundleState.HOSTS + BundleState.REQUIRING_BUNDLES;
+		TabularData table = jmxInvokeBundleState("listBundles", new Object[]{ new Integer(mask) }, new String[]{ "int" });
+		Set<?> keys = table.keySet();
+		Iterator<?> iter = keys.iterator();
+		BundleContext bc = FrameworkUtil.getBundle(BundleState.class).getBundleContext();
+		while (iter.hasNext()) {
+			key = iter.next();
+			keysArray = ((Collection<?>) key).toArray();
+			bundleInfo = (CompositeData) table.get(keysArray);
+
+			version = (String) bundleInfo.get(BundleStateMBean.VERSION);
+			state = (String) bundleInfo.get(BundleStateMBean.STATE);
+			lastModified = (Long) bundleInfo.get(BundleStateMBean.LAST_MODIFIED);
+			persistenlyStarted = (Boolean) bundleInfo.get(BundleStateMBean.PERSISTENTLY_STARTED);
+			removalPending = (Boolean) bundleInfo.get(BundleStateMBean.REMOVAL_PENDING);
+			registeredServices = (Long[]) bundleInfo.get(BundleStateMBean.REGISTERED_SERVICES);
+			servicesInUse = (Long[]) bundleInfo.get(BundleStateMBean.SERVICES_IN_USE);
+			exportedPackages = (String[]) bundleInfo.get(BundleStateMBean.EXPORTED_PACKAGES);
+			importedPackages = (String[]) bundleInfo.get(BundleStateMBean.IMPORTED_PACKAGES);
+			hosts = (Long[]) bundleInfo.get(BundleStateMBean.HOSTS);
+			requiringBundles = (Long[]) bundleInfo.get(BundleStateMBean.REQUIRING_BUNDLES);
+			bundle = bc.getBundle((Long) keysArray[0]);
+
+			assertEquals(version, bundle.getVersion().toString());
+			assertEquals(state, stateToString(bundle.getState()));
+			assertEquals(lastModified, bundle.getLastModified());
+			assertEquals(persistenlyStarted, BundleUtil.isBundlePersistentlyStarted(bundle));
+			assertEquals(removalPending, BundleUtil.isRemovalPending(bundle));
+
+			Long[] rs2 = serviceIds(bundle.getRegisteredServices());
+			Arrays.sort(registeredServices);
+			Arrays.sort(rs2);
+			assertTrue(Arrays.equals(registeredServices, rs2));
+
+			Long[] siu2 = serviceIds(bundle.getServicesInUse());
+			Arrays.sort(servicesInUse);
+			Arrays.sort(siu2);
+			assertTrue(Arrays.equals(servicesInUse, siu2));
+
+			String[] exportedPackages2 = BundleUtil.getBundleExportedPackages(bundle);
+			Arrays.sort(exportedPackages);
+			Arrays.sort(exportedPackages2);
+			assertTrue(Arrays.equals(exportedPackages, exportedPackages2));
+
+			String[] importedPackages2 = BundleUtil.getBundleImportedPackages(bundle);
+			Arrays.sort(importedPackages);
+			Arrays.sort(importedPackages2);
+			assertTrue(Arrays.equals(importedPackages, importedPackages2));
+
+			Long[] hst2 = getBundleHosts(bundle);
+			Arrays.sort(hosts);
+			Arrays.sort(hst2);
+			assertTrue(Arrays.equals(hosts, hst2));
+
+			Long[] reqB2 = getRequiringBundles(bundle);
+			Arrays.sort(requiringBundles);
+			Arrays.sort(reqB2);
+			assertTrue(Arrays.equals(requiringBundles, reqB2));
+		}
+	}
+
+	@Test
+	public void illegalMaskTest() throws Exception {
+		int mask = 2097152;
+		try {
+			@SuppressWarnings("unused")
+			TabularData table = jmxInvokeBundleState("listBundles", new Object[]{ new Integer(mask) }, new String[]{ "int" });
+			fail("Expected exception did not occur!");
+		} catch (Exception e) {
+			assertTrue(e.getCause() instanceof IllegalArgumentException);
+		}
+	}
+
+	private String stateToString(int state) {
+		switch (state) {
+			case Bundle.ACTIVE:
+				return "ACTIVE";
+			case Bundle.INSTALLED:
+				return "INSTALLED";
+			case Bundle.RESOLVED:
+				return "RESOLVED";
+			case Bundle.STARTING:
+				return "STARTING";
+			case Bundle.STOPPING:
+				return "STOPPING";
+			case Bundle.UNINSTALLED:
+				return "UNINSTALLED";
+			default:
+				return "UNKNOWN";
+		}
+	}
+
+    private Long[] getRequiredBundles(Bundle bundle) {
+        BundleWiring wiring = bundle.adapt(BundleWiring.class);
+        List<BundleWire> requiredWires = wiring.getRequiredWires(BundleRevision.BUNDLE_NAMESPACE);
+        return bundleWiresToIds(requiredWires);
+    }
+
+    private Long[] getRequiringBundles(Bundle bundle) {
+        BundleWiring wiring = bundle.adapt(BundleWiring.class);
+        List<BundleWire> providedWires = wiring.getProvidedWires(BundleRevision.BUNDLE_NAMESPACE);
+        return bundleWiresToIds(providedWires);
+    }
+
+	private Long[] getBundleFragments(Bundle bundle) {
+		BundleWiring wiring = bundle.adapt(BundleWiring.class);
+		List<BundleWire> requiredWires = wiring.getRequiredWires(BundleRevision.HOST_NAMESPACE);
+        return bundleWiresToIds(requiredWires);
+	}
+
+	private Long[] getBundleHosts(Bundle bundle) {
+		BundleWiring wiring = bundle.adapt(BundleWiring.class);
+		List<BundleWire> providedWires = wiring.getProvidedWires(BundleRevision.HOST_NAMESPACE);
+        return bundleWiresToIds(providedWires);
+	}
+
+	private Long[] bundleWiresToIds(List<BundleWire> wires){
+        Long[] consumerWirings = new Long[wires.size()];
+        int i = 0;
+        for (BundleWire bundleWire : wires) {
+            consumerWirings[i] = bundleWire.getRequirerWiring().getBundle().getBundleId();
+            i++;
+        }
+        return consumerWirings;
+	}
+	
+	private Long[] serviceIds(ServiceReference<?>[] refs) {
+		if (refs == null) {
+			return new Long[0];
+		}
+		Long[] ids = new Long[refs.length];
+		for (int i = 0; i < refs.length; i++) {
+			ids[i] = (Long) refs[i].getProperty(Constants.SERVICE_ID);
+		}
+		return ids;
+	}
+}
+
diff --git a/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/framework/BundleWiringStateTests.java b/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/framework/BundleWiringStateTests.java
new file mode 100644
index 0000000..ef12075
--- /dev/null
+++ b/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/framework/BundleWiringStateTests.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * 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:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.gemini.mgmt.framework;
+
+import org.eclipse.gemini.mgmt.AbstractOSGiMBeanTest;
+
+/**
+ * Integration tests for the {@link BundleWiringState} implementation of {@link CustomBundleWiringStateMBean}
+ *
+ */
+public final class BundleWiringStateTests extends AbstractOSGiMBeanTest {
+
+	protected String mBeanObjectName = CustomBundleWiringStateMBean.OBJECTNAME;
+	
+}
diff --git a/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/framework/FrameworkTests.java b/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/framework/FrameworkTests.java
new file mode 100644
index 0000000..0aae3e4
--- /dev/null
+++ b/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/framework/FrameworkTests.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * 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:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.gemini.mgmt.framework;
+
+import org.eclipse.gemini.mgmt.AbstractOSGiMBeanTest;
+import org.osgi.jmx.framework.FrameworkMBean;
+
+/**
+ * Integration tests for the {@link Framework} implementation of {@link FrameworkMBean}
+ *
+ */
+public final class FrameworkTests extends AbstractOSGiMBeanTest {
+
+	protected String mBeanObjectName = FrameworkMBean.OBJECTNAME;
+	
+}
diff --git a/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/framework/PackageStateTests.java b/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/framework/PackageStateTests.java
new file mode 100644
index 0000000..46615c7
--- /dev/null
+++ b/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/framework/PackageStateTests.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * 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:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.gemini.mgmt.framework;
+
+import org.eclipse.gemini.mgmt.AbstractOSGiMBeanTest;
+import org.osgi.jmx.framework.PackageStateMBean;
+
+/**
+ * Integration tests for the {@link PackageState} implementation {@link PackageStateMBean}
+ *
+ */
+public final class PackageStateTests extends AbstractOSGiMBeanTest {
+
+	protected String mBeanObjectName = PackageStateMBean.OBJECTNAME;
+	
+}
diff --git a/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/framework/ServiceStateTests.java b/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/framework/ServiceStateTests.java
new file mode 100644
index 0000000..69c7420
--- /dev/null
+++ b/org.eclipse.gemini.mgmt.tests/src/org/eclipse/gemini/mgmt/framework/ServiceStateTests.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * 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:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.gemini.mgmt.framework;
+
+import org.eclipse.gemini.mgmt.AbstractOSGiMBeanTest;
+import org.osgi.jmx.framework.ServiceStateMBean;
+
+/**
+ * Integration tests for the {@link ServiceState} implementation of {@link CustomServiceStateMBean} and {@link ServiceStateMBean}
+ *
+ */
+public final class ServiceStateTests extends AbstractOSGiMBeanTest {
+
+	protected String mBeanObjectName = ServiceStateMBean.OBJECTNAME;
+	
+}
diff --git a/org.eclipse.gemini.mgmt/.classpath b/org.eclipse.gemini.mgmt/.classpath
index 9aa40d0..39727ae 100644
--- a/org.eclipse.gemini.mgmt/.classpath
+++ b/org.eclipse.gemini.mgmt/.classpath
@@ -1,7 +1,8 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry excluding="**/.svn/*" kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/main/java"/>
+	<classpathentry kind="src" path="src/test/java"/>
+	<classpathentry kind="output" path="target"/>
+</classpath>
diff --git a/org.eclipse.gemini.mgmt/build.properties b/org.eclipse.gemini.mgmt/build.properties
index 0db7570..60212e4 100644
--- a/org.eclipse.gemini.mgmt/build.properties
+++ b/org.eclipse.gemini.mgmt/build.properties
@@ -1,3 +1,3 @@
-source.. = src/
-output.. = bin/
+source.. = src/main/java/
+output.. = target/
 bin.includes = META-INF/,.
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/Activator.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/Activator.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/Activator.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/Activator.java
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/DefaultObjectNameTranslator.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/DefaultObjectNameTranslator.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/DefaultObjectNameTranslator.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/DefaultObjectNameTranslator.java
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/Monitor.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/Monitor.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/Monitor.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/Monitor.java
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/ObjectNameTranslator.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/ObjectNameTranslator.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/ObjectNameTranslator.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/ObjectNameTranslator.java
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/configurationadmin/ConfigAdminManager.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/configurationadmin/ConfigAdminManager.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/configurationadmin/ConfigAdminManager.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/configurationadmin/ConfigAdminManager.java
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/BundleState.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/BundleState.java
similarity index 78%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/BundleState.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/BundleState.java
index 8220e2f..36da3a8 100644
--- a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/BundleState.java
+++ b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/BundleState.java
@@ -17,6 +17,7 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.List;
 
 import javax.management.Notification;
 import javax.management.openmbean.CompositeData;
@@ -27,6 +28,11 @@
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleEvent;
 import org.osgi.framework.BundleListener;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.wiring.BundleRevision;
+import org.osgi.framework.wiring.BundleWire;
+import org.osgi.framework.wiring.BundleWiring;
 import org.osgi.jmx.framework.BundleStateMBean;
 
 import org.eclipse.gemini.mgmt.Monitor;
@@ -56,7 +62,7 @@
 	 */
 	public TabularData listBundles() throws IOException {
 		try {
-			TabularDataSupport table = new TabularDataSupport(BundleStateMBean.BUNDLES_TYPE);
+			TabularDataSupport table = new TabularDataSupport(CustomBundleStateMBean.CUSTOM_BUNDLES_TYPE);
 			for (Bundle bundle : bundleContext.getBundles()) {
 				table.put(new OSGiBundle(bundle).asCompositeData());
 			}
@@ -70,7 +76,7 @@
 	 * {@inheritDoc}
 	 */
 	public TabularData listBundles(int mask) throws IOException {
-		if (mask < 1 || mask > 1048575) {
+		if (mask < 1 || mask > 2097151) {
 			throw new IllegalArgumentException("Mask out of range!");
 		}
 		try {
@@ -96,7 +102,9 @@
 	 * {@inheritDoc}
 	 */
 	public long[] getFragments(long bundleId) throws IOException {
-		return BundleUtil.getBundleFragments(retrieveBundle(bundleId));
+		BundleWiring wiring = retrieveBundle(bundleId).adapt(BundleWiring.class);
+		List<BundleWire> requiredWires = wiring.getRequiredWires(BundleRevision.HOST_NAMESPACE);
+        return bundleWiresToIds(requiredWires);
 	}
 
 	/**
@@ -110,9 +118,11 @@
 	 * {@inheritDoc}
 	 */
 	public long[] getHosts(long fragment) throws IOException {
-		return BundleUtil.getBundleHosts(retrieveBundle(fragment));
+		BundleWiring wiring = retrieveBundle(fragment).adapt(BundleWiring.class);
+		List<BundleWire> providedWires = wiring.getProvidedWires(BundleRevision.HOST_NAMESPACE);
+        return bundleWiresToIds(providedWires);
 	}
-
+	
 	/**
 	 * {@inheritDoc}
 	 */
@@ -131,21 +141,22 @@
 	 * {@inheritDoc}
 	 */
 	public long[] getRegisteredServices(long bundleId) throws IOException {
-		return BundleUtil.serviceIds(retrieveBundle(bundleId).getRegisteredServices());
+		return serviceIds(retrieveBundle(bundleId).getRegisteredServices());
 	}
 
 	/**
 	 * {@inheritDoc}
 	 */
 	public long[] getRequiringBundles(long bundleId) throws IOException {
-		return BundleUtil.getRequiringBundles(retrieveBundle(bundleId));
-	}
-
+        BundleWiring wiring = retrieveBundle(bundleId).adapt(BundleWiring.class);
+        List<BundleWire> providedWires = wiring.getProvidedWires(BundleRevision.BUNDLE_NAMESPACE);
+        return bundleWiresToIds(providedWires);
+    }
 	/**
 	 * {@inheritDoc}
 	 */
 	public long[] getServicesInUse(long bundleIdentifier) throws IOException {
-		return BundleUtil.serviceIds(retrieveBundle(bundleIdentifier).getServicesInUse());
+		return serviceIds(retrieveBundle(bundleIdentifier).getServicesInUse());
 	}
 
 	/**
@@ -180,8 +191,10 @@
 	 * {@inheritDoc}
 	 */
 	public long[] getRequiredBundles(long bundleIdentifier) throws IOException {
-		return BundleUtil.getRequiredBundles(retrieveBundle(bundleIdentifier));
-	}
+        BundleWiring wiring = retrieveBundle(bundleIdentifier).adapt(BundleWiring.class);
+        List<BundleWire> requiredWires = wiring.getRequiredWires(BundleRevision.BUNDLE_NAMESPACE);
+        return bundleWiresToIds(requiredWires);
+    }
 
 	/**
 	 * {@inheritDoc}
@@ -285,6 +298,29 @@
 		return b;
 	}
 
+	private long[] bundleWiresToIds(List<BundleWire> wires){
+        long[] consumerWirings = new long[wires.size()];
+        int i = 0;
+        for (BundleWire bundleWire : wires) {
+            consumerWirings[i] = bundleWire.getRequirerWiring().getBundle().getBundleId();
+            i++;
+        }
+        return consumerWirings;
+	}
+
+	private long[] serviceIds(ServiceReference<?>[] refs) {
+		if (refs == null) {
+			return new long[0];
+		}
+		long[] ids = new long[refs.length];
+		for (int i = 0; i < refs.length; i++) {
+			ids[i] = (Long) refs[i].getProperty(Constants.SERVICE_ID);
+		}
+		return ids;
+	}
+	
+	//Monitor methods
+	
 	/**
 	 * {@inheritDoc}
 	 */
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/BundleWiringState.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/BundleWiringState.java
similarity index 82%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/BundleWiringState.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/BundleWiringState.java
index 345b58a..9460add 100644
--- a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/BundleWiringState.java
+++ b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/BundleWiringState.java
@@ -23,11 +23,11 @@
 import org.eclipse.gemini.mgmt.framework.internal.OSGiBundleRevision;
 import org.eclipse.gemini.mgmt.framework.internal.OSGiBundleRevisionIdTracker;
 import org.eclipse.gemini.mgmt.framework.internal.OSGiBundleWiring;
-import org.eclipse.gemini.mgmt.internal.BundleWiringUtil;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.wiring.BundleRevision;
 import org.osgi.framework.wiring.BundleRevisions;
+import org.osgi.framework.wiring.BundleWire;
 import org.osgi.framework.wiring.BundleWiring;
 
 /**
@@ -79,7 +79,7 @@
 		namespace = processNamespace(namespace);
 		BundleWiring wiring = getBundle(rootBundleId).adapt(BundleWiring.class);
 		Map<BundleRevision, OSGiBundleWiring> mappings = new HashMap<BundleRevision, OSGiBundleWiring>();
-		BundleWiringUtil.processWiring(mappings, wiring, namespace);
+		processWiring(mappings, wiring, namespace);
 		TabularDataSupport table = new TabularDataSupport(CustomBundleWiringStateMBean.BUNDLE_REVISIONS_WIRINGS_CLOSURES_TYPE);
 		OSGiBundleRevisionIdTracker revisionTracker = new OSGiBundleRevisionIdTracker();
 		for(Entry<BundleRevision, OSGiBundleWiring> osgiBundleWiring : mappings.entrySet()){
@@ -140,7 +140,7 @@
 		List<BundleRevision> bundleRevisions = getBundle(rootBundleId).adapt(BundleRevisions.class).getRevisions();
 		Map<BundleRevision, OSGiBundleWiring> mappings = new HashMap<BundleRevision, OSGiBundleWiring>();
 		for (BundleRevision bundleRevision : bundleRevisions) {
-			BundleWiringUtil.processWiring(mappings, bundleRevision.getWiring(), namespace);
+			processWiring(mappings, bundleRevision.getWiring(), namespace);
 		}
 		TabularDataSupport table = new TabularDataSupport(CustomBundleWiringStateMBean.BUNDLE_REVISIONS_WIRINGS_CLOSURES_TYPE);
 		OSGiBundleRevisionIdTracker revisionTracker = new OSGiBundleRevisionIdTracker();
@@ -167,4 +167,37 @@
 		return namespace;
 	}
 	
+	/**
+	 * Add all related wirings to the provided map.
+	 * 
+	 * @param mappings of 
+	 * @param wiring
+	 * @param namespace
+	 */
+	private void processWiring(Map<BundleRevision, OSGiBundleWiring> mappings, BundleWiring wiring, String namespace){
+		BundleRevision bundleRevision = wiring.getRevision();
+		if(!mappings.containsKey(bundleRevision)) {
+			mappings.put(bundleRevision, new OSGiBundleWiring(wiring));
+			processRequiredWirings(mappings, wiring, namespace);
+			processProvidedWirings(mappings, wiring, namespace);
+		}
+	}
+	
+	private void processRequiredWirings(Map<BundleRevision, OSGiBundleWiring> mappings, BundleWiring wiring, String namespace){
+		List<BundleWire> requiredWires = wiring.getRequiredWires(namespace);
+		if(requiredWires != null) {
+			for (BundleWire bundleWire : requiredWires) {
+				processWiring(mappings, bundleWire.getProviderWiring(), namespace);
+			}
+		}
+	}
+	
+	private void processProvidedWirings(Map<BundleRevision, OSGiBundleWiring> mappings, BundleWiring wiring, String namespace){
+		List<BundleWire> providedWires = wiring.getProvidedWires(namespace);
+		if(providedWires != null) {
+			for (BundleWire bundleWire : providedWires) {
+				processWiring(mappings, bundleWire.getRequirerWiring(), namespace);
+			}
+		}
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/CustomBundleStateMBean.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/CustomBundleStateMBean.java
similarity index 87%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/CustomBundleStateMBean.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/CustomBundleStateMBean.java
index 393225d..f5df475 100644
--- a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/CustomBundleStateMBean.java
+++ b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/CustomBundleStateMBean.java
@@ -17,8 +17,10 @@
 import java.io.IOException;
 
 import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.CompositeType;
 import javax.management.openmbean.SimpleType;
 import javax.management.openmbean.TabularData;
+import javax.management.openmbean.TabularType;
 
 import org.osgi.jmx.Item;
 import org.osgi.jmx.framework.BundleStateMBean;
@@ -157,7 +159,7 @@
 	 */
 	public final static int DEFAULT = LOCATION + IDENTIFIER
 	+ SYMBOLIC_NAME + VERSION + START_LEVEL + STATE + LAST_MODIFIED 
-	+ PERSISTENTLY_STARTED + REMOVAL_PENDING + REQUIRED + FRAGMENT + REGISTERED_SERVICES
+	+ PERSISTENTLY_STARTED + ACTIVATION_POLICY + REMOVAL_PENDING + REQUIRED + FRAGMENT + REGISTERED_SERVICES
 	+ SERVICES_IN_USE + HEADERS + EXPORTED_PACKAGES + IMPORTED_PACKAGES + FRAGMENTS 
 	+ HOSTS + REQUIRING_BUNDLES + REQUIRED_BUNDLES;
 
@@ -172,6 +174,8 @@
 	 * @throws IOException
 	 */
 	TabularData listBundles(int mask) throws IOException;
+
+	//New methods from the JMX Update RFC 169
 	
 	/**
 	 * The key PERSISTENTLY_STARTED, used in {@link #PERSISTENTLY_STARTED_ITEM}.
@@ -185,7 +189,21 @@
 	 */
 	Item ACTIVATION_POLICY_ITEM = new Item(ACTIVATION_POLICY_USED,	"Whether the bundle is using an activation policy", SimpleType.BOOLEAN);
 	
-	//New methods from the JMX Update RFC 169
+	CompositeType CUSTOM_BUNDLE_TYPE = Item.compositeType("BUNDLE",
+			"This type encapsulates OSGi bundles", EXPORTED_PACKAGES_ITEM,
+			FRAGMENT_ITEM, FRAGMENTS_ITEM, HEADERS_ITEM, HOSTS_ITEM,
+			IDENTIFIER_ITEM, IMPORTED_PACKAGES_ITEM, LAST_MODIFIED_ITEM,
+			LOCATION_ITEM, PERSISTENTLY_STARTED_ITEM, ACTIVATION_POLICY_ITEM, 
+			REGISTERED_SERVICES_ITEM, REMOVAL_PENDING_ITEM, REQUIRED_ITEM, 
+			REQUIRED_BUNDLES_ITEM, REQUIRING_BUNDLES_ITEM, START_LEVEL_ITEM, 
+			STATE_ITEM, SERVICES_IN_USE_ITEM, SYMBOLIC_NAME_ITEM, VERSION_ITEM);
+
+	/**
+	 * The Tabular Type for a list of bundles. The row type is
+	 * {@link #BUNDLE_TYPE}.
+	 */
+	TabularType CUSTOM_BUNDLES_TYPE = Item.tabularType("BUNDLES", "A list of bundles",
+			BUNDLE_TYPE, new String[] { BundleStateMBean.IDENTIFIER });
 	
 	/**
 	 * 
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/CustomBundleWiringStateMBean.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/CustomBundleWiringStateMBean.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/CustomBundleWiringStateMBean.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/CustomBundleWiringStateMBean.java
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/CustomServiceStateMBean.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/CustomServiceStateMBean.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/CustomServiceStateMBean.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/CustomServiceStateMBean.java
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/Framework.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/Framework.java
similarity index 94%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/Framework.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/Framework.java
index 9a25864..334ef6a 100644
--- a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/Framework.java
+++ b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/Framework.java
@@ -104,12 +104,12 @@
 		if (locations == null) {
 			throw new IOException("locations must not be null");
 		}
-		long ids[] = new long[locations.length];
+		Long ids[] = new Long[locations.length];
 		for (int i = 0; i < locations.length; i++) {
 			try {
 				ids[i] = bundleContext.installBundle(locations[i]).getBundleId();
 			} catch (Throwable e) {
-				long[] completed = new long[i];
+				Long[] completed = new Long[i];
 				System.arraycopy(ids, 0, completed, 0, completed.length);
 				String[] remaining = new String[locations.length - i - 1];
 				System.arraycopy(locations, i + 1, remaining, 0, remaining.length);
@@ -129,14 +129,14 @@
 		if (urls == null) {
 			throw new IOException("urls must not be null");
 		}
-		long ids[] = new long[locations.length];
+		Long ids[] = new Long[locations.length];
 		for (int i = 0; i < locations.length; i++) {
 			InputStream is = null;
 			try {
 				is = new URL(urls[i]).openStream();
 				ids[i] = bundleContext.installBundle(locations[i], is).getBundleId();
 			} catch (Throwable e) {
-				long[] completed = new long[i];
+				Long[] completed = new Long[i];
 				System.arraycopy(ids, 0, completed, 0, completed.length);
 				String[] remaining = new String[locations.length - i - 1];
 				System.arraycopy(locations, i + 1, remaining, 0, remaining.length);
@@ -245,9 +245,9 @@
 			try {
 				bundle(bundleIdentifiers[i]).adapt(BundleStartLevel.class).setStartLevel(newlevels[i]);
 			} catch (Throwable e) {
-				long[] completed = new long[i];
+				Long[] completed = new Long[i];
 				System.arraycopy(bundleIdentifiers, 0, completed, 0, completed.length);
-				long[] remaining = new long[bundleIdentifiers.length - i - 1];
+				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();
 			}
@@ -314,9 +314,9 @@
 			try {
 				bundle(bundleIdentifiers[i]).start();
 			} catch (Throwable e) {
-				long[] completed = new long[i];
+				Long[] completed = new Long[i];
 				System.arraycopy(bundleIdentifiers, 0, completed, 0, completed.length);
-				long[] remaining = new long[bundleIdentifiers.length - i - 1];
+				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();
 			}
@@ -346,9 +346,9 @@
 			try {
 				bundle(bundleIdentifiers[i]).stop();
 			} catch (Throwable e) {
-				long[] completed = new long[i];
+				Long[] completed = new Long[i];
 				System.arraycopy(bundleIdentifiers, 0, completed, 0, completed.length);
-				long[] remaining = new long[bundleIdentifiers.length - i - 1];
+				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();
 			}
@@ -378,9 +378,9 @@
 			try {
 				bundle(bundleIdentifiers[i]).uninstall();
 			} catch (Throwable e) {
-				long[] completed = new long[i];
+				Long[] completed = new Long[i];
 				System.arraycopy(bundleIdentifiers, 0, completed, 0, completed.length);
-				long[] remaining = new long[bundleIdentifiers.length - i - 1];
+				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();
 			}
@@ -430,9 +430,9 @@
 			try {
 				bundle(bundleIdentifiers[i]).update();
 			} catch (Throwable e) {
-				long[] completed = new long[i];
+				Long[] completed = new Long[i];
 				System.arraycopy(bundleIdentifiers, 0, completed, 0, completed.length);
-				long[] remaining = new long[bundleIdentifiers.length - i - 1];
+				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();
 			}
@@ -453,9 +453,9 @@
 				is = new URL(urls[i]).openStream();
 				bundle(bundleIdentifiers[i]).update(is);
 			} catch (Throwable e) {
-				long[] completed = new long[i];
+				Long[] completed = new Long[i];
 				System.arraycopy(bundleIdentifiers, 0, completed, 0, completed.length);
-				long[] remaining = new long[bundleIdentifiers.length - i - 1];
+				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();
 			} finally {
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/PackageState.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/PackageState.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/PackageState.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/PackageState.java
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/ServiceState.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/ServiceState.java
similarity index 98%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/ServiceState.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/ServiceState.java
index c2e144f..2cee22f 100644
--- a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/ServiceState.java
+++ b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/ServiceState.java
@@ -29,7 +29,6 @@
 import org.eclipse.gemini.mgmt.framework.internal.OSGiService;
 import org.eclipse.gemini.mgmt.framework.internal.OSGiServiceEvent;
 import org.eclipse.gemini.mgmt.internal.OSGiProperties;
-import org.eclipse.gemini.mgmt.internal.ServiceUtil;
 import org.osgi.framework.AllServiceListener;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
@@ -101,7 +100,7 @@
 	 * {@inheritDoc}
 	 */
 	public long[] getUsingBundles(long serviceId) throws IOException {
-		return ServiceUtil.getBundlesUsing(getServiceReference(serviceId));
+		return OSGiService.getBundlesUsing(getServiceReference(serviceId));
 	}
 
 	//New methods from the JMX Update RFC 169
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/BundleBatchActionResult.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/BundleBatchActionResult.java
similarity index 60%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/BundleBatchActionResult.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/BundleBatchActionResult.java
index d7572ab..43a9fe9 100644
--- a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/BundleBatchActionResult.java
+++ b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/BundleBatchActionResult.java
@@ -15,8 +15,6 @@
 
 package org.eclipse.gemini.mgmt.framework.internal;
 
-import static org.eclipse.gemini.mgmt.internal.BundleUtil.LongArrayFrom;
-
 import java.util.HashMap;
 import java.util.Map;
 
@@ -56,11 +54,32 @@
  * </tr>
  * </table>
  */
-public final class BundleBatchActionResult extends BundleBatchResult {
+public final class BundleBatchActionResult {
 
+	/**
+	 * The list of bundles successfully completed
+	 */
+	private Long[] completed;
+	
+	/**
+	 * The error message of a failed result
+	 */
+	private String errorMessage;
+	
+	/**
+	 * True if the action completed without error
+	 */
+	private boolean success = true;
+	
+	/**
+	 * The bundle in error or -1L if no bundle is in error
+	 */
 	private long bundleInError;
 
-	private long[] remaining;
+	/**
+	 * The ids of the bundles remaining to be processed
+	 */
+	private Long[] remaining;
 	
 	/**
 	 * Construct a result signifying the successful completion of the batch
@@ -71,39 +90,6 @@
 	}
 
 	/**
-	 * Construct a result representing the contents of the supplied
-	 * CompositeData returned from a batch operation.
-	 * 
-	 * @param compositeData
-	 *            - the CompositeData representing the result of a batch
-	 *            operation.
-	 */
-	@SuppressWarnings("boxing")
-	public BundleBatchActionResult(CompositeData compositeData) {
-		success = ((Boolean) compositeData.get(FrameworkMBean.SUCCESS)).booleanValue();
-		errorMessage = (String) compositeData.get(FrameworkMBean.ERROR);
-		Long[] c = (Long[]) compositeData.get(FrameworkMBean.COMPLETED);
-		bundleInError = (Long) compositeData.get(FrameworkMBean.BUNDLE_IN_ERROR);
-		if (c != null) {
-			completed = new long[c.length];
-			for (int i = 0; i < c.length; i++) {
-				completed[i] = c[i];
-			}
-		} else {
-			completed = new long[0];
-		}
-		c = (Long[]) compositeData.get(FrameworkMBean.REMAINING);
-		if (c != null) {
-			remaining = new long[c.length];
-			for (int i = 0; i < c.length; i++) {
-				remaining[i] = c[i];
-			}
-		} else {
-			remaining = new long[0];
-		}
-	}
-
-	/**
 	 * Construct a result indictating the failure of a batch operation.
 	 * 
 	 * @param errorMessage
@@ -116,7 +102,7 @@
 	 * @param remaining
 	 *            - the list of bundle identifiers which remain unprocessed
 	 */
-	public BundleBatchActionResult(String errorMessage, long[] completed, long bundleInError, long[] remaining) {
+	public BundleBatchActionResult(String errorMessage, Long[] completed, long bundleInError, Long[] remaining) {
 		success = false;
 		this.errorMessage = errorMessage;
 		this.completed = completed;
@@ -129,14 +115,13 @@
 	 * 
 	 * @return the CompositeData encoding of the receiver.
 	 */
-	@SuppressWarnings("boxing")
 	public CompositeData asCompositeData() {
 		Map<String, Object> items = new HashMap<String, Object>();
 		items.put(FrameworkMBean.SUCCESS, success);
 		items.put(FrameworkMBean.ERROR, errorMessage);
-		items.put(FrameworkMBean.COMPLETED, LongArrayFrom(completed));
+		items.put(FrameworkMBean.COMPLETED, completed);
 		items.put(FrameworkMBean.BUNDLE_IN_ERROR, bundleInError);
-		items.put(FrameworkMBean.REMAINING, LongArrayFrom(remaining));
+		items.put(FrameworkMBean.REMAINING, remaining);
 
 		try {
 			return new CompositeDataSupport( FrameworkMBean.BATCH_ACTION_RESULT_TYPE, items);
@@ -145,26 +130,4 @@
 		}
 	}
 
-	/**
-	 * Answer the bundle identifier which indicates the bundle that produced an
-	 * error during the batch operation.
-	 * 
-	 * @return the bundle identifier of the bundle in error, or -1L if no error
-	 *         occurred
-	 */
-	public long getBundleInError() {
-		return bundleInError;
-	}
-
-	/**
-	 * If the operation was unsuccessful, answer the list of bundle identifiers
-	 * of the bundles that were not processed during the batch operation. If the
-	 * operation was a success, then answer null
-	 * 
-	 * @return the remaining bundle identifiers or null if the operation was a
-	 *         success
-	 */
-	public long[] getRemaining() {
-		return remaining;
-	}
 }
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/BundleBatchInstallResult.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/BundleBatchInstallResult.java
similarity index 65%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/BundleBatchInstallResult.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/BundleBatchInstallResult.java
index d6ffcaa..0111110 100644
--- a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/BundleBatchInstallResult.java
+++ b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/BundleBatchInstallResult.java
@@ -15,8 +15,6 @@
 
 package org.eclipse.gemini.mgmt.framework.internal;
 
-import static org.eclipse.gemini.mgmt.internal.BundleUtil.LongArrayFrom;
-
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
@@ -58,36 +56,32 @@
  * </tr>
  * </table>
  */
-public final class BundleBatchInstallResult extends BundleBatchResult {
+public final class BundleBatchInstallResult {
 
-	private String bundleInError;
-
-	private String[] remaining;
+	/**
+	 * The list of bundles successfully completed
+	 */
+	private Long[] completed;
 	
 	/**
-	 * Construct a result representing the contents of the supplied
-	 * CompositeData returned from a batch operation.
-	 * 
-	 * @param compositeData
-	 *            - the CompositeData representing the result of a batch
-	 *            operation.
+	 * The error message of a failed result
 	 */
-	@SuppressWarnings("boxing")
-	public BundleBatchInstallResult(CompositeData compositeData) {
-		success = ((Boolean) compositeData.get(FrameworkMBean.SUCCESS)).booleanValue();
-		errorMessage = (String) compositeData.get(FrameworkMBean.ERROR);
-		Long[] c = (Long[]) compositeData.get(FrameworkMBean.COMPLETED);
-		if (c != null) {
-			completed = new long[c.length];
-			for (int i = 0; i < c.length; i++) {
-				completed[i] = c[i];
-			}
-		} else {
-			completed = new long[0];
-		}
-		bundleInError = (String) compositeData.get(FrameworkMBean.BUNDLE_IN_ERROR);
-		remaining = (String[]) compositeData.get(FrameworkMBean.REMAINING);
-	}
+	private String errorMessage;
+	
+	/**
+	 * True if the action completed without error
+	 */
+	private boolean success = true;
+	
+	/**
+	 * The bundle in error or -1L if no bundle is in error
+	 */
+	private String bundleInError;
+
+	/**
+	 * The locations of the bundles remaining to be processed
+	 */
+	private String[] remaining;
 
 	/**
 	 * Construct a result signifying the successful completion of the batch
@@ -96,7 +90,7 @@
 	 * @param completed
 	 *            - the resulting bundle identifiers of the installed bundles
 	 */
-	public BundleBatchInstallResult(long[] completed) {
+	public BundleBatchInstallResult(Long[] completed) {
 		success = true;
 		this.completed = completed;
 	}
@@ -114,7 +108,7 @@
 	 * @param remaining
 	 *            - the list of bundle identifiers which remain unprocessed
 	 */
-	public BundleBatchInstallResult(String errorMessage, long[] completed, String bundleInError, String[] remaining) {
+	public BundleBatchInstallResult(String errorMessage, Long[] completed, String bundleInError, String[] remaining) {
 		success = false;
 		this.errorMessage = errorMessage;
 		this.completed = completed;
@@ -128,12 +122,11 @@
 	 * @return the CompositeData encoding of the receiver.
 	 * @throws IOException
 	 */
-	@SuppressWarnings("boxing")
 	public CompositeData asCompositeData() throws IOException {
 		Map<String, Object> items = new HashMap<String, Object>();
 		items.put(FrameworkMBean.SUCCESS, success);
 		items.put(FrameworkMBean.ERROR, errorMessage);
-		items.put(FrameworkMBean.COMPLETED, LongArrayFrom(completed));
+		items.put(FrameworkMBean.COMPLETED, completed);
 		items.put(FrameworkMBean.BUNDLE_IN_ERROR, bundleInError);
 		items.put(FrameworkMBean.REMAINING, remaining);
 
@@ -146,26 +139,4 @@
 		}
 	}
 
-	/**
-	 * Answer the bundle location which indicates the bundle that produced an
-	 * error during the batch operation.
-	 * 
-	 * @return the bundle location of the bundle in error, or null if no error
-	 *         occurred
-	 */
-	public String getBundleInError() {
-		return bundleInError;
-	}
-
-	/**
-	 * Answer the list of locations of the bundles that were not processed
-	 * during the batch operation, or null if the operation was successsful
-	 * 
-	 * @return the remaining bundle locations if the operation was successful,
-	 *         or null if the operation was unsuccsesful.
-	 */
-	public String[] getRemaining() {
-		return remaining;
-	}
-
 }
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiBundle.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiBundle.java
similarity index 85%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiBundle.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiBundle.java
index 070eb89..1eaa4b0 100644
--- a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiBundle.java
+++ b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiBundle.java
@@ -15,6 +15,8 @@
 
 package org.eclipse.gemini.mgmt.framework.internal;
 
+import static org.osgi.framework.Constants.SERVICE_ID;
+
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -34,6 +36,10 @@
 import org.eclipse.gemini.mgmt.framework.CustomBundleStateMBean;
 import org.eclipse.gemini.mgmt.internal.BundleUtil;
 import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.wiring.BundleRevision;
+import org.osgi.framework.wiring.BundleWire;
+import org.osgi.framework.wiring.BundleWiring;
 import org.osgi.jmx.Item;
 import org.osgi.jmx.framework.BundleStateMBean;
 
@@ -174,10 +180,10 @@
 			items.put(BundleStateMBean.FRAGMENT, isFragment());
 		}
 		if(bundleTypes.contains(BundleStateMBean.REGISTERED_SERVICES)) {
-			items.put(BundleStateMBean.REGISTERED_SERVICES, BundleUtil.LongArrayFrom(getRegisteredServices()));
+			items.put(BundleStateMBean.REGISTERED_SERVICES, getRegisteredServices());
 		}
 		if(bundleTypes.contains(BundleStateMBean.SERVICES_IN_USE)) {
-			items.put(BundleStateMBean.SERVICES_IN_USE, BundleUtil.LongArrayFrom(getServicesInUse()));
+			items.put(BundleStateMBean.SERVICES_IN_USE, getServicesInUse());
 		}
 		if(bundleTypes.contains(BundleStateMBean.HEADERS)) {
 			items.put(BundleStateMBean.HEADERS, headerTable(getHeaders()));
@@ -189,16 +195,16 @@
 			items.put(BundleStateMBean.IMPORTED_PACKAGES, getImportedPackages());
 		}
 		if(bundleTypes.contains(BundleStateMBean.FRAGMENTS)) {
-			items.put(BundleStateMBean.FRAGMENTS, BundleUtil.LongArrayFrom(getFragments()));
+			items.put(BundleStateMBean.FRAGMENTS, getFragments());
 		}
 		if(bundleTypes.contains(BundleStateMBean.HOSTS)) {
-			items.put(BundleStateMBean.HOSTS, BundleUtil.LongArrayFrom(getHosts()));
+			items.put(BundleStateMBean.HOSTS, getHosts());
 		}
 		if(bundleTypes.contains(BundleStateMBean.REQUIRING_BUNDLES)) {
-			items.put(BundleStateMBean.REQUIRING_BUNDLES, BundleUtil.LongArrayFrom(getRequiringBundles()));
+			items.put(BundleStateMBean.REQUIRING_BUNDLES, getRequiringBundles());
 		}
 		if(bundleTypes.contains(BundleStateMBean.REQUIRED_BUNDLES)) {
-			items.put(BundleStateMBean.REQUIRED_BUNDLES, BundleUtil.LongArrayFrom(getRequiredBundles()));
+			items.put(BundleStateMBean.REQUIRED_BUNDLES, getRequiredBundles());
 		}
 		try {
 			return new CompositeDataSupport(computeBundleType, items);
@@ -336,10 +342,10 @@
 			items.put(BundleStateMBean.FRAGMENT, isFragment());
 		}
 		if((mask | CustomBundleStateMBean.REGISTERED_SERVICES) == mask) {
-			items.put(BundleStateMBean.REGISTERED_SERVICES, BundleUtil.LongArrayFrom(getRegisteredServices()));
+			items.put(BundleStateMBean.REGISTERED_SERVICES, getRegisteredServices());
 		}
 		if((mask | CustomBundleStateMBean.SERVICES_IN_USE) == mask) {
-			items.put(BundleStateMBean.SERVICES_IN_USE, BundleUtil.LongArrayFrom(getServicesInUse()));
+			items.put(BundleStateMBean.SERVICES_IN_USE, getServicesInUse());
 		}
 		if((mask | CustomBundleStateMBean.HEADERS) == mask) {
 			items.put(BundleStateMBean.HEADERS, headerTable(getHeaders()));
@@ -351,16 +357,16 @@
 			items.put(BundleStateMBean.IMPORTED_PACKAGES, getImportedPackages());
 		}
 		if((mask | CustomBundleStateMBean.FRAGMENTS) == mask) {
-			items.put(BundleStateMBean.FRAGMENTS, BundleUtil.LongArrayFrom(getFragments()));
+			items.put(BundleStateMBean.FRAGMENTS, getFragments());
 		}
 		if((mask | CustomBundleStateMBean.HOSTS) == mask) {
-			items.put(BundleStateMBean.HOSTS, BundleUtil.LongArrayFrom(getHosts()));
+			items.put(BundleStateMBean.HOSTS, getHosts());
 		}
 		if((mask | CustomBundleStateMBean.REQUIRING_BUNDLES) == mask) {
-			items.put(BundleStateMBean.REQUIRING_BUNDLES, BundleUtil.LongArrayFrom(getRequiringBundles()));
+			items.put(BundleStateMBean.REQUIRING_BUNDLES, getRequiringBundles());
 		}
 		if((mask | CustomBundleStateMBean.REQUIRED_BUNDLES) == mask) {
-			items.put(BundleStateMBean.REQUIRED_BUNDLES, BundleUtil.LongArrayFrom(getRequiredBundles()));
+			items.put(BundleStateMBean.REQUIRED_BUNDLES, getRequiredBundles());
 		}
 
 		try {
@@ -391,17 +397,17 @@
 		items.put(BundleStateMBean.REMOVAL_PENDING, isRemovalPending());
 		items.put(BundleStateMBean.REQUIRED, isRequired());
 		items.put(BundleStateMBean.FRAGMENT, isFragment());
-		items.put(BundleStateMBean.REGISTERED_SERVICES, BundleUtil.LongArrayFrom(getRegisteredServices()));
-		items.put(BundleStateMBean.SERVICES_IN_USE, BundleUtil.LongArrayFrom(getServicesInUse()));
+		items.put(BundleStateMBean.REGISTERED_SERVICES, getRegisteredServices());
+		items.put(BundleStateMBean.SERVICES_IN_USE, getServicesInUse());
 		items.put(BundleStateMBean.HEADERS, headerTable(getHeaders()));
 		items.put(BundleStateMBean.EXPORTED_PACKAGES, getExportedPackages());
 		items.put(BundleStateMBean.IMPORTED_PACKAGES, getImportedPackages());
-		items.put(BundleStateMBean.FRAGMENTS, BundleUtil.LongArrayFrom(getFragments()));
-		items.put(BundleStateMBean.HOSTS, BundleUtil.LongArrayFrom(getHosts()));
-		items.put(BundleStateMBean.REQUIRING_BUNDLES, BundleUtil.LongArrayFrom(getRequiringBundles()));
-		items.put(BundleStateMBean.REQUIRED_BUNDLES, BundleUtil.LongArrayFrom(getRequiredBundles()));
+		items.put(BundleStateMBean.FRAGMENTS, getFragments());
+		items.put(BundleStateMBean.HOSTS, getHosts());
+		items.put(BundleStateMBean.REQUIRING_BUNDLES, getRequiringBundles());
+		items.put(BundleStateMBean.REQUIRED_BUNDLES, getRequiredBundles());
 		try {
-			return new CompositeDataSupport(BundleStateMBean.BUNDLE_TYPE, items);
+			return new CompositeDataSupport(CustomBundleStateMBean.CUSTOM_BUNDLE_TYPE, items);
 		} catch (OpenDataException e) {
 			throw new IllegalStateException("Cannot form bundle open data", e);
 		}
@@ -443,14 +449,6 @@
 	}
 
 	/**
-	 * @return the list of identifiers of the bundle fragments which use this
-	 *         bundle as a host
-	 */
-	private long[] getFragments() {
-		return  BundleUtil.getBundleFragments(bundle);			
-	}
-
-	/**
 	 * @return the map of headers for this bundle
 	 */
 	private Dictionary<String, String> getHeaders() {
@@ -458,10 +456,22 @@
 	}
 
 	/**
+	 * @return the list of identifiers of the bundle fragments which use this
+	 *         bundle as a host
+	 */
+	private Long[] getFragments() {
+		BundleWiring wiring = bundle.adapt(BundleWiring.class);
+		List<BundleWire> requiredWires = wiring.getRequiredWires(BundleRevision.HOST_NAMESPACE);
+        return bundleWiresToIds(requiredWires);
+	}
+
+	/**
 	 * @return list of identifiers of the bundles which host this fragment
 	 */
-	private long[] getHosts() {
-		return BundleUtil.getBundleHosts(bundle);
+	private Long[] getHosts() {
+		BundleWiring wiring = bundle.adapt(BundleWiring.class);
+		List<BundleWire> providedWires = wiring.getProvidedWires(BundleRevision.HOST_NAMESPACE);
+        return bundleWiresToIds(providedWires);
 	}
 
 	/**
@@ -496,31 +506,35 @@
 	/**
 	 * @return the list of identifiers of the services registered by this bundle
 	 */
-	private long[] getRegisteredServices() {
-		return BundleUtil.serviceIds(bundle.getRegisteredServices());
+	private Long[] getRegisteredServices() {
+		return serviceIds(bundle.getRegisteredServices());
 	}
-
+	
 	/**
 	 * @return the list of identifiers of bundles required by this bundle
 	 * @throws IOException 
 	 */
-	private long[] getRequiredBundles() throws IOException {
-		return BundleUtil.getRequiredBundles(bundle);
+	private Long[] getRequiredBundles() throws IOException {
+        BundleWiring wiring = bundle.adapt(BundleWiring.class);
+        List<BundleWire> requiredWires = wiring.getRequiredWires(BundleRevision.BUNDLE_NAMESPACE);
+        return bundleWiresToIds(requiredWires);
 	}
 
 	/**
 	 * @return the list of identifiers of bundles which require this bundle
 	 * @throws IOException 
 	 */
-	private long[] getRequiringBundles() throws IOException {
-		return BundleUtil.getRequiringBundles(bundle);
+	private Long[] getRequiringBundles() throws IOException {
+        BundleWiring wiring = bundle.adapt(BundleWiring.class);
+        List<BundleWire> providedWires = wiring.getProvidedWires(BundleRevision.BUNDLE_NAMESPACE);
+        return bundleWiresToIds(providedWires);
 	}
 
 	/**
 	 * @return the list of identifiers of services in use by this bundle
 	 */
-	private long[] getServicesInUse() {
-		return BundleUtil.serviceIds(bundle.getServicesInUse());
+	private Long[] getServicesInUse() {
+		return serviceIds(bundle.getServicesInUse());
 	}
 
 	/**
@@ -585,5 +599,26 @@
 	private boolean isRequired() {
 		return BundleUtil.isRequired(bundle);
 	}
+
+	private Long[] bundleWiresToIds(List<BundleWire> wires){
+        Long[] consumerWirings = new Long[wires.size()];
+        int i = 0;
+        for (BundleWire bundleWire : wires) {
+            consumerWirings[i] = bundleWire.getRequirerWiring().getBundle().getBundleId();
+            i++;
+        }
+        return consumerWirings;
+	}
+	
+	private Long[] serviceIds(ServiceReference<?>[] refs) {
+		if (refs == null) {
+			return new Long[0];
+		}
+		Long[] ids = new Long[refs.length];
+		for (int i = 0; i < refs.length; i++) {
+			ids[i] = (Long) refs[i].getProperty(SERVICE_ID);
+		}
+		return ids;
+	}
 	
 }
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleCapability.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleCapability.java
similarity index 93%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleCapability.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleCapability.java
index df0ee43..98e35e7 100644
--- a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleCapability.java
+++ b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleCapability.java
@@ -20,7 +20,6 @@
 import javax.management.openmbean.TabularDataSupport;
 
 import org.eclipse.gemini.mgmt.framework.CustomBundleWiringStateMBean;
-import org.eclipse.gemini.mgmt.internal.BundleWiringUtil;
 import org.eclipse.gemini.mgmt.internal.OSGiProperties;
 import org.osgi.framework.wiring.BundleCapability;
 
@@ -43,7 +42,7 @@
 			TabularDataSupport tabularDirectives = new TabularDataSupport(CustomBundleWiringStateMBean.DIRECTIVES_TYPE);
 			Map<String, String> directives = bundleCapability.getDirectives();
 			for (Entry<String, String> directive : directives.entrySet()) {
-				tabularDirectives.put(new CompositeDataSupport(CustomBundleWiringStateMBean.PROPERTY_TYPE, BundleWiringUtil.getDirectiveKeyValueItem(directive.getKey(), directive.getValue())));
+				tabularDirectives.put(new CompositeDataSupport(CustomBundleWiringStateMBean.PROPERTY_TYPE, OSGiProperties.getDirectiveKeyValueItem(directive.getKey(), directive.getValue())));
 			}
 			
 			Map<String, Object> items = new HashMap<String, Object>();
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleEvent.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleEvent.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleEvent.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleEvent.java
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleRequirement.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleRequirement.java
similarity index 93%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleRequirement.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleRequirement.java
index c81e258..babe8cc 100644
--- a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleRequirement.java
+++ b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleRequirement.java
@@ -20,7 +20,6 @@
 import javax.management.openmbean.TabularDataSupport;
 
 import org.eclipse.gemini.mgmt.framework.CustomBundleWiringStateMBean;
-import org.eclipse.gemini.mgmt.internal.BundleWiringUtil;
 import org.eclipse.gemini.mgmt.internal.OSGiProperties;
 import org.osgi.framework.wiring.BundleRequirement;
 
@@ -43,7 +42,7 @@
 			TabularDataSupport tabularDirectives = new TabularDataSupport(CustomBundleWiringStateMBean.DIRECTIVES_TYPE);
 			Map<String, String> directives = bundleRequirement.getDirectives();
 			for (Entry<String, String> directive : directives.entrySet()) {
-				tabularDirectives.put(new CompositeDataSupport(CustomBundleWiringStateMBean.PROPERTY_TYPE, BundleWiringUtil.getDirectiveKeyValueItem(directive.getKey(), directive.getValue())));
+				tabularDirectives.put(new CompositeDataSupport(CustomBundleWiringStateMBean.PROPERTY_TYPE, OSGiProperties.getDirectiveKeyValueItem(directive.getKey(), directive.getValue())));
 			}
 			
 			Map<String, Object> items = new HashMap<String, Object>();
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleRevision.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleRevision.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleRevision.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleRevision.java
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleRevisionIdTracker.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleRevisionIdTracker.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleRevisionIdTracker.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleRevisionIdTracker.java
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleWire.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleWire.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleWire.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleWire.java
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleWiring.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleWiring.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleWiring.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiBundleWiring.java
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiPackage.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiPackage.java
similarity index 91%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiPackage.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiPackage.java
index 707514a..a72239f 100644
--- a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiPackage.java
+++ b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiPackage.java
@@ -15,8 +15,6 @@
 
 package org.eclipse.gemini.mgmt.framework.internal;
 
-import static org.eclipse.gemini.mgmt.internal.BundleUtil.LongArrayFrom;
-
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
@@ -64,8 +62,8 @@
  */
 public final class OSGiPackage {
 
-	private long[] exportingBundles;
-	private long[] importingBundles;
+	private Long[] exportingBundles;
+	private Long[] importingBundles;
 	private String name;
 	private boolean removalPending;
 	private String version;
@@ -93,11 +91,11 @@
 	 * @param bundles
 	 * @return the bundle ids of the bundles
 	 */
-	private static long[] bundleIds(Bundle[] bundles) {
+	private static Long[] bundleIds(Bundle[] bundles) {
 		if (bundles == null) {
-			return new long[0];
+			return new Long[0];
 		}
-		long[] ids = new long[bundles.length];
+		Long[] ids = new Long[bundles.length];
 		for (int i = 0; i < bundles.length; i++) {
 			ids[i] = bundles[i].getBundleId();
 		}
@@ -128,8 +126,8 @@
 		items.put(PackageStateMBean.NAME, name);
 		items.put(PackageStateMBean.VERSION, version);
 		items.put(PackageStateMBean.REMOVAL_PENDING, removalPending);
-		items.put(PackageStateMBean.EXPORTING_BUNDLES, LongArrayFrom(exportingBundles));
-		items.put(PackageStateMBean.IMPORTING_BUNDLES, LongArrayFrom(importingBundles));
+		items.put(PackageStateMBean.EXPORTING_BUNDLES, exportingBundles);
+		items.put(PackageStateMBean.IMPORTING_BUNDLES, importingBundles);
 
 		try {
 			return new CompositeDataSupport(PackageStateMBean.PACKAGE_TYPE, items);
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiService.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiService.java
similarity index 87%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiService.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiService.java
index 67ab7ce..9afe179 100644
--- a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiService.java
+++ b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiService.java
@@ -15,7 +15,7 @@
 
 package org.eclipse.gemini.mgmt.framework.internal;
 
-import static org.eclipse.gemini.mgmt.internal.BundleUtil.LongArrayFrom;
+//import static org.eclipse.gemini.mgmt.internal.BundleUtil.LongArrayFrom;
 import static org.osgi.framework.Constants.OBJECTCLASS;
 import static org.osgi.framework.Constants.SERVICE_ID;
 
@@ -33,7 +33,7 @@
 import javax.management.openmbean.TabularData;
 import javax.management.openmbean.TabularDataSupport;
 
-import org.eclipse.gemini.mgmt.internal.ServiceUtil;
+import org.osgi.framework.Bundle;
 import org.osgi.framework.ServiceReference;
 import org.osgi.jmx.Item;
 import org.osgi.jmx.framework.ServiceStateMBean;
@@ -74,7 +74,7 @@
 	
 	private String[] interfaces;
 	
-	private long[] usingBundles;
+	private Long[] usingBundles;
 
 	/**
 	 * Construct an OSGiService from the underlying
@@ -88,9 +88,34 @@
 		this.identifier = (Long) reference.getProperty(SERVICE_ID);
 		this.interfaces = (String[]) reference.getProperty(OBJECTCLASS);
 		this.bundle = reference.getBundle().getBundleId();
-		this.usingBundles = ServiceUtil.getBundlesUsing(reference);
+		this.usingBundles = longArrayFrom(OSGiService.getBundlesUsing(reference));
 	}
 
+	private Long[] longArrayFrom(long[] array) {
+		if (array == null) {
+			return new Long[0];
+		}
+		Long[] result = new Long[array.length];
+		for (int i = 0; i < array.length; i++) {
+			result[i] = array[i];
+		}
+		return result;
+	}
+	
+	/**
+	 * 
+	 * @param serviceRef
+	 * @return
+	 */
+	public static long[] getBundlesUsing(ServiceReference<?> serviceRef) {
+		Bundle[] bundles = serviceRef.getUsingBundles();
+		long[] ids = new long[bundles.length];
+		for (int i = 0; i < bundles.length; i++) {
+			ids[i] = bundles[i].getBundleId();
+		}
+		return ids;
+	}
+	
 	/**
 	 * Construct the TabularData representing a list of services
 	 * 
@@ -152,7 +177,7 @@
 		items.put(ServiceStateMBean.IDENTIFIER, identifier);
 		items.put(ServiceStateMBean.OBJECT_CLASS, interfaces);
 		items.put(ServiceStateMBean.BUNDLE_IDENTIFIER, bundle);
-		items.put(ServiceStateMBean.USING_BUNDLES, LongArrayFrom(usingBundles));
+		items.put(ServiceStateMBean.USING_BUNDLES, usingBundles);
 
 		try {
 			return new CompositeDataSupport(ServiceStateMBean.SERVICE_TYPE, items);
@@ -178,7 +203,7 @@
 			items.put(ServiceStateMBean.BUNDLE_IDENTIFIER, bundle);
 		}
 		if(serviceTypes.contains(ServiceStateMBean.USING_BUNDLES)){
-			items.put(ServiceStateMBean.USING_BUNDLES, LongArrayFrom(usingBundles));
+			items.put(ServiceStateMBean.USING_BUNDLES, usingBundles);
 		}
 		try {
 			return new CompositeDataSupport(ServiceStateMBean.SERVICE_TYPE, items);
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiServiceEvent.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiServiceEvent.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/OSGiServiceEvent.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/framework/internal/OSGiServiceEvent.java
diff --git a/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/internal/BundleUtil.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/internal/BundleUtil.java
new file mode 100644
index 0000000..2998511
--- /dev/null
+++ b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/internal/BundleUtil.java
@@ -0,0 +1,171 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Oracle.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Apache License v2.0 which accompanies this distribution. 
+ * The Eclipse Public License is available at
+ *     http://www.eclipse.org/legal/epl-v10.html
+ * and the Apache License v2.0 is available at 
+ *     http://www.opensource.org/licenses/apache2.0.php.
+ * You may elect to redistribute this code under either of these licenses.
+ *
+ * Contributors:
+ *     Hal Hildebrand - Initial JMX support 
+ ******************************************************************************/
+
+package org.eclipse.gemini.mgmt.internal;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.framework.startlevel.BundleStartLevel;
+import org.osgi.framework.wiring.BundleRevision;
+import org.osgi.framework.wiring.BundleWire;
+import org.osgi.framework.wiring.BundleWiring;
+
+/**
+ * Static utilities
+ * 
+ */
+public final class BundleUtil {
+	
+	/**
+	 * Answer the string representation of the exported packages of the bundle
+	 * 
+	 * @param b
+	 * @param admin
+	 * @return the string representation of the exported packages of the bundle
+	 */
+	public static String[] getBundleExportedPackages(Bundle bundle) {
+		BundleWiring wiring = bundle.adapt(BundleWiring.class);
+		List<BundleWire> providedWires = wiring.getProvidedWires(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));
+        	if(!packages.contains(packageName)){
+        		packages.add(packageName);
+        	}
+        }
+        return packages.toArray(new String[packages.size()]);
+	}
+
+	/**
+	 * Answer the string representation of the packages imported by a bundle
+	 * 
+	 * @param b
+	 * @param bundleContext
+	 * @param admin
+	 * @return the string representation of the packages imported by a bundle
+	 */
+	public static String[] getBundleImportedPackages(Bundle bundle) {
+		BundleWiring wiring = bundle.adapt(BundleWiring.class);
+		List<BundleWire> providedWires = 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));
+            if(!packages.contains(packageName)){
+                packages.add(packageName);
+            }
+        }
+        return packages.toArray(new String[packages.size()]);
+	}
+
+	/**
+	 * Answer the string representation of the bundle state
+	 * 
+	 * @param b
+	 * @return the string representation of the bundle state
+	 */
+	public static String getBundleState(Bundle b) {
+		switch (b.getState()) {
+			case Bundle.ACTIVE:
+				return "ACTIVE";
+			case Bundle.INSTALLED:
+				return "INSTALLED";
+			case Bundle.RESOLVED:
+				return "RESOLVED";
+			case Bundle.STARTING:
+				return "STARTING";
+			case Bundle.STOPPING:
+				return "STOPPING";
+			case Bundle.UNINSTALLED:
+				return "UNINSTALLED";
+			default:
+				return "UNKNOWN";
+		}
+	}
+
+	/**
+	 * Answer true if the bundle is a fragment
+	 * 
+	 * @param bundle
+	 * @param admin
+	 * @return true if the bundle is a fragment
+	 */
+	public static boolean isBundleFragment(Bundle bundle) {
+		BundleWiring wiring = bundle.adapt(BundleWiring.class);
+		return 0 != (wiring.getRevision().getTypes() & BundleRevision.TYPE_FRAGMENT);
+	}
+
+	/**
+	 * Return the start level for the given bundle
+	 * 
+	 * @param bundle
+	 * @return
+	 */
+	public static int getBundleStartLevel(Bundle bundle) {
+		BundleStartLevel startLevel = bundle.adapt(BundleStartLevel.class);
+		return startLevel.getStartLevel();
+	}
+	
+	/**
+	 * Answer true if the bundle has been persitently started
+	 * 
+	 * @param bundle
+	 * @param sl
+	 * @return true if the bundle has been persitently started
+	 */
+	public static boolean isBundlePersistentlyStarted(Bundle bundle) {
+		BundleStartLevel startLevel = bundle.adapt(BundleStartLevel.class);
+		return startLevel.isPersistentlyStarted();
+	}
+	
+	/**
+	 * Answer true if the bundle has been persitently started
+	 * 
+	 * @param bundle
+	 * @param sl
+	 * @return true if the bundle has been persitently started
+	 */
+	public static boolean isBundleActivationPolicyUsed(Bundle bundle) {
+		BundleStartLevel startLevel = bundle.adapt(BundleStartLevel.class);
+		return startLevel.isActivationPolicyUsed();
+	}
+
+	/**
+	 * Answer true if the bundle is required
+	 * 
+	 * @param bundle
+	 * @param bc
+	 * @return true if the bundle is required
+	 */
+	public static boolean isRequired(Bundle bundle) {
+		BundleWiring wiring = bundle.adapt(BundleWiring.class);
+		return wiring.getProvidedWires(BundleRevision.BUNDLE_NAMESPACE).size() > 0;
+	}
+
+	/**
+	 * Answer true if the bundle is pending removal
+	 * 
+	 * @param bundle
+	 * @param bc
+	 * @return true if the bundle is pending removal
+	 */
+	public static boolean isRemovalPending(Bundle bundle) {
+        BundleWiring wiring = bundle.adapt(BundleWiring.class);
+        return (!wiring.isCurrent()) && wiring.isInUse();
+	}
+
+}
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/internal/OSGiProperties.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/internal/OSGiProperties.java
similarity index 74%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/internal/OSGiProperties.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/internal/OSGiProperties.java
index 771edb5..59dcfda 100644
--- a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/internal/OSGiProperties.java
+++ b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/internal/OSGiProperties.java
@@ -11,6 +11,7 @@
  *
  * Contributors:
  *     Hal Hildebrand - Initial JMX support 
+ *     Christopher Frost - Refactoring for Spec updates
  ******************************************************************************/
 
 package org.eclipse.gemini.mgmt.internal;
@@ -18,14 +19,15 @@
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Dictionary;
 import java.util.Enumeration;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Hashtable;
+import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.Vector;
 
@@ -35,6 +37,7 @@
 import javax.management.openmbean.TabularData;
 import javax.management.openmbean.TabularDataSupport;
 
+import org.eclipse.gemini.mgmt.framework.CustomBundleWiringStateMBean;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.Version;
 import org.osgi.jmx.JmxConstants;
@@ -86,38 +89,36 @@
  * The
  */
 public final class OSGiProperties {
-
+	
+	private static final String VERSION = "Version";
+	
 	/**
 	 * The scalar type
 	 */
-	private static final Set<String> SCALAR_TYPES = new HashSet<String>();
+	private static final List<String> SCALAR_TYPES = Collections.unmodifiableList(Arrays.asList(
+		JmxConstants.STRING,
+		JmxConstants.INTEGER,
+		JmxConstants.LONG,
+		JmxConstants.FLOAT,
+		JmxConstants.DOUBLE,
+		JmxConstants.BYTE,
+		JmxConstants.SHORT,
+		JmxConstants.CHARACTER,
+		JmxConstants.BOOLEAN,
+		JmxConstants.BIGDECIMAL,
+		JmxConstants.BIGINTEGER));
+	
 	/**
 	 * The primitive types
 	 */
-	private static final Set<String> PRIMITIVE_TYPES = new HashSet<String>();
-
-	static {
-		SCALAR_TYPES.add("String");
-		SCALAR_TYPES.add("Integer");
-		SCALAR_TYPES.add("Long");
-		SCALAR_TYPES.add("Float");
-		SCALAR_TYPES.add("Double");
-		SCALAR_TYPES.add("Byte");
-		SCALAR_TYPES.add("Short");
-		SCALAR_TYPES.add("Character");
-		SCALAR_TYPES.add("Boolean");
-		SCALAR_TYPES.add("BigDecimal");
-		SCALAR_TYPES.add("BigInteger");
-
-		PRIMITIVE_TYPES.add("int");
-		PRIMITIVE_TYPES.add("long");
-		PRIMITIVE_TYPES.add("float");
-		PRIMITIVE_TYPES.add("double");
-		PRIMITIVE_TYPES.add("byte");
-		PRIMITIVE_TYPES.add("short");
-		PRIMITIVE_TYPES.add("char");
-		PRIMITIVE_TYPES.add("boolean");
-	}
+	private static final List<String> PRIMITIVE_TYPES = Collections.unmodifiableList(Arrays.asList(
+		JmxConstants.P_BYTE,
+		JmxConstants.P_CHAR,
+		JmxConstants.P_SHORT,
+		JmxConstants.P_INT,
+		JmxConstants.P_LONG,
+		JmxConstants.P_DOUBLE,
+		JmxConstants.P_FLOAT));
 	
 	/**
 	 * Answer the tabular data representation of the properties dictionary
@@ -160,7 +161,6 @@
 	 */
 	public static CompositeData encode(String key, Object value) {
 		Class<?> clazz = value.getClass();
-
 		if (clazz.isArray()) {
 			return encodeArray(key, value, clazz.getComponentType());
 		} else if (clazz.equals(Vector.class)) {
@@ -176,7 +176,7 @@
 	 * @return the hashtable represented by the tabular data
 	 */
 	@SuppressWarnings("unchecked")
-	public static Hashtable<String, Object> propertiesFrom(TabularData table) {
+	public static Dictionary<String, Object> propertiesFrom(TabularData table) {
 		Hashtable<String, Object> props = new Hashtable<String, Object>();
 		if (table == null) {
 			return props;
@@ -184,10 +184,23 @@
 		for (CompositeData data : (Collection<CompositeData>) table.values()) {
 			props.put((String) data.get(JmxConstants.KEY), parse((String) data.get(JmxConstants.VALUE), (String) data.get(JmxConstants.TYPE)));
 		}
-
 		return props;
 	}
-
+	
+	/**
+	 * Convert a key-value directive in to the required format for representation over JMX
+	 * 
+	 * @param key
+	 * @param value
+	 * @return a map of key to the key and value to the value
+	 */
+	public static Map<String, ?> getDirectiveKeyValueItem(String key, Object value){
+		Map<String, Object> items = new HashMap<String, Object>();
+		items.put(CustomBundleWiringStateMBean.KEY, key);
+		items.put(CustomBundleWiringStateMBean.VALUE, value);
+		return items;
+	}
+	
 	/**
 	 * Encode the array as composite data
 	 * 
@@ -197,7 +210,6 @@
 	 * @return the composite data representation
 	 */
 	private static CompositeData encodeArray(String key, Object value, Class<?> componentClazz) {
-		String type = typeOf(componentClazz);
 		StringBuffer buf = new StringBuffer();
 		if (Integer.TYPE.equals(componentClazz)) {
 			int[] array = (int[]) value;
@@ -223,6 +235,14 @@
 					buf.append(',');
 				}
 			}
+		} else if (Float.TYPE.equals(componentClazz)) {
+			float[] array = (float[]) value;
+			for (int i = 0; i < array.length; i++) {
+				buf.append(array[i]);
+				if (i < array.length - 1) {
+					buf.append(',');
+				}
+			}
 		} else if (Byte.TYPE.equals(componentClazz)) {
 			byte[] array = (byte[]) value;
 			for (int i = 0; i < array.length; i++) {
@@ -264,6 +284,7 @@
 				}
 			}
 		}
+		String type = typeOf(componentClazz);
 		return propertyData(key, buf.toString(), "Array of " + type);
 	}
 
@@ -275,7 +296,7 @@
 	 * @return the composite data representation
 	 */
 	private static CompositeData encodeVector(String key, Vector<?> value) {
-		String type = "String";
+		String type = JmxConstants.STRING;
 		if (value.size() > 0) {
 			type = typeOf(value.get(0).getClass());
 		}
@@ -288,7 +309,7 @@
 		}
 		return propertyData(key, buf.toString(), "Vector of " + type);
 	}
-
+	
 	/**
 	 * Answer the string type of the class
 	 * 
@@ -296,59 +317,65 @@
 	 * @return the string type of the class
 	 */
 	private static String typeOf(Class<?> clazz) {
-		if (clazz.equals(Version.class)) {
-			return "Version";
-		}
 		if (clazz.equals(String.class)) {
-			return "String";
+			return JmxConstants.STRING;
+		}
+		if (clazz.equals(Version.class)) {
+			return VERSION;
 		}
 		if (clazz.equals(Integer.class)) {
-			return "Integer";
+			return JmxConstants.INTEGER;
 		}
 		if (clazz.equals(Long.class)) {
-			return "Long";
+			return JmxConstants.LONG;
 		}
 		if (clazz.equals(Double.class)) {
-			return "Double";
+			return JmxConstants.DOUBLE;
+		}
+		if (clazz.equals(Double.class)) {
+			return JmxConstants.FLOAT;
 		}
 		if (clazz.equals(Byte.class)) {
-			return "Byte";
+			return JmxConstants.BYTE;
 		}
 		if (clazz.equals(Short.class)) {
-			return "Short";
+			return JmxConstants.SHORT;
 		}
 		if (clazz.equals(Character.class)) {
-			return "Character";
+			return JmxConstants.CHARACTER;
 		}
 		if (clazz.equals(Boolean.class)) {
-			return "Boolean";
+			return JmxConstants.BOOLEAN;
 		}
 		if (clazz.equals(BigDecimal.class)) {
-			return "BigDecimal";
+			return JmxConstants.BIGDECIMAL;
 		}
 		if (clazz.equals(BigInteger.class)) {
-			return "BigInteger";
+			return JmxConstants.BIGINTEGER;
 		}
 		if (clazz.equals(Integer.TYPE)) {
-			return "int";
+			return JmxConstants.P_INT;
 		}
 		if (clazz.equals(Long.TYPE)) {
-			return "long";
+			return JmxConstants.P_LONG;
 		}
 		if (clazz.equals(Double.TYPE)) {
-			return "double";
+			return JmxConstants.P_DOUBLE;
+		}
+		if (clazz.equals(Double.TYPE)) {
+			return JmxConstants.P_FLOAT;
 		}
 		if (clazz.equals(Byte.TYPE)) {
-			return "byte";
+			return JmxConstants.P_BYTE;
 		}
 		if (clazz.equals(Short.TYPE)) {
-			return "short";
+			return JmxConstants.P_SHORT;
 		}
 		if (clazz.equals(Character.TYPE)) {
-			return "char";
+			return JmxConstants.P_CHAR;
 		}
 		if (clazz.equals(Boolean.TYPE)) {
-			return "boolean";
+			return JmxConstants.P_BOOLEAN;
 		}
 		throw new IllegalArgumentException("Illegal type: " + clazz);
 	}
@@ -392,8 +419,8 @@
 		if ("Vector".equals(token)) {
 			return parseVector(value, tokens);
 		}
-		if (SCALAR_TYPES.contains(token)) {
-			return parseScalar(value, token);
+		if (SCALAR_TYPES.contains(token) || PRIMITIVE_TYPES.contains(token)) {
+			return parseValue(value, token);
 		}
 		throw new IllegalArgumentException("Unknown type: " + type);
 	}
@@ -426,131 +453,6 @@
 	}
 
 	/**
-	 * Parse the array represented by the string value
-	 * 
-	 * @param value
-	 * @param type
-	 * @return the array represented by the string value
-	 */
-	private static Object parseScalarArray(String value, String type) {
-		ArrayList<Object> array = new ArrayList<Object>();
-		StringTokenizer values = new StringTokenizer(value, ",");
-		while (values.hasMoreTokens()) {
-			array.add(parseScalar(values.nextToken().trim(), type));
-		}
-		return array.toArray(createScalarArray(type, array.size()));
-	}
-
-	/**
-	 * Create the scalar array from the supplied type
-	 * 
-	 * @param type
-	 * @param size
-	 * @return the scalar array from the supplied type
-	 */
-	private static Object[] createScalarArray(String type, int size) {
-		if ("String".equals(type)) {
-			return new String[size];
-		}
-		if ("Integer".equals(type)) {
-			return new Integer[size];
-		}
-		if ("Long".equals(type)) {
-			return new Long[size];
-		}
-		if ("Double".equals(type)) {
-			return new Double[size];
-		}
-		if ("Byte".equals(type)) {
-			return new Byte[size];
-		}
-		if ("Short".equals(type)) {
-			return new Short[size];
-		}
-		if ("Character".equals(type)) {
-			return new Character[size];
-		}
-		if ("Boolean".equals(type)) {
-			return new Boolean[size];
-		}
-		if ("BigDecimal".equals(type)) {
-			return new BigDecimal[size];
-		}
-		if ("BigInteger".equals(type)) {
-			return new BigInteger[size];
-		}
-		throw new IllegalArgumentException("Unknown scalar type: " + type);
-	}
-
-	/**
-	 * Parse the array from the supplied values
-	 * 
-	 * @param value
-	 * @param type
-	 * @return the array from the supplied values
-	 */
-	private static Object parsePrimitiveArray(String value, String type) {
-		StringTokenizer values = new StringTokenizer(value, ",");
-		if ("int".equals(type)) {
-			int[] array = new int[values.countTokens()];
-			int i = 0;
-			while (values.hasMoreTokens()) {
-				array[i++] = Integer.parseInt(values.nextToken().trim());
-			}
-			return array;
-		}
-		if ("long".equals(type)) {
-			long[] array = new long[values.countTokens()];
-			int i = 0;
-			while (values.hasMoreTokens()) {
-				array[i++] = Long.parseLong(values.nextToken().trim());
-			}
-			return array;
-		}
-		if ("double".equals(type)) {
-			double[] array = new double[values.countTokens()];
-			int i = 0;
-			while (values.hasMoreTokens()) {
-				array[i++] = Double.parseDouble(values.nextToken().trim());
-			}
-			return array;
-		}
-		if ("byte".equals(type)) {
-			byte[] array = new byte[values.countTokens()];
-			int i = 0;
-			while (values.hasMoreTokens()) {
-				array[i++] = Byte.parseByte(values.nextToken().trim());
-			}
-			return array;
-		}
-		if ("short".equals(type)) {
-			short[] array = new short[values.countTokens()];
-			int i = 0;
-			while (values.hasMoreTokens()) {
-				array[i++] = Short.parseShort(values.nextToken().trim());
-			}
-			return array;
-		}
-		if ("char".equals(type)) {
-			char[] array = new char[values.countTokens()];
-			int i = 0;
-			while (values.hasMoreTokens()) {
-				array[i++] = values.nextToken().trim().charAt(0);
-			}
-			return array;
-		}
-		if ("boolean".equals(type)) {
-			boolean[] array = new boolean[values.countTokens()];
-			int i = 0;
-			while (values.hasMoreTokens()) {
-				array[i++] = Boolean.parseBoolean(values.nextToken().trim());
-			}
-			return array;
-		}
-		throw new IllegalArgumentException("Unknown primitive type: " + type);
-	}
-
-	/**
 	 * Parse the vector represented by the supplied string value
 	 * 
 	 * @param value
@@ -580,6 +482,145 @@
 	}
 
 	/**
+	 * Parse the array represented by the string value
+	 * 
+	 * @param value
+	 * @param type
+	 * @return the array represented by the string value
+	 */
+	private static Object[] parseScalarArray(String value, String type) {
+		ArrayList<Object> array = new ArrayList<Object>();
+		StringTokenizer values = new StringTokenizer(value, ",");
+		while (values.hasMoreTokens()) {
+			array.add(parseScalar(values.nextToken().trim(), type));
+		}
+		return array.toArray(createScalarArray(type, array.size()));
+	}
+
+	/**
+	 * Parse the array from the supplied values
+	 * 
+	 * @param value
+	 * @param type
+	 * @return the array from the supplied values
+	 */
+	private static Object parsePrimitiveArray(String value, String type) {
+		StringTokenizer values = new StringTokenizer(value, ",");
+		if (JmxConstants.P_INT.equals(type)) {
+			int[] array = new int[values.countTokens()];
+			int i = 0;
+			while (values.hasMoreTokens()) {
+				array[i++] = Integer.parseInt(values.nextToken().trim());
+			}
+			return array;
+		}
+		if (JmxConstants.P_LONG.equals(type)) {
+			long[] array = new long[values.countTokens()];
+			int i = 0;
+			while (values.hasMoreTokens()) {
+				array[i++] = Long.parseLong(values.nextToken().trim());
+			}
+			return array;
+		}
+		if (JmxConstants.P_DOUBLE.equals(type)) {
+			double[] array = new double[values.countTokens()];
+			int i = 0;
+			while (values.hasMoreTokens()) {
+				array[i++] = Double.parseDouble(values.nextToken().trim());
+			}
+			return array;
+		}
+		if (JmxConstants.P_FLOAT.equals(type)) {
+			float[] array = new float[values.countTokens()];
+			int i = 0;
+			while (values.hasMoreTokens()) {
+				array[i++] = Float.parseFloat(values.nextToken().trim());
+			}
+			return array;
+		}
+		if (JmxConstants.P_BYTE.equals(type)) {
+			byte[] array = new byte[values.countTokens()];
+			int i = 0;
+			while (values.hasMoreTokens()) {
+				array[i++] = Byte.parseByte(values.nextToken().trim());
+			}
+			return array;
+		}
+		if (JmxConstants.P_SHORT.equals(type)) {
+			short[] array = new short[values.countTokens()];
+			int i = 0;
+			while (values.hasMoreTokens()) {
+				array[i++] = Short.parseShort(values.nextToken().trim());
+			}
+			return array;
+		}
+		if (JmxConstants.P_CHAR.equals(type)) {
+			char[] array = new char[values.countTokens()];
+			int i = 0;
+			while (values.hasMoreTokens()) {
+				array[i++] = values.nextToken().trim().charAt(0);
+			}
+			return array;
+		}
+		if (JmxConstants.P_BOOLEAN.equals(type)) {
+			boolean[] array = new boolean[values.countTokens()];
+			int i = 0;
+			while (values.hasMoreTokens()) {
+				array[i++] = Boolean.parseBoolean(values.nextToken().trim());
+			}
+			return array;
+		}
+		throw new IllegalArgumentException("Unknown primitive type: " + type);
+	}
+	
+	/**
+	 * Create the scalar array from the supplied type
+	 * 
+	 * @param type
+	 * @param size
+	 * @return the scalar array from the supplied type
+	 */
+	private static Object[] createScalarArray(String type, int size) {
+		if (JmxConstants.STRING.equals(type)) {
+			return new String[size];
+		}
+		if (VERSION.equals(type)) {
+			return new Version[size];
+		}
+		if (JmxConstants.INTEGER.equals(type)) {
+			return new Integer[size];
+		}
+		if (JmxConstants.LONG.equals(type)) {
+			return new Long[size];
+		}
+		if (JmxConstants.DOUBLE.equals(type)) {
+			return new Double[size];
+		}
+		if (JmxConstants.FLOAT.equals(type)) {
+			return new Float[size];
+		}
+		if (JmxConstants.BYTE.equals(type)) {
+			return new Byte[size];
+		}
+		if (JmxConstants.SHORT.equals(type)) {
+			return new Short[size];
+		}
+		if (JmxConstants.CHARACTER.equals(type)) {
+			return new Character[size];
+		}
+		if (JmxConstants.BOOLEAN.equals(type)) {
+			return new Boolean[size];
+		}
+		if (JmxConstants.BIGDECIMAL.equals(type)) {
+			return new BigDecimal[size];
+		}
+		if (JmxConstants.BIGINTEGER.equals(type)) {
+			return new BigInteger[size];
+		}
+		throw new IllegalArgumentException("Unknown scalar type: " + type);
+	}
+
+	/**
 	 * Construct the scalar value represented by the string
 	 * 
 	 * @param value
@@ -587,37 +628,82 @@
 	 * @return the scalar value represented by the string
 	 */
 	private static Object parseScalar(String value, String type) {
-		if ("String".equals(type)) {
+		if (JmxConstants.STRING.equals(type)) {
 			return value;
 		}
-		if ("Integer".equals(type)) {
+		if (VERSION.equals(type)) {
+			return Version.parseVersion(value);
+		}
+		if (JmxConstants.INTEGER.equals(type)) {
 			return Integer.parseInt(value);
 		}
-		if ("Long".equals(type)) {
+		if (JmxConstants.LONG.equals(type)) {
 			return Long.parseLong(value);
 		}
-		if ("Double".equals(type)) {
+		if (JmxConstants.DOUBLE.equals(type)) {
 			return Double.parseDouble(value);
 		}
-		if ("Byte".equals(type)) {
+		if (JmxConstants.FLOAT.equals(type)) {
+			return Float.parseFloat(value);
+		}
+		if (JmxConstants.BYTE.equals(type)) {
 			return Byte.parseByte(value);
 		}
-		if ("Short".equals(type)) {
+		if (JmxConstants.SHORT.equals(type)) {
 			return Short.parseShort(value);
 		}
-		if ("Character".equals(type)) {
+		if (JmxConstants.CHARACTER.equals(type)) {
 			return value.charAt(0);
 		}
-		if ("Boolean".equals(type)) {
+		if (JmxConstants.BOOLEAN.equals(type)) {
 			return Boolean.parseBoolean(value);
 		}
-		if ("BigDecimal".equals(type)) {
+		if (JmxConstants.BIGDECIMAL.equals(type)) {
 			return new BigDecimal(value);
 		}
-		if ("BigInteger".equals(type)) {
+		if (JmxConstants.BIGINTEGER.equals(type)) {
 			return new BigInteger(value);
 		}
 		throw new IllegalArgumentException("Unknown scalar type: " + type);
 	}
 
+	/**
+	 * Construct the scalar value represented by the string
+	 * 
+	 * @param value
+	 * @param type
+	 * @return the scalar value represented by the string
+	 */
+	private static Object parseValue(String value, String type) {
+		try{
+			return parseScalar(value, type);
+		}catch (IllegalArgumentException e) {
+			if (JmxConstants.P_INT.equals(type)) {
+				return Integer.parseInt(value);
+			}
+			if (JmxConstants.P_LONG.equals(type)) {
+				return Long.parseLong(value);
+			}
+			if (JmxConstants.P_DOUBLE.equals(type)) {
+				return Double.parseDouble(value);
+			}
+			if (JmxConstants.P_FLOAT.equals(type)) {
+				return Float.parseFloat(value);
+			}
+			if (JmxConstants.P_BYTE.equals(type)) {
+				return Byte.parseByte(value);
+			}
+			if (JmxConstants.P_SHORT.equals(type)) {
+				return Short.parseShort(value);
+			}
+			if (JmxConstants.P_CHAR.equals(type)) {
+				return value.charAt(0);
+			}
+			if (JmxConstants.P_BOOLEAN.equals(type)) {
+				return Boolean.parseBoolean(value);
+			}
+			throw new IllegalArgumentException("Unknown scalar type: " + type);
+		}
+	}
+	
 }
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/permissionadmin/PermissionManager.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/permissionadmin/PermissionManager.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/permissionadmin/PermissionManager.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/permissionadmin/PermissionManager.java
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/provisioning/Provisioning.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/provisioning/Provisioning.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/provisioning/Provisioning.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/provisioning/Provisioning.java
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/useradmin/UserManager.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/useradmin/UserManager.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/useradmin/UserManager.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/useradmin/UserManager.java
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/useradmin/internal/OSGiAuthorization.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/useradmin/internal/OSGiAuthorization.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/useradmin/internal/OSGiAuthorization.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/useradmin/internal/OSGiAuthorization.java
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/useradmin/internal/OSGiGroup.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/useradmin/internal/OSGiGroup.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/useradmin/internal/OSGiGroup.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/useradmin/internal/OSGiGroup.java
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/useradmin/internal/OSGiRole.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/useradmin/internal/OSGiRole.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/useradmin/internal/OSGiRole.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/useradmin/internal/OSGiRole.java
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/useradmin/internal/OSGiUser.java b/org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/useradmin/internal/OSGiUser.java
similarity index 100%
rename from org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/useradmin/internal/OSGiUser.java
rename to org.eclipse.gemini.mgmt/src/main/java/org/eclipse/gemini/mgmt/useradmin/internal/OSGiUser.java
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/BundleBatchResult.java b/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/BundleBatchResult.java
deleted file mode 100644
index 84fc9cb..0000000
--- a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/framework/internal/BundleBatchResult.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Oracle.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * and Apache License v2.0 which accompanies this distribution. 
- * The Eclipse Public License is available at
- *     http://www.eclipse.org/legal/epl-v10.html
- * and the Apache License v2.0 is available at 
- *     http://www.opensource.org/licenses/apache2.0.php.
- * You may elect to redistribute this code under either of these licenses.
- *
- * Contributors:
- *     Hal Hildebrand - Initial JMX support 
- ******************************************************************************/
-
-package org.eclipse.gemini.mgmt.framework.internal;
-
-/**
- * Abstract supertype to represent the result of an operation on multiple bundles. 
- * The bundles are identified by their id.
- */
-abstract public class BundleBatchResult {
-
-	/**
-	 * The list of bundles successfully completed
-	 */
-	protected long[] completed;
-	/**
-	 * The error message of a failed result
-	 */
-	protected String errorMessage;
-	/**
-	 * True if the action completed without error
-	 */
-	protected boolean success = true;
-	
-	/**
-	 * Answer the list of bundle identifiers that successfully completed the
-	 * batch operation. If the operation was unsuccessful, this will be a
-	 * partial list. If this operation was successful, this will be the full
-	 * list of bundle ids. This list corresponds one to one with the supplied
-	 * list of bundle locations provided to the batch install operations.
-	 * 
-	 * @return the list of identifiers of the bundles that successfully
-	 *         installed
-	 */
-	public long[] getCompleted() {
-		return completed;
-	}
-
-	/**
-	 * Answer the error message indicating the error that occurred during the
-	 * batch operation or null if the operation was successful
-	 * 
-	 * @return the String error message if the operation was unsuccessful, or
-	 *         null if the operation was successful
-	 */
-	public String getErrorMessage() {
-		return errorMessage;
-	}
-
-	/**
-	 * Answer true if the batch operation was successful, false otherwise.
-	 * 
-	 * @return the success of the batch operation
-	 */
-	public boolean isSuccess() {
-		return success;
-	}
-
-}
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/internal/BundleUtil.java b/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/internal/BundleUtil.java
deleted file mode 100644
index 024990e..0000000
--- a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/internal/BundleUtil.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Oracle.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * and Apache License v2.0 which accompanies this distribution. 
- * The Eclipse Public License is available at
- *     http://www.eclipse.org/legal/epl-v10.html
- * and the Apache License v2.0 is available at 
- *     http://www.opensource.org/licenses/apache2.0.php.
- * You may elect to redistribute this code under either of these licenses.
- *
- * Contributors:
- *     Hal Hildebrand - Initial JMX support 
- ******************************************************************************/
-
-package org.eclipse.gemini.mgmt.internal;
-
-import static org.osgi.framework.Constants.SERVICE_ID;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.Constants;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.startlevel.BundleStartLevel;
-import org.osgi.framework.wiring.BundleRevision;
-import org.osgi.framework.wiring.BundleWire;
-import org.osgi.framework.wiring.BundleWiring;
-
-/**
- * Static utilities
- * 
- */
-public final class BundleUtil {
-
-	/**
-	 * 
-	 * @param bundleId
-	 * @param bundleContext
-	 * @return
-	 * @throws IOException
-	 */
-    public static long[] getRequiredBundles(Bundle bundle) {
-        BundleWiring wiring = bundle.adapt(BundleWiring.class);
-        List<BundleWire> consumedWires = wiring.getRequiredWires(BundleRevision.BUNDLE_NAMESPACE);
-        long[] providerWires = new long[consumedWires.size()];
-        int i = 0;
-        for (BundleWire bundleWire : consumedWires) {
-            providerWires[i] = bundleWire.getProviderWiring().getBundle().getBundleId();
-        }
-        return providerWires;
-    }
-
-    /**
-     * 
-     * @param bundleId
-     * @param bundleContext
-     * @return
-     * @throws IOException
-     */
-    public static long[] getRequiringBundles(Bundle bundle) {
-        BundleWiring wiring = bundle.adapt(BundleWiring.class);
-        List<BundleWire> providedWirings = wiring.getProvidedWires(BundleRevision.BUNDLE_NAMESPACE);
-        long[] consumerWirings = new long[providedWirings.size()];
-        int i = 0;
-        for (BundleWire bundleWire : providedWirings) {
-            consumerWirings[i] = bundleWire.getRequirerWiring().getBundle().getBundleId();
-        }
-        return consumerWirings;
-    }
-	
-	/**
-	 * Answer the string representation of the exported packages of the bundle
-	 * 
-	 * @param b
-	 * @param admin
-	 * @return the string representation of the exported packages of the bundle
-	 */
-	public static String[] getBundleExportedPackages(Bundle bundle) {
-		BundleWiring wiring = bundle.adapt(BundleWiring.class);
-		List<BundleWire> providedWires = wiring.getProvidedWires(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));
-        	if(!packages.contains(packageName)){
-        		packages.add(packageName);
-        	}
-        }
-        return packages.toArray(new String[packages.size()]);
-	}
-
-	/**
-	 * Answer the ids of the fragments hosted by the bundle
-	 * 
-	 * @param bundle
-	 * @param admin
-	 * @return the ids of the fragments hosted by the bundle
-	 */
-	public static long[] getBundleFragments(Bundle bundle) {
-		BundleWiring wiring = bundle.adapt(BundleWiring.class);
-		List<BundleWire> consumedWires = wiring.getRequiredWires(BundleRevision.HOST_NAMESPACE);
-        long[] providerWires = new long[consumedWires.size()];
-        int i = 0;
-        for (BundleWire bundleWire : consumedWires) {
-            providerWires[i] = bundleWire.getProviderWiring().getBundle().getBundleId();
-        }
-        return providerWires;
-	}
-
-	/**
-	 * Answer the ids of the hosts this fragment is attached to
-	 * 
-	 * @param bundle
-	 * @param admin
-	 * @return the ids of the hosts this fragment is attached to
-	 */
-	public static long[] getBundleHosts(Bundle bundle) {
-		BundleWiring wiring = bundle.adapt(BundleWiring.class);
-		List<BundleWire> consumedWires = wiring.getProvidedWires(BundleRevision.HOST_NAMESPACE);
-        long[] providerWires = new long[consumedWires.size()];
-        int i = 0;
-        for (BundleWire bundleWire : consumedWires) {
-            providerWires[i] = bundleWire.getRequirerWiring().getBundle().getBundleId();
-        }
-        return providerWires;
-	}
-
-	/**
-	 * Answer the string representation of the packages imported by a bundle
-	 * 
-	 * @param b
-	 * @param bundleContext
-	 * @param admin
-	 * @return the string representation of the packages imported by a bundle
-	 */
-	public static String[] getBundleImportedPackages(Bundle bundle) {
-		BundleWiring wiring = bundle.adapt(BundleWiring.class);
-		List<BundleWire> providedWires = 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));
-            if(!packages.contains(packageName)){
-                packages.add(packageName);
-            }
-        }
-        return packages.toArray(new String[packages.size()]);
-	}
-
-	/**
-	 * Answer the string representation of the bundle state
-	 * 
-	 * @param b
-	 * @return the string representation of the bundle state
-	 */
-	public static String getBundleState(Bundle b) {
-		switch (b.getState()) {
-		case Bundle.ACTIVE:
-			return "ACTIVE";
-		case Bundle.INSTALLED:
-			return "INSTALLED";
-		case Bundle.RESOLVED:
-			return "RESOLVED";
-		case Bundle.STARTING:
-			return "STARTING";
-		case Bundle.STOPPING:
-			return "STOPPING";
-		case Bundle.UNINSTALLED:
-			return "UNINSTALLED";
-		default:
-			return "UNKNOWN";
-		}
-	}
-
-	/**
-	 * Answer true if the bundle is a fragment
-	 * 
-	 * @param bundle
-	 * @param admin
-	 * @return true if the bundle is a fragment
-	 */
-	public static boolean isBundleFragment(Bundle bundle) {
-		BundleWiring wiring = bundle.adapt(BundleWiring.class);
-		return 0 != (wiring.getRevision().getTypes() & BundleRevision.TYPE_FRAGMENT);
-	}
-
-	public static int getBundleStartLevel(Bundle bundle) {
-		BundleStartLevel startLevel = bundle.adapt(BundleStartLevel.class);
-		return startLevel.getStartLevel();
-	}
-	
-	/**
-	 * Answer true if the bundle has been persitently started
-	 * 
-	 * @param bundle
-	 * @param sl
-	 * @return true if the bundle has been persitently started
-	 */
-	public static boolean isBundlePersistentlyStarted(Bundle bundle) {
-		BundleStartLevel startLevel = bundle.adapt(BundleStartLevel.class);
-		return startLevel.isPersistentlyStarted();
-	}
-	
-	/**
-	 * Answer true if the bundle has been persitently started
-	 * 
-	 * @param bundle
-	 * @param sl
-	 * @return true if the bundle has been persitently started
-	 */
-	public static boolean isBundleActivationPolicyUsed(Bundle bundle) {
-		BundleStartLevel startLevel = bundle.adapt(BundleStartLevel.class);
-		return startLevel.isActivationPolicyUsed();
-	}
-
-	/**
-	 * Answer true if the bundle is required
-	 * 
-	 * @param bundle
-	 * @param bc
-	 * @return true if the bundle is required
-	 */
-	public static boolean isRequired(Bundle bundle) {
-		BundleWiring wiring = bundle.adapt(BundleWiring.class);
-		return wiring.getProvidedWires(BundleRevision.BUNDLE_NAMESPACE).size() > 0;
-	}
-
-	/**
-	 * Answer true if the bundle is pending removal
-	 * 
-	 * @param bundle
-	 * @param bc
-	 * @return true if the bundle is pending removal
-	 */
-	public static boolean isRemovalPending(Bundle bundle) {
-        BundleWiring wiring = bundle.adapt(BundleWiring.class);
-        return (!wiring.isCurrent()) && wiring.isInUse();
-	}
-
-	/**
-	 * Answer the ids of the service references
-	 * 
-	 * @param refs
-	 * @return the ids of the service references
-	 */
-	public static long[] serviceIds(ServiceReference<?>[] refs) {
-		if (refs == null) {
-			return new long[0];
-		}
-		long[] ids = new long[refs.length];
-		for (int i = 0; i < refs.length; i++) {
-			ids[i] = (Long) refs[i].getProperty(SERVICE_ID);
-		}
-		return ids;
-	}
-
-	/**
-	 * Answer a Long array from the supplied array of longs
-	 * 
-	 * @param array
-	 * @return a Long array from the supplied array of longs
-	 */
-	public static Long[] LongArrayFrom(long[] array) {
-		if (array == null) {
-			return new Long[0];
-		}
-		Long[] result = new Long[array.length];
-		for (int i = 0; i < array.length; i++) {
-			result[i] = array[i];
-		}
-		return result;
-	}
-
-}
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/internal/BundleWiringUtil.java b/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/internal/BundleWiringUtil.java
deleted file mode 100644
index 327482b..0000000
--- a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/internal/BundleWiringUtil.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 VMware Inc.
- * 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:
- *   VMware Inc. - initial contribution
- *******************************************************************************/
-package org.eclipse.gemini.mgmt.internal;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.gemini.mgmt.framework.CustomBundleWiringStateMBean;
-import org.eclipse.gemini.mgmt.framework.internal.OSGiBundleWiring;
-import org.osgi.framework.wiring.BundleRevision;
-import org.osgi.framework.wiring.BundleWire;
-import org.osgi.framework.wiring.BundleWiring;
-
-/**
- * Util methods when working with a {@link BundleWiring}
- *
- */
-public final class BundleWiringUtil {
-	
-	/**
-	 * Convert a key-value directive in to the required format for representation over JMX
-	 * 
-	 * @param key
-	 * @param value
-	 * @return
-	 */
-	public static Map<String, ?> getDirectiveKeyValueItem(String key, Object value){
-		Map<String, Object> items = new HashMap<String, Object>();
-		items.put(CustomBundleWiringStateMBean.KEY, key);
-		items.put(CustomBundleWiringStateMBean.VALUE, value);
-		return items;
-	}
-	
-	/**
-	 * Add all related wirings to the provided map.
-	 * 
-	 * @param mappings of 
-	 * @param wiring
-	 * @param namespace
-	 */
-	public static void processWiring(Map<BundleRevision, OSGiBundleWiring> mappings, BundleWiring wiring, String namespace){
-		BundleRevision bundleRevision = wiring.getRevision();
-		if(!mappings.containsKey(bundleRevision)) {
-			mappings.put(bundleRevision, new OSGiBundleWiring(wiring));
-			processRequiredWirings(mappings, wiring, namespace);
-			processProvidedWirings(mappings, wiring, namespace);
-		}
-	}
-	
-	private static void processRequiredWirings(Map<BundleRevision, OSGiBundleWiring> mappings, BundleWiring wiring, String namespace){
-		List<BundleWire> requiredWires = wiring.getRequiredWires(namespace);
-		if(requiredWires != null) {
-			for (BundleWire bundleWire : requiredWires) {
-				BundleWiringUtil.processWiring(mappings, bundleWire.getProviderWiring(), namespace);
-			}
-		}
-	}
-	
-	private static void processProvidedWirings(Map<BundleRevision, OSGiBundleWiring> mappings, BundleWiring wiring, String namespace){
-		List<BundleWire> providedWires = wiring.getProvidedWires(namespace);
-		if(providedWires != null) {
-			for (BundleWire bundleWire : providedWires) {
-				BundleWiringUtil.processWiring(mappings, bundleWire.getRequirerWiring(), namespace);
-			}
-		}
-	}
-}
diff --git a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/internal/ServiceUtil.java b/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/internal/ServiceUtil.java
deleted file mode 100644
index bb9c320..0000000
--- a/org.eclipse.gemini.mgmt/src/org/eclipse/gemini/mgmt/internal/ServiceUtil.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 VMware Inc.
- * 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:
- *   VMware Inc. - initial contribution
- *******************************************************************************/
-package org.eclipse.gemini.mgmt.internal;
-
-import java.io.IOException;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.ServiceReference;
-
-public final class ServiceUtil {
-	
-	/**
-	 * 
-	 * @param serviceRef
-	 * @return
-	 * @throws IOException
-	 */
-	public static long[] getBundlesUsing(ServiceReference<?> serviceRef) {
-		Bundle[] bundles = serviceRef.getUsingBundles();
-		long[] ids = new long[bundles.length];
-		for (int i = 0; i < bundles.length; i++) {
-			ids[i] = bundles[i].getBundleId();
-		}
-		return ids;
-	}
-}
