diff --git a/tests/bundles/org.eclipse.ecf.tests.osgi.services.distribution/src/org/eclipse/ecf/tests/osgi/services/distribution/AbstractRemoteServiceAccessTest.java b/tests/bundles/org.eclipse.ecf.tests.osgi.services.distribution/src/org/eclipse/ecf/tests/osgi/services/distribution/AbstractRemoteServiceAccessTest.java
index db3037b..a307a8b 100644
--- a/tests/bundles/org.eclipse.ecf.tests.osgi.services.distribution/src/org/eclipse/ecf/tests/osgi/services/distribution/AbstractRemoteServiceAccessTest.java
+++ b/tests/bundles/org.eclipse.ecf.tests.osgi.services.distribution/src/org/eclipse/ecf/tests/osgi/services/distribution/AbstractRemoteServiceAccessTest.java
@@ -26,17 +26,50 @@
 public abstract class AbstractRemoteServiceAccessTest extends
 		AbstractDistributionTest {
 
-	private static final String TESTPROP1_VALUE = "baz";
-	private static final String TESTPROP_VALUE = "foobar";
-	private static final String TESTPROP1_NAME = "org.eclipse.ecf.testprop1";
-	private static final String TESTPROP_NAME = "org.eclipse.ecf.testprop";
 	protected static final int REGISTER_WAIT = Integer.parseInt(System.getProperty("waittime","15000"));
 
+	private final String classname = TestServiceInterface1.class.getName();
+	private ServiceTracker st;
+	private ServiceRegistration registration;
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ecf.tests.osgi.services.distribution.AbstractDistributionTest#tearDown()
+	 */
+	protected void tearDown() throws Exception {
+		// Unregister on server
+		if (registration != null) {
+			registration.unregister();
+			registration = null;
+		}
+		if (st != null) {
+			st.close();
+			st = null;
+		}
+		Thread.sleep(REGISTER_WAIT);
+
+		super.tearDown();
+	}
+
+	protected void createServiceTrackerAndRegister(final Properties props) throws Exception {
+		// Setup service tracker for client
+		st = createProxyServiceTracker(classname);
+
+		// Actually register
+		registration = registerService(classname,
+				new TestService1(), props);
+
+		// Wait
+		Thread.sleep(REGISTER_WAIT);
+	}
+
+	protected void createServiceTrackerAndRegister() throws Exception {
+		createServiceTrackerAndRegister(getServiceProperties());
+	}
+
 	protected Properties getServiceProperties() {
-		Properties props = new Properties();
+		final Properties props = new Properties();
 		props.put(SERVICE_EXPORTED_CONFIGS, getServerContainerName());
-		props.put(SERVICE_EXPORTED_INTERFACES,
-				new String[] { SERVICE_EXPORTED_INTERFACES_WILDCARD });
+		props.put(SERVICE_EXPORTED_INTERFACES, SERVICE_EXPORTED_INTERFACES_WILDCARD);
 		return props;
 	}
 
@@ -60,177 +93,113 @@
 
 
 	public void testGetRemoteServiceReference() throws Exception {
-		String classname = TestServiceInterface1.class.getName();
-		// Setup service tracker for client container
-		ServiceTracker st = createProxyServiceTracker(classname);
-		// Get service properties...and allow subclasses to override to add
-		// other service properties
-		Properties props = getServiceProperties();
-		// Service Host: register service
-		ServiceRegistration registration = registerService(classname,
-				new TestService1(), props);
-		// Wait
-		Thread.sleep(REGISTER_WAIT);
-
+		createServiceTrackerAndRegister();
+		
 		// Service Consumer - Get (remote) ervice references
-		ServiceReference[] remoteReferences = st.getServiceReferences();
+		final ServiceReference[] remoteReferences = st.getServiceReferences();
 		assertReferencesValidAndFirstHasCorrectType(remoteReferences, classname);
 		// Spec requires that the 'service.imported' property be set
 		assertTrue(remoteReferences[0].getProperty(SERVICE_IMPORTED) != null);
-		
-		if (registration != null) registration.unregister();
-		st.close();
-		Thread.sleep(REGISTER_WAIT);
 	}
 	
 	public void testGetRemoteServiceReferenceWithExtraProperties() throws Exception {
-		String classname = TestServiceInterface1.class.getName();
-		// Setup service tracker for client container
-		ServiceTracker st = createProxyServiceTracker(classname);
-		// Get service properties...and allow subclasses to override to add
-		// other service properties
-		Properties props = getServiceProperties();
+		final String TESTPROP1_VALUE = "baz";
+		final String TESTPROP_VALUE = "foobar";
+		final String TESTPROP1_NAME = "org.eclipse.ecf.testprop1";
+		final String TESTPROP_NAME = "org.eclipse.ecf.testprop";
+
+		final Properties props = getServiceProperties();
 		// Add other properties
 		props.put(TESTPROP_NAME, TESTPROP_VALUE);
 		props.put(TESTPROP1_NAME,TESTPROP1_VALUE);
-		// Service Host: register service
-		ServiceRegistration registration = registerService(classname,
-				new TestService1(), props);
-		// Wait
-		Thread.sleep(REGISTER_WAIT);
+		createServiceTrackerAndRegister(props);
 
 		// Service Consumer - Get (remote) ervice references
-		ServiceReference[] remoteReferences = st.getServiceReferences();
+		final ServiceReference[] remoteReferences = st.getServiceReferences();
 		assertReferencesValidAndFirstHasCorrectType(remoteReferences, classname);
 		// Spec requires that the 'service.imported' property be set
 		assertTrue(remoteReferences[0].getProperty(SERVICE_IMPORTED) != null);
 		
-		String testProp = (String) remoteReferences[0].getProperty(TESTPROP_NAME);
-		String testProp1 = (String) remoteReferences[0].getProperty(TESTPROP1_NAME);
+		final String testProp = (String) remoteReferences[0].getProperty(TESTPROP_NAME);
+		final String testProp1 = (String) remoteReferences[0].getProperty(TESTPROP1_NAME);
 		assertTrue(TESTPROP_VALUE.equals(testProp));
 		assertTrue(TESTPROP1_VALUE.equals(testProp1));
-		if (registration != null) registration.unregister();
-		st.close();
-		Thread.sleep(REGISTER_WAIT);
 	}
 
 
 	public void testProxy() throws Exception {
-		String classname = TestServiceInterface1.class.getName();
-		// Setup service tracker for client
-		ServiceTracker st = createProxyServiceTracker(classname);
-
-		// Actually register and wait a while
-		ServiceRegistration registration = registerService(classname,
-				new TestService1(), getServiceProperties());
-		Thread.sleep(REGISTER_WAIT);
-
+		createServiceTrackerAndRegister();
+		
 		// Client - Get service references from service tracker
-		ServiceReference[] remoteReferences = st.getServiceReferences();
+		final ServiceReference[] remoteReferences = st.getServiceReferences();
 		assertReferencesValidAndFirstHasCorrectType(remoteReferences, classname);
 
 		// Get proxy/service
-		TestServiceInterface1 proxy = (TestServiceInterface1) getContext()
+		final TestServiceInterface1 proxy = (TestServiceInterface1) getContext()
 				.getService(remoteReferences[0]);
 		assertNotNull(proxy);
 		// Now use proxy
-		String result = proxy.doStuff1();
+		final String result = proxy.doStuff1();
 		Trace.trace(Activator.PLUGIN_ID, "proxy.doStuff1 result=" + result);
 		assertTrue(TestServiceInterface1.TEST_SERVICE_STRING1.equals(result));
-
-		// Unregister on server and wait
-		if (registration != null) registration.unregister();
-		st.close();
-		Thread.sleep(REGISTER_WAIT);
 	}
 
 	public void testCallSyncFromProxy() throws Exception {
-		String classname = TestServiceInterface1.class.getName();
-		// Setup service tracker for client
-		ServiceTracker st = createProxyServiceTracker(classname);
-
-		// Actually register and wait a while
-		ServiceRegistration registration = registerService(classname,
-				new TestService1(), getServiceProperties());
-		Thread.sleep(REGISTER_WAIT);
-
+		createServiceTrackerAndRegister();
+		
 		// Client - Get service references from service tracker
-		ServiceReference[] remoteReferences = st.getServiceReferences();
+		final ServiceReference[] remoteReferences = st.getServiceReferences();
 		assertReferencesValidAndFirstHasCorrectType(remoteReferences, classname);
 
 		// Get proxy
-		TestServiceInterface1 proxy = (TestServiceInterface1) getContext()
+		final TestServiceInterface1 proxy = (TestServiceInterface1) getContext()
 				.getService(remoteReferences[0]);
 
 		assertProxyValid(proxy);
 		
 		// Get IRemoteService from proxy
-		IRemoteService remoteService = getRemoteServiceFromProxy(proxy);
+		final IRemoteService remoteService = getRemoteServiceFromProxy(proxy);
 
 		// Call remote service synchronously
-		Object result = remoteService.callSync(createRemoteCall());
+		final Object result = remoteService.callSync(createRemoteCall());
 		Trace.trace(Activator.PLUGIN_ID, "proxy.doStuff1 result=" + result);
 		assertStringResultValid(result, TestServiceInterface1.TEST_SERVICE_STRING1);
-		
-		// Unregister on server and wait
-		if (registration != null) registration.unregister();
-		st.close();
-		Thread.sleep(REGISTER_WAIT);
 	}
 
 	public void testCallSync() throws Exception {
-		String classname = TestServiceInterface1.class.getName();
-		// Setup service tracker for client
-		ServiceTracker st = createProxyServiceTracker(classname);
-
-		// Actually register and wait a while
-		ServiceRegistration registration = registerService(classname,
-				new TestService1(), getServiceProperties());
-		Thread.sleep(REGISTER_WAIT);
-
+		createServiceTrackerAndRegister();
+		
 		// Client - Get service references from service tracker
-		ServiceReference[] remoteReferences = st.getServiceReferences();
+		final ServiceReference[] remoteReferences = st.getServiceReferences();
 		assertReferencesValidAndFirstHasCorrectType(remoteReferences, classname);
 
-		Object o = remoteReferences[0].getProperty(SERVICE_IMPORTED);
+		final Object o = remoteReferences[0].getProperty(SERVICE_IMPORTED);
 		assertNotNull(o);
 		assertTrue(o instanceof IRemoteService);
-		IRemoteService rs = (IRemoteService) o;
+		final IRemoteService rs = (IRemoteService) o;
 
 		// Call synchronously
-		Object result = rs.callSync(createRemoteCall());
+		final Object result = rs.callSync(createRemoteCall());
 		Trace.trace(Activator.PLUGIN_ID, "callSync.doStuff1 result=" + result);
 		assertStringResultValid(result, TestServiceInterface1.TEST_SERVICE_STRING1);
-
-		// Unregister on server
-		if (registration != null) registration.unregister();
-		st.close();
-		Thread.sleep(REGISTER_WAIT);
 	}
 
 	public void testCallAsync() throws Exception {
-		String classname = TestServiceInterface1.class.getName();
-		// Setup service tracker for client
-		ServiceTracker st = createProxyServiceTracker(classname);
-
-		// Actually register and wait a while
-		ServiceRegistration registration = registerService(classname,
-				new TestService1(), getServiceProperties());
-		Thread.sleep(REGISTER_WAIT);
-
+		createServiceTrackerAndRegister();
+		
 		// Client - Get service references from service tracker
-		ServiceReference[] remoteReferences = st.getServiceReferences();
+		final ServiceReference[] remoteReferences = st.getServiceReferences();
 		assertReferencesValid(remoteReferences);
 
-		Object o = remoteReferences[0].getProperty(SERVICE_IMPORTED);
+		final Object o = remoteReferences[0].getProperty(SERVICE_IMPORTED);
 		assertNotNull(o);
 		assertTrue(o instanceof IRemoteService);
-		IRemoteService rs = (IRemoteService) o;
+		final IRemoteService rs = (IRemoteService) o;
 		// Call asynchronously
 		rs.callAsync(createRemoteCall(), new IRemoteCallListener() {
-			public void handleEvent(IRemoteCallEvent event) {
+			public void handleEvent(final IRemoteCallEvent event) {
 				if (event instanceof IRemoteCallCompleteEvent) {
-					Object result = ((IRemoteCallCompleteEvent) event)
+					final Object result = ((IRemoteCallCompleteEvent) event)
 							.getResponse();
 					Trace.trace(Activator.PLUGIN_ID,
 							"callSync.doStuff1 result=" + result);
@@ -241,69 +210,41 @@
 		});
 
 		syncWaitForNotify(REGISTER_WAIT);
-		// Unregister on server
-		registration.unregister();
-		st.close();
-		Thread.sleep(REGISTER_WAIT);
 	}
 
 	public void testCallFuture() throws Exception {
-		String classname = TestServiceInterface1.class.getName();
-		// Setup service tracker for client
-		ServiceTracker st = createProxyServiceTracker(classname);
-
-		// Actually register and wait a while
-		ServiceRegistration registration = registerService(classname,
-				new TestService1(), getServiceProperties());
-		Thread.sleep(REGISTER_WAIT);
-
+		createServiceTrackerAndRegister();
+		
 		// Client - Get service references from service tracker
-		ServiceReference[] remoteReferences = st.getServiceReferences();
+		final ServiceReference[] remoteReferences = st.getServiceReferences();
 		assertReferencesValid(remoteReferences);
 
-		Object o = remoteReferences[0].getProperty(SERVICE_IMPORTED);
+		final Object o = remoteReferences[0].getProperty(SERVICE_IMPORTED);
 		assertNotNull(o);
 		assertTrue(o instanceof IRemoteService);
-		IRemoteService rs = (IRemoteService) o;
+		final IRemoteService rs = (IRemoteService) o;
 		// Call asynchronously
-		IFuture futureResult = rs.callAsync(createRemoteCall());
+		final IFuture futureResult = rs.callAsync(createRemoteCall());
 
 		// now get result from futureResult
-		Object result = futureResult.get();
+		final Object result = futureResult.get();
 		Trace.trace(Activator.PLUGIN_ID, "callSync.doStuff1 result=" + result);
 		assertStringResultValid(result, TestServiceInterface1.TEST_SERVICE_STRING1);
-
-		// Unregister on server
-		if (registration != null) registration.unregister();
-		st.close();
-		Thread.sleep(REGISTER_WAIT);
 	}
 
 	public void testFireAsync() throws Exception {
-		String classname = TestServiceInterface1.class.getName();
-		// Setup service tracker for client
-		ServiceTracker st = createProxyServiceTracker(classname);
-
-		// Actually register and wait a while
-		ServiceRegistration registration = registerService(classname,
-				new TestService1(), getServiceProperties());
-		Thread.sleep(REGISTER_WAIT);
-
+		createServiceTrackerAndRegister();
+		
 		// Client - Get service references from service tracker
-		ServiceReference[] remoteReferences = st.getServiceReferences();
+		final ServiceReference[] remoteReferences = st.getServiceReferences();
 		assertReferencesValid(remoteReferences);
 
-		Object o = remoteReferences[0].getProperty(SERVICE_IMPORTED);
+		final Object o = remoteReferences[0].getProperty(SERVICE_IMPORTED);
 		assertNotNull(o);
 		assertTrue(o instanceof IRemoteService);
-		IRemoteService rs = (IRemoteService) o;
+		final IRemoteService rs = (IRemoteService) o;
 		// Call asynchronously
 		rs.fireAsync(createRemoteCall());
-		Thread.sleep(5000);
-		// Unregister on server
-		if (registration != null) registration.unregister();
-		st.close();
 		Thread.sleep(REGISTER_WAIT);
 	}
-
 }
diff --git a/tests/bundles/org.eclipse.ecf.tests.osgi.services.distribution/src/org/eclipse/ecf/tests/osgi/services/distribution/AbstractRemoteServiceRegisterTest.java b/tests/bundles/org.eclipse.ecf.tests.osgi.services.distribution/src/org/eclipse/ecf/tests/osgi/services/distribution/AbstractRemoteServiceRegisterTest.java
index e353d65..fba70b7 100644
--- a/tests/bundles/org.eclipse.ecf.tests.osgi.services.distribution/src/org/eclipse/ecf/tests/osgi/services/distribution/AbstractRemoteServiceRegisterTest.java
+++ b/tests/bundles/org.eclipse.ecf.tests.osgi.services.distribution/src/org/eclipse/ecf/tests/osgi/services/distribution/AbstractRemoteServiceRegisterTest.java
@@ -24,11 +24,20 @@
 		AbstractDistributionTest {
 
 	protected static final int REGISTER_WAIT = 2000;
+	private ServiceRegistration registration;
 
 	protected abstract String getServerContainerTypeName();
 	
 	protected void tearDown() throws Exception {
+		// Then unregister
+		if(registration != null) {
+			registration.unregister();
+			registration = null;
+		}
+		Thread.sleep(REGISTER_WAIT);
+		
 		super.tearDown();
+		
 		IContainer [] containers = getContainerManager().getAllContainers();
 		for(int i=0; i < containers.length; i++) {
 			containers[i].dispose();
@@ -39,14 +48,13 @@
 	
 	protected void registerWaitAndUnregister(Properties props, boolean verifyRegistration) throws Exception {
 		// Actually register with default service (IConcatService)
-		ServiceRegistration registration = registerDefaultService(props);
+		registration = registerDefaultService(props);
 		// Wait a while
 		Thread.sleep(REGISTER_WAIT);
 		// Verify
-		if (verifyRegistration) verifyRemoteServiceRegisteredWithServer();
-		// Then unregister
-		registration.unregister();
-		Thread.sleep(REGISTER_WAIT);
+		if (verifyRegistration) {
+			verifyRemoteServiceRegisteredWithServer();
+		}
 	}
 
 	private void verifyRemoteServiceRegisteredWithServer() throws Exception {
@@ -75,20 +83,23 @@
 	}
 
 	public void testRegisterOnCreatedServer() throws Exception {
-		Properties props = new Properties();
-		props.put(SERVICE_EXPORTED_CONFIGS, getServerContainerTypeName());
-		props.put(SERVICE_EXPORTED_INTERFACES, new String[] {SERVICE_EXPORTED_INTERFACES_WILDCARD});
+		Properties props = getServiceProperties();
 		registerWaitAndUnregister(props, true);
 	}
 
-	public void testRegisterOnCreatedServerWithIdentity() throws Exception {
+	private Properties getServiceProperties() {
 		Properties props = new Properties();
 		// Set config to the server container name/provider config name (e.g. ecf.generic.server)
 		props.put(SERVICE_EXPORTED_CONFIGS, getServerContainerTypeName());
+		// Set the service exported interfaces to all
+		props.put(SERVICE_EXPORTED_INTERFACES, SERVICE_EXPORTED_INTERFACES_WILDCARD);
+		return props;
+	}
+
+	public void testRegisterOnCreatedServerWithIdentity() throws Exception {
+		Properties props = getServiceProperties();
 		// set the container factory arguments to the server identity (e.g. ecftcp://localhost:3282/server)
 		props.put(SERVICE_EXPORTED_CONTAINER_FACTORY_ARGUMENTS, new String[] { getServerIdentity() } );
-		// Set the service exported interfaces to all
-		props.put(SERVICE_EXPORTED_INTERFACES, new String[] {SERVICE_EXPORTED_INTERFACES_WILDCARD});
 		
 		registerWaitAndUnregister(props, true);
 	}
@@ -97,9 +108,7 @@
 		// Create server container
 		this.server = ContainerFactory.getDefault().createContainer(getServerContainerTypeName(),new Object[] {createServerID()});
 		
-		Properties props = new Properties();
-		props.put(SERVICE_EXPORTED_CONFIGS, getServerContainerTypeName());
-		props.put(SERVICE_EXPORTED_INTERFACES, new String[] {SERVICE_EXPORTED_INTERFACES_WILDCARD});
+		Properties props = getServiceProperties();
 		
 		registerWaitAndUnregister(props, true);
 	}
@@ -108,9 +117,7 @@
 		// Create server container
 		this.server = ContainerFactory.getDefault().createContainer(getServerContainerTypeName(),new Object[] {createServerID()});
 		
-		Properties props = new Properties();
-		props.put(SERVICE_EXPORTED_CONFIGS, getServerContainerTypeName());
-		props.put(SERVICE_EXPORTED_INTERFACES, new String[] {SERVICE_EXPORTED_INTERFACES_WILDCARD});
+		Properties props = getServiceProperties();
 		// Add intents
 		props.put(SERVICE_INTENTS, "passByValue");
 		registerWaitAndUnregister(props, true);
@@ -120,9 +127,7 @@
 		// Create server container
 		this.server = ContainerFactory.getDefault().createContainer(getServerContainerTypeName(),new Object[] {createServerID()});
 		
-		Properties props = new Properties();
-		props.put(SERVICE_EXPORTED_CONFIGS, getServerContainerTypeName());
-		props.put(SERVICE_EXPORTED_INTERFACES, new String[] {SERVICE_EXPORTED_INTERFACES_WILDCARD});
+		Properties props = getServiceProperties();
 		// Add intent that no one actually exposes
 		props.put(SERVICE_INTENTS, "foobar");
 		registerWaitAndUnregister(props, false);
@@ -132,9 +137,7 @@
 		// Create server container
 		this.server = ContainerFactory.getDefault().createContainer(getServerContainerTypeName(),new Object[] {createServerID()});
 		
-		Properties props = new Properties();
-		props.put(SERVICE_EXPORTED_CONFIGS, getServerContainerTypeName());
-		props.put(SERVICE_EXPORTED_INTERFACES, new String[] {SERVICE_EXPORTED_INTERFACES_WILDCARD});
+		Properties props = getServiceProperties();
 		// Add intents
 		props.put(SERVICE_EXPORTED_INTENTS, "passByValue");
 		registerWaitAndUnregister(props, true);
@@ -144,9 +147,7 @@
 		// Create server container
 		this.server = ContainerFactory.getDefault().createContainer(getServerContainerTypeName(),new Object[] {createServerID()});
 		
-		Properties props = new Properties();
-		props.put(SERVICE_EXPORTED_CONFIGS, getServerContainerTypeName());
-		props.put(SERVICE_EXPORTED_INTERFACES, new String[] {SERVICE_EXPORTED_INTERFACES_WILDCARD});
+		Properties props = getServiceProperties();
 		// Add intent that no one actually exposes
 		props.put(SERVICE_EXPORTED_INTENTS, "foobar");
 		registerWaitAndUnregister(props, false);
@@ -156,9 +157,7 @@
 		// Create server container
 		this.server = ContainerFactory.getDefault().createContainer(getServerContainerTypeName(),new Object[] {createServerID()});
 		
-		Properties props = new Properties();
-		props.put(SERVICE_EXPORTED_CONFIGS, getServerContainerTypeName());
-		props.put(SERVICE_EXPORTED_INTERFACES, new String[] {SERVICE_EXPORTED_INTERFACES_WILDCARD});
+		Properties props = getServiceProperties();
 		// Add intents
 		props.put(SERVICE_EXPORTED_INTENTS_EXTRA, "passByValue");
 		registerWaitAndUnregister(props, true);
@@ -168,9 +167,7 @@
 		// Create server container
 		this.server = ContainerFactory.getDefault().createContainer(getServerContainerTypeName(),new Object[] {createServerID()});
 		
-		Properties props = new Properties();
-		props.put(SERVICE_EXPORTED_CONFIGS, getServerContainerTypeName());
-		props.put(SERVICE_EXPORTED_INTERFACES, new String[] {SERVICE_EXPORTED_INTERFACES_WILDCARD});
+		Properties props = getServiceProperties();
 		// Add intent that no one actually exposes
 		props.put(SERVICE_EXPORTED_INTENTS_EXTRA, "foobar");
 		registerWaitAndUnregister(props, false);
@@ -180,8 +177,7 @@
 		// Create server container
 		this.server = ContainerFactory.getDefault().createContainer(getServerContainerTypeName(),new Object[] {createServerID()});
 		
-		Properties props = new Properties();
-		props.put(SERVICE_EXPORTED_INTERFACES, new String[] {SERVICE_EXPORTED_INTERFACES_WILDCARD});
+		final Properties props = getServiceProperties();
 		props.put(SERVICE_EXPORTED_CONTAINER_ID, this.server.getID());
 		registerWaitAndUnregister(props, true);
 	}
@@ -190,11 +186,7 @@
 		// Create server container
 		this.server = ContainerFactory.getDefault().createContainer(getServerContainerTypeName(),getServerIdentity());
 		
-		Properties props = new Properties();
-		// Set config to the server container name/provider config name (e.g. ecf.generic.server)
-		props.put(SERVICE_EXPORTED_CONFIGS, getServerContainerTypeName());
-		// Set the service exported interfaces to all
-		props.put(SERVICE_EXPORTED_INTERFACES, new String[] {SERVICE_EXPORTED_INTERFACES_WILDCARD});
+		Properties props = getServiceProperties();
 		
 		registerWaitAndUnregister(props, true);
 	}
diff --git a/tests/bundles/org.eclipse.ecf.tests.osgi.services.distribution/src/org/eclipse/ecf/tests/osgi/services/distribution/AbstractServicePublicationTest.java b/tests/bundles/org.eclipse.ecf.tests.osgi.services.distribution/src/org/eclipse/ecf/tests/osgi/services/distribution/AbstractServicePublicationTest.java
index 955b5f2..573cfb3 100644
--- a/tests/bundles/org.eclipse.ecf.tests.osgi.services.distribution/src/org/eclipse/ecf/tests/osgi/services/distribution/AbstractServicePublicationTest.java
+++ b/tests/bundles/org.eclipse.ecf.tests.osgi.services.distribution/src/org/eclipse/ecf/tests/osgi/services/distribution/AbstractServicePublicationTest.java
@@ -9,6 +9,7 @@
 ******************************************************************************/
 package org.eclipse.ecf.tests.osgi.services.distribution;
 
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Dictionary;
 import java.util.Hashtable;
@@ -22,19 +23,13 @@
 import org.eclipse.ecf.osgi.services.distribution.IDistributionConstants;
 import org.eclipse.ecf.tests.internal.osgi.services.distribution.Activator;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.util.tracker.ServiceTracker;
 
 public abstract class AbstractServicePublicationTest extends TestCase implements IDistributionConstants, RemoteServicePublication {
 
-	protected static void assertStringsEqual(final String[] s1, final String[] s2) {
-		assertEquals(s1.length, s2.length);
-		for (int i = 0; i < s1.length; i++) {
-			assertEquals(s1[i], s2[i]);
-		}
-	}
-
 	// Member variables that should be set by subclasses
 	protected IContainer container;
 	protected String[] ifaces;
@@ -97,7 +92,7 @@
 		this.container = container;
 	}
 	
-	public void testServicePublication() throws InterruptedException {
+	public void testServicePublication() throws InterruptedException, InvalidSyntaxException {
 		final BundleContext context = Activator.getDefault().getContext();
 	
 		// register a service with the marker property set
@@ -116,16 +111,23 @@
 		tracker.waitForService(10000);
 	
 		// expected behavior: an endpoint is published
-		final ServiceReference ref = context
-				.getServiceReference(ServicePublication.class.getName());
-		assertTrue(ref != null);
-		// check the service publication properties
-		final Object o = ref
+		final ServiceReference[] refs = context
+				.getServiceReferences(ServicePublication.class.getName(), null);
+		assertTrue(refs != null);
+		
+		for (int i = 0; i < refs.length; i++) {
+			ServiceReference ref = refs[i];
+			
+			// check the service publication properties
+			final Object o = ref
 				.getProperty(ServicePublication.SERVICE_INTERFACE_NAME);
-		assertTrue(o instanceof Collection);
-		final Collection refIfaces = (Collection) o;
-		assertStringsEqual(getInterfaces(), (String []) refIfaces.toArray(new String[] {}));
-		Thread.sleep(10000);
+			assertTrue(o instanceof Collection);
+			final Collection refIfaces = (Collection) o;
+			if(Arrays.equals(getInterfaces(), (String []) refIfaces.toArray(new String[] {}))) {
+				return;
+			}
+		}
+		fail("registered service not found.");
 	}
 	public void setInterfaces(String [] interfaces) {
 		this.ifaces = interfaces;
