diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FilterIndexResourceAdapterTest.java b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FilterIndexResourceAdapterTest.java
deleted file mode 100644
index 29bf371..0000000
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FilterIndexResourceAdapterTest.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.dm.test;
-//import static org.ops4j.pax.exam.CoreOptions.waitForFrameworkStartupFor;
-//import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.vmOption;
-
-import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
-import static org.ops4j.pax.exam.CoreOptions.options;
-import static org.ops4j.pax.exam.CoreOptions.provision;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import junit.framework.Assert;
-
-import org.apache.felix.dm.DependencyManager;
-import org.apache.felix.dm.ResourceHandler;
-import org.apache.felix.dm.ResourceUtil;
-import org.apache.felix.dm.ServiceUtil;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.Option;
-import org.ops4j.pax.exam.junit.Configuration;
-import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Filter;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-
-
-@RunWith(JUnit4TestRunner.class)
-public class FilterIndexResourceAdapterTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            //vmOption( "-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005" ),
-            //waitForFrameworkStartupFor(Long.MAX_VALUE),
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }
-
-    
-    @Test
-    public void testBasicResourceAdapter(BundleContext context) throws Exception {
-        System.setProperty("org.apache.felix.dependencymanager.filterindex", "objectClass");
-        DependencyManager m = new DependencyManager(context);
-        // helper class that ensures certain steps get executed in sequence
-        Ensure e = new Ensure();
-        // create a resource provider
-        ResourceProvider provider = new ResourceProvider(e);
-        // activate it
-        m.add(m.createComponent().setImplementation(provider).add(m.createServiceDependency().setService(ResourceHandler.class).setCallbacks("add", "remove")));
-        // create a resource adapter for our single resource
-        // note that we can provide an actual implementation instance here because there will be only one
-        // adapter, normally you'd want to specify a Class here
-        m.add(m.createResourceAdapterService("(&(path=/path/to/*.txt)(host=localhost))", false, null, "changed")
-              .setImplementation(new ResourceAdapter(e)));
-        // wait until the single resource is available
-        e.waitForStep(3, 5000);
-        // trigger a 'change' in our resource
-        provider.change();
-        // wait until the changed callback is invoked
-        e.waitForStep(4, 5000);
-     }
-    
-    static class ResourceAdapter {
-        protected URL m_resource; // injected by reflection.
-        private Ensure m_ensure;
-        
-        ResourceAdapter(Ensure e) {
-            m_ensure = e;
-        }
-        
-        public void start() {
-            m_ensure.step(1);
-            Assert.assertNotNull("resource not injected", m_resource);
-            m_ensure.step(2);
-            try {
-                InputStream in = m_resource.openStream();
-            } 
-            catch (FileNotFoundException e) {
-                m_ensure.step(3);
-            }
-            catch (IOException e) {
-                Assert.fail("We should not have gotten this exception.");
-            }
-        }
-        
-        public void changed() {
-            m_ensure.step(4);
-        }
-    }
-    
-    static class ResourceProvider {
-        private volatile BundleContext m_context;
-        private final Ensure m_ensure;
-        private final Map m_handlers = new HashMap();
-        private URL[] m_resources;
-
-        public ResourceProvider(Ensure ensure) throws MalformedURLException {
-            m_ensure = ensure;
-            m_resources = new URL[] {
-                new URL("file://localhost/path/to/file1.txt")
-            };
-        }
-        
-        public void change() {
-            ResourceHandler[] handlers;
-            synchronized (m_handlers) {
-                handlers = (ResourceHandler[]) m_handlers.keySet().toArray(new ResourceHandler[m_handlers.size()]);
-            }
-            for (int i = 0; i < m_resources.length; i++) {
-                for (int j = 0; j < handlers.length; j++) {
-                    ResourceHandler handler = handlers[j];
-                    handler.changed(m_resources[i]);
-                }
-            }
-        }
-
-        public void add(ServiceReference ref, ResourceHandler handler) {
-            System.out.println("RP.add: " + ServiceUtil.toString(ref));
-            String filterString = (String) ref.getProperty("filter");
-            Filter filter = null;
-            if (filterString != null) {
-                try {
-                    filter = m_context.createFilter(filterString);
-                }
-                catch (InvalidSyntaxException e) {
-                    Assert.fail("Could not create filter for resource handler: " + e);
-                    return;
-                }
-            }
-            synchronized (m_handlers) {
-                m_handlers.put(handler, filter);
-            }
-            for (int i = 0; i < m_resources.length; i++) {
-                if (filter == null || filter.match(ResourceUtil.createProperties(m_resources[i]))) {
-                    handler.added(m_resources[i]);
-                }
-            }
-        }
-
-        public void remove(ServiceReference ref, ResourceHandler handler) {
-            Filter filter;
-            synchronized (m_handlers) {
-                filter = (Filter) m_handlers.remove(handler);
-            }
-            removeResources(handler, filter);
-        }
-
-        private void removeResources(ResourceHandler handler, Filter filter) {
-                for (int i = 0; i < m_resources.length; i++) {
-                    if (filter == null || filter.match(ResourceUtil.createProperties(m_resources[i]))) {
-                        handler.removed(m_resources[i]);
-                    }
-                }
-            }
-
-        public void destroy() {
-            Entry[] handlers;
-            synchronized (m_handlers) {
-                handlers = (Entry[]) m_handlers.entrySet().toArray(new Entry[m_handlers.size()]);
-            }
-            for (int i = 0; i < handlers.length; i++) {
-                removeResources((ResourceHandler) handlers[i].getKey(), (Filter) handlers[i].getValue());
-            }
-            
-            System.out.println("DESTROY..." + m_handlers.size());
-        }
-    }
-}
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/AdapterAndConsumerTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/AdapterAndConsumerTest.java
similarity index 86%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/AdapterAndConsumerTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/AdapterAndConsumerTest.java
index 33a56fa..806c657 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/AdapterAndConsumerTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/AdapterAndConsumerTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -31,20 +31,15 @@
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
 import org.osgi.framework.BundleContext;
 
-@RunWith(JUnit4TestRunner.class)
-public class AdapterAndConsumerTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
+
+@RunWith(PaxExam.class)
+public class AdapterAndConsumerTest extends TestBase {
     
     @Test
-    public void testServiceWithAdapterAndConsumer(BundleContext context) {
+    public void testServiceWithAdapterAndConsumer() {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/AdapterWithExtraDependenciesTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/AdapterWithExtraDependenciesTest.java
similarity index 85%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/AdapterWithExtraDependenciesTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/AdapterWithExtraDependenciesTest.java
index 7bd1f99..15d4b44 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/AdapterWithExtraDependenciesTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/AdapterWithExtraDependenciesTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -31,20 +31,14 @@
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
 import org.osgi.framework.BundleContext;
 
-@RunWith(JUnit4TestRunner.class)
-public class AdapterWithExtraDependenciesTest {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
 
+@RunWith(PaxExam.class)
+public class AdapterWithExtraDependenciesTest extends TestBase {
     @Test
-    public void testAdapterWithExtraDependenciesAndCallbacks(BundleContext context) {
+    public void testAdapterWithExtraDependenciesAndCallbacks() {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
@@ -75,6 +69,9 @@
         
         // make sure both adapters have their "remove" callbacks invoked
         e.waitForStep(4, 5000);
+        
+        m.remove(s1);
+        m.remove(sa);
     }
     
     static interface S1 {
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/AdapterWithInstanceBoundDependencyTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/AdapterWithInstanceBoundDependencyTest.java
similarity index 88%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/AdapterWithInstanceBoundDependencyTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/AdapterWithInstanceBoundDependencyTest.java
index bc2c81f..c5f4f94 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/AdapterWithInstanceBoundDependencyTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/AdapterWithInstanceBoundDependencyTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -31,20 +31,14 @@
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
 import org.osgi.framework.BundleContext;
 
-@RunWith(JUnit4TestRunner.class)
-public class AdapterWithInstanceBoundDependencyTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }
-    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
+
+@RunWith(PaxExam.class)
+public class AdapterWithInstanceBoundDependencyTest extends TestBase {
     @Test
-    public void testInstanceBoundDependency(BundleContext context) {
+    public void testInstanceBoundDependency() {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/AspectChainTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/AspectChainTest.java
similarity index 87%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/AspectChainTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/AspectChainTest.java
index 3510315..dabec19 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/AspectChainTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/AspectChainTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -31,20 +31,14 @@
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
 import org.osgi.framework.BundleContext;
 
-@RunWith(JUnit4TestRunner.class)
-public class AspectChainTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
 
+@RunWith(PaxExam.class)
+public class AspectChainTest extends TestBase {
     @Test
-    public void testBuildAspectChain(BundleContext context) {
+    public void testBuildAspectChain() {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/AspectDynamicsTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/AspectDynamicsTest.java
similarity index 91%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/AspectDynamicsTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/AspectDynamicsTest.java
index 5058846..b766283 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/AspectDynamicsTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/AspectDynamicsTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -31,20 +31,14 @@
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
 import org.osgi.framework.BundleContext;
 
-@RunWith(JUnit4TestRunner.class)
-public class AspectDynamicsTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
 
+@RunWith(PaxExam.class)
+public class AspectDynamicsTest extends TestBase {
     @Test
-    public void testDynamicallyAddAndRemoveAspect(BundleContext context) {
+    public void testDynamicallyAddAndRemoveAspect() {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/AspectWhiteboardTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/AspectWhiteboardTest.java
similarity index 92%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/AspectWhiteboardTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/AspectWhiteboardTest.java
index a3734e0..bfa4e7d 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/AspectWhiteboardTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/AspectWhiteboardTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -39,20 +39,14 @@
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 
-@RunWith(JUnit4TestRunner.class)
-public class AspectWhiteboardTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
 
+@RunWith(PaxExam.class)
+public class AspectWhiteboardTest extends TestBase {
     @Test
-    public void testWhiteboardConsumer(BundleContext context) {
+    public void testWhiteboardConsumer() {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/BundleDependencyTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/BundleDependencyTest.java
similarity index 88%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/BundleDependencyTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/BundleDependencyTest.java
index 0c30262..9b8a9fd 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/BundleDependencyTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/BundleDependencyTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -33,20 +33,14 @@
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 
-@RunWith(JUnit4TestRunner.class)
-public class BundleDependencyTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
-    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
+
+@RunWith(PaxExam.class)
+public class BundleDependencyTest extends TestBase {
     @Test
-    public void testBundleDependencies(BundleContext context) {
+    public void testBundleDependencies() {
         DependencyManager m = new DependencyManager(context);
         // create a service provider and consumer
         Consumer c = new Consumer();
@@ -72,7 +66,7 @@
     }
     
     @Test
-    public void testRequiredBundleDependency(BundleContext context) {
+    public void testRequiredBundleDependency() {
         DependencyManager m = new DependencyManager(context);
         // create a service provider and consumer
         Consumer c = new Consumer();
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/CompositionTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/CompositionTest.java
similarity index 86%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/CompositionTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/CompositionTest.java
index e692c56..4b1d0cb 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/CompositionTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/CompositionTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -31,20 +31,14 @@
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
 import org.osgi.framework.BundleContext;
 
-@RunWith(JUnit4TestRunner.class)
-public class CompositionTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
 
+@RunWith(PaxExam.class)
+public class CompositionTest extends TestBase {
     @Test
-    public void testComposition(BundleContext context) {
+    public void testComposition() {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
@@ -57,6 +51,7 @@
         m.add(sc);
         // ensure we executed all steps inside the component instance
         e.step(6);
+        m.clear();
     }
     
     static interface ServiceInterface {
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/CustomDependencyTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/CustomDependencyTest.java
similarity index 82%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/CustomDependencyTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/CustomDependencyTest.java
index d90b14d..b01e86e 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/CustomDependencyTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/CustomDependencyTest.java
@@ -1,4 +1,22 @@
-package org.apache.felix.dm.test;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -20,20 +38,14 @@
 import org.osgi.framework.BundleContext;
 
 
-@RunWith(JUnit4TestRunner.class)
-public class CustomDependencyTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
 
+@RunWith(PaxExam.class)
+public class CustomDependencyTest extends TestBase {
     @Test
-    public void testCustomDependency(BundleContext context) {
+    public void testCustomDependency() {
         Ensure e = new Ensure();
         DependencyManager dm = new DependencyManager(context);
         
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/DynamicProxyAspectTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/DynamicProxyAspectTest.java
similarity index 92%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/DynamicProxyAspectTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/DynamicProxyAspectTest.java
index 168b1dd..c92725b 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/DynamicProxyAspectTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/DynamicProxyAspectTest.java
@@ -1,4 +1,4 @@
-/*
+/**
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -37,20 +37,14 @@
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
 import org.osgi.framework.BundleContext;
 
-@RunWith(JUnit4TestRunner.class)
-public class DynamicProxyAspectTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
 
+@RunWith(PaxExam.class)
+public class DynamicProxyAspectTest extends TestBase {
     @Test
-    public void testImplementGenericAspectWithDynamicProxy(BundleContext context) {
+    public void testImplementGenericAspectWithDynamicProxy() {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
@@ -93,6 +87,14 @@
         // make sure the proxy has been called twice
         Assert.assertEquals("Proxy should have been invoked this many times.", 2, DynamicProxyHandler.getCounter());
         
+        m.remove(sc);
+        m.remove(a2);
+        m.remove(a1);
+        m.remove(sp2);
+        m.remove(sp1);
+        m.remove(a2);
+        m.remove(a1);
+        
         try {
             Thread.sleep(2000);
         }
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2078_ServiceDependencyTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX2078_ServiceDependencyTest.java
similarity index 85%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2078_ServiceDependencyTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX2078_ServiceDependencyTest.java
index 922948d..02b66fb 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2078_ServiceDependencyTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX2078_ServiceDependencyTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -31,20 +31,14 @@
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
 import org.osgi.framework.BundleContext;
 
-@RunWith(JUnit4TestRunner.class)
-public class FELIX2078_ServiceDependencyTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
 
+@RunWith(PaxExam.class)
+public class FELIX2078_ServiceDependencyTest extends TestBase {
     @Test
-    public void testRequiredServiceRegistrationAndConsumption(BundleContext context) {
+    public void testRequiredServiceRegistrationAndConsumption() {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
@@ -66,7 +60,7 @@
     }
     
     @Test
-    public void testOptionalServiceRegistrationAndConsumption(BundleContext context) {
+    public void testOptionalServiceRegistrationAndConsumption() {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2344_ExtraDependencyWithAutoConfigTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX2344_ExtraDependencyWithAutoConfigTest.java
similarity index 88%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2344_ExtraDependencyWithAutoConfigTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX2344_ExtraDependencyWithAutoConfigTest.java
index 3a405f6..0e87840 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2344_ExtraDependencyWithAutoConfigTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX2344_ExtraDependencyWithAutoConfigTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -32,23 +32,17 @@
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
 import org.osgi.framework.BundleContext;
 
-@RunWith(JUnit4TestRunner.class)
-public class FELIX2344_ExtraDependencyWithAutoConfigTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
 
+@RunWith(PaxExam.class)
+public class FELIX2344_ExtraDependencyWithAutoConfigTest extends TestBase {
     /**
      * Test if an auto config extra dependency is injected in the expected order.
      */
     @Test
-    public void testExtraDependencyWithAutoConfig(BundleContext context) {  
+    public void testExtraDependencyWithAutoConfig() {  
         DependencyManager m = new DependencyManager(context);
         // Helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2344_ExtraDependencyWithCallbackTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX2344_ExtraDependencyWithCallbackTest.java
similarity index 88%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2344_ExtraDependencyWithCallbackTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX2344_ExtraDependencyWithCallbackTest.java
index 9dfda9c..4fa7245 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2344_ExtraDependencyWithCallbackTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX2344_ExtraDependencyWithCallbackTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -35,23 +35,17 @@
 /**
  * Tests for extra dependencies which are declared from service's init method.
  */
-@RunWith(JUnit4TestRunner.class)
-public class FELIX2344_ExtraDependencyWithCallbackTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
 
+@RunWith(PaxExam.class)
+public class FELIX2344_ExtraDependencyWithCallbackTest extends TestBase {
     /**
      * Checks if an extra optional/required dependency is properly injected into a consumer, using callbacks.
      */
     @Test
-    public void testExtraDependencyWithCallback(BundleContext context) {
+    public void testExtraDependencyWithCallback() {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
@@ -82,6 +76,7 @@
         m.add(sc3);
         m.add(sp);
         e.waitForStep(12, 5000);
+        m.clear();
     }
     
     public interface ProviderInterface {
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2348_ResourceAdapterTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX2348_ResourceAdapterTest.java
similarity index 89%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2348_ResourceAdapterTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX2348_ResourceAdapterTest.java
index 9061ddf..9fbbd37 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2348_ResourceAdapterTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX2348_ResourceAdapterTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -46,20 +46,14 @@
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 
-@RunWith(JUnit4TestRunner.class)
-public class FELIX2348_ResourceAdapterTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
 
+@RunWith(PaxExam.class)
+public class FELIX2348_ResourceAdapterTest extends TestBase {
     @Test
-    public void testBasicResourceAdapter(BundleContext context) throws Exception {
+    public void testBasicResourceAdapter() throws Exception {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
@@ -67,6 +61,7 @@
               .setImplementation(new ResourceAdapter(e)));
         m.add(m.createComponent().setImplementation(new ResourceProvider(e)).add(m.createServiceDependency().setService(ResourceHandler.class).setCallbacks("add", "remove")));
         e.waitForStep(3, 5000);
+        m.clear();
      }
     
     static class ResourceAdapter {
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2369_ExtraDependencyTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX2369_ExtraDependencyTest.java
similarity index 88%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2369_ExtraDependencyTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX2369_ExtraDependencyTest.java
index 925a51d..ce414f4 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2369_ExtraDependencyTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX2369_ExtraDependencyTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -41,21 +41,15 @@
  * This testcase verify that a Service is not started if one of its extra required dependencies
  * is unavailable.
  */
-@RunWith(JUnit4TestRunner.class)
-public class FELIX2369_ExtraDependencyTest extends Base
-{
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
 
+@RunWith(PaxExam.class)
+public class FELIX2369_ExtraDependencyTest extends TestBase
+{
     @Test
-    public void testExtraDependencies(BundleContext context) {
+    public void testExtraDependencies() {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
@@ -129,4 +123,4 @@
             m_ensure.step(m_startStep+1);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX3008_FilterIndexStartupTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX3008_FilterIndexStartupTest.java
similarity index 80%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX3008_FilterIndexStartupTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX3008_FilterIndexStartupTest.java
index 2be6917..b08fd1a 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX3008_FilterIndexStartupTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX3008_FilterIndexStartupTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 //import static org.ops4j.pax.exam.CoreOptions.waitForFrameworkStartupFor;
 //import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.vmOption;
 
@@ -36,22 +36,14 @@
 import org.osgi.framework.BundleContext;
 
 
-@RunWith(JUnit4TestRunner.class)
-public class FELIX3008_FilterIndexStartupTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            //vmOption( "-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005" ),
-            //waitForFrameworkStartupFor(Long.MAX_VALUE),
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject().noStart()
-            )
-        );
-    }
-    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
+
+@RunWith(PaxExam.class)
+public class FELIX3008_FilterIndexStartupTest extends TestBase {
     @Test
-    public void testNormalStart(BundleContext context) throws Exception {
+    public void testNormalStart() throws Exception {
         System.setProperty("org.apache.felix.dependencymanager.filterindex", "objectClass");
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX3057_EmptyServiceReferenceArray.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX3057_EmptyServiceReferenceArray.java
similarity index 74%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX3057_EmptyServiceReferenceArray.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX3057_EmptyServiceReferenceArray.java
index fea7273..2c962f0 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX3057_EmptyServiceReferenceArray.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX3057_EmptyServiceReferenceArray.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 //import static org.ops4j.pax.exam.CoreOptions.waitForFrameworkStartupFor;
 //import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.vmOption;
 
@@ -35,27 +35,19 @@
 import org.osgi.framework.InvalidSyntaxException;
 
 
-@RunWith(JUnit4TestRunner.class)
-public class FELIX3057_EmptyServiceReferenceArray extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            //vmOption( "-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005" ),
-            //waitForFrameworkStartupFor(Long.MAX_VALUE),
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject().noStart()
-            )
-        );
-    }
-    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
+
+@RunWith(PaxExam.class)
+public class FELIX3057_EmptyServiceReferenceArray extends TestBase {
     @Test
-    public void testWithoutIndex(BundleContext context) throws Exception {
+    public void testWithoutIndex() throws Exception {
         executeTest(context);
     }
     
     @Test
-    public void testWithIndex(BundleContext context) throws Exception {
+    public void testWithIndex() throws Exception {
         System.setProperty(DependencyManager.SERVICEREGISTRY_CACHE_INDICES, "objectClass");
         executeTest(context);
     }
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX3186_AspectAdapterTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX3186_AspectAdapterTest.java
similarity index 89%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX3186_AspectAdapterTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX3186_AspectAdapterTest.java
index 7dca3a9..2f16f27 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX3186_AspectAdapterTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FELIX3186_AspectAdapterTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -32,6 +32,10 @@
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
 
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
+
 /**
  * Scenario: 
  * 
@@ -40,20 +44,10 @@
  * Expected behavior is transparent replacement of the service the adapter adapts with the aspect service.
  *
  */
-@RunWith(JUnit4TestRunner.class)
-public class FELIX3186_AspectAdapterTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }
-    
+@RunWith(PaxExam.class)
+public class FELIX3186_AspectAdapterTest extends TestBase {
     @Test
-    public void testAdapterWithAspectMultipleTimes(BundleContext context) throws Exception {
+    public void testAdapterWithAspectMultipleTimes() throws Exception {
         // TODO this test is broken, it assumes that the order in which listeners are added to the BundleContext will also
         // be the order in which they're invoked (which from a spec point of view is not true)
         
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceAdapterTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FilterIndexResourceAdapterTest.java
similarity index 89%
copy from dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceAdapterTest.java
copy to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FilterIndexResourceAdapterTest.java
index a7d9f49..349f11a 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceAdapterTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/FilterIndexResourceAdapterTest.java
@@ -16,7 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
+//import static org.ops4j.pax.exam.CoreOptions.waitForFrameworkStartupFor;
+//import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.vmOption;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -36,6 +38,7 @@
 import org.apache.felix.dm.DependencyManager;
 import org.apache.felix.dm.ResourceHandler;
 import org.apache.felix.dm.ResourceUtil;
+import org.apache.felix.dm.ServiceUtil;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.ops4j.pax.exam.Option;
@@ -46,20 +49,16 @@
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 
-@RunWith(JUnit4TestRunner.class)
-public class ResourceAdapterTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
 
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
+
+@RunWith(PaxExam.class)
+public class FilterIndexResourceAdapterTest extends TestBase {
     @Test
-    public void testBasicResourceAdapter(BundleContext context) throws Exception {
+    public void testBasicResourceAdapter() throws Exception {
+        System.setProperty("org.apache.felix.dependencymanager.filterindex", "objectClass");
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
@@ -78,6 +77,7 @@
         provider.change();
         // wait until the changed callback is invoked
         e.waitForStep(4, 5000);
+        m.clear();
      }
     
     static class ResourceAdapter {
@@ -135,6 +135,7 @@
         }
 
         public void add(ServiceReference ref, ResourceHandler handler) {
+            System.out.println("RP.add: " + ServiceUtil.toString(ref));
             String filterString = (String) ref.getProperty("filter");
             Filter filter = null;
             if (filterString != null) {
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/MultipleExtraDependenciesTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/MultipleExtraDependenciesTest.java
similarity index 92%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/MultipleExtraDependenciesTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/MultipleExtraDependenciesTest.java
index 8789ad5..2dc0d26 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/MultipleExtraDependenciesTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/MultipleExtraDependenciesTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -35,25 +35,19 @@
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
 import org.osgi.framework.BundleContext;
 
-@RunWith(JUnit4TestRunner.class)
-public class MultipleExtraDependenciesTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
-    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
+
+@RunWith(PaxExam.class)
+public class MultipleExtraDependenciesTest extends TestBase {
     /**
      * Check that list of extra dependencies (defined from init method) are handled properly.
      * The extra dependencies are added using a List object (Component.add(List)).
      * A component c1 will define two extra dependencies over *available* c4/c5 services.
      */
      @Test
-     public void testWithTwoAvailableExtraDependency(BundleContext context) {   
+     public void testWithTwoAvailableExtraDependency() {   
          DependencyManager m = new DependencyManager(context);
          // Helper class that ensures certain steps get executed in sequence
          Ensure e = new Ensure();
@@ -103,6 +97,7 @@
          // both extra dependencies are available, so the c1 component should be started immediately.
          m.add(c1);
          e.waitForStep(3, 3000);
+         m.clear();
      }
 
     /**
@@ -114,7 +109,7 @@
      * Then c5 is added, and it triggers the c1 activation ...
      */
    @Test
-    public void testWithOneAvailableExtraDependency(BundleContext context) {  
+    public void testWithOneAvailableExtraDependency() {  
         DependencyManager m = new DependencyManager(context);
         // Helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
@@ -166,6 +161,7 @@
         System.out.println("\n+++ Adding c5 / Service3(yy)");
         m.add(c5);
         e.waitForStep(3, 3000);
+        m.clear();
     }
 
 
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/MultipleExtraDependencyTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/MultipleExtraDependencyTest.java
similarity index 91%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/MultipleExtraDependencyTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/MultipleExtraDependencyTest.java
index 91f4d12..75111f4 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/MultipleExtraDependencyTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/MultipleExtraDependencyTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -36,20 +36,14 @@
 /**
  * Test which validates multi-dependencies combination.
  */
-@RunWith(JUnit4TestRunner.class)
-public class MultipleExtraDependencyTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
-    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
+
+@RunWith(PaxExam.class)
+public class MultipleExtraDependencyTest extends TestBase {
     @Test
-    public void testMultipleExtraDependencies(BundleContext context)
+    public void testMultipleExtraDependencies()
     {
         DependencyManager m = new DependencyManager(context);
         Ensure e = new Ensure();
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/MultipleServiceDependencyTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/MultipleServiceDependencyTest.java
similarity index 88%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/MultipleServiceDependencyTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/MultipleServiceDependencyTest.java
index c8f5bf4..599012c 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/MultipleServiceDependencyTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/MultipleServiceDependencyTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -34,20 +34,14 @@
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 
-@RunWith(JUnit4TestRunner.class)
-public class MultipleServiceDependencyTest extends Base {
-   @Configuration
-   public static Option[] configuration() {
-       return options(
-           provision(
-               mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-               mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-           )
-       );
-   }    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
 
+@RunWith(PaxExam.class)
+public class MultipleServiceDependencyTest extends TestBase {
    @Test
-   public void testMultipleServiceRegistrationAndConsumption(BundleContext context) {
+   public void testMultipleServiceRegistrationAndConsumption() {
        DependencyManager m = new DependencyManager(context);
        // helper class that ensures certain steps get executed in sequence
        Ensure e = new Ensure();
@@ -68,7 +62,7 @@
    }
 
    @Test
-   public void testReplacementAutoConfig(BundleContext context) {
+   public void testReplacementAutoConfig() {
        DependencyManager m = new DependencyManager(context);
        // helper class that ensures certain steps get executed in sequence
        Ensure e = new Ensure();
@@ -89,7 +83,7 @@
    }
 
    @Test
-   public void testReplacementCallbacks(BundleContext context) {
+   public void testReplacementCallbacks() {
        DependencyManager m = new DependencyManager(context);
        // helper class that ensures certain steps get executed in sequence
        Ensure e = new Ensure();
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceAdapterDependencyAddAndRemoveTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ResourceAdapterDependencyAddAndRemoveTest.java
similarity index 93%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceAdapterDependencyAddAndRemoveTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ResourceAdapterDependencyAddAndRemoveTest.java
index 642d259..ddc8f91 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceAdapterDependencyAddAndRemoveTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ResourceAdapterDependencyAddAndRemoveTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -48,20 +48,14 @@
 import org.osgi.framework.ServiceReference;
 
 
-@RunWith(JUnit4TestRunner.class)
-public class ResourceAdapterDependencyAddAndRemoveTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
 
+@RunWith(PaxExam.class)
+public class ResourceAdapterDependencyAddAndRemoveTest extends TestBase {
     @Test
-    public void testBasicResourceAdapter(BundleContext context) throws Exception {
+    public void testBasicResourceAdapter() throws Exception {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceAdapterTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ResourceAdapterTest.java
similarity index 91%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceAdapterTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ResourceAdapterTest.java
index a7d9f49..11624cf 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceAdapterTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ResourceAdapterTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -46,20 +46,14 @@
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 
-@RunWith(JUnit4TestRunner.class)
-public class ResourceAdapterTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
 
+@RunWith(PaxExam.class)
+public class ResourceAdapterTest extends TestBase {
     @Test
-    public void testBasicResourceAdapter(BundleContext context) throws Exception {
+    public void testBasicResourceAdapter() throws Exception {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
@@ -78,6 +72,7 @@
         provider.change();
         // wait until the changed callback is invoked
         e.waitForStep(4, 5000);
+        m.clear();
      }
     
     static class ResourceAdapter {
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceDependencyTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ResourceDependencyTest.java
similarity index 93%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceDependencyTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ResourceDependencyTest.java
index f2938a0..09a9c91 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceDependencyTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ResourceDependencyTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -47,20 +47,14 @@
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 
-@RunWith(JUnit4TestRunner.class)
-public class ResourceDependencyTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
-    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
+
+@RunWith(PaxExam.class)
+public class ResourceDependencyTest extends TestBase {
     @Test
-    public void testResourceDependency(BundleContext context) {
+    public void testResourceDependency() {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ServiceDependencyComponentLifeCycleTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ServiceDependencyComponentLifeCycleTest.java
similarity index 89%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/ServiceDependencyComponentLifeCycleTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ServiceDependencyComponentLifeCycleTest.java
index 07618f3..25a5905 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ServiceDependencyComponentLifeCycleTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ServiceDependencyComponentLifeCycleTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 //import static org.ops4j.pax.exam.CoreOptions.waitForFrameworkStartupFor;
 //import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.vmOption;
 
@@ -37,22 +37,14 @@
 import org.osgi.util.tracker.ServiceTracker;
 
 
-@RunWith(JUnit4TestRunner.class)
-public class ServiceDependencyComponentLifeCycleTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            //vmOption( "-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005" ),
-            //waitForFrameworkStartupFor(Long.MAX_VALUE),
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
 
+@RunWith(PaxExam.class)
+public class ServiceDependencyComponentLifeCycleTest extends TestBase {
     @Test
-    public void testComponentLifeCycleWhenAddingAndRemovingDependencies(BundleContext context) throws Exception {
+    public void testComponentLifeCycleWhenAddingAndRemovingDependencies() throws Exception {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ServiceDependencyInjectionTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ServiceDependencyInjectionTest.java
similarity index 88%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/ServiceDependencyInjectionTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ServiceDependencyInjectionTest.java
index 0297687..34e8a05 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ServiceDependencyInjectionTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ServiceDependencyInjectionTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -32,20 +32,14 @@
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
 import org.osgi.framework.BundleContext;
 
-@RunWith(JUnit4TestRunner.class)
-public class ServiceDependencyInjectionTest {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
-    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
+
+@RunWith(PaxExam.class)
+public class ServiceDependencyInjectionTest extends TestBase {
     @Test
-    public void testServiceInjection(BundleContext context) {
+    public void testServiceInjection() {
         DependencyManager m = new DependencyManager(context);
         Ensure e = new Ensure();
         // create a service provider and consumer
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ServiceDependencyPropagateTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ServiceDependencyPropagateTest.java
similarity index 87%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/ServiceDependencyPropagateTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ServiceDependencyPropagateTest.java
index 1711bda..7773b09 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ServiceDependencyPropagateTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ServiceDependencyPropagateTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -36,26 +36,20 @@
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
 
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
+
 /**
  * Validates ServiceDependency service properties propagation.
  */
-@RunWith(JUnit4TestRunner.class)
-public class ServiceDependencyPropagateTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
-
+@RunWith(PaxExam.class)
+public class ServiceDependencyPropagateTest extends TestBase {
     /**
      * Checks that a ServiceDependency propagates the dependency service properties to the provided service properties.
      */
     @Test
-    public void testServiceDependencyPropagate(BundleContext context) {
+    public void testServiceDependencyPropagate() {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
@@ -77,6 +71,11 @@
         m.add(c3);
 
         e.waitForStep(3, 10000);
+        
+        m.remove(c3);
+        m.remove(c2);
+        m.remove(c1);
+        m.clear();
     }
     
     /**
@@ -84,7 +83,7 @@
      * using a callback method.
      */
     @Test
-    public void testServiceDependencyPropagateCallback(BundleContext context) {
+    public void testServiceDependencyPropagateCallback() {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
@@ -107,6 +106,7 @@
         m.add(c3);
 
         e.waitForStep(3, 10000);
+        m.clear();
     }
     
     public static class C1 {
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ServiceDependencyTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ServiceDependencyTest.java
similarity index 84%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/ServiceDependencyTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ServiceDependencyTest.java
index db1540e..53e5d19 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ServiceDependencyTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ServiceDependencyTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -31,20 +31,14 @@
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
 import org.osgi.framework.BundleContext;
 
-@RunWith(JUnit4TestRunner.class)
-public class ServiceDependencyTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
 
+@RunWith(PaxExam.class)
+public class ServiceDependencyTest extends TestBase {
     @Test
-    public void testServiceRegistrationAndConsumption(BundleContext context) {
+    public void testServiceRegistrationAndConsumption() {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ServiceDependencyThroughCallbackInstanceTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ServiceDependencyThroughCallbackInstanceTest.java
similarity index 79%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/ServiceDependencyThroughCallbackInstanceTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ServiceDependencyThroughCallbackInstanceTest.java
index df84897..1ebd138 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ServiceDependencyThroughCallbackInstanceTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ServiceDependencyThroughCallbackInstanceTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -31,25 +31,19 @@
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
 import org.osgi.framework.BundleContext;
 
-@RunWith(JUnit4TestRunner.class)
-public class ServiceDependencyThroughCallbackInstanceTest {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
-    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
+
+@RunWith(PaxExam.class)
+public class ServiceDependencyThroughCallbackInstanceTest extends TestBase {
     @Test
-    public void testServiceWithCallbacksAndOneDependency(BundleContext context) {
+    public void testServiceWithCallbacksAndOneDependency() {
         invokeTest(context, 1);
     }
     
     @Test
-    public void testServiceWithCallbacksAndThreeDependencies(BundleContext context) {
+    public void testServiceWithCallbacksAndThreeDependencies() {
         invokeTest(context, 3);
     }
 
@@ -81,6 +75,7 @@
 		);
 		
 		Assert.assertEquals(numberOfServices, instance.getCount());
+		m.clear();
     }
     
     public static interface Service {
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ServiceUpdateTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ServiceUpdateTest.java
similarity index 93%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/ServiceUpdateTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ServiceUpdateTest.java
index a285650..63c810f 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ServiceUpdateTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/ServiceUpdateTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -47,20 +47,14 @@
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 
-@RunWith(JUnit4TestRunner.class)
-public class ServiceUpdateTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
 
+@RunWith(PaxExam.class)
+public class ServiceUpdateTest extends TestBase {
     @Test
-    public void testServiceUpdate(BundleContext context) throws Exception {
+    public void testServiceUpdate() throws Exception {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
@@ -106,6 +100,7 @@
         // wait until the changed event arrived at the component
         e.waitForStep(4, 5000);
         System.out.println("Done!");
+        m.clear();
      }
     
     static class ResourceAdapter implements ServiceInterface {
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/TemporalServiceDependencyTest.java b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/TemporalServiceDependencyTest.java
similarity index 87%
rename from dependencymanager/test/src/test/java/org/apache/felix/dm/test/TemporalServiceDependencyTest.java
rename to dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/TemporalServiceDependencyTest.java
index 4608a7e..6a19001 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/TemporalServiceDependencyTest.java
+++ b/dependencymanager/test2/src/test/java/org/apache/felix/dependencymanager/test2/integration/api/TemporalServiceDependencyTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.test;
+package org.apache.felix.dependencymanager.test2.integration.api;
 
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
@@ -31,20 +31,14 @@
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
 import org.osgi.framework.BundleContext;
 
-@RunWith(JUnit4TestRunner.class)
-public class TemporalServiceDependencyTest extends Base {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version(Base.OSGI_SPEC_VERSION),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
-    
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.apache.felix.dependencymanager.test2.components.Ensure;
+import org.apache.felix.dependencymanager.test2.integration.common.TestBase;
+
+@RunWith(PaxExam.class)
+public class TemporalServiceDependencyTest extends TestBase {
     @Test
-    public void testServiceConsumptionAndIntermittentAvailability(BundleContext context) {
+    public void testServiceConsumptionAndIntermittentAvailability() {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
