diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dependencymanager/test/MultipleServiceDependencyTest.java b/dependencymanager/test/src/test/java/org/apache/felix/dependencymanager/test/MultipleServiceDependencyTest.java
index 691d551..927ea37 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dependencymanager/test/MultipleServiceDependencyTest.java
+++ b/dependencymanager/test/src/test/java/org/apache/felix/dependencymanager/test/MultipleServiceDependencyTest.java
@@ -19,84 +19,130 @@
 
 @RunWith(JUnit4TestRunner.class)
 public class MultipleServiceDependencyTest {
-    @Configuration
-    public static Option[] configuration() {
-        return options(
-            provision(
-                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version("4.2.0"),
-                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
-            )
-        );
-    }    
+   @Configuration
+   public static Option[] configuration() {
+       return options(
+           provision(
+               mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version("4.2.0"),
+               mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
+           )
+       );
+   }    
 
-    @Test
-    public void testMultipleServiceRegistrationAndConsumption(BundleContext context) {
-        DependencyManager m = new DependencyManager(context, new Logger(context));
-        // helper class that ensures certain steps get executed in sequence
-        Ensure e = new Ensure();
-        // create a service provider and consumer
-        Service provider = m.createService().setImplementation(new ServiceProvider(e)).setInterface(ServiceInterface.class.getName(), null);
-        Service providerWithHighRank = m.createService().setImplementation(new ServiceProvider2(e)).setInterface(ServiceInterface.class.getName(), new Properties() {{ put(Constants.SERVICE_RANKING, Integer.valueOf(5)); }});
-        Service consumer = m.createService().setImplementation(new ServiceConsumer(e)).add(m.createServiceDependency().setService(ServiceInterface.class).setRequired(true));
-        m.add(provider);
-        m.add(providerWithHighRank);
-        m.add(consumer);
-        e.waitForStep(3, 1000);
-        m.remove(providerWithHighRank);
-        e.step(4);
-        e.waitForStep(5, 1000);
-        m.remove(provider);
-        m.remove(consumer);
-        e.waitForStep(6, 1000);
-    }
-    
-    static interface ServiceInterface {
-        public void invoke();
-    }
+   @Test
+   public void testMultipleServiceRegistrationAndConsumption(BundleContext context) {
+       DependencyManager m = new DependencyManager(context, new Logger(context));
+       // helper class that ensures certain steps get executed in sequence
+       Ensure e = new Ensure();
+       // create a service provider and consumer
+       Service provider = m.createService().setImplementation(new ServiceProvider(e)).setInterface(ServiceInterface.class.getName(), null);
+       Service providerWithHighRank = m.createService().setImplementation(new ServiceProvider2(e)).setInterface(ServiceInterface.class.getName(), new Properties() {{ put(Constants.SERVICE_RANKING, Integer.valueOf(5)); }});
+       Service consumer = m.createService().setImplementation(new ServiceConsumer(e)).add(m.createServiceDependency().setService(ServiceInterface.class).setRequired(true));
+       m.add(provider);
+       m.add(providerWithHighRank);
+       m.add(consumer);
+       e.waitForStep(3, 1000);
+       m.remove(providerWithHighRank);
+       e.step(4);
+       e.waitForStep(5, 1000);
+       m.remove(provider);
+       m.remove(consumer);
+       e.waitForStep(6, 1000);
+   }
 
-    static class ServiceProvider implements ServiceInterface {
-        private final Ensure m_ensure;
-        public ServiceProvider(Ensure e) {
-            m_ensure = e;
-        }
-        public void invoke() {
-            m_ensure.step(5);
-        }
-    }
+   @Test
+   public void testReplacementAutoConfig(BundleContext context) {
+       DependencyManager m = new DependencyManager(context, new Logger(context));
+       // helper class that ensures certain steps get executed in sequence
+       Ensure e = new Ensure();
+       // create a service provider and consumer
+       Service provider = m.createService().setImplementation(new ServiceProvider(e)).setInterface(ServiceInterface.class.getName(), null);
+       Service provider2 = m.createService().setImplementation(new ServiceProvider2(e)).setInterface(ServiceInterface.class.getName(), null);
+       Service consumer = m.createService().setImplementation(new ServiceConsumer(e)).add(m.createServiceDependency().setService(ServiceInterface.class).setRequired(true));
+       m.add(provider2);
+       m.add(consumer);
+       e.waitForStep(3, 1000);
+       m.add(provider);
+       m.remove(provider2);
+       e.step(4);
+       e.waitForStep(5, 1000);
+       m.remove(provider);
+       m.remove(consumer);
+       e.waitForStep(6, 1000);
+   }
 
-    static class ServiceProvider2 implements ServiceInterface {
-        private final Ensure m_ensure;
-        public ServiceProvider2(Ensure e) {
-            m_ensure = e;
-        }
-        public void invoke() {
-            m_ensure.step(2);
-        }
-    }
+   @Test
+   public void testReplacementCallbacks(BundleContext context) {
+       DependencyManager m = new DependencyManager(context, new Logger(context));
+       // helper class that ensures certain steps get executed in sequence
+       Ensure e = new Ensure();
+       // create a service provider and consumer
+       Service provider = m.createService().setImplementation(new ServiceProvider(e)).setInterface(ServiceInterface.class.getName(), null);
+       Service provider2 = m.createService().setImplementation(new ServiceProvider2(e)).setInterface(ServiceInterface.class.getName(), null);
+       Service consumer = m.createService().setImplementation(new ServiceConsumer(e))
+         .add(m.createServiceDependency()
+              .setService(ServiceInterface.class)
+              .setRequired(true)
+              .setCallbacks("add", "remove"));
+       m.add(provider2);
+       m.add(consumer);
+       e.waitForStep(3, 1000);
+       m.add(provider);
+       m.remove(provider2);
+       e.step(4);
+       e.waitForStep(5, 1000);
+       m.remove(provider);
+       m.remove(consumer);
+       e.waitForStep(6, 1000);
+   }
 
-    static class ServiceConsumer implements Runnable {
-        private volatile ServiceInterface m_service;
-        private final Ensure m_ensure;
+   static interface ServiceInterface {
+       public void invoke();
+   }
 
-        public ServiceConsumer(Ensure e) {
-            m_ensure = e;
-        }
-        
-        public void init() {
-            Thread t = new Thread(this);
-            t.start();
-        }
-        
-        public void run() {
-            m_ensure.step(1);
-            m_service.invoke();
-            m_ensure.step(3);
-            m_ensure.waitForStep(4, 1000);
-            m_service.invoke();
-        }
-        
-        public void destroy() {
-            m_ensure.step(6);
-        }
-    }
-}
+   static class ServiceProvider implements ServiceInterface {
+       private final Ensure m_ensure;
+       public ServiceProvider(Ensure e) {
+           m_ensure = e;
+       }
+       public void invoke() {
+           m_ensure.step(5);
+       }
+   }
+
+   static class ServiceProvider2 implements ServiceInterface {
+       private final Ensure m_ensure;
+       public ServiceProvider2(Ensure e) {
+           m_ensure = e;
+       }
+       public void invoke() {
+           m_ensure.step(2);
+       }
+   }
+
+   static class ServiceConsumer implements Runnable {
+       private volatile ServiceInterface m_service;
+       private final Ensure m_ensure;
+
+       private void add(ServiceInterface service) { m_service = service; }
+       private void remove(ServiceInterface service) { if (m_service == service) { m_service = null; }};
+       public ServiceConsumer(Ensure e) { m_ensure = e; }
+
+       public void start() {
+           Thread t = new Thread(this);
+           t.start();
+       }
+
+       public void run() {
+           m_ensure.step(1);
+           m_service.invoke();
+           m_ensure.step(3);
+           m_ensure.waitForStep(4, 1000);
+           m_service.invoke();
+       }
+
+       public void stop() {
+           m_ensure.step(6);
+       }
+   }
+}
\ No newline at end of file
