Applied feedbacks that Jan Willem sent to me about the new dm-lambda library:

- renamed the DependencyManagerActivator.activate() method to  init(BundleContext ctx, DependencyManager dm) 
- Removed abbreviated names like "cb()" or "cbi" methods, and replaced them with niced method names like "add()/changed()/removed()" ...
- Added a system property "org.apache.felix.dependencymanager.lambda.dependencymode" that allows to control the default
mode of dependency (still to be discussed).
- added full support or new configuration types.


git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1731147 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AbstractServiceDependencyTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AbstractServiceDependencyTest.java
index daa1e22..92ecfd6 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AbstractServiceDependencyTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AbstractServiceDependencyTest.java
@@ -37,7 +37,7 @@
        Component sp = 
            component(m).provides(ServiceAbstract.class).impl(new ServiceProvider(e)).build();
        Component sc = 
-           component(m).impl(new ServiceConsumer(e)).withSrv(ServiceAbstract.class, srv -> srv.cb(ServiceConsumer::bind, ServiceConsumer::unbind)).build();
+           component(m).impl(new ServiceConsumer(e)).withSvc(ServiceAbstract.class, srv -> srv.add(ServiceConsumer::bind).remove(ServiceConsumer::unbind)).build();
            
        m.add(sp);
        m.add(sc);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterAndConsumerTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterAndConsumerTest.java
index eea9782..54c9d58 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterAndConsumerTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterAndConsumerTest.java
@@ -35,7 +35,7 @@
         Ensure e = new Ensure();
 
         Component provider = component(m).provides(OriginalService.class).impl(new ServiceProvider(e)).build();
-        Component consumer = component(m).impl(new ServiceConsumer(e)).withSrv(AdaptedService.class).build();
+        Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(AdaptedService.class).build();
         Component adapter = adapter(m, OriginalService.class).provides(AdaptedService.class).impl(ServiceAdapter.class).build();
         		        
         // add the provider and the adapter
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterNoAutoConfigIfInstanceCallbackIsUsed.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterNoAutoConfigIfInstanceCallbackIsUsed.java
index 32d30df..95c3297 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterNoAutoConfigIfInstanceCallbackIsUsed.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterNoAutoConfigIfInstanceCallbackIsUsed.java
@@ -40,7 +40,7 @@
         
         // Declare S1 adapter
         S1AdapterCallback s1AdapterCB = new S1AdapterCallback();
-        adapter(m, S1.class, a -> a.impl(S1Adapter.class).cbi(s1AdapterCB, "set"));
+        adapter(m, S1.class, a -> a.impl(S1Adapter.class).callbackInstance(s1AdapterCB).add("set"));
         
         // At this point, the s1AdapterCB.set(S1 s1) method should be called, and s1Adapter.start() method should then be called.
         // but s1 should not be injected on s1Adapter class fields.
@@ -58,7 +58,7 @@
         
         // Declare S1 adapter
         S1AdapterCallback s1AdapterCB = new S1AdapterCallback();
-        adapter(m, S1.class, a -> a.impl(S1Adapter.class).cbi(s1AdapterCB::set));
+        adapter(m, S1.class, a -> a.impl(S1Adapter.class).add(s1AdapterCB::set));
         
         // At this point, the s1AdapterCB.set(S1 s1) method should be called, and s1Adapter.start() method should then be called.
         // but s1 should not be injected on s1Adapter class fields.
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithCallbackInstanceTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithCallbackInstanceTest.java
index f6bcbe2..fa622b6 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithCallbackInstanceTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithCallbackInstanceTest.java
@@ -41,13 +41,13 @@
 
         ServiceProvider serviceProvider = new ServiceProvider(e);
         Component provider = component(m).provides(OriginalService.class).impl(serviceProvider).build();
-        Component consumer = component(m).impl(new ServiceConsumer(e)).withSrv(AdaptedService.class).build();
+        Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(AdaptedService.class).build();
         
         ServiceAdapterCallbackInstance callbackInstance = new ServiceAdapterCallbackInstance(e);
         Component adapter = adapter(m, OriginalService.class)
             .provides(AdaptedService.class).impl(new ServiceAdapter(e)).propagate(true)
             .autoConfig("m_originalService")
-            .cbi(callbackInstance, "set", "changed", "unset")
+            .callbackInstance(callbackInstance).add("set").change("changed").remove("unset")
             .build();
        
         // add the provider and the adapter
@@ -82,14 +82,14 @@
 
         ServiceProvider serviceProvider = new ServiceProvider(e);
         Component provider = component(m).provides(OriginalService.class).impl(serviceProvider).build();
-        Component consumer = component(m).impl(new ServiceConsumer(e)).withSrv(AdaptedService.class).build();
+        Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(AdaptedService.class).build();
         
         ServiceAdapterCallbackInstance callbackInstance = new ServiceAdapterCallbackInstance(e);
         Component adapter = adapter(m, OriginalService.class, adp -> adp
             .provides(AdaptedService.class).impl(new ServiceAdapter(e))
             .autoAdd(false).propagate(true)
             .autoConfig("m_originalService")
-            .cbi(callbackInstance::set, callbackInstance::changed, callbackInstance::unset));
+            .add(callbackInstance::set).change(callbackInstance::changed).remove(callbackInstance::unset));
        
         // add the provider and the adapter
         m.add(provider);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithExtraDependenciesTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithExtraDependenciesTest.java
index c514b2d..a62878b 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithExtraDependenciesTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithExtraDependenciesTest.java
@@ -36,7 +36,7 @@
         Ensure e = new Ensure();
         
         // create a service adapter that adapts to services S1 and has an optional dependency on services S2
-        Component sa = adapter(m, S1.class).impl(SA.class).withSrv(S2.class, s2 -> s2.cb("add", "remove")).build();
+        Component sa = adapter(m, S1.class).impl(SA.class).withSvc(S2.class, s2 -> s2.add("add").remove("remove")).build();
         m.add(sa);
         
         // create a service S1, which triggers the creation of the first adapter instance (A1)
@@ -71,7 +71,7 @@
         Ensure e = new Ensure();
         
         // create a service adapter that adapts to services S1 and has an optional dependency on services S2
-        Component sa = adapter(m, S1.class).impl(SA.class).withSrv(S2.class, s2 -> s2.cb(SA::add, SA::remove)).build();
+        Component sa = adapter(m, S1.class).impl(SA.class).withSvc(S2.class, s2 -> s2.add(SA::add).remove(SA::remove)).build();
         m.add(sa);
         
         // create a service S1, which triggers the creation of the first adapter instance (A1)
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithInstanceBoundDependencyTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithInstanceBoundDependencyTest.java
index 4d436fb..1008dbb 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithInstanceBoundDependencyTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithInstanceBoundDependencyTest.java
@@ -38,7 +38,7 @@
         
         Component sp = component(m).provides(ServiceInterface.class).impl(new ServiceProvider(e)).build();
         Component sp2 = component(m).provides(ServiceInterface2.class).impl(new ServiceProvider2(e)).build();
-        Component sc = component(m).impl(new ServiceConsumer(e)).autoAdd(false).withSrv(ServiceInterface3.class).build();
+        Component sc = component(m).impl(new ServiceConsumer(e)).autoAdd(false).withSvc(ServiceInterface3.class).build();
         Component sa = adapter(m, ServiceInterface.class).provides(ServiceInterface3.class).impl(new ServiceAdapter(e)).build();
         m.add(sc);
         m.add(sp);
@@ -107,7 +107,7 @@
         }
         public void init() {
             m_ensure.step(1);
-            component(m_component, c->c.withSrv(ServiceInterface2.class));
+            component(m_component, c->c.withSvc(ServiceInterface2.class));
         }
         public void start() {
             m_ensure.step(2);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithModifiedInstanceBoundDependencyTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithModifiedInstanceBoundDependencyTest.java
index 93fe8b6..10e2f08 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithModifiedInstanceBoundDependencyTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithModifiedInstanceBoundDependencyTest.java
@@ -74,7 +74,7 @@
         
         void init(Component comp) {
             m_e.step(2);
-            component(comp, c->c.withSrv(C.class, s->s.cb("addC", "removeC")));
+            component(comp, c->c.withSvc(C.class, s->s.add("addC").remove("removeC")));
         }      
         
         void addA(A a, Map<String, Object> properties) {
@@ -116,8 +116,8 @@
         Ensure e = new Ensure();
 
         Component a = component(m).impl(new AImpl(e)).provides(A.class).properties(foo -> "bar").build();
-        Component b = adapter(m, A.class).provides(B.class).impl(new BImpl(e)).cb("addA", "changeA", "removeA").build();
-        Component c = component(m).impl(new CImpl()).provides(C.class).withSrv(A.class, "(foo=bar)").build();
+        Component b = adapter(m, A.class).provides(B.class).impl(new BImpl(e)).add("addA").change("changeA").remove("removeA").build();
+        Component c = component(m).impl(new CImpl()).provides(C.class).withSvc(A.class, "(foo=bar)").build();
                       
         m.add(a);
         m.add(c);
@@ -144,8 +144,8 @@
         Ensure e = new Ensure();
 
         Component a = component(m).impl(new AImpl(e)).provides(A.class).properties(foo -> "bar").build();        
-        Component b = adapter(m, A.class).impl(new BImpl(e)).provides(B.class).cb(BImpl::addA, BImpl::changeA, BImpl::removeA).build();        
-        Component c = component(m).impl(new CImpl()).provides(C.class).withSrv(A.class, s -> s.filter("(foo=bar)")).build();
+        Component b = adapter(m, A.class).impl(new BImpl(e)).provides(B.class).add(BImpl::addA).change(BImpl::changeA).remove(BImpl::removeA).build();        
+        Component c = component(m).impl(new CImpl()).provides(C.class).withSvc(A.class, s -> s.filter("(foo=bar)")).build();
                       
         m.add(a);
         m.add(c);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithPropagationTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithPropagationTest.java
index e56bd44..4e57806 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithPropagationTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithPropagationTest.java
@@ -102,8 +102,8 @@
         Ensure e = new Ensure(); 
         
         Component s1 = component(m).impl(new S1Impl(e)).provides(S1.class).properties(p1 -> "v1", p2 -> "v2overriden").build();
-        Component s1Adapter = adapter(m, S1.class).cb("add", "change", null).impl(new S1Adapter(e)).provides(S2.class).properties(p2 -> "v2").build();   
-        Component s3 = component(m).impl(new S3(e)).withSrv(S2.class, s -> s.cb("add", "change", null)).build();
+        Component s1Adapter = adapter(m, S1.class).add("add").change("change").impl(new S1Adapter(e)).provides(S2.class).properties(p2 -> "v2").build();   
+        Component s3 = component(m).impl(new S3(e)).withSvc(S2.class, s -> s.add("add").change("change")).build();
                                           
         m.add(s1);
         m.add(s1Adapter);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithoutPropagationTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithoutPropagationTest.java
index 41c4ad9..1170c38 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithoutPropagationTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithoutPropagationTest.java
@@ -45,11 +45,11 @@
 
         // The Adapter will see the "foo=bar" property from the adaptee
         Component adapter = adapter(m, OriginalService.class)
-            .propagate(false).cb("set", "change", null).provides(AdaptedService.class).impl(new ServiceAdapter(e)).build();
+            .propagate(false).add("set").change("change").provides(AdaptedService.class).impl(new ServiceAdapter(e)).build();
 
         // The consumer depends on the AdaptedService, but won't see foo=bar property from the adaptee 
         Component consumer = component(m) 
-            .impl(new ServiceConsumer(e)).withSrv(AdaptedService.class, b -> b.cb("set", "change", null)).build();
+            .impl(new ServiceConsumer(e)).withSvc(AdaptedService.class, b -> b.add("set").change("change")).build();
         
         // add the provider and the adapter
         m.add(provider);
@@ -80,11 +80,11 @@
 
         // The Adapter will see the "foo=bar" property from the adaptee
         ServiceAdapter saimpl = new ServiceAdapter(e);
-        Component adapter = adapter(m, OriginalService.class).propagate(false).impl(saimpl).provides(AdaptedService.class).cbi(saimpl::set, saimpl::change, null).build();           
+        Component adapter = adapter(m, OriginalService.class).propagate(false).impl(saimpl).provides(AdaptedService.class).add(saimpl::set).change(saimpl::change).build();           
 
         // The consumer depends on the AdaptedService, but won't see foo=bar property from the adaptee 
         ServiceConsumer scimpl = new ServiceConsumer(e);
-        Component consumer = component(m).impl(scimpl).withSrv(AdaptedService.class, s -> s.cbi(scimpl::set, scimpl::change, null)).build();
+        Component consumer = component(m).impl(scimpl).withSvc(AdaptedService.class, s -> s.add(scimpl::set).change(scimpl::change)).build();
         
         // add the provider and the adapter
         m.add(provider);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectBaseTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectBaseTest.java
index e207545..d652eb7 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectBaseTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectBaseTest.java
@@ -45,7 +45,7 @@
         ServiceConsumer c = new ServiceConsumer(e);
         
         Component sp = component(m).impl(p).provides(ServiceInterface.class).properties(name -> "a").build();
-        Component sc = component(m).impl(c).withSrv(ServiceInterface.class, srv -> srv.cb("add", "remove").autoConfig("m_service")).build();
+        Component sc = component(m).impl(c).withSvc(ServiceInterface.class, srv -> srv.add("add").remove("remove").autoConfig("m_service")).build();
         Component sa = aspect(m, ServiceInterface.class).rank(20).impl(ServiceAspect.class).build();
             
         m.add(sc);
@@ -81,7 +81,7 @@
         
         Component sp = component(m).impl(p).provides(ServiceInterface.class).properties(name -> "a").build();        
         Component sc = component(m)
-            .impl(c).withSrv(ServiceInterface.class, srv -> srv.cbi(c::add, c::remove).autoConfig("m_service")).build();
+            .impl(c).withSvc(ServiceInterface.class, srv -> srv.add(c::addRef).remove(c::removeRef).autoConfig("m_service")).build();
         Component sa = aspect(m, ServiceInterface.class).rank(20).impl(ServiceAspect.class).build();
         
         m.add(sc);
@@ -116,7 +116,7 @@
         ServiceProvider p = new ServiceProvider(e, "a");
         ServiceConsumer c = new ServiceConsumer(e);
         Component sp = component(m).impl(p).provides(ServiceInterface.class).properties(name -> "a").build();            
-        Component sc = component(m).impl(c).withSrv(ServiceInterface.class, srv -> srv.cb("add", "remove").autoConfig("m_service")).build();
+        Component sc = component(m).impl(c).withSvc(ServiceInterface.class, srv -> srv.add("add").remove("remove").autoConfig("m_service")).build();
         Component sa = aspect(m, ServiceInterface.class).rank(20).impl(ServiceAspect.class).build();
 
         // we first add the aspect
@@ -158,7 +158,7 @@
         ServiceConsumer c = new ServiceConsumer(e);
         
         Component sp = component(m).impl(p).provides(ServiceInterface.class).properties(name -> "a").build();
-        Component sc = component(m).impl(c).withSrv(ServiceInterface.class, srv -> srv.cbi(c::add, c::remove).autoConfig("m_service")).build();
+        Component sc = component(m).impl(c).withSvc(ServiceInterface.class, srv -> srv.add(c::addRef).remove(c::removeRef).autoConfig("m_service")).build();
         Component sa = aspect(m, ServiceInterface.class).rank(20).impl(ServiceAspect.class).build();
 
         // we first add the aspect
@@ -199,7 +199,7 @@
         ServiceConsumer c = new ServiceConsumer(e);
         Component sp = component(m).impl(new ServiceProvider(e, "a")).provides(ServiceInterface.class).properties(name -> "a").build();
         Component sp2 = component(m).impl(new ServiceProvider(e, "b")).provides(ServiceInterface.class).properties(name -> "b").build();
-        Component sc = component(m).impl(c).withSrv(ServiceInterface.class, srv -> srv.cb("add", "remove")).build();
+        Component sc = component(m).impl(c).withSvc(ServiceInterface.class, srv -> srv.add("add").remove("remove")).build();
 
         Component sa = aspect(m, ServiceInterface.class).rank(20).impl(ServiceAspect.class).build();
         Component sa2 = aspect(m, ServiceInterface.class).rank(10).impl(ServiceAspect.class).build();
@@ -241,7 +241,7 @@
         ServiceConsumer c = new ServiceConsumer(e);
         Component sp = component(m).impl(new ServiceProvider(e, "a")).provides(ServiceInterface.class).properties(name -> "a").build();
         Component sp2 = component(m).impl(new ServiceProvider(e, "b")).provides(ServiceInterface.class).properties(name -> "b").build();
-        Component sc = component(m).impl(c).withSrv(ServiceInterface.class, srv -> srv.cbi(c::add, c::remove)).build();
+        Component sc = component(m).impl(c).withSvc(ServiceInterface.class, srv -> srv.add(c::addRef).remove(c::removeRef)).build();
 
         Component sa = aspect(m, ServiceInterface.class).rank(20).impl(ServiceAspect.class).build();
         Component sa2 = aspect(m, ServiceInterface.class).rank(10).impl(ServiceAspect.class).build();
@@ -310,13 +310,21 @@
             m_ensure = e;
         }
         
-        public void add(ServiceReference<ServiceInterface> ref, ServiceInterface si) {
+        public void addRef(ServiceInterface si, ServiceReference<ServiceInterface> ref) { // method ref callback
+            add(ref, si);
+        }
+        
+        public void add(ServiceReference<ServiceInterface> ref, ServiceInterface si) { // reflection callback
             System.out.println("add: " + ServiceUtil.toString(ref));
             m_services.add(si);
             m_ensure.step();
         }
         
-        public void remove(ServiceReference<ServiceInterface> ref, ServiceInterface si) {
+        public void removeRef(ServiceInterface si, ServiceReference<ServiceInterface> ref) { // method ref callback
+            remove(ref, si);
+        }
+        
+        public void remove(ServiceReference<ServiceInterface> ref, ServiceInterface si) { // reflection callback
             System.out.println("rem: " + ServiceUtil.toString(ref));
             m_services.remove(si);
             m_ensure.step();
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectChainTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectChainTest.java
index 81bfa7e..6e16f25 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectChainTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectChainTest.java
@@ -35,7 +35,7 @@
         Ensure e = new Ensure();
         // create a service provider and consumer
         Component sp = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class).build();
-        Component sc = component(m).impl(new ServiceConsumer(e)).withSrv(ServiceInterface.class).build();
+        Component sc = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class).build();
         Component sa2 = aspect(m, ServiceInterface.class).rank(20).impl(new ServiceAspect(e, 3)).build();
         Component sa3 = aspect(m, ServiceInterface.class).rank(30).impl(new ServiceAspect(e, 2)).build();
         Component sa1 = aspect(m, ServiceInterface.class).rank(10).impl(new ServiceAspect(e, 4)).build();
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectDynamicsTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectDynamicsTest.java
index b89ef9a..b9812dd 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectDynamicsTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectDynamicsTest.java
@@ -37,7 +37,7 @@
         // create a service provider and consumer
         Component provider = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class).build();
         Component provider2 = component(m).impl(new ServiceProvider2(e)).provides(ServiceInterface2.class.getName()).build();
-        Component consumer = component(m).impl(new ServiceConsumer(e)).withSrv(ServiceInterface.class, s->s.cb("add", null, null, "swap")).build();
+        Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class, s->s.add("add").swap("swap")).build();
         Component aspect = aspect(m, ServiceInterface.class).autoAdd(false).rank(1).impl(new ServiceAspect(e, aspectStopEnsure)).build();
         
         m.add(consumer);
@@ -94,7 +94,7 @@
         // create a service provider and consumer
         Component provider = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class.getName()).build();
         Component provider2 = component(m).impl(new ServiceProvider2(e)).provides(ServiceInterface2.class.getName()).build();
-        Component consumer = component(m).impl(new ServiceConsumer(e)).withSrv(ServiceInterface.class, s->s.cb(ServiceConsumer::add).sw(ServiceConsumer::swap)).build();
+        Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class, s->s.add(ServiceConsumer::add).swap(ServiceConsumer::swap)).build();
         Component aspect = aspect(m, ServiceInterface.class).autoAdd(false).rank(1).impl(new ServiceAspect(e, aspectStopEnsure)).build();
         
         m.add(consumer);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectServiceDependencyTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectServiceDependencyTest.java
index 145cc8c..c555d79 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectServiceDependencyTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectServiceDependencyTest.java
@@ -35,7 +35,7 @@
         Ensure e = new Ensure();
         // create a service provider and consumer
         Component sp = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class.getName()).build();
-        Component sc = component(m).impl(new ServiceConsumer(e)).withSrv(ServiceInterface.class, s->s.cb("add", "remove")).build();
+        Component sc = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class, s->s.add("add").remove("remove")).build();
         Component asp = aspect(m, ServiceInterface.class).rank(100).impl(ServiceProviderAspect.class).build();
         		
         m.add(sp);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectServiceDependencyWithSwapCallbackTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectServiceDependencyWithSwapCallbackTest.java
index 6140f8e..89d0113 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectServiceDependencyWithSwapCallbackTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectServiceDependencyWithSwapCallbackTest.java
@@ -35,7 +35,7 @@
         Ensure e = new Ensure();
         // create a service provider and consumer
         Component sp = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class).build();
-        Component sc = component(m).impl(new ServiceConsumer(e)).withSrv(ServiceInterface.class, s->s.cb("add", null, "remove", "swap")).build();
+        Component sc = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class, s->s.add("add").remove("remove").swap("swap")).build();
         Component asp = aspect(m, ServiceInterface.class).rank(100).impl(ServiceProviderAspect.class).build();
         m.add(sp);
         m.add(sc);
@@ -55,7 +55,7 @@
         // create a service provider and consumer
         ServiceConsumer scimpl = new ServiceConsumer(e);
         Component sp = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class).build();
-        Component sc = component(m).impl(scimpl).withSrv(ServiceInterface.class, s->s.cbi(scimpl::add, scimpl::remove).swi(scimpl::swap)).build();
+        Component sc = component(m).impl(scimpl).withSvc(ServiceInterface.class, s->s.add(scimpl::add).remove(scimpl::remove).swap(scimpl::swap)).build();
         Component asp = aspect(m, ServiceInterface.class).rank(100).impl(ServiceProviderAspect.class).build();
         m.add(sp);
         m.add(sc);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectWhiteboardTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectWhiteboardTest.java
index ae45b3c..8271808 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectWhiteboardTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectWhiteboardTest.java
@@ -43,7 +43,7 @@
         Component sp1 = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class.getName()).build();
         Component sp2 = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class.getName()).build();
         ServiceConsumer sci = new ServiceConsumer(e);
-        Component sc = component(m).impl(sci).withSrv(ServiceInterface.class, srv->srv.required(false).cb("add", "remove")).build();
+        Component sc = component(m).impl(sci).withSvc(ServiceInterface.class, srv->srv.required(false).add("add").remove("remove")).build();
         Component sa2 = aspect(m, ServiceInterface.class).rank(20).autoAdd(false).impl(new ServiceAspect(e, 3)).build();
         Component sa1 = aspect(m, ServiceInterface.class).rank(10).autoAdd(false).impl(new ServiceAspect(e, 4)).build();
         
@@ -120,9 +120,9 @@
         Component sp1 = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class.getName()).build();
         Component sp2 = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class.getName()).build();
         ServiceConsumer sci = new ServiceConsumer(e);
-        Component sc = component(m).impl(sci).withSrv(ServiceInterface.class, srv->srv.required(false).cbi(sci::add, sci::remove)).build();
-        Component sa2 = aspect(m, ServiceInterface.class).rank(20).autoAdd(false).impl(new ServiceAspect(e, 3)).build();
-        Component sa1 = aspect(m, ServiceInterface.class).rank(10).autoAdd(false).impl(new ServiceAspect(e, 4)).build();
+        Component sc = component(m).impl(sci).withSvc(ServiceInterface.class, srv->srv.optional().add(sci::addRef).remove(sci::removeRef)).build();
+        Component sa2 = aspect(m, ServiceInterface.class).rank(20).impl(new ServiceAspect(e, 3)).build();
+        Component sa1 = aspect(m, ServiceInterface.class).rank(10).impl(new ServiceAspect(e, 4)).build();
         
         // start with a service consumer
         System.out.println("Adding consumer");
@@ -265,13 +265,26 @@
             return ranking;
         }
         
+        // method ref callback
+        public void addRef(ServiceInterface svc, ServiceReference ref) {
+            add(ref, svc);
+        }
+        
+        // refection callback
         public void add(ServiceReference ref, ServiceInterface svc) {
             System.out.println("Added: " + ServiceUtil.toString(ref));
             m_services.add(ref);
         }
+        
+        // method ref callback
+        public void removeRef(ServiceInterface svc, ServiceReference ref) {
+            remove(ref, svc);
+        }
+
+        // refection callback
         public void remove(ServiceReference ref, ServiceInterface svc) {
             System.out.println("Removed: " + ServiceUtil.toString(ref));
             m_services.remove(ref);
-        }
+        }        
     }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectWithCallbacksServiceDependencyTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectWithCallbacksServiceDependencyTest.java
index 4cffad6..06f0d35 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectWithCallbacksServiceDependencyTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectWithCallbacksServiceDependencyTest.java
@@ -35,8 +35,8 @@
         Ensure e = new Ensure();
         // create a service provider and consumer
         Component sp = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class.getName()).build();
-        Component sc = component(m).impl(new ServiceConsumer(e)).withSrv(ServiceInterface.class, s->s.cb("add", "remove")).build();
-        Component asp = aspect(m, ServiceInterface.class).rank(100).cb("add", null, "remove", "swap").impl(ServiceProviderAspect.class).build();
+        Component sc = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class, s->s.add("add").remove("remove")).build();
+        Component asp = aspect(m, ServiceInterface.class).rank(100).add("add").remove("remove").swap("swap").impl(ServiceProviderAspect.class).build();
             
         m.add(sp);
         m.add(sc);
@@ -55,10 +55,10 @@
         Ensure e = new Ensure();
         // create a service provider and consumer
         Component sp = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class.getName()).build();
-        Component sc = component(m).impl(new ServiceConsumer(e)).withSrv(ServiceInterface.class, s->s.cb(ServiceConsumer::add, ServiceConsumer::remove)).build();            
+        Component sc = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class, s->s.add(ServiceConsumer::add).remove(ServiceConsumer::remove)).build();            
         Component asp = aspect(m, ServiceInterface.class)
             .impl(ServiceProviderAspect.class).rank(100)
-            .cb(ServiceProviderAspect::add, ServiceProviderAspect::remove).sw(ServiceProviderAspect::swap)
+            .add(ServiceProviderAspect::add).remove(ServiceProviderAspect::remove).swap(ServiceProviderAspect::swap)
             .build();
                 
         m.add(sp);
@@ -78,11 +78,11 @@
         Ensure e = new Ensure();
         // create a service provider and consumer
         Component sp = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class).build();
-        Component sc = component(m).impl(new ServiceConsumer(e)).withSrv(ServiceInterface.class, s->s.cb("add", "remove")).build();
+        Component sc = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class, s->s.add("add").remove("remove")).build();
                 
         ServiceProviderAspect providerAspect = new ServiceProviderAspect();
         ServiceProviderAspectCallbackInstance aspectCb = new ServiceProviderAspectCallbackInstance(providerAspect);
-        Component asp = aspect(m, ServiceInterface.class).rank(100).impl(providerAspect).cbi(aspectCb::add, aspectCb::remove).swi(aspectCb::swap).build();
+        Component asp = aspect(m, ServiceInterface.class).rank(100).impl(providerAspect).add(aspectCb::add).remove(aspectCb::remove).swap(aspectCb::swap).build();
             
         m.add(sp);
         m.add(sc);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectWithPropagationTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectWithPropagationTest.java
index 0a6b336..bcf8e84 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectWithPropagationTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AspectWithPropagationTest.java
@@ -99,7 +99,7 @@
         		}
         	}
         };
-        Component clientComp = component(m).impl(client).withSrv(S.class, srv->srv.cb("add", "change", null)).build();
+        Component clientComp = component(m).impl(client).withSvc(S.class, srv->srv.add("add").change("change")).build();
         
         // Add components in dependency manager
         m.add(sComp);
@@ -151,12 +151,12 @@
                 
         // Create an aspect aware client, depending on "S" service.
         Client clientImpl;
-        Component client = component(m).impl((clientImpl = new Client())).withSrv(S.class, srv -> srv.cb("add", "change", "remove", "swap")).build();     
+        Component client = component(m).impl((clientImpl = new Client())).withSvc(S.class, srv -> srv.add("add").change("change").remove("remove").swap("swap")).build();     
 
         // Create some "S" aspects
         Component[] aspects = new Component[ASPECTS];
         for (int rank = 1; rank <= ASPECTS; rank ++) {
-            aspects[rank-1] = aspect(m, S.class).rank(rank).impl(new A("A" + rank, rank)).cb("add", "change", "remove", "swap").build();
+            aspects[rank-1] = aspect(m, S.class).rank(rank).impl(new A("A" + rank, rank)).add("add").change("change").remove("remove").swap("swap").build();
             props = new Hashtable();
             props.put("a" + rank, "v" + rank);
             aspects[rank-1].setServiceProperties(props);
@@ -261,7 +261,7 @@
         
         // Create an aspect aware client, depending on "S" service.
         Client clientImpl;
-        Component client = component(m).impl((clientImpl = new Client())).withSrv(S.class, srv->srv.cb("add", "change", "remove")).build();            
+        Component client = component(m).impl((clientImpl = new Client())).withSvc(S.class, srv->srv.add("add").change("change").remove("remove")).build();            
 
         // Create some "S" aspects
         Component[] aspects = new Component[ASPECTS];
@@ -354,18 +354,18 @@
         // Create some "S" aspects
         Component[] aspects = new Component[ASPECTS];
         for (int rank = 1; rank <= ASPECTS; rank ++) {
-            aspects[rank-1] = aspect(m, S.class).rank(rank).impl(new A("A" + rank, rank)).cb("add", "change", "remove", "swap").build();
+            aspects[rank-1] = aspect(m, S.class).rank(rank).impl(new A("A" + rank, rank)).add("add").change("change").remove("remove").swap("swap").build();
             props = new Hashtable();
             props.put("a" + rank, "v" + rank);
             aspects[rank-1].setServiceProperties(props);
         } 
         
         // Create S2 adapter (which adapts S1 to S2 interface)
-        Component adapter = adapter(m, S.class).cb("add", "change", "remove", "swap").provides(S2.class).impl(new S2Impl()).build();
+        Component adapter = adapter(m, S.class).add("add").change("change").remove("remove").swap("swap").provides(S2.class).impl(new S2Impl()).build();
         
         // Create Client2, which depends on "S2" service.
         Client2 client2Impl;
-        Component client2 = component(m).impl((client2Impl = new Client2())).withSrv(S2.class, srv -> srv.cb("add", "change", null)).build();
+        Component client2 = component(m).impl((client2Impl = new Client2())).withSvc(S2.class, srv -> srv.add("add").change("change")).build();
               
         // Register client2
         m.add(client2);
@@ -451,7 +451,7 @@
         
         // Create Client2, which depends on "S2" service.
         Client2 client2Impl;
-        Component client2 = component(m).impl((client2Impl = new Client2())).withSrv(S2.class, srv->srv.cb("add", "change", null)).build();
+        Component client2 = component(m).impl((client2Impl = new Client2())).withSvc(S2.class, srv->srv.add("add").change("change")).build();
               
         // Register client2
         m.add(client2);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AutoConfigTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AutoConfigTest.java
index 3f9839c..36e84b1 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AutoConfigTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AutoConfigTest.java
@@ -148,7 +148,7 @@
     }
 
     private Component createConsumer(DependencyManager dm, Object consumer) {
-        return component(dm).impl(consumer).withSrv(Provider.class).build();
+        return component(dm).impl(consumer).withSvc(Provider.class).build();
     }
 
     public static interface Provider extends Runnable {      
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/BundleAdapterTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/BundleAdapterTest.java
index f91c1ff..bfee928 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/BundleAdapterTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/BundleAdapterTest.java
@@ -66,7 +66,8 @@
         
         Component adapter = bundleAdapter(m)
             .mask(Bundle.INSTALLED | Bundle.RESOLVED | Bundle.ACTIVE)
-            .cbi(cbInstance, "add", "remove")
+            .callbackInstance(cbInstance)
+            .add("add").remove("remove")
             .impl(baWithCb)
             .provides(BundleAdapter.class.getName())
             .build();
@@ -75,7 +76,7 @@
         Consumer c = new Consumer();
         Component consumer = component(m)
             .impl(c)
-            .withSrv(BundleAdapter.class, s->s.cb("add", "remove"))
+            .withSvc(BundleAdapter.class, s->s.add("add").remove("remove"))
             .build();
         
         // add the bundle adapter
@@ -100,7 +101,7 @@
         
         Component adapter = bundleAdapter(m)
             .mask(Bundle.INSTALLED | Bundle.RESOLVED | Bundle.ACTIVE)
-            .cbi(cbInstance::add, cbInstance::remove)
+            .add(cbInstance::addRef).remove(cbInstance::removeRef)
             .impl(baWithCb)
             .provides(BundleAdapter.class.getName())
             .build();
@@ -109,7 +110,7 @@
         Consumer c = new Consumer();
         Component consumer = component(m)
             .impl(c)
-            .withSrv(BundleAdapter.class, s->s.cb("add", "remove"))
+            .withSvc(BundleAdapter.class, s->s.add("add").remove("remove"))
             .build();
         
         // add the bundle adapter
@@ -151,13 +152,21 @@
     		m_ba = ba;
     	}
     	
-        void add(Component c, Bundle b) {
+        void add(Component c, Bundle b) { // reflection callback
         	m_ba.add(b);	
         }
-        
-        void remove(Component c, Bundle b) {
+         
+        void addRef(Bundle b, Component c) { // method reference callback
+            add(c, b);  
+        }
+
+        void remove(Component c, Bundle b) { // reflection callback
         	m_ba.remove(b);
         }
+        
+        void removeRef(Bundle b, Component c) { // method reference callback
+            remove (c, b);
+        }
     }
     
     static class Consumer {
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/BundleAdapterWithCallbacksNotAutoConfiguredTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/BundleAdapterWithCallbacksNotAutoConfiguredTest.java
index 76b6eb8..2a55f03 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/BundleAdapterWithCallbacksNotAutoConfiguredTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/BundleAdapterWithCallbacksNotAutoConfiguredTest.java
@@ -38,7 +38,7 @@
         String bsn = "org.apache.felix.dependencymanager";
         String filter = "(Bundle-SymbolicName=" + bsn + ")";
 
-        Component adapter = bundleAdapter(m).mask(Bundle.ACTIVE).filter(filter).cb("add").impl(baWithCb).build();
+        Component adapter = bundleAdapter(m).mask(Bundle.ACTIVE).filter(filter).add("add").impl(baWithCb).build();
                     												 
         // add the bundle adapter
         m.add(adapter);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/BundleDependencyTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/BundleDependencyTest.java
index b9d1937..5924d93 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/BundleDependencyTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/BundleDependencyTest.java
@@ -35,7 +35,7 @@
         DependencyManager m = getDM();
         // create a service provider and consumer
         MyConsumer c = new MyConsumer();        
-        Component consumer = component(m, comp -> comp.impl(c).withBundle(bundle -> bundle.cb("add", "remove")));
+        Component consumer = component(m, comp -> comp.impl(c).withBundle(bundle -> bundle.add("add").remove("remove")));
         
         // check if at least one bundle was found
         c.check();
@@ -48,7 +48,7 @@
         Ensure e = new Ensure();
         String filter = "(Bundle-SymbolicName=" + BSN + ")";
         Component consumerWithFilter = component(m, comp -> comp.impl(new FilteredConsumer(e))
-            .withBundle(bundle-> bundle.filter(filter).cb("add", "remove")));
+            .withBundle(bundle-> bundle.filter(filter).add("add").remove("remove")));
         e.step(2);
         // remove the consumer again
         m.remove(consumerWithFilter);
@@ -59,7 +59,7 @@
         DependencyManager m = getDM();
         // create a service provider and consumer
         MyConsumer c = new MyConsumer();        
-        Component consumer = component(m, comp -> comp.impl(c).withBundle(bundle -> bundle.cb(MyConsumer::add, MyConsumer::remove)));
+        Component consumer = component(m, comp -> comp.impl(c).withBundle(bundle -> bundle.add(MyConsumer::add).remove(MyConsumer::remove)));
         
         // check if at least one bundle was found
         c.check();
@@ -72,7 +72,7 @@
         Ensure e = new Ensure();
         String filter = "(Bundle-SymbolicName=" + BSN + ")";
         Component consumerWithFilter = component(m, comp -> comp.impl(new FilteredConsumer(e))
-            .withBundle(bundle-> bundle.filter(filter).cb(FilteredConsumer::add, FilteredConsumer::remove)));
+            .withBundle(bundle-> bundle.filter(filter).add(FilteredConsumer::add).remove(FilteredConsumer::remove)));
         e.step(2);
         // remove the consumer again
         m.remove(consumerWithFilter);
@@ -85,7 +85,7 @@
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
         Component consumerWithFilter = component(m, c -> c.impl(new FilteredConsumerRequired(e))
-            .withBundle(b -> b.filter("(Bundle-SymbolicName=" + BSN + ")").cb("add", "remove")));
+            .withBundle(b -> b.filter("(Bundle-SymbolicName=" + BSN + ")").add("add").remove("remove")));
         e.waitForStep(1, 5000);
         // remove the consumer again
         m.remove(consumerWithFilter);
@@ -99,7 +99,7 @@
         Ensure e = new Ensure();
         FilteredConsumerRequired impl = new FilteredConsumerRequired(e);
         Component consumerWithFilter = component(m, c -> c.impl(impl)
-            .withBundle(b -> b.filter("(Bundle-SymbolicName=" + BSN + ")").cbi(impl::add, impl::remove)));
+            .withBundle(b -> b.filter("(Bundle-SymbolicName=" + BSN + ")").add(impl::add).remove(impl::remove)));
         e.waitForStep(1, 5000);
         // remove the consumer again
         m.remove(consumerWithFilter);
@@ -114,7 +114,7 @@
         // add a consumer with a filter
         FilteredConsumerRequiredWithComponentArg impl = new FilteredConsumerRequiredWithComponentArg(e);
         Component consumerWithFilter = component(m, c -> c.impl(impl)
-            .withBundle(b -> b.filter("(Bundle-SymbolicName=" + BSN + ")").cb("add", "remove")));
+            .withBundle(b -> b.filter("(Bundle-SymbolicName=" + BSN + ")").add("add").remove("remove")));
         e.waitForStep(1, 5000);
         // remove the consumer again
         m.remove(consumerWithFilter);
@@ -128,7 +128,7 @@
         Ensure e = new Ensure();
         FilteredConsumerRequiredWithComponentArg impl = new FilteredConsumerRequiredWithComponentArg(e);
         Component consumerWithFilter = component(m).impl(impl)
-        		.withBundle(b -> b.filter("(Bundle-SymbolicName=" + BSN + ")").cbi(impl::add, impl::remove)).build();
+        		.withBundle(b -> b.filter("(Bundle-SymbolicName=" + BSN + ")").add(impl::addRef).remove(impl::removeRef)).build();
         // add a consumer with a filter
         m.add(consumerWithFilter);
         e.waitForStep(1, 5000);
@@ -206,15 +206,23 @@
             m_ensure = e;
         }
                 
-        public void add(Component component, Bundle b) {
-        	Assert.assertNotNull(component);
+        public void add(Component component, Bundle b) { // method ref callback
+            Assert.assertNotNull(component);
             if (b.getSymbolicName().equals(BSN)) {
                 m_ensure.step(1);
             }
         }
         
-        public void remove(Component component, Bundle b) {
-        	Assert.assertNotNull(component);
+        public void addRef(Bundle b, Component component) { // method ref callback
+            add(component, b);
+        }
+        
+        public void removeRef(Bundle b, Component component) { // method ref callback
+            remove(component, b);
+        }
+
+        public void remove(Component component, Bundle b) { // method ref callback
+            Assert.assertNotNull(component);
             Assert.assertNotNull(b);
             if (b.getSymbolicName().equals(BSN)) {
                 m_ensure.step(2);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ComponentTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ComponentTest.java
index 9b90cea..27c8d4f 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ComponentTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ComponentTest.java
@@ -37,8 +37,8 @@
         // Create consumer (dependency is required by default using builder api).
         component(dm, comp -> comp
         		.factory(Consumer::new)
-        		.withSrv(Provider.class, srv -> srv.filter("(name=provider2)").cb(Consumer::add, Consumer::remove))
-        		.withSrv(Provider.class, srv -> srv.filter("(name=provider1)").autoConfig("m_autoConfiguredProvider")));
+        		.withSvc(Provider.class, srv -> srv.filter("(name=provider2)").add(Consumer::add).remove(Consumer::remove))
+        		.withSvc(Provider.class, srv -> srv.filter("(name=provider1)").autoConfig("m_autoConfiguredProvider")));
                 
         // Create providers (auto added to dependency manager)
         component(dm, comp -> comp
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/CompositionTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/CompositionTest.java
index 20fc990..87cf2a9 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/CompositionTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/CompositionTest.java
@@ -35,7 +35,7 @@
         // create a service provider and consumer
         Component sp = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class).build();
         Component sc = component(m).impl(new ServiceConsumer(e)).composition("getComposition")
-            .withSrv(ServiceInterface.class, sb->sb.cb("add")).build();
+            .withSvc(ServiceInterface.class, sb->sb.add("add")).build();
         m.add(sp);
         m.add(sc);
         // ensure we executed all steps inside the component instance
@@ -51,7 +51,7 @@
         Component sp = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class).build();
         ServiceConsumer scimpl = new ServiceConsumer(e);
         Component sc = component(m).impl(scimpl).composition(scimpl::getComposition)
-            .withSrv(ServiceInterface.class, sb->sb.cb("add")).build();
+            .withSvc(ServiceInterface.class, sb->sb.add("add")).build();
         m.add(sp);
         m.add(sc);
         // ensure we executed all steps inside the component instance
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/DynamicProxyAspectTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/DynamicProxyAspectTest.java
index 16a0f4b..e13f41f 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/DynamicProxyAspectTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/DynamicProxyAspectTest.java
@@ -62,7 +62,7 @@
         // through the proxy twice
         Component sc = component(m)
             .impl(new ServiceConsumer(e))
-            .withSrv(ServiceInterface.class, ServiceInterface2.class).build();
+            .withSvc(ServiceInterface.class, ServiceInterface2.class).build();
         
         // register both producers, validate that both services are started
         m.add(sp1);
@@ -114,7 +114,7 @@
         // through the proxy twice
         Component sc = component(m)
             .impl(new ServiceConsumer(e))
-            .withSrv(ServiceInterface.class, ServiceInterface2.class).build();
+            .withSvc(ServiceInterface.class, ServiceInterface2.class).build();
         
         // register both producers, validate that both services are started
         m.add(sp1);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FactoryConfigurationAdapterTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FactoryConfigurationAdapterTest.java
index e01ac73..d6759dd 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FactoryConfigurationAdapterTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FactoryConfigurationAdapterTest.java
@@ -54,13 +54,13 @@
         
         // Create a Configuration instance, which will create/update/remove a configuration for factoryPid "MyFactoryPid"
         ConfigurationCreator configurator = new ConfigurationCreator("MyFactoryPid", "key", "value1");
-        Component s1 = component(m).impl(configurator).withSrv(ConfigurationAdmin.class).build();
+        Component s1 = component(m).impl(configurator).withSvc(ConfigurationAdmin.class).build();
            
         // Create an Adapter that will be instantiated, once the configuration is created.
         // This Adapter provides an AdapterService, and depends on an AdapterExtraDependency service.
         Component s2 = factoryPidAdapter(m)
-            .factoryPid("MyFactoryPid").impl(adapterImplClass).cb(adapterUpdate).propagate().provides(AdapterService.class, "foo", "bar")            
-            .withSrv(AdapterExtraDependency.class)
+            .factoryPid("MyFactoryPid").impl(adapterImplClass).update(adapterUpdate).propagate().provides(AdapterService.class, "foo", "bar")            
+            .withSvc(AdapterExtraDependency.class)
             .build();
                     
         // Create extra adapter service dependency upon which our adapter depends on.
@@ -69,7 +69,7 @@
         
         // Create an AdapterService Consumer
         Component s4 = component(m)
-            .impl(AdapterServiceConsumer.class).withSrv(AdapterService.class, srv -> srv.cb("bind", "change", "remove")).build();
+            .impl(AdapterServiceConsumer.class).withSvc(AdapterService.class, srv -> srv.add("bind").change("change").remove("remove")).build();
         
         // Start services
         m.add(s1);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FactoryInjectedWithConfigurationBeforeTheCreateMethod.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FactoryInjectedWithConfigurationBeforeTheCreateMethod.java
index f1ac3a9..01a3d93 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FactoryInjectedWithConfigurationBeforeTheCreateMethod.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/FactoryInjectedWithConfigurationBeforeTheCreateMethod.java
@@ -45,13 +45,13 @@
         m_e = new Ensure();
         
         // Create the component that creates a configuration.
-        Component configurator = component(m).impl(new Configurator("foobar")).withSrv(ConfigurationAdmin.class).build();
+        Component configurator = component(m).impl(new Configurator("foobar")).withSvc(ConfigurationAdmin.class).build();
         
         // Create the object that has to be injected with the configuration before its create method is called.
         MyFactory factory = new MyFactory();
         
         // Create the Component for the MyComponent class that is created using the factory above.
-        Component myComponent = component(m).factory(factory, "create").withCnf(b->b.pid("foobar").cbi(factory, "updated")).build();
+        Component myComponent = component(m).factory(factory, "create").withCnf(b->b.pid("foobar").update(factory, "updated")).build();
         
         // provide the configuration
         m.add(configurator);
@@ -67,13 +67,13 @@
         m_e = new Ensure();
         
         // Create the component that creates a configuration.
-        Component configurator = component(m).impl(new Configurator("foobar")).withSrv(ConfigurationAdmin.class).build();
+        Component configurator = component(m).impl(new Configurator("foobar")).withSvc(ConfigurationAdmin.class).build();
         
         // Create the object that has to be injected with the configuration before its create method is called.
         MyFactory factory = new MyFactory();
         
         // Create the Component for the MyComponent class that is created using the factory above.
-        Component myComponent = component(m).factory(factory, "create").withCnf(b->b.pid("foobar").cbi(factory::updated)).build();
+        Component myComponent = component(m).factory(factory, "create").withCnf(b->b.pid("foobar").update(factory::updated)).build();
         
         // provide the configuration
         m.add(configurator);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/InstanceBoundDependencyTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/InstanceBoundDependencyTest.java
index 8844a0c..c2d3cd9 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/InstanceBoundDependencyTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/InstanceBoundDependencyTest.java
@@ -46,7 +46,7 @@
         // Create a "C" component: it depends on some S1 services, and on some S2 instance-bound services (declared from C.init() method)        
         C cimpl = new C();
         Component c = component(m).impl(cimpl)
-            .withSrv(S1.class, sb->sb.cb("addS1", "changeS1", "removeS1").autoConfig(true)).build();
+            .withSvc(S1.class, sb->sb.add("addS1").change("changeS1").remove("removeS1").autoConfig(true)).build();
         m.add(c);
         
         // Add S1 (s1_1): C.add(S1 s1) is called, then init() is called where a dependency is declared on S2
@@ -108,6 +108,7 @@
     }
     
     // Our "C" component: it depends on S1 (required) and S2 (required/instance bound)
+    // Class tested with reflection based callbacks
     class C {        
         final Map<String, ServiceReference> m_s1Map = new HashMap();
         final Map<String, ServiceReference> m_s2Map = new HashMap();
@@ -150,7 +151,7 @@
         }
         
         void init(Component c) {
-            component(c, comp->comp.withSrv(S2.class, srv -> srv.cb(C::addS2, C::changeS2, C::removeS2)));
+            component(c, comp->comp.withSvc(S2.class, srv -> srv.add("addS2").change("changeS2").remove("removeS2")));
             m_e.step(1);
         }
     }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ModifiedBundleDependencyTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ModifiedBundleDependencyTest.java
index ade9bff..474a7de 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ModifiedBundleDependencyTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ModifiedBundleDependencyTest.java
@@ -64,7 +64,7 @@
 
         void init(Component c) {
             m_e.step(2);
-            component(c, comp -> comp.withSrv(A.class, srv -> srv.cb("add", "remove")));
+            component(c, comp -> comp.withSvc(A.class, srv -> srv.add("add").remove("remove")));
         }
         
         public void add(A a) {
@@ -105,7 +105,7 @@
         String filter = "(Bundle-SymbolicName=org.apache.felix.metatype)";
         int mask = Bundle.INSTALLED|Bundle.ACTIVE|Bundle.RESOLVED|Bundle.STARTING;
         Component b = component(m)
-            .provides(B.class).impl(new BImpl(e)).withBundle(bd -> bd.filter(filter).mask(mask).cb("add", "change", "remove")).build();     	
+            .provides(B.class).impl(new BImpl(e)).withBundle(bd -> bd.filter(filter).mask(mask).add("add").change("change").remove("remove")).build();     	
         						                    
         Bundle dmtest = getBundle("org.apache.felix.metatype");
         try {
@@ -141,7 +141,7 @@
         String filter = "(Bundle-SymbolicName=org.apache.felix.metatype)";
         int mask = Bundle.INSTALLED|Bundle.ACTIVE|Bundle.RESOLVED|Bundle.STARTING;
         Component b = component(m).provides(B.class).impl(impl)
-            .withBundle(bd -> bd.filter(filter).mask(mask).cbi(impl::add, impl::change, impl::remove)).build();        	
+            .withBundle(bd -> bd.filter(filter).mask(mask).add(impl::add).change(impl::change).remove(impl::remove)).build();        	
         
         Bundle dmtest = getBundle("org.apache.felix.metatype");
         try {
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependenciesTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependenciesTest.java
index b48d5ee..c6cc634 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependenciesTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependenciesTest.java
@@ -38,8 +38,8 @@
          DependencyManager m = getDM();
          // Helper class that ensures certain steps get executed in sequence
          Ensure e = new Ensure();
-         Component c1 = component(m).provides(Service1.class).impl(new MyComponent1(e)).withSrv(Service2.class, srv->srv.autoConfig("m_service2")).build();
-         Component c2 = component(m).impl(new MyComponent2(e)).withSrv(Service1.class, srv->srv.required(false).autoConfig(false).cb("added")).build();
+         Component c1 = component(m).provides(Service1.class).impl(new MyComponent1(e)).withSvc(Service2.class, srv->srv.autoConfig("m_service2")).build();
+         Component c2 = component(m).impl(new MyComponent2(e)).withSvc(Service1.class, srv->srv.required(false).autoConfig(false).add("added")).build();
          Component c3 = component(m).provides(Service2.class).impl(Service2Impl.class).build();
          Component c4 = component(m).impl(Service3Impl1.class).provides(Service3.class, type -> "xx").build();
          Component c5 = component(m).impl(Service3Impl2.class).provides(Service3.class, type -> "yy").build();
@@ -72,8 +72,8 @@
         DependencyManager m = getDM();
         // Helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
-        Component c1 = component(m).provides(Service1.class).impl(new MyComponent1(e)).withSrv(Service2.class, srv->srv.autoConfig("m_service2")).build();
-        Component c2 = component(m).impl(new MyComponent2(e)).withSrv(Service1.class, srv->srv.required(false).autoConfig(false).cb("added")).build();
+        Component c1 = component(m).provides(Service1.class).impl(new MyComponent1(e)).withSvc(Service2.class, srv->srv.autoConfig("m_service2")).build();
+        Component c2 = component(m).impl(new MyComponent2(e)).withSvc(Service1.class, srv->srv.required(false).autoConfig(false).add("added")).build();
         Component c3 = component(m).provides(Service2.class).impl(Service2Impl.class).build();
         Component c4 = component(m).impl(Service3Impl1.class).provides(Service3.class, type -> "xx").build();
         Component c5 = component(m).impl(Service3Impl2.class).provides(Service3.class, type -> "yy").build();
@@ -121,8 +121,8 @@
             // Service3/yy not yet available
 
             component(c, comp -> comp
-                .withSrv(Service3.class, srv->srv.filter("(type=xx)").autoConfig("m_service3_xx"))
-                .withSrv(Service3.class, srv->srv.filter("(type=yy)").autoConfig("m_service3_yy")));
+                .withSvc(Service3.class, srv->srv.filter("(type=xx)").autoConfig("m_service3_xx"))
+                .withSvc(Service3.class, srv->srv.filter("(type=yy)").autoConfig("m_service3_yy")));
         }
         
         void start() {
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependencyTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependencyTest.java
index 301bdf9..fa58126 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependencyTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependencyTest.java
@@ -37,8 +37,8 @@
         
         Component sp2 = component(m)
               .impl(ServiceProvider2.class).provides(ServiceProvider2.class)
-              .withSrv(Runnable.class, srv->srv.filter("(foo=bar)").required(false).autoConfig("m_runnable"))
-              .withSrv(Sequencer.class, srv->srv.cb("bind"))
+              .withSvc(Runnable.class, srv->srv.filter("(foo=bar)").required(false).autoConfig("m_runnable"))
+              .withSvc(Sequencer.class, srv->srv.add("bind"))
               .composition("getComposition")
               .build();
 
@@ -46,15 +46,15 @@
               .impl(ServiceProvider.class)
               .provides(ServiceInterface.class, foo -> "bar")
               .start("start").stop("stop")
-              .withSrv(Sequencer.class, srv->srv.autoConfig("m_sequencer"))
-              .withSrv(ServiceProvider2.class, srv->srv.cb("bind", "unbind"))
+              .withSvc(Sequencer.class, srv->srv.autoConfig("m_sequencer"))
+              .withSvc(ServiceProvider2.class, srv->srv.add("bind").remove("unbind"))
               .build();
         
         Component sc = component(m)
               .impl(ServiceConsumer.class)
               .start("start").stop("stop")
-              .withSrv(Sequencer.class, srv->srv.autoConfig("m_sequencer"))
-              .withSrv(ServiceInterface.class, srv->srv.filter("(foo=bar)").autoConfig("m_service"))
+              .withSvc(Sequencer.class, srv->srv.autoConfig("m_sequencer"))
+              .withSvc(ServiceInterface.class, srv->srv.filter("(foo=bar)").autoConfig("m_service"))
               .build();
         
         Component sequencer = component(m)
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependencyTest2.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependencyTest2.java
index b0c2c36..def5566 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependencyTest2.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleExtraDependencyTest2.java
@@ -127,8 +127,8 @@
 
         public void init(Component s) {
             component(s, comp->comp
-                .withSrv(Sequencer.class, srv->srv.autoConfig("m_sequencer"))
-                .withSrv(ServiceInterface.class, srv->srv.filter("(foo=bar)").autoConfig("m_service")));
+                .withSvc(Sequencer.class, srv->srv.autoConfig("m_sequencer"))
+                .withSvc(ServiceInterface.class, srv->srv.filter("(foo=bar)").autoConfig("m_service")));
         }
         
         void start() {
@@ -150,8 +150,8 @@
         public void init(Component c)
         {
             component(c, comp->comp
-                .withSrv(Sequencer.class, srv->srv.autoConfig("m_sequencer"))
-                .withSrv(ServiceProvider2.class, srv->srv.cb("bind", "unbind")));
+                .withSvc(Sequencer.class, srv->srv.autoConfig("m_sequencer"))
+                .withSvc(ServiceProvider2.class, srv->srv.add("bind").remove("unbind")));
         }
         
         void bind(ServiceProvider2 provider2)
@@ -191,8 +191,8 @@
         public void init(Component c)
         {
             component(c, comp->comp
-		      .withSrv(Runnable.class, srv->srv.optional().filter("(foo=bar)"))
-		      .withSrv(Sequencer.class, srv->srv.cb("bind")));
+		      .withSvc(Runnable.class, srv->srv.optional().filter("(foo=bar)"))
+		      .withSvc(Sequencer.class, srv->srv.add("bind")));
         }
         
         void bind(Sequencer seq)
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleServiceDependencyTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleServiceDependencyTest.java
index 8a8af42..dc9d294 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleServiceDependencyTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/MultipleServiceDependencyTest.java
@@ -36,7 +36,7 @@
        // create a service provider and consumer
        Component provider = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class.getName()).build();
        Component providerWithHighRank = component(m).impl(new ServiceProvider2(e)).provides(ServiceInterface.class.getName(), Constants.SERVICE_RANKING, Integer.valueOf(5)).build();
-       Component consumer = component(m).impl(new ServiceConsumer(e)).withSrv(ServiceInterface.class).build();
+       Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class).build();
        m.add(provider);
        m.add(providerWithHighRank);
        m.add(consumer);
@@ -56,7 +56,7 @@
        // create a service provider and consumer
        Component provider = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class.getName()).build();
        Component provider2 = component(m).impl(new ServiceProvider2(e)).provides(ServiceInterface.class.getName()).build();
-       Component consumer = component(m).impl(new ServiceConsumer(e)).withSrv(ServiceInterface.class).build();
+       Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class).build();
        m.add(provider2);
        m.add(consumer);
        e.waitForStep(3, 5000);
@@ -76,7 +76,7 @@
        // create a service provider and consumer
        Component provider = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class.getName()).build();
        Component provider2 = component(m).impl(new ServiceProvider2(e)).provides(ServiceInterface.class.getName()).build();
-       Component consumer = component(m).impl(new ServiceConsumer(e)).withSrv(ServiceInterface.class, srv->srv.cb("add", "remove")).build();
+       Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class, srv->srv.add("add").remove("remove")).build();
        m.add(provider2);
        m.add(consumer);
        e.waitForStep(3, 15000);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/RemovedDependencyTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/RemovedDependencyTest.java
index 30424d0..9c1a4b1 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/RemovedDependencyTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/RemovedDependencyTest.java
@@ -67,8 +67,8 @@
         ServiceConsumer consumer = new ServiceConsumer(e, d3);
         Component sc = component(m).impl(consumer).build();
         
-        Dependency d1 = serviceDependency(sc, ServiceInterface.class).filter("(name=provider1)").cb("add", "remove").build();
-        Dependency d2 = serviceDependency(sc, ServiceInterface.class).filter("(name=provider2)").cb("add", "remove").build();
+        Dependency d1 = serviceDependency(sc, ServiceInterface.class).filter("(name=provider1)").add("add").remove("remove").build();
+        Dependency d2 = serviceDependency(sc, ServiceInterface.class).filter("(name=provider2)").add("add").remove("remove").build();
         
         sc.add(d1, d2);
             
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ResourceProvider.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ResourceProvider.java
index 260fa59..54b4800 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ResourceProvider.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ResourceProvider.java
@@ -66,7 +66,7 @@
     }
 
     @SuppressWarnings({ "deprecation", "unchecked" })
-	public void add(ServiceReference<ResourceHandler> ref, ResourceHandler handler) {
+	public void add(ResourceHandler handler, ServiceReference<ResourceHandler> ref) {
         String filterString = (String) ref.getProperty("filter");
         Filter filter = null;
         if (filterString != null) {
@@ -88,7 +88,7 @@
         }
     }
 
-    public void remove(ServiceReference<ResourceHandler> ref, ResourceHandler handler) {
+    public void remove(ResourceHandler handler, ServiceReference<ResourceHandler> ref) {
         Filter filter;
         synchronized (m_handlers) {
             filter = (Filter) m_handlers.remove(handler);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyCallbackSignaturesTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyCallbackSignaturesTest.java
index 609cca1..76e3f66 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyCallbackSignaturesTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyCallbackSignaturesTest.java
@@ -47,15 +47,15 @@
         Component provider = component(m)
             .impl(new ProviderImpl()).provides(Provider.class.getName(), props).build();
         
-        component(m, c->c.impl(new Consumer1()).withSrv(Provider.class, srv->srv.cb("bind", "change", "remove")));
-        component(m, c->c.impl(new Consumer2()).withSrv(Provider.class, srv->srv.cb("bind", "change", "remove")));
-        component(m, c->c.impl(new Consumer3()).withSrv(Provider.class, srv->srv.cb("bind", "change", "remove")));
-        component(m, c->c.impl(new Consumer4()).withSrv(Provider.class, srv->srv.cb("bind", "change", "remove")));
-        component(m, c->c.impl(new Consumer5()).withSrv(Provider.class, srv->srv.cb("bind", "change", "remove")));
-        component(m, c->c.impl(new Consumer6()).withSrv(Provider.class, srv->srv.cb("bind", "change", "remove")));
-        component(m, c->c.impl(new Consumer7()).withSrv(Provider.class, srv->srv.cb("bind", "change", "remove")));
-        component(m, c->c.impl(new Consumer8()).withSrv(Provider.class, srv->srv.cb("bind", "change", "remove")));
-        component(m, c->c.impl(new Consumer9()).withSrv(Provider.class, srv->srv.cb("bind", "change", "remove")));
+        component(m, c->c.impl(new Consumer1()).withSvc(Provider.class, srv->srv.add("bind").change("change").remove("remove")));
+        component(m, c->c.impl(new Consumer2()).withSvc(Provider.class, srv->srv.add("bind").change("change").remove("remove")));
+        component(m, c->c.impl(new Consumer3()).withSvc(Provider.class, srv->srv.add("bind").change("change").remove("remove")));
+        component(m, c->c.impl(new Consumer4()).withSvc(Provider.class, srv->srv.add("bind").change("change").remove("remove")));
+        component(m, c->c.impl(new Consumer5()).withSvc(Provider.class, srv->srv.add("bind").change("change").remove("remove")));
+        component(m, c->c.impl(new Consumer6()).withSvc(Provider.class, srv->srv.add("bind").change("change").remove("remove")));
+        component(m, c->c.impl(new Consumer7()).withSvc(Provider.class, srv->srv.add("bind").change("change").remove("remove")));
+        component(m, c->c.impl(new Consumer8()).withSvc(Provider.class, srv->srv.add("bind").change("change").remove("remove")));
+        component(m, c->c.impl(new Consumer9()).withSvc(Provider.class, srv->srv.add("bind").change("change").remove("remove")));
 
         m.add(provider);
         m_ensure.waitForStep(9, 5000);
@@ -68,7 +68,7 @@
         m.remove(provider);
         m_ensure.waitForStep(26, 5000);
     }
-    
+        
     /**
      * Tests if all possible dependency callbacks signatures supported by ServiceDependency.
      */
@@ -80,15 +80,15 @@
         Component provider = component(m)
             .impl(new ProviderImpl()).provides(Provider.class.getName(), props).build();
         
-        component(m, c->c.impl(new Consumer1()).withSrv(Provider.class, srv->srv.cb(Consumer1::bind, Consumer1::change, Consumer1::remove)));
-        component(m, c->c.impl(new Consumer2()).withSrv(Provider.class, srv->srv.cb(Consumer2::bind, Consumer2::change, Consumer2::remove)));
-        component(m, c->c.impl(new Consumer3()).withSrv(Provider.class, srv->srv.cb(Consumer3::bind, Consumer3::change, Consumer3::remove)));
-        component(m, c->c.impl(new Consumer4()).withSrv(Provider.class, srv->srv.cb(Consumer4::bind, Consumer4::change, Consumer4::remove)));
-        component(m, c->c.impl(new Consumer5()).withSrv(Provider.class, srv->srv.cb(Consumer5::bind, Consumer5::change, Consumer5::remove)));
-        component(m, c->c.impl(new Consumer6()).withSrv(Provider.class, srv->srv.cb(Consumer6::bind, Consumer6::change, Consumer6::remove)));
-        component(m, c->c.impl(new Consumer7()).withSrv(Provider.class, srv->srv.cb(Consumer7::bind, Consumer7::change, Consumer7::remove)));
-        component(m, c->c.impl(new Consumer8()).withSrv(Provider.class, srv->srv.cb(Consumer8::bind, Consumer8::change, Consumer8::remove)));
-        component(m, c->c.impl(new Consumer9()).withSrv(Provider.class, srv->srv.cb(Consumer9::bind, Consumer9::change, Consumer9::remove)));
+        component(m, c->c.impl(new Consumer1()).withSvc(Provider.class, srv->srv.add(Consumer1::bind).change(Consumer1::change).remove(Consumer1::remove)));
+        component(m, c->c.impl(new Consumer2()).withSvc(Provider.class, srv->srv.add(Consumer2::bind).change(Consumer2::change).remove(Consumer2::remove)));
+        component(m, c->c.impl(new Consumer3()).withSvc(Provider.class, srv->srv.add(Consumer3::bind).change(Consumer3::change).remove(Consumer3::remove)));
+        component(m, c->c.impl(new Consumer4()).withSvc(Provider.class, srv->srv.add(Consumer4::bindRef).change(Consumer4::changeRef).remove(Consumer4::removeRef)));
+        component(m, c->c.impl(new Consumer5()).withSvc(Provider.class, srv->srv.add(Consumer5::bindRef).change(Consumer5::changeRef).remove(Consumer5::removeRef)));
+        component(m, c->c.impl(new Consumer6()).withSvc(Provider.class, srv->srv.add(Consumer6::bindRef).change(Consumer6::changeRef).remove(Consumer6::removeRef)));
+        component(m, c->c.impl(new Consumer7()).withSvc(Provider.class, srv->srv.add(Consumer7::bindRef).change(Consumer7::changeRef).remove(Consumer7::removeRef)));
+        component(m, c->c.impl(new Consumer8()).withSvc(Provider.class, srv->srv.add(Consumer8::bindRef).change(Consumer8::changeRef).remove(Consumer8::removeRef)));
+        component(m, c->c.impl(new Consumer9()).withSvc(Provider.class, srv->srv.add(Consumer9::bindRef).change(Consumer9::changeRef).remove(Consumer9::removeRef)));
 
         m.add(provider);
         m_ensure.waitForStep(9, 5000);
@@ -101,14 +101,6 @@
         m.remove(provider);
         m_ensure.waitForStep(26, 5000);
     }
-    
-    private void declareConsumer(DependencyManager m, Object consumerImpl) {
-        Component consumer = component(m)
-            .impl(consumerImpl)
-            .withSrv(Provider.class, srv->srv.cb("bind", "change", "change"))
-            .build();
-        m.add(consumer);
-    }
 
     public static interface Provider {        
     }
@@ -169,19 +161,33 @@
     }
 
     class Consumer4 {        
-        void bind(ServiceReference ref, Provider provider) {
+        void bindRef(Provider provider, ServiceReference ref) { // method ref callback
+            bind(ref, provider);
+        }
+        
+        void bind(ServiceReference ref, Provider provider) { // reflection based callback
             Assert.assertNotNull(ref);
             Assert.assertNotNull(provider);
             Assert.assertEquals("bar", ref.getProperty("foo"));
             m_ensure.step();
         }
-        void change(ServiceReference ref, Provider provider) {
+        
+        void changeRef(Provider provider, ServiceReference ref) { // method ref callback
+            change(ref, provider);
+        }
+        
+        void change(ServiceReference ref, Provider provider) { // reflection based callback
             Assert.assertNotNull(ref);
             Assert.assertNotNull(provider);
             Assert.assertEquals("zoo", ref.getProperty("foo"));
             m_ensure.step();
         }
-        void remove(ServiceReference ref, Provider provider) {
+        
+        void removeRef(Provider provider, ServiceReference ref) { // method ref callback
+            remove(ref, provider);
+        }
+        
+        void remove(ServiceReference ref, Provider provider) { // reflection based callback
             Assert.assertNotNull(ref);
             Assert.assertNotNull(provider);
             Assert.assertEquals("zoo", ref.getProperty("foo"));
@@ -190,40 +196,73 @@
     }
         
     class Consumer5 {        
-        void bind(ServiceReference ref) {
+        void bindRef(Provider provider, ServiceReference ref) { // method ref callback
+            bind(ref);
+        }
+        
+        void bind(ServiceReference ref) { // reflection based callback
             Assert.assertNotNull(ref);
             Assert.assertEquals("bar", ref.getProperty("foo"));
             m_ensure.step();
         }
-        void change(ServiceReference ref) {
+      
+        void changeRef(Provider provider, ServiceReference ref) { // method ref callback
+            change(ref);
+        }
+        
+        void change(ServiceReference ref) { // reflection based callback
             Assert.assertNotNull(ref);
             Assert.assertEquals("zoo", ref.getProperty("foo"));
             m_ensure.step();
         }
-        void remove(ServiceReference ref) {
+        
+        void removeRef(Provider provider, ServiceReference ref) { // method ref callback
+            remove(ref);
+        }
+
+        void remove(ServiceReference ref) { // reflection based callback
             Assert.assertNotNull(ref);
             Assert.assertEquals("zoo", ref.getProperty("foo"));
             m_ensure.step();
         }
     }
 
-    class Consumer6 {        
-        void bind(Component c) {
+    class Consumer6 {     
+        
+        void bindRef(Provider p, Component c) { // method ref callback
+            bind(c);
+        }
+        
+        void bind(Component c) { // reflection based callback
             Assert.assertNotNull(c);
             m_ensure.step();
         }
-        void change(Component c) {
+        
+        void changeRef(Provider p, Component c) { // method ref callback
+            change(c);
+        }
+
+        void change(Component c) { // reflection based callback
             Assert.assertNotNull(c);
             m_ensure.step();
         }
-        void remove(Component c) {
+        
+        void removeRef(Provider p, Component c) { // method ref callback
+            remove(c);
+        }
+
+        void remove(Component c) { // reflection based callback
             Assert.assertNotNull(c);
             m_ensure.step();
         }
     }
         
     class Consumer7 {
-        void bind(Component c, ServiceReference ref) {
+        void bindRef(Provider p, Component c, ServiceReference ref) { // reflection callback
+            bind(c, ref);
+        }
+        
+        void bind(Component c, ServiceReference ref) { // reflection callback
             Assert.assertNotNull(c);
             Assert.assertNotNull(ref);
             Assert.assertEquals("bar", ref.getProperty("foo"));
@@ -231,7 +270,12 @@
             Assert.assertEquals(context.getService(ref).getClass(), ProviderImpl.class);
             m_ensure.step();
         }
-        void change(Component c, ServiceReference ref) {
+        
+        void changeRef(Provider p, Component c, ServiceReference ref) { // reflection callback
+            change(c, ref);
+        }
+        
+        void change(Component c, ServiceReference ref) { // reflection callback
             Assert.assertNotNull(c);
             Assert.assertNotNull(ref);
             Assert.assertEquals("zoo", ref.getProperty("foo"));
@@ -239,7 +283,12 @@
             Assert.assertEquals(context.getService(ref).getClass(), ProviderImpl.class);
             m_ensure.step();
         }
-        void remove(Component c, ServiceReference ref) {
+        
+        void removeRef(Provider p, Component c, ServiceReference ref) { // reflection callback
+            remove(c, ref);
+        }
+        
+        void remove(Component c, ServiceReference ref) { // reflection callback
             Assert.assertNotNull(c);
             Assert.assertNotNull(ref);
             Assert.assertEquals("zoo", ref.getProperty("foo"));
@@ -250,17 +299,31 @@
     }
         
     class Consumer8 {
-        void bind(Component c, Provider provider) {
+        void bindRef(Provider p, Component c) { // method ref callback
+            bind(c, p);
+        }
+        
+        void bind(Component c, Provider provider) { // reflection callback
             Assert.assertNotNull(c);
             Assert.assertNotNull(provider);
             m_ensure.step();
         }
-        void change(Component c, Provider provider) {
+        
+        void changeRef(Provider p, Component c) { // method ref callback
+            change(c, p);
+        }
+        
+        void change(Component c, Provider provider) { // reflection callback
             Assert.assertNotNull(c);
             Assert.assertNotNull(provider);
             m_ensure.step();
         }
-        void remove(Component c, Provider provider) {
+        
+        void removeRef(Provider p, Component c) { // method ref callback
+            remove(c, p);
+        }
+        
+        void remove(Component c, Provider provider) { // reflection callback
             Assert.assertNotNull(c);
             Assert.assertNotNull(provider);
             m_ensure.step();
@@ -268,7 +331,11 @@
     }
     
     class Consumer9 {
-        void bind(Component c, ServiceReference ref, Provider provider) {
+        void bindRef(Provider provider, Component c, ServiceReference ref) { // method ref callback
+            bind(c, ref, provider);
+        }
+        
+        void bind(Component c, ServiceReference ref, Provider provider) { // reflection callback
             Assert.assertNotNull(c);
             Assert.assertNotNull(ref);
             Assert.assertNotNull(provider);
@@ -276,7 +343,12 @@
             Assert.assertEquals(context.getService(ref), provider);
             m_ensure.step();
         }
-        void change(Component c, ServiceReference ref, Provider provider) {
+        
+        void changeRef(Provider provider, Component c, ServiceReference ref) { // method ref callback
+            change(c, ref, provider);
+        }
+        
+        void change(Component c, ServiceReference ref, Provider provider) { // reflection callback
             Assert.assertNotNull(c);
             Assert.assertNotNull(ref);
             Assert.assertNotNull(provider);
@@ -284,7 +356,12 @@
             Assert.assertEquals(context.getService(ref), provider);
             m_ensure.step();
         }
-        void remove(Component c, ServiceReference ref, Provider provider) {
+        
+        void removeRef(Provider provider, Component c, ServiceReference ref) { // method ref callback
+            remove(c, ref, provider);
+        }
+        
+        void remove(Component c, ServiceReference ref, Provider provider) { // reflection callback
             Assert.assertNotNull(c);
             Assert.assertNotNull(ref);
             Assert.assertNotNull(provider);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyInjectionTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyInjectionTest.java
index 1dff100..7192423 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyInjectionTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyInjectionTest.java
@@ -34,20 +34,20 @@
         // create a service provider and consumer
         ServiceProvider provider = new ServiceProvider(e);
         Component sp = component(m).impl(provider).provides(ServiceInterface2.class.getName()).build();
-        Component sc = component(m).impl(new ServiceConsumer()).withSrv(ServiceInterface2.class).build();
+        Component sc = component(m).impl(new ServiceConsumer()).withSvc(ServiceInterface2.class).build();
            
         Component sc2 = component(m) // all dependencies are optional
             .impl(new ServiceConsumerNamedInjection(false, false)) 
-            .withSrv(ServiceInterface2.class, s->s.optional().autoConfig("m_service"))
-            .withSrv(ServiceInterface2.class, s->s.optional().autoConfig("m_service2"))
-            .withSrv(ServiceInterface2.class, s->s.optional().autoConfig("m_service3"))
+            .withSvc(ServiceInterface2.class, s->s.optional().autoConfig("m_service"))
+            .withSvc(ServiceInterface2.class, s->s.optional().autoConfig("m_service2"))
+            .withSvc(ServiceInterface2.class, s->s.optional().autoConfig("m_service3"))
             .build();
         
         Component sc3 = component(m) // second dependency is required, first and third are optional
             .impl(new ServiceConsumerNamedInjection(false, false))
-            .withSrv(ServiceInterface2.class, s->s.optional().autoConfig("m_service"))
-            .withSrv(ServiceInterface2.class, s->s.required().autoConfig("m_service2"))
-            .withSrv(ServiceInterface2.class, s->s.optional().autoConfig("m_service3"))
+            .withSvc(ServiceInterface2.class, s->s.optional().autoConfig("m_service"))
+            .withSvc(ServiceInterface2.class, s->s.required().autoConfig("m_service2"))
+            .withSvc(ServiceInterface2.class, s->s.optional().autoConfig("m_service3"))
             .build();
         
         Component sc4 = component(m)
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyPropagateTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyPropagateTest.java
index 227a738..b71c8ec 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyPropagateTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyPropagateTest.java
@@ -45,12 +45,12 @@
         
         Component c1 = component(m)
                       .impl(new C1(e))
-                      .withSrv(C2.class, s->s.cb("bind")).build();
+                      .withSvc(C2.class, s->s.add("bind")).build();
 
         Component c2 = component(m)
                       .provides(C2.class.getName(), new Hashtable() {{ put("foo", "bar"); }})
                       .impl(new C2())
-                      .withSrv(C3.class, s->s.propagate()).build();
+                      .withSvc(C3.class, s->s.propagate()).build();
 
         Component c3 = component(m)
                       .provides(C3.class.getName(), new Hashtable() {{ put("foo2", "bar2"); put("foo", "overriden");}})
@@ -78,13 +78,13 @@
         Ensure e = new Ensure();
         Component c1 = component(m)
                       .impl(new C1(e))
-                      .withSrv(C2.class, s->s.cb("bind")).build();
+                      .withSvc(C2.class, s->s.add("bind")).build();
 
         C2 c2Impl = new C2();
         Component c2 = component(m)
                       .provides(C2.class.getName(), new Hashtable() {{ put("foo", "bar"); }})
                       .impl(c2Impl)
-                      .withSrv(C3.class, s->s.propagate(c2Impl, "getServiceProperties")).build();
+                      .withSvc(C3.class, s->s.propagate(c2Impl, "getServiceProperties")).build();
         
         Component c3 = component(m)
                       .provides(C3.class.getName())
@@ -104,13 +104,13 @@
         Ensure e = new Ensure();
         Component c1 = component(m)
                       .impl(new C1(e))
-                      .withSrv(C2.class, s->s.cb(C1::bind)).build();
+                      .withSvc(C2.class, s->s.add(C1::bind)).build();
 
         C2 c2Impl = new C2();
         Component c2 = component(m)
                       .provides(C2.class.getName(), new Hashtable() {{ put("foo", "bar"); }})
                       .impl(c2Impl)
-                      .withSrv(C3.class, s->s.propagate(c2Impl::getServiceProperties)).build();
+                      .withSvc(C3.class, s->s.propagate(c2Impl::getServiceProperties)).build();
         
         Component c3 = component(m)
                       .provides(C3.class.getName())
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyTest.java
index 6f4e35a..4b9e95a 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyTest.java
@@ -33,10 +33,10 @@
         Ensure e = new Ensure();
         // create a service provider and consumer
         Component sp = component(m).impl(new ServiceProvider(e)).provides(ServiceInterface.class).build();
-        Component sc = component(m).impl(new ServiceConsumer(e)).withSrv(ServiceInterface.class).build();
+        Component sc = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class).build();
         		
         Component sc2 = component(m).impl(new ServiceConsumerCallbacks(e))
-            .withSrv(ServiceInterface.class, srv -> srv.required(false).cb(ServiceConsumerCallbacks::add, ServiceConsumerCallbacks::remove))
+            .withSvc(ServiceInterface.class, srv -> srv.required(false).add(ServiceConsumerCallbacks::add).remove(ServiceConsumerCallbacks::remove))
             .build();
 
         m.add(sp);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyThroughCallbackInstanceTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyThroughCallbackInstanceTest.java
index 31616f9..27b028e 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyThroughCallbackInstanceTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceDependencyThroughCallbackInstanceTest.java
@@ -52,7 +52,7 @@
 		CallbackInstance instance = new CallbackInstance();
 		component(m, comp -> comp
 				.impl(new SimpleService() {})
-				.withSrv(Service.class, srv -> srv.cbi(instance::added, instance::removed)));
+				.withSvc(Service.class, srv -> srv.add(instance::added).remove(instance::removed)));
 		
 		Assert.assertEquals(numberOfServices, instance.getCount());
 		m.clear();
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceUpdateTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceUpdateTest.java
index b181449..4e2ac90 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceUpdateTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/ServiceUpdateTest.java
@@ -43,11 +43,11 @@
         // activate it
         component(m, comp -> comp
         		.impl(new ServiceProvider(e))
-        		.withSrv(ServiceInterface.class, srv -> srv
-        				.cb(ServiceProvider::add, ServiceProvider::change, ServiceProvider::remove)));
+        		.withSvc(ServiceInterface.class, srv -> srv
+        				.add(ServiceProvider::add).change(ServiceProvider::change).remove(ServiceProvider::remove)));
         component(m, comp -> comp
         		.impl(provider)
-        		.withSrv(ResourceHandler.class, srv -> srv.cb(ResourceProvider::add, ResourceProvider::remove)));
+        		.withSvc(ResourceHandler.class, srv -> srv.add(ResourceProvider::add).remove(ResourceProvider::remove)));
                
         // TODO implement resource adapters in new builder API and use it for the following resource adapter.
         
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/TemporalServiceDependencyTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/TemporalServiceDependencyTest.java
index eaa4c6b..7b8aa03 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/TemporalServiceDependencyTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/TemporalServiceDependencyTest.java
@@ -44,7 +44,7 @@
         TemporalServiceProvider2 provider2 = new TemporalServiceProvider2(e);
         Component sp2 = component(m).impl(provider2).provides(TemporalServiceInterface.class.getName()).build();
         TemporalServiceConsumer consumer = new TemporalServiceConsumer(e);
-        Component sc = component(m).impl(consumer).withSrv(TemporalServiceInterface.class, s->s.timeout(10000)).build();
+        Component sc = component(m).impl(consumer).withSvc(TemporalServiceInterface.class, s->s.timeout(10000)).build();
         // add the service consumer
         m.add(sc);
         // now add the first provider
@@ -76,7 +76,7 @@
         TemporalServiceProvider2 provider2 = new TemporalServiceProvider2(e);
         Component sp2 = component(m).impl(provider2).provides(TemporalServiceInterface.class.getName()).build();
         TemporalServiceConsumerWithCallback consumer = new TemporalServiceConsumerWithCallback(e);
-        Component sc = component(m).impl(consumer).withSrv(TemporalServiceInterface.class, srv->srv.cb("add", "remove").timeout(10000)).build();
+        Component sc = component(m).impl(consumer).withSvc(TemporalServiceInterface.class, srv->srv.add("add").remove("remove").timeout(10000)).build();
             
         // add the service consumer
         m.add(sc);
@@ -114,7 +114,7 @@
         Component sp2 = component(m).impl(provider2).provides(TemporalServiceInterface.class.getName()).build();
         TemporalServiceConsumerAdapterWithCallback consumer = new TemporalServiceConsumerAdapterWithCallback(e);
         Component sc = m.createAdapterService(Adaptee.class, null).setImplementation(consumer);
-        ServiceDependency temporalDep = serviceDependency(sc, TemporalServiceInterface.class).timeout(10000).cb("add", "remove").build();
+        ServiceDependency temporalDep = serviceDependency(sc, TemporalServiceInterface.class).timeout(10000).add("add").remove("remove").build();
         sc.add(temporalDep);
         Component adaptee = component(m).impl(new Adaptee()).provides(Adaptee.class.getName()).build();
             
@@ -171,7 +171,7 @@
         };
         Component consumerComp = component(m)
         		.impl(consumer)
-        		.withSrv(Runnable.class, s->s.timeout(5000).filter("(target=" + getClass().getSimpleName() + ")")).build();
+        		.withSvc(Runnable.class, s->s.timeout(5000).filter("(target=" + getClass().getSimpleName() + ")")).build();
         m.add(consumerComp);
         m.add(providerComp);
         ensure.waitForStep(2, 5000);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Activator.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Activator.java
index 2aab3bc..dbb3c3c 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Activator.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Activator.java
@@ -20,7 +20,9 @@
 
 import static java.lang.System.out;
 
+import org.apache.felix.dm.DependencyManager;
 import org.apache.felix.dm.lambda.DependencyManagerActivator;
+import org.osgi.framework.BundleContext;
 import org.osgi.service.cm.ConfigurationAdmin;
 import org.osgi.service.log.LogService;
 
@@ -39,8 +41,8 @@
  */
 public class Activator extends DependencyManagerActivator {
     @Override
-    public void activate() throws Exception {
-    	out.println("type \"log info\" to see the logs emitted by this test.");
+    public void init(BundleContext ctx, DependencyManager dm) throws Exception {
+    	out.println("type \"log warn\" to see the logs emitted by this test.");
 
     	// Create the Factory used to instantiate ProvuderImpl, ProviderComposite1 and ProviderComposite2
         ProviderFactory factory = new ProviderFactory();
@@ -51,13 +53,11 @@
         // before creating the composition of classes.
         component(comp -> comp
             .factory(factory::create, factory::getComposition)
-            .start(ProviderImpl::start) // only call start on ProviderImpl          
-            .withSrv(LogService.class, srv -> srv.cb(ProviderImpl::bind).cb(ProviderComposite1::bind))
-            .withCnf(conf -> conf.pid(ProviderFactory.class).cbi(factory::updated)));
+            .start(ProviderImpl::start) // only call start on ProviderImpl
+            .withSvc(LogService.class, srv -> srv.add(ProviderImpl::bind).add(ProviderComposite1::bind))
+            .withCnf(conf -> conf.update(MyConfig.class, factory::updated)));
                 
         // Creates a configuration with pid name = "org.apache.felix.dependencymanager.lambda.samples.compositefactory.ProviderFactory"
-        component(comp -> comp
-            .impl(Configurator.class)
-            .withSrv(ConfigurationAdmin.class));
-    }
+        component(comp -> comp.impl(Configurator.class).withSvc(ConfigurationAdmin.class));
+    }    
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Configurator.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Configurator.java
index b030616..7bc8984 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Configurator.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/Configurator.java
@@ -12,7 +12,7 @@
     
     void start() throws IOException {
         // Configure the ServiceConsumer component
-        Configuration c = m_cm.getConfiguration(ProviderFactory.class.getName(), null);
+        Configuration c = m_cm.getConfiguration(MyConfig.class.getName(), null);
         Dictionary<String, Object> props = new Hashtable<>();
         props.put("foo", "bar");
         c.update(props);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/MyConfig.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/MyConfig.java
new file mode 100644
index 0000000..72ee2e2
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/MyConfig.java
@@ -0,0 +1,27 @@
+/*
+ * 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.lambda.samples.compositefactory;
+
+/**
+ * Our properties interface that is implemented by DependencyManager. 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public interface MyConfig {
+    String getFoo();
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderComposite1.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderComposite1.java
index bad0463..0ee4d91 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderComposite1.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderComposite1.java
@@ -31,6 +31,10 @@
     }
 
     void start() {
-        m_log.log(LogService.LOG_INFO, "ProviderParticipant1.start()");
+        m_log.log(LogService.LOG_WARNING, "ProviderParticipant1.start()");
+    }
+    
+    public String toString() {
+        return "ProviderComposite1";
     }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderComposite2.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderComposite2.java
index 8386244..12b4fa3 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderComposite2.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderComposite2.java
@@ -22,5 +22,7 @@
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public class ProviderComposite2 {
-
+    public String toString() {
+        return "ProviderComposite2";
+    }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderFactory.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderFactory.java
index 3b35134..eba4df2 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderFactory.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderFactory.java
@@ -18,8 +18,6 @@
  */
 package org.apache.felix.dm.lambda.samples.compositefactory;
 
-import java.util.Dictionary;
-
 /**
  * Pojo used to create all the objects composition used to implements the "Provider" Service.
  * The manager is using a Configuration injected by Config Admin, in order to configure the 
@@ -32,11 +30,10 @@
     private ProviderComposite2 m_composite2;
     private ProviderImpl m_providerImpl;
     @SuppressWarnings("unused")
-	private Dictionary<String, Object> m_conf;
+	private MyConfig m_conf;
 
-    public void updated(Dictionary<String, Object> conf) {
-        // validate configuration and throw an exception if the properties are invalid
-        m_conf = conf;
+    public void updated(MyConfig conf) {
+        m_conf = conf; // conf.getFoo() returns "bar"
     }
 
     /**
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderImpl.java
index c874d71..1c69b85 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/compositefactory/ProviderImpl.java
@@ -44,6 +44,6 @@
     }
 
     void start() {
-        m_log.log(LogService.LOG_INFO, "ProviderImpl.start(): participants=" + m_participant1 + "," + m_participant2);
+        m_log.log(LogService.LOG_WARNING, "ProviderImpl.start(): participants=" + m_participant1 + "," + m_participant2);
     }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/Activator.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/Activator.java
index 3ccfd09..793a50d 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/Activator.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/Activator.java
@@ -20,7 +20,9 @@
 
 import static java.lang.System.out;
 
+import org.apache.felix.dm.DependencyManager;
 import org.apache.felix.dm.lambda.DependencyManagerActivator;
+import org.osgi.framework.BundleContext;
 import org.osgi.service.log.LogService;
 
 /**
@@ -28,8 +30,8 @@
  */
 public class Activator extends DependencyManagerActivator {
     @Override
-    public void activate() throws Exception {
-    	out.println("type \"log info\" to see the logs emitted by this test.");
+    public void init(BundleContext ctx, DependencyManager dm) throws Exception {
+    	out.println("type \"log warn\" to see the logs emitted by this test.");
 
     	// Create a pair of Device/DeviceParameter service with id=1
         createDeviceAndParameter(1);
@@ -44,8 +46,8 @@
         // Creates a component that simply displays all available DeviceParameter adapter services.
         component(comp -> comp
             .impl(DeviceAccessConsumer.class)
-            .withSrv(LogService.class)
-            .withSrv(DeviceAccess.class, device -> device.cb(DeviceAccessConsumer::add)));       
+            .withSvc(LogService.class)
+            .withSvc(DeviceAccess.class, device -> device.add(DeviceAccessConsumer::add)));       
     }
     
     private void createDeviceAndParameter(int id) {
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceAccessConsumer.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceAccessConsumer.java
index 1d46839..22dded4 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceAccessConsumer.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceAccessConsumer.java
@@ -29,7 +29,7 @@
     volatile LogService log;
 
     void add(DeviceAccess deviceAccess, Map<String, Object> props) {
-        log.log(LogService.LOG_INFO, "DeviceAccessConsumer: Handling device access: id=" + props.get("device.access.id") 
+        log.log(LogService.LOG_WARNING, "DeviceAccessConsumer: Handling device access: id=" + props.get("device.access.id") 
             + "\n\t device=" + deviceAccess.getDevice() 
             + "\n\t device parameter=" + deviceAccess.getDeviceParameter()
             + "\n\t device access properties=" + props);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceAccessImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceAccessImpl.java
index 9a8e321..5b4033d 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceAccessImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceAccessImpl.java
@@ -35,7 +35,7 @@
                 
         component(c, builder -> builder
             .properties("device.access.id", device.getDeviceId())
-            .withSrv(DeviceParameter.class, srv -> srv.filter("(device.id=" + device.getDeviceId() + ")")));
+            .withSvc(DeviceParameter.class, srv -> srv.filter("(device.id=" + device.getDeviceId() + ")")));
     }
     
     @Override
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceImpl.java
index 6caacbe..28c2e15 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceImpl.java
@@ -32,4 +32,10 @@
     public int getDeviceId() {
         return id;
     }
+    
+    
+    @Override
+    public String toString() {
+        return "Device #" + id;
+    }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceParameterImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceParameterImpl.java
index f7b9779..a97ae47 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceParameterImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceParameterImpl.java
@@ -32,4 +32,9 @@
     public int getDeviceId() {
         return id;
     }
+    
+    @Override
+    public String toString() {
+        return "DeviceParameter #" + id;
+    }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/dictionary/Activator.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/dictionary/Activator.java
index 9d3bb7a..8e4482e 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/dictionary/Activator.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/dictionary/Activator.java
@@ -22,7 +22,9 @@
 import static org.apache.felix.service.command.CommandProcessor.COMMAND_FUNCTION;
 import static org.apache.felix.service.command.CommandProcessor.COMMAND_SCOPE;
 
+import org.apache.felix.dm.DependencyManager;
 import org.apache.felix.dm.lambda.DependencyManagerActivator;
+import org.osgi.framework.BundleContext;
 import org.osgi.service.log.LogService;
 
 /**
@@ -30,7 +32,7 @@
  */
 public class Activator extends DependencyManagerActivator {
     @Override
-    public void activate() throws Exception {
+    public void init(BundleContext ctx, DependencyManager dm) throws Exception {
     	out.println("type \"log info\" to see the logs emitted by this test.");
 
         // Create the factory configuration for our DictionaryImpl service. An instance of the DictionaryImpl is created for each
@@ -38,25 +40,24 @@
         factoryPidAdapter(adapter -> adapter
             .impl(DictionaryImpl.class)
             .provides(DictionaryService.class)
-            .factoryPid(DictionaryConfiguration.class)
             .propagate()
-            .cb(DictionaryImpl::updated)
-            .withSrv(LogService.class));
+            .update(DictionaryConfiguration.class, DictionaryImpl::updated)
+            .withSvc(LogService.class));
                             
         // Create the Dictionary Aspect that decorates any registered Dictionary service. For each Dictionary, an instance of the 
         // DictionaryAspect service is created).
         aspect(DictionaryService.class, aspect -> aspect
             .impl(DictionaryAspect.class)
             .filter("(lang=en)").rank(10)
-            .withCnf(conf -> conf.pid(DictionaryAspectConfiguration.class).cb(DictionaryAspect::addWords))
-            .withSrv(LogService.class));
+            .withCnf(conf -> conf.update(DictionaryAspectConfiguration.class, DictionaryAspect::addWords))
+            .withSvc(LogService.class));
                     
         // Create the SpellChecker component. It depends on all available DictionaryService instances, possibly
         // decorated by some DictionaryAspects.
         component(comp -> comp
             .impl(SpellChecker.class)
             .provides(SpellChecker.class, COMMAND_SCOPE, "dictionary", COMMAND_FUNCTION, new String[] {"spellcheck"}) 
-            .withSrv(DictionaryService.class)
-            .withSrv(LogService.class));
+            .withSvc(DictionaryService.class)
+            .withSvc(LogService.class));
     }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/dictionary/DictionaryAspect.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/dictionary/DictionaryAspect.java
index 1982db5..0e7060c 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/dictionary/DictionaryAspect.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/dictionary/DictionaryAspect.java
@@ -11,13 +11,10 @@
  */
 package org.apache.felix.dm.lambda.samples.dictionary;
 
-import java.util.Dictionary;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.osgi.service.log.LogService;
 
-import aQute.bnd.annotation.metatype.Configurable;
-
 /**
  * This aspect applies to the English DictionaryService, and allows to decorate it with some
  * custom English words, which are configurable from WebConsole.
@@ -43,13 +40,13 @@
     private LogService m_log;
 
     /**
-     * Defines a configuration dependency for retrieving our english custom words (by default,
-     * our PID is our full class name).
+     * Defines a configuration dependency for retrieving our english custom words.
+     * Dependency Manager will inject a dynamic proxy that implements our DictionaryAspectConfiguration interface.
+     * The dynamic proxy is used to wrap the actual Dictionary configuration.
+     * The pid for our configuration is by default the fqdn of our DictionaryAspectConfiguration interface.
      */
-    protected void addWords(Dictionary<String, ?> config) {
-        if (config != null) {
-            // We use the bnd "Configurable" helper in order to get an implementation for our DictionaryConfiguration interface.
-            DictionaryConfiguration cnf = Configurable.createConfigurable(DictionaryConfiguration.class, config);
+    protected void addWords(DictionaryAspectConfiguration cnf) {
+        if (cnf != null) {
             m_words.clear();
             for (String word : cnf.words()) {
                 m_words.add(word);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/dictionary/DictionaryImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/dictionary/DictionaryImpl.java
index 4167e77..ed1b499 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/dictionary/DictionaryImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/dictionary/DictionaryImpl.java
@@ -18,13 +18,10 @@
  */
 package org.apache.felix.dm.lambda.samples.dictionary;
 
-import java.util.Dictionary;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.osgi.service.log.LogService;
 
-import aQute.bnd.annotation.metatype.Configurable;
-
 /**
  * A Dictionary Service, instantiated from webconsole, when you add some configurations instances to the
  * DictionaryConfiguration factory pid. The Configuration metatype informations is described using the
@@ -61,17 +58,12 @@
      * Our service will be initialized from ConfigAdmin.
      * @param config The configuration where we'll lookup our words list (key=".words").
      */
-    protected void updated(Dictionary<String, ?> config) {
-        if (config != null) {
-            // We use the bnd "Configurable" helper in order to get an implementation for our DictionaryConfiguration interface.
-            DictionaryConfiguration cnf = Configurable.createConfigurable(DictionaryConfiguration.class, config);
-
-            m_lang = cnf.lang();
-            m_words.clear();
-            for (String word : cnf.words()) {
-                m_words.add(word);
-            }
-        }
+    protected void updated(DictionaryConfiguration cnf) {
+        m_lang = cnf.lang();
+        m_words.clear();
+        for (String word : cnf.words()) {
+            m_words.add(word);
+        }        
     }
 
     /**
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/factory/Activator.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/factory/Activator.java
index 73a3b64..7e884e3 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/factory/Activator.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/factory/Activator.java
@@ -20,7 +20,9 @@
 
 import static java.lang.System.out;
 
+import org.apache.felix.dm.DependencyManager;
 import org.apache.felix.dm.lambda.DependencyManagerActivator;
+import org.osgi.framework.BundleContext;
 import org.osgi.service.log.LogService;
 
 /**
@@ -28,13 +30,13 @@
  */
 public class Activator extends DependencyManagerActivator {
     @Override
-    public void activate() throws Exception {
-    	out.println("type \"log info\" to see the logs emitted by this test.");
+    public void init(BundleContext ctx, DependencyManager dm) throws Exception {
+    	out.println("type \"log warn\" to see the logs emitted by this test.");
 
         component(comp -> comp
             .factory(ProviderFactory::new, ProviderFactory::create)       
             .provides(Provider.class)
             .start(ProviderImpl::start)                      
-            .withSrv(LogService.class, log -> log.cb(ProviderImpl::set)));
+            .withSvc(LogService.class, log -> log.add(ProviderImpl::set)));
     }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/factory/ProviderImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/factory/ProviderImpl.java
index 220958e..11d72f4 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/factory/ProviderImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/factory/ProviderImpl.java
@@ -33,6 +33,6 @@
     void set(LogService log) { m_log = log; }
 
     void start() {
-        m_log.log(LogService.LOG_INFO, "ProviderImpl.start()");
+        m_log.log(LogService.LOG_WARNING, "ProviderImpl.start()");
     }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/future/Activator.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/future/Activator.java
index 117af23..a1e9a9e 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/future/Activator.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/future/Activator.java
@@ -20,7 +20,9 @@
 
 import static java.lang.System.out;
 
+import org.apache.felix.dm.DependencyManager;
 import org.apache.felix.dm.lambda.DependencyManagerActivator;
+import org.osgi.framework.BundleContext;
 import org.osgi.service.log.LogService;
 
 /**
@@ -38,21 +40,21 @@
      * Initialize our components using new DM-lambda activator base.
      */
     @Override
-    public void activate() throws Exception {
-    	out.println("type \"log info\" to see the logs emitted by this test.");
+    public void init(BundleContext ctx, DependencyManager dm) throws Exception {
+    	out.println("type \"log warn\" to see the logs emitted by this test.");
     	
     	// System.setProperty("http.proxyHost","your.http.proxy.host");
     	// System.setProperty("http.proxyPort", "your.http.proxy.port");
     	    	
-        // Create the PageLinks service, which asynchronously download the content of the Felix web page.
+        // Create the PageLinks service, which asynchronously downloads the content of the Felix web page.
     	// The PageLink service will be started once the page has been downloaded (using a CompletableFuture).
         component(comp -> comp
             .factory(() -> new PageLinksImpl("http://felix.apache.org/"))
             .provides(PageLinks.class)
-            .withSrv(LogService.class, log -> log.cb(PageLinksImpl::bind)));
+            .withSvc(LogService.class, log -> log.add(PageLinksImpl::bind)));
         
         // Just wait for the PageLinks service and display all links found from the Felix web site.
-        component(comp -> comp.impl(this).withSrv(PageLinks.class, page -> page.cbi(this::setPageLinks))); 
+        component(comp -> comp.impl(this).withSvc(PageLinks.class, page -> page.add(this::setPageLinks))); 
     }
         
     /**
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/future/PageLinksImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/future/PageLinksImpl.java
index 3017ccf..b78e469 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/future/PageLinksImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/future/PageLinksImpl.java
@@ -37,7 +37,7 @@
 	        .thenApply(this::parseLinks);	       
 
 	    // Add the future dependency so we'll be started once the CompletableFuture "futureLinks" has completed.
-	    component(c, comp -> comp.withFuture(futureLinks, future -> future.cbi(this::setLinks)));
+	    component(c, comp -> comp.withFuture(futureLinks, future -> future.complete(this::setLinks)));
 	}
 	
 	// Called when our future has completed.
@@ -47,7 +47,7 @@
     
 	// once our future has completed, our component is started.
 	void start() {
-		m_log.log(LogService.LOG_INFO, "Service starting: number of links found from Felix web site: " + m_links.size());
+		m_log.log(LogService.LOG_WARNING, "Service starting: number of links found from Felix web site: " + m_links.size());
 	}
 	
 	@Override
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/Activator.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/Activator.java
index 8dfd611..98c970b 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/Activator.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/Activator.java
@@ -20,7 +20,9 @@
 
 import static java.lang.System.out;
 
+import org.apache.felix.dm.DependencyManager;
 import org.apache.felix.dm.lambda.DependencyManagerActivator;
+import org.osgi.framework.BundleContext;
 import org.osgi.service.cm.ConfigurationAdmin;
 import org.osgi.service.event.EventAdmin;
 import org.osgi.service.log.LogService;
@@ -30,25 +32,28 @@
  */
 public class Activator extends DependencyManagerActivator {
     @Override
-    public void activate() throws Exception {
-    	out.println("type \"log info\" to see the logs emitted by this test.");
+    public void init(BundleContext ctx, DependencyManager dm) throws Exception {
+    	out.println("type \"log warn\" to see the logs emitted by this test.");
     	
     	// Creates a Service Provider (property names are deduced from lambda parameter names).
     	// (service dependencies are required by default)
         component(comp -> comp.impl(ServiceProviderImpl.class)
             .provides(ServiceProvider.class, p1 -> "v1", p2 -> 123)
-            .withSrv(LogService.class));
+            .withSvc(LogService.class));
             
         // Creates a Service Consumer. we depend on LogService, EventAdmin and on our ServiceProvider.
         // (LogService and EventAdmin are declared in one single method call).
+        // We also depend on a configuration. Our ServiceConsumer.updated method takes as argument a "Configuration" interface
+        // which is used to wrap the actual properties behind a dynamic proxy for our "Configuration" interface that is implemented by Dependency Manager.
+        // (the pid is assumed to be by default the fqdn of our Configuration interface).
         component(comp -> comp.impl(ServiceConsumer.class)
-            .withSrv(LogService.class, EventAdmin.class)
-            .withSrv(ServiceProvider.class, srv -> srv.filter("(p1=v1)")) 
-            .withCnf(ServiceConsumer.class));  
+            .withSvc(LogService.class, EventAdmin.class)
+            .withSvc(ServiceProvider.class, srv -> srv.filter("(p1=v1)")) 
+            .withCnf(cnf -> cnf.update(Configuration.class, ServiceConsumer::updated))); 
         
         // Creates a component that populates some properties in the Configuration Admin.
         // Here, we inject the CM (Configuration Admin) service dependency using a method reference:
-        component(comp -> comp.impl(Configurator.class)
-            .withSrv(ConfigurationAdmin.class, srv -> srv.cb(Configurator::bind)));
+        component(comp -> comp.factory(() -> new Configurator(Configuration.class.getName()))
+            .withSvc(ConfigurationAdmin.class, srv -> srv.add(Configurator::bind)));
     }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/Configuration.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/Configuration.java
new file mode 100644
index 0000000..df3bf44
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/Configuration.java
@@ -0,0 +1,30 @@
+/*
+ * 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.lambda.samples.hello;
+
+/**
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public interface Configuration {
+    /**
+     * Returns the value of the "foo" property.
+     * @return the value of the "foo" property.
+     */
+    String getFoo();
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/Configurator.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/Configurator.java
index 648a92f..e73c769 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/Configurator.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/Configurator.java
@@ -8,7 +8,12 @@
 import org.osgi.service.cm.ConfigurationAdmin;
 
 public class Configurator {
-    ConfigurationAdmin m_cm; 
+    ConfigurationAdmin m_cm;
+    final String m_pid;
+    
+    Configurator(String pid) {
+        m_pid = pid;
+    }
     
     void bind(ConfigurationAdmin cm) {
         m_cm = cm;
@@ -16,7 +21,7 @@
     
     void start() throws IOException {
         // Configure the ServiceConsumer component
-        Configuration c = m_cm.getConfiguration(ServiceConsumer.class.getName(), null);
+        Configuration c = m_cm.getConfiguration(m_pid, null);
         Dictionary<String, Object> props = new Hashtable<>();
         props.put("foo", "bar");
         c.update(props);
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/ServiceConsumer.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/ServiceConsumer.java
index a67fa4c..1127173 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/ServiceConsumer.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/ServiceConsumer.java
@@ -18,8 +18,6 @@
  */
 package org.apache.felix.dm.lambda.samples.hello;
 
-import java.util.Dictionary;
-
 import org.osgi.service.event.EventAdmin;
 import org.osgi.service.log.LogService;
 
@@ -33,11 +31,12 @@
     volatile LogService log;
     volatile EventAdmin eventAdmin;
 
-    public void updated(Dictionary<String, Object> conf) {
+    public void updated(Configuration conf) {
+        // conf.getFoo() returns "bar"
     }
     
     public void start() {
-        log.log(LogService.LOG_INFO, "ServiceConsumer.start: calling service.hello()");
+        log.log(LogService.LOG_WARNING, "ServiceConsumer.start: calling service.hello()");
         this.service.hello();
     }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/ServiceProviderImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/ServiceProviderImpl.java
index 2d1fbba..99af097 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/ServiceProviderImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/hello/ServiceProviderImpl.java
@@ -48,6 +48,6 @@
     
     @Override
     public void hello() {
-        log.log(LogService.LOG_INFO, "ServiceProviderImpl.hello");
+        log.log(LogService.LOG_WARNING, "ServiceProviderImpl.hello");
     }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/BundleAdapterBuilder.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/BundleAdapterBuilder.java
index 8a393a1..a120738 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/BundleAdapterBuilder.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/BundleAdapterBuilder.java
@@ -1,9 +1,9 @@
 package org.apache.felix.dm.lambda;
 
 import org.apache.felix.dm.lambda.callbacks.CbBundle;
-import org.apache.felix.dm.lambda.callbacks.CbComponentBundle;
-import org.apache.felix.dm.lambda.callbacks.CbTypeBundle;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponentBundle;
+import org.apache.felix.dm.lambda.callbacks.CbBundleComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbBundle;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbBundleComponent;
 
 /**
  * Builds a Dependency Manager bundle adapter. The adapter created by this builder will be applied to any bundle that matches the specified 
@@ -12,12 +12,14 @@
  * you supply here. The bundle is injected by reflection in adapter class fields having a Bundle type, or using a callback method that you can 
  * specify.
  * 
+ * You can specify reflection based (using method names), or java8 method references for callbacks.
+ * 
  * <p> Example which creates a BundleAdapter service for each started bundle (the bundle is added by reflection on
  * a class field that has a "Bundle" type):
  * 
  * <pre> {@code
  * public class Activator extends DependencyManagerActivator {
- *     public void activate() throws Exception { 
+ *     public void init(BundleContext ctx, DependencyManager dm) throws Exception { 
  *       bundleAdapter(adapt -> adapt
  *           .impl(BundleAdapterImpl.class)
  *           .provides(BundleAdapter.class)
@@ -30,12 +32,12 @@
  * 
  * <pre> {@code
  * public class Activator extends DependencyManagerActivator {
- *     public void activate() throws Exception { 
+ *     public void init(BundleContext ctx, DependencyManager dm) throws Exception { 
  *       bundleAdapter(adapt -> adapt
  *           .impl(BundleAdapterImpl.class)
  *           .provides(BundleAdapter.class)
  *           .mask(Bundle.INSTALLED | Bundle.RESOLVED | Bundle.ACTIVE)
- *           .cb(BundleAdapterImpl::setBundle));
+ *           .add(BundleAdapterImpl::setBundle));
  *    }
  * }
  * }</pre>
@@ -44,12 +46,12 @@
  * 
  * <pre> {@code
  * public class Activator extends DependencyManagerActivator {
- *     public void activate() throws Exception { 
+ *     public void init(BundleContext ctx, DependencyManager dm) throws Exception { 
  *       bundleAdapter(adapt -> adapt
  *           .impl(BundleAdapterImpl.class)
  *           .provides(BundleAdapter.class)
  *           .mask(Bundle.INSTALLED | Bundle.RESOLVED | Bundle.ACTIVE)
- *           .cb("setBundle"));
+ *           .add("setBundle"));
  *    }
  * }
  * }</pre>
@@ -92,152 +94,187 @@
     BundleAdapterBuilder propagate();
     
     /**
-     * Sets some <code>callbacks</code> invoked on the component implementation instances. When a bundle state matches the bundle 
-     * adapter filter, then the bundle is injected using the specified callback methods. When you specify one callback, it stands for the "add" callback.
-     * When you specify two callbacks, the first one corresponds to the "add" callback, and the second one to the "remove" callback. When you specify three
-     * callbacks, the first one stands for the "add" callback, the second one for the "change" callback, and the third one for the "remove" callback.
+     * Sets a "add" callback name invoked on the component implementation instance(s).
+     * The callback can be used as hooks whenever the dependency is added. When you specify a callback, 
+     * the auto configuration feature is automatically turned off, because we're assuming you don't need it in this case.
      * 
-     * @param callbacks a list of callbacks (1 param : "add", 2 params : "add"/remove", 3 params : "add"/"change"/"remove").
-     * @return this builder
+     * @param callback the method to call when a bundle was added
+     * 
+     * The following method signature are supported:
+     * <pre>{@code
+     * callback(Bundle b)
+     * callback(Component c, Bundle b)
+     * }</pre>
+     * 
+     * @param callback the callback name
+     * @return this builder.
      */
-    BundleAdapterBuilder cb(String ... callbacks);
+    BundleAdapterBuilder add(String callback);
     
     /**
-     * Sets some <code>callback instance</code> methods invoked on a given Object instance. When a bundle state matches the bundle 
-     * adapter filter, then the bundle is injected using the specified callback methods. When you specify one callback, it stands for the "add" callback.
-     * When you specify two callbacks, the first one corresponds to the "add" callback, and the second one to the "remove" callback. 
-     * When you specify three callbacks, the first one stands for the "add" callback, the second one for the "change" callback, and the third one for 
-     * the "remove" callback.
+     * Sets a "change" callback name invoked on the component implementation instance(s).
+     * The callback can be used as hooks whenever the dependency is changed. When you specify a callback, 
+     * the auto configuration feature is automatically turned off, because we're assuming you don't need it in this case.
      * 
-     * @param callbackInstance the Object instance where the callbacks are invoked on
-     * @param callbacks a list of callbacks (1 param : "add", 2 params : "add"/remove", 3 params : "add"/"change"/"remove").
-     * @return this builder
+     * @param callback the method to call when a bundle was changed
+     * 
+     * The following method signature are supported:
+     * <pre>{@code
+     * callback(Bundle b)
+     * callback(Component c, Bundle b)
+     * }</pre>
+     * 
+     * @param callback the callback name
+     * @return this builder.
      */
-    BundleAdapterBuilder cbi(Object callbackInstance, String ... callbacks);
+     BundleAdapterBuilder change(String callback);
+ 
+     /**
+      * Sets a "remove" callback name invoked on the component implementation instance(s).
+      * The callback can be used as hooks whenever the dependency is removed. When you specify a callback, 
+      * the auto configuration feature is automatically turned off, because we're assuming you don't need it in this case.
+      * 
+      * @param callback the method to call when a bundle was removed
+      * 
+      * The following method signature are supported:
+      * <pre>{@code
+      * callback(Bundle b)
+      * callback(Component c, Bundle b)
+      * }</pre>
+      * 
+      * @param callback the callback name
+      * @return this builder.
+      */
+     BundleAdapterBuilder remove(String callback);
+     
+     /**
+      * Sets a callback instance to use when invoking reflection based callbacks.
+      * 
+      * @param callbackInstance the instance to call the reflection based callbacks on
+      * @return this builder.
+      * @see #add(String)
+      * @see #change(String)
+      * @see #remove(String)
+      */
+     BundleAdapterBuilder callbackInstance(Object callbackInstance);
 
     /**
-     * Sets a <code>callback</code> invoked on a component implementation instance when a bundle is added.
-     * The method reference must point to a Component implementation class method, and take as argument a Bundle.
+     * Sets a reference to a callback method invoked on one of the component implementation classes.
+     * The method reference must point to a Component implementation class method, it is called when the bundle is added
+     * and takes as argument a Bundle.
      * 
      * @param <T> the type of the component instance class on which the callback is invoked.
      * @param add the method reference invoked when a bundle is added.
      * @return this builder
      */
-    <T> BundleAdapterBuilder cb(CbTypeBundle<T> add);
+    <T> BundleAdapterBuilder add(CbBundle<T> add);
     
     /**
-     * Sets some <code>callbacks</code> invoked on a component implementation instance when a bundle is added/removed.
-     * The method references must point to a Component implementation class method, and take as argument a Bundle.
+     * Sets a reference to a callback method invoked on one of the component implementation classes.
+     * The method reference must point to a Component implementation class method, it is called when the bundle is changed
+     * and takes as argument a Bundle.
      * 
      * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a bundle is added.
-     * @param remove the method reference invoked when a bundle is removed.
-     * @return this builder
-     */
-    <T> BundleAdapterBuilder cb(CbTypeBundle<T> add, CbTypeBundle<T> remove);
-    
-    /**
-     * Sets some <code>callbacks</code> invoked on a component implementation instance when a bundle is added, changed or removed.
-     * The method references must point to a Component implementation class method, and take as argument a Bundle.
-     * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a bundle is added.
      * @param change the method reference invoked when a bundle has changed.
+     * @return this builder
+     */
+    <T> BundleAdapterBuilder change(CbBundle<T> change);
+    
+    /**
+     * Sets a reference to a callback method invoked on one of the component implementation classes.
+     * The method reference must point to a Component implementation class method, it is called when the bundle is removed
+     * and takes as argument a Bundle.
+     * 
+     * @param <T> the type of the component instance class on which the callback is invoked.
      * @param remove the method reference invoked when a bundle is removed.
      * @return this builder
      */
-    <T> BundleAdapterBuilder cb(CbTypeBundle<T> add, CbTypeBundle<T> change, CbTypeBundle<T> remove);
+    <T> BundleAdapterBuilder remove(CbBundle<T> remove);
     
     /**
-     * Sets a <code>callback</code> invoked on a component implementation instance when a bundle is added.
-     * The method reference must point to a Component implementation class method, and take as argument a Component and a Bundle.
+     * Sets a reference to a callback method invoked on one of the component implementation classes.
+     * The method reference must point to a Component implementation class method, it is called when the bundle is added
+     * and takes as argument a Bundle and a Component.
      * 
      * @param <T> the type of the component instance class on which the callback is invoked.
      * @param add the method reference invoked when a bundle is added.
      * @return this builder
      */
-    <T> BundleAdapterBuilder cb(CbTypeComponentBundle<T> add);    
+    <T> BundleAdapterBuilder add(CbBundleComponent<T> add);    
     
     /**
-     * Sets some <code>callbacks</code> invoked on a component implementation instance when a bundle is added, or removed.
-     * The method references must point to a Component implementation class method, and take as argument a Component and a Bundle.
+     * Sets a reference to a callback method invoked on one of the component implementation classes.
+     * The method reference must point to a Component implementation class method, it is called when the bundle is changed
+     * and takes as argument a Bundle and a Component.
      * 
      * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a bundle is added.
-     * @param remove the method reference invoked when a bundle is removed.
-     * @return this builder
-     */
-    <T> BundleAdapterBuilder cb(CbTypeComponentBundle<T> add, CbTypeComponentBundle<T> remove);   
-    
-    /**
-     * Sets some <code>callbacks</code> invoked on a component implementation instance when a bundle is added, changed or removed.
-     * The method references must point to a Component implementation class method, and take as argument a Component and a Bundle.
-     * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a bundle is added.
      * @param change the method reference invoked when a bundle has changed.
+     * @return this builder
+     */
+    <T> BundleAdapterBuilder change(CbBundleComponent<T> change);    
+    
+    /**
+     * Sets a reference to a callback method invoked on one of the component implementation classes.
+     * The method reference must point to a Component implementation class method, it is called when the bundle is removed
+     * and takes as argument a Bundle and a Component.
+     * 
+     * @param <T> the type of the component instance class on which the callback is invoked.
      * @param remove the method reference invoked when a bundle is removed.
      * @return this builder
      */
-    <T> BundleAdapterBuilder cb(CbTypeComponentBundle<T> add, CbTypeComponentBundle<T> change, CbTypeComponentBundle<T> remove);         
+    <T> BundleAdapterBuilder remove(CbBundleComponent<T> remove);    
 
     /**
-     * Sets a <code>callback instance</code> invoked on a given Object instance when a bundle is added. 
-     * The method reference must point to an Object instance method, and takes as argument a Bundle parameter.
+     * Sets a reference to a callback method invoked on a given Object instance.
+     * The method reference is invoked when the bundle is added and takes as argument a Bundle.
      * 
      * @param add the method reference invoked when a bundle is added.
      * @return this builder
      */
-    BundleAdapterBuilder cbi(CbBundle add);
+    BundleAdapterBuilder add(InstanceCbBundle add);
     
     /**
-     * Sets some <code>callback instance</code> invoked on a given Object instance when a bundle is added or removed. 
-     * The method references must point to an Object instance method, and take as argument a Bundle parameter.
+     * Sets a reference to a callback method invoked on a given Object instance.
+     * The method reference is invoked when the bundle has changed and takes as argument a Bundle.
      * 
-     * @param add the method reference invoked when a bundle is added.
-     * @param remove the method reference invoked when a bundle is removed.
-     * @return this builder
-     */
-    BundleAdapterBuilder cbi(CbBundle add, CbBundle remove);
-    
-    /**
-     * Sets some <code>callback instance</code> invoked on a given Object instance when a bundle is added, changed or removed.
-     * The method references must point to an Object instance method, and take as argument a Bundle parameter.
-     * 
-     * @param add the method reference invoked when a bundle is added.
      * @param change the method reference invoked when a bundle has changed.
+     * @return this builder
+     */
+    BundleAdapterBuilder change(InstanceCbBundle change);
+    
+    /**
+     * Sets a reference to a callback method invoked on a given Object instance.
+     * The method reference is invoked when the bundle is removed and takes as argument a Bundle.
+     * 
      * @param remove the method reference invoked when a bundle is removed.
      * @return this builder
      */
-    BundleAdapterBuilder cbi(CbBundle add, CbBundle change, CbBundle remove);
+    BundleAdapterBuilder remove(InstanceCbBundle remove);
 
     /**
-     * Sets a <code>callback instance</code> invoked on a given Object instance when a bundle is added. 
-     * The method reference must point to an Object instance method, and takes as arguments a Component and a Bundle.
+     * Sets a reference to a callback method invoked on a given Object instance.
+     * The method reference is invoked when the bundle is added and takes as argument a Bundle and a Component.
      * 
      * @param add the method reference invoked when a bundle is added.
      * @return this builder
      */
-    BundleAdapterBuilder cbi(CbComponentBundle add);
+    BundleAdapterBuilder add(InstanceCbBundleComponent add);
     
     /**
-     * Sets some <code>callback instance</code> invoked on a given Object instance when a bundle is added or removed. 
-     * The method references must point to an Object instance method, and take as argument a Component and a Bundle.
+     * Sets a reference to a callback method invoked on a given Object instance.
+     * The method reference is invoked when the bundle has changed and takes as argument a Bundle and a Component.
      * 
-     * @param add the method reference invoked when a bundle is added.
-     * @param remove the method reference invoked when a bundle is removed.
-     * @return this builder
-     */
-    BundleAdapterBuilder cbi(CbComponentBundle add, CbComponentBundle remove);
-    
-    /**
-     * Sets some <code>callback instance</code> invoked on a given Object instance when a bundle is added, changed or removed.
-     * The method references must point to an Object instance method, and take as argument a Component and a Bundle.
-     * 
-     * @param add the method reference invoked when a bundle is added.
      * @param change the method reference invoked when a bundle has changed.
+     * @return this builder
+     */
+    BundleAdapterBuilder change(InstanceCbBundleComponent change);
+    
+    /**
+     * Sets a reference to a callback method invoked on a given Object instance.
+     * The method reference is invoked when the bundle is removed and takes as argument a Bundle and a Component.
+     * 
      * @param remove the method reference invoked when a bundle is removed.
      * @return this builder
      */
-    BundleAdapterBuilder cbi(CbComponentBundle add, CbComponentBundle change, CbComponentBundle remove);
+    BundleAdapterBuilder remove(InstanceCbBundleComponent remove);
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/BundleDependencyBuilder.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/BundleDependencyBuilder.java
index 0c577ba..7d87a12 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/BundleDependencyBuilder.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/BundleDependencyBuilder.java
@@ -1,27 +1,30 @@
 package org.apache.felix.dm.lambda;
 
 import java.util.Dictionary;
-import java.util.function.Supplier;
+import java.util.function.Function;
 
 import org.apache.felix.dm.BundleDependency;
 import org.apache.felix.dm.lambda.callbacks.CbBundle;
-import org.apache.felix.dm.lambda.callbacks.CbComponentBundle;
-import org.apache.felix.dm.lambda.callbacks.CbTypeBundle;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponentBundle;
+import org.apache.felix.dm.lambda.callbacks.CbBundleComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbBundle;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbBundleComponent;
 import org.osgi.framework.Bundle;
 
 /**
- * Builds a Dependency Manager Bundle Dependency. The Dependency is required by default (unlike in the original Dependency Manager API).
+ * Builds a Dependency Manager Bundle Dependency. 
+ * The Dependency is required by default, but you can
+ * control the default mode (required or optional) using the "org.apache.felix.dependencymanager.lambda.dependencymode"
+ * system property which can be set to either "required" or "optional" ("required" by default).
  * 
- * <p> Example of a Component which tracks a started bundle having a given bundle symbolic name:
+ * <p> Example of a Pojo Component which tracks a started bundle having a given bundle symbolic name:
  * 
  * <pre> {@code
  * public class Activator extends DependencyManagerActivator {
- *     public void activate() throws Exception { 
+ *     public void init(BundleContext ctx, DependencyManager dm) throws Exception { 
  *         String BSN = "org.apache.felix.dependencymanager";
  *         component(comp -> comp
- *             .impl(MyComponent.class)
- *             .withBundle(b -> b.mask(Bundle.ACTIVE).filter("(Bundle-SymbolicName=" + BSN + ")").cb(MyComponent::add, MyComponent::remove)));
+ *             .impl(Pojo.class)
+ *             .withBundle(b -> b.mask(Bundle.ACTIVE).filter("(Bundle-SymbolicName=" + BSN + ")").add(Pojo::add).remove(Pojo::remove)));
  *                  
  *    }
  * }
@@ -31,7 +34,7 @@
  */
 public interface BundleDependencyBuilder extends DependencyBuilder<BundleDependency> {
     /**
-     * Enables auto configuration for this dependency. This means the component implementation (composition) will be
+     * Enables auto configuration for this dependency. This means the component implementation class fields will be
      * injected with this bundle dependency automatically.
      * 
      * @param autoConfig <code>true</code> to enable auto configuration
@@ -40,7 +43,7 @@
     public BundleDependencyBuilder autoConfig(boolean autoConfig);
 
     /**
-     * Enables auto configuration for this dependency. This means the component implementation (composition) will be
+     * Enables auto configuration for this dependency. This means the component implementation class fields will be
      * injected with this bundle dependency automatically.
      * 
      * @return the bundle dependency builder
@@ -48,7 +51,8 @@
     public BundleDependencyBuilder autoConfig();
 
     /**
-     * Sets the dependency to be required. By default, the dependency is required.
+     * Sets the dependency to be required. By default, the dependency is required, but you can specify the default mode
+     * using the "org.apache.felix.dependencymanager.lambda.dependencymode" system property.
      * 
      * @param required <code>true</code> if this bundle dependency is required (true by default).
      * @return the bundle dependency builder
@@ -56,7 +60,8 @@
     public BundleDependencyBuilder required(boolean required);
 
     /**
-     * Sets the dependency to be required.
+     * Sets the dependency to be required.  By default, the dependency is required, but you can specify the default mode
+     * using the "org.apache.felix.dependencymanager.lambda.dependencymode" system property.
      * 
      * @return the bundle dependency builder
      */
@@ -107,9 +112,9 @@
     /**
      * Sets an Object instance and a callback method used to propagate some properties to the provided service properties.
      * The method will be invoked on the specified object instance and must have one of the following signatures:
-     * <ul><li>Dictionary callback(ServiceReference, Object service) 
-     * <li>Dictionary callback(ServiceReference)
-     * </ul>
+     * 
+     * <p><ul><li>Dictionary callback(Bundle bundle)</ul>
+     * 
      * @param instance the Object instance which is used to retrieve propagated service properties 
      * @param method the method to invoke for retrieving the properties to be propagated to the service properties.
      * @return this service dependency. builder
@@ -117,163 +122,176 @@
     public BundleDependencyBuilder propagate(Object instance, String method);
     
     /**
-     * Sets an Object instance and a callback method used to propagate some properties to the provided service properties.
-     * The method will be invoked on the specified object instance and must have one of the following signatures:
-     * <ul><li>Dictionary callback(ServiceReference, Object service) 
-     * <li>Dictionary callback(ServiceReference)
-     * </ul>
-     * @param instance the Object instance which is used to retrieve propagated service properties 
+     * Sets a reference to a method on an Object instance used to propagate some bundle properties to the provided service properties.
+     * 
+     * @param propagate a function which accepts a Bundle argument and which returns some properties that will be
+     * propagated to the provided component service properties. 
      * @return this service dependency. builder
      */
-    public BundleDependencyBuilder propagate(Supplier<Dictionary<?, ?>> instance);
+    public BundleDependencyBuilder propagate(Function<Bundle, Dictionary<?, ?>> propagate);
 
     /**
-     * Sets some <code>callback</code> methods to invoke on the component instance(s). When a bundle state matches the bundle 
-     * filter, then the bundle is injected using the specified callback methods. When you specify one callback, it stands for the "add" callback.
-     * When you specify two callbacks, the first one corresponds to the "add" callback, and the second one to the "remove" callback. When you specify three
-     * callbacks, the first one stands for the "add" callback, the second one for the "change" callback, and the third one for the "remove" callback.
+     * Sets a "add" <code>callback</code> method to invoke on the component implementation instance(s).
+     * The callback is invoked when the bundle is added, and the following signatures are supported:
      * 
-     * @param callbacks a list of callbacks (1 param: "add", 2 params: "add"/remove", 3 params: "add"/"change"/"remove" callbacks).
+     * <p><ol>
+     * <li>method(Bundle)</li>
+     * <li>method(Component, Bundle)</li>
+     * </ol>
+     * 
+     * @param callback the add callback
      * @return this builder
      */
-    BundleDependencyBuilder cb(String ... callbacks);
+    BundleDependencyBuilder add(String callback);
     
     /**
-     * Sets some <code>callback instance</code> methods to invoke on a given Object instance. When a bundle state matches the bundle 
-     * filter, then the bundle is injected using the specified callback methods. When you specify one callback, it stands for the "add" callback.
-     * When you specify two callbacks, the first one corresponds to the "add" callback, and the second one to the "remove" callback. 
-     * When you specify three callbacks, the first one stands for the "add" callback, the second one for the "change" callback, and the third one for 
-     * the "remove" callback.
+     * Sets a "change" <code>callback</code> method to invoke on the component implementation instance(s). 
+     * The callback is invoked when the bundle state has changed, and the following signatures are supported:
      * 
-     * @param callbackInstance the Object instance where the callbacks are invoked on
-     * @param callbacks a list of callbacks (1 param: "add", 2 params: "add/remove", 3 params: "add/change/remove" callbacks).
+     * <p><ol>
+     * <li>method(Bundle)</li>
+     * <li>method(Component, Bundle)</li>
+     * </ol>
+     * 
+     * @param callback the change callback
      * @return this builder
      */
-    BundleDependencyBuilder cb(Object callbackInstance, String ... callbacks);
+    BundleDependencyBuilder change(String callback);
+    
+    /**
+     * Sets a "remove" <code>callback</code> method to invoke on the component implementation instance(s). 
+     * The callback is invoked when the bundle is removed, and the following signatures are supported:
+     * <p><ol>
+     * <li>method(Bundle)</li>
+     * <li>method(Component, Bundle)</li>
+     * </ol>
+     * 
+     * @param callback the remove callback
+     * @return this builder
+     */
+    BundleDependencyBuilder remove(String callback);
+    
+    /**
+     * Specifies a callback instance used to invoke the reflection based callbacks on it.
+     * @param callbackInstance the instance to invoke the callbacks on
+     * @return this builder
+     * @see #add(String)
+     * @see #change(String)
+     * @see #remove(String)
+     */
+    BundleDependencyBuilder callbackInstance(Object callbackInstance);
 
     /**
      * Sets a <code>callback</code> method reference which is invoked when a bundle is added.
-     * The method reference must point to a Component implementation class method, and take as argument a Bundle.
+     * The method reference must point to a Component implementation class method, and takes as argument a Bundle.
      * 
      * @param <T> the type of the component implementation class on which the callback is invoked on.
      * @param add the method reference invoked when a bundle is added.
      * @return this builder
      */
-    <T> BundleDependencyBuilder cb(CbTypeBundle<T> add);
-    
+    <T> BundleDependencyBuilder add(CbBundle<T> add);
+        
     /**
-     * Sets some <code>callback</code> method references which are invoked when a bundle is added, or removed.
-     * The method references must point to a Component implementation class method, and take as argument a Bundle.
+     * Sets a <code>callback</code> method reference which is invoked when a bundle is changed.
+     * The method reference must point to a Component implementation class method, and takes as argument a Bundle.
      * 
      * @param <T> the type of the component implementation class on which the callback is invoked on.
-     * @param add the method reference invoked when a bundle is added.
-     * @param remove the method reference invoked when a bundle is removed.
-     * @return this builder
-     */
-    <T> BundleDependencyBuilder cb(CbTypeBundle<T> add, CbTypeBundle<T> remove);
-    
-    /**
-     * Sets some <code>callback</code> method references which are invoked when a bundle is added, changed or removed.
-     * The method references must point to a Component implementation class method, and take as argument a Bundle.
-     * 
-     * @param <T> the type of the component implementation class on which the callback is invoked on.
-     * @param add the method reference invoked when a bundle is added.
      * @param change the method reference invoked when a bundle has changed.
+     * @return this builder
+     */
+    <T> BundleDependencyBuilder change(CbBundle<T> change);
+    
+    /**
+     * Sets a <code>callback</code> method reference which is invoked when a bundle is removed.
+     * The method reference must point to a Component implementation class method, and takes as argument a Bundle.
+     * 
+     * @param <T> the type of the component implementation class on which the callback is invoked on.
      * @param remove the method reference invoked when a bundle is removed.
      * @return this builder
      */
-    <T> BundleDependencyBuilder cb(CbTypeBundle<T> add, CbTypeBundle<T> change, CbTypeBundle<T> remove);
-    
+    <T> BundleDependencyBuilder remove(CbBundle<T> remove);
+
     /**
      * Sets a <code>callback</code> method reference which is invoked when a bundle is added.
-     * The method reference must point to a Component implementation class method, and take as argument a Component and a Bundle.
+     * The method reference must point to a Component implementation class method, and takes as argument a Bundle and a Component.
      * 
      * @param <T> the type of the component implementation class on which the callback is invoked on.
      * @param add the method reference invoked when a bundle is added.
      * @return this builder
      */
-    <T> BundleDependencyBuilder cb(CbTypeComponentBundle<T> add); 
+    <T> BundleDependencyBuilder add(CbBundleComponent<T> add); 
     
     /**
-     * Sets some <code>callback</code> method references which are invoked when a bundle is added, or removed.
-     * The method references must point to a Component implementation class method, and take as argument a Component and a Bundle.
+     * Sets a <code>callback</code> method reference which is invoked when a bundle is changed.
+     * The method reference must point to a Component implementation class method, and takes as argument a Bundle and a Component.
      * 
      * @param <T> the type of the component implementation class on which the callback is invoked on.
-     * @param add the method reference invoked when a bundle is added.
-     * @param remove the method reference invoked when a bundle is removed.
-     * @return this builder
-     */
-    <T> BundleDependencyBuilder cb(CbTypeComponentBundle<T> add, CbTypeComponentBundle<T> remove); 
-    
-    /**
-     * Sets some <code>callback</code> method references which are invoked when a bundle is added, changed or removed.
-     * The method references must point to a Component implementation class method, and take as argument a Component and a Bundle.
-     * 
-     * @param <T> the type of the component implementation class on which the callback is invoked on.
-     * @param add the method reference invoked when a bundle is added.
      * @param change the method reference invoked when a bundle has changed.
-     * @param remove the method reference invoked when a bundle is removed.
      * @return this builder
      */
-    <T> BundleDependencyBuilder cb(CbTypeComponentBundle<T> add, CbTypeComponentBundle<T> change, CbTypeComponentBundle<T> remove); 
+    <T> BundleDependencyBuilder change(CbBundleComponent<T> change); 
  
     /**
-     * Sets a <code>callback instance</code> method reference which is invoked when a bundle is added. 
+     * Sets a <code>callback</code> method reference which is invoked when a bundle is removed.
+     * The method reference must point to a Component implementation class method, and takes as argument a Bundle and a Component.
+     * 
+     * @param <T> the type of the component implementation class on which the callback is invoked on.
+     * @param remove the method reference invoked when a bundle is removed.
+     * @return this builder
+     */
+    <T> BundleDependencyBuilder remove(CbBundleComponent<T> remove); 
+    
+    /**
+     * Sets a method reference on an Object instance which is invoked when a bundle is added. 
      * The method reference must point to an Object instance method, and takes as argument a Bundle parameter.
      * 
      * @param add the method reference invoked when a bundle is added.
      * @return this builder
      */
-    BundleDependencyBuilder cbi(CbBundle add);
+    BundleDependencyBuilder add(InstanceCbBundle add);
     
     /**
-     * Sets some <code>callback instance</code> method references which are invoked when a bundle is added or removed. 
-     * The method references must point to an Object instance method, and take as argument a Bundle parameter.
+     * Sets a method reference on an Object instance which is invoked when a bundle is changed. 
+     * The method reference must point to an Object instance method, and takes as argument a Bundle parameter.
      * 
-     * @param add the method reference invoked when a bundle is added.
+     * @param change the method reference invoked when a bundle is changed.
+     * @return this builder
+     */
+    BundleDependencyBuilder change(InstanceCbBundle change);
+    
+    /**
+     * Sets a method reference on an Object instance which is invoked when a bundle is removed. 
+     * The method reference must point to an Object instance method, and takes as argument a Bundle parameter.
+     * 
      * @param remove the method reference invoked when a bundle is removed.
      * @return this builder
      */
-    BundleDependencyBuilder cbi(CbBundle add, CbBundle remove);
-    
-    /**
-     * Sets some <code>callback instance</code> method references which are invoked when a bundle is added, changed or removed.
-     * The method references must point to an Object instance method, and take as argument a Bundle parameter.
-     * 
-     * @param add the method reference invoked when a bundle is added.
-     * @param change the method reference invoked when a bundle has changed.
-     * @param remove the method reference invoked when a bundle is removed.
-     * @return this builder
-     */
-    BundleDependencyBuilder cbi(CbBundle add, CbBundle change, CbBundle remove);
+    BundleDependencyBuilder remove(InstanceCbBundle remove);
 
     /**
      * Sets a <code>callback instance</code> method reference which is invoked when a bundle is added. 
-     * The method reference must point to an Object instance method, and takes as arguments a Component and a Bundle.
+     * The method reference must point to an Object instance method, and takes as arguments a Bundle and a Component.
      * 
      * @param add the method reference invoked when a bundle is added.
      * @return this builder
      */
-    BundleDependencyBuilder cbi(CbComponentBundle add);
+    BundleDependencyBuilder add(InstanceCbBundleComponent add);
     
     /**
-     * Sets some <code>callback instance</code> method references which are invoked when a bundle is added or removed. 
-     * The method references must point to an Object instance method, and take as argument a Component and a Bundle.
+     * Sets a <code>callback instance</code> method reference which is invoked when a bundle is changed. 
+     * The method reference must point to an Object instance method, and takes as argument a Bundle and a Component.
      * 
-     * @param add the method reference invoked when a bundle is added.
+     * @param change the method reference invoked when a bundle is changed.
+     * @return this builder
+     */
+    BundleDependencyBuilder change(InstanceCbBundleComponent change);
+    
+    /**
+     * Sets a <code>callback instance</code> method reference which is invoked when a bundle is removed. 
+     * The method reference must point to an Object instance method, and takes as argument a Bundle and a Component.
+     * 
      * @param remove the method reference invoked when a bundle is removed.
      * @return this builder
      */
-    BundleDependencyBuilder cbi(CbComponentBundle add, CbComponentBundle remove);
-    
-    /**
-     * Sets some <code>callback instance</code> method references which are invoked when a bundle is added, changed or removed.
-     * The method references must point to an Object instance method, and take as argument a Component and a Bundle.
-     * 
-     * @param add the method reference invoked when a bundle is added.
-     * @param change the method reference invoked when a bundle has changed.
-     * @param remove the method reference invoked when a bundle is removed.
-     * @return this builder
-     */
-    BundleDependencyBuilder cbi(CbComponentBundle add, CbComponentBundle change, CbComponentBundle remove);    
+    BundleDependencyBuilder remove(InstanceCbBundleComponent remove);    
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ComponentBuilder.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ComponentBuilder.java
index 0c978ea..206c9e9 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ComponentBuilder.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ComponentBuilder.java
@@ -8,9 +8,10 @@
 import java.util.stream.Stream;
 
 import org.apache.felix.dm.Component;
+import org.apache.felix.dm.lambda.callbacks.Cb;
 import org.apache.felix.dm.lambda.callbacks.CbComponent;
-import org.apache.felix.dm.lambda.callbacks.CbConsumer;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCb;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbComponent;
 
 /**
  * Builds a Dependency Manager Component. Components are the main building blocks for OSGi applications. 
@@ -25,8 +26,8 @@
  * 
  * <pre>{@code
  * public class Activator extends DependencyManagerActivator {
- *   public void activate() throws Exception {
- *       component(comp -> comp.impl(Configurator.class).withSrv(ConfigurationAdmin.class));
+ *   public void init(BundleContext ctx, DependencyManager dm) throws Exception {
+ *       component(comp -> comp.impl(Configurator.class).withSvc(ConfigurationAdmin.class));
  *   }
  * }
  * } </pre>
@@ -35,6 +36,7 @@
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public interface ComponentBuilder<B extends ComponentBuilder<B>> {
+    
     /**
      * Configures the component implementation. Can be a class name, or a component implementation object.
      * 
@@ -84,8 +86,9 @@
     <U, V> B factory(Supplier<U> factory, Function<U, V> create);
         
     /**
-     * Configures a factory used to create this component implementation using a Factory object and a "getComponent" factory method.
-     * the Factory method may then return multiple objects that will be part of this component implementation.
+     * Configures a factory used to create this component implementation using a Factory object and a "getComposition" factory method.
+     * the Factory method may then return multiple objects that will be part of this component implementation, and 
+     * all of them will be searched for injecting any of the dependencies.
      * 
      * Example:
      * 
@@ -110,8 +113,9 @@
      * factory(CompositionManager::new, CompositionManager::create, CompositionManager::getComposition).
      * }</pre>
      * 
-     * Here, the CompositionManager will act as a factory (the create method will return the component implementation object), and the
-     * CompositionManager.getComposition() method will return all the objects that are also part of the component implementation.
+     * Here, the CompositionManager will act as a factory (the create method will return the component implementation object), the
+     * CompositionManager.getComposition() method will return all the objects that are also part of the component implementation, 
+     * and all of them will be searched for injecting any of the dependencies.
      * 
      * @param <U> the type of the object returned by the supplier factory
      * @param factory the function used to create the Factory itself
@@ -122,9 +126,9 @@
     <U> B factory(Supplier<U> factory, Function<U, ?> create, Function<U, Object[]> getComposition);
 
     /**
-     * Sets the public interfaces under which this component should be registered in the OSGi service registry.
+     * Sets the public interface under which this component should be registered in the OSGi service registry.
      * 
-     * @param iface the public interfaces to register in the OSGI service registry.
+     * @param iface the public interface to register in the OSGI service registry.
      * @return this builder
      */
 	B provides(Class<?>  iface);
@@ -132,7 +136,7 @@
 	/**
      * Sets the public interface under which this component should be registered in the OSGi service registry.
      * 
-     * @param iface the public interfaces to register in the OSGI service registry.
+     * @param iface the public interface to register in the OSGI service registry.
 	 * @param name a property name for the provided service
 	 * @param value a property value for the provided service
 	 * @param rest the rest of property name/value pairs.
@@ -150,7 +154,7 @@
      *  provides(MyService.class, property1 -> "value1", property2 -> 123);
      * }</pre>
      *
-     * @param iface the public interfaces to register in the OSGI service registry.
+     * @param iface the public interface to register in the OSGI service registry.
 	 * @param properties a list of fluent service properties for the provided service. You can specify a list of lambda expression, each one implementing the
 	 * {@link FluentProperty} interface that allows to define a property name using a lambda parameter.
      * @return this builder.
@@ -159,7 +163,7 @@
 	
 	/**
      * Sets the public interface under which this component should be registered in the OSGi service registry.
-     * @param iface the public interfaces to register in the OSGI service registry.
+     * @param iface the public interface to register in the OSGI service registry.
 	 * @param properties the properties for the provided service
      * @return this builder.
 	 */
@@ -202,6 +206,7 @@
     
     /**
      * Sets the public interfaces under which this component should be registered in the OSGi service registry.
+     * 
      * @param ifaces the public interfaces to register in the OSGI service registry.
      * @param properties the properties for the provided service
      * @return this builder.
@@ -219,7 +224,7 @@
     /**
      * Sets the public interface under which this component should be registered in the OSGi service registry.
      * 
-     * @param iface the public interfaces to register in the OSGI service registry.
+     * @param iface the public interface to register in the OSGI service registry.
      * @param name a property name for the provided service
      * @param value a property value for the provided service
      * @param rest the rest of property name/value pairs.
@@ -236,7 +241,7 @@
      * provides(MyService.class, property1 -> "value1", property2 -> 123);
      * }</pre>
      *
-     * @param iface the public interfaces to register in the OSGI service registry.
+     * @param iface the public interface to register in the OSGI service registry.
      * @param properties a list of fluent service properties for the provided service. You can specify a list of lambda expression, each one implementing the
      * {@link FluentProperty} interface that allows to define a property name using a lambda parameter.
      * @return this builder.
@@ -245,7 +250,7 @@
     
     /**
      * Sets the public interface under which this component should be registered in the OSGi service registry.
-     * @param iface the public interfaces to register in the OSGI service registry.
+     * @param iface the public interface to register in the OSGI service registry.
      * @param properties the properties for the provided service
      * @return this builder.
      */
@@ -288,6 +293,7 @@
     
     /**
      * Sets the public interfaces under which this component should be registered in the OSGi service registry.
+     * 
      * @param ifaces the public interfaces to register in the OSGI service registry.
      * @param properties the properties for the provided service
      * @return this builder.
@@ -339,14 +345,14 @@
      * @param filter the service filter
      * @return this builder
      */
-    B withSrv(Class<?> service, String filter);
+    B withSvc(Class<?> service, String filter);
 
     /**
      * Adds in one shot multiple required/autoconfig service dependencies.
      * @param services the dependencies that are required and that will be injected in any field with the same dependency type.
      * @return this builder
      */
-    B withSrv(Class<?> ... services);
+    B withSvc(Class<?> ... services);
            
     /**
      * Adds a service dependency built using a Consumer lambda that is provided with a ServiceDependencyBuilder. 
@@ -356,7 +362,7 @@
      * @param consumer the lambda for building the service dependency
      * @return this builder.
      */
-    <U> B withSrv(Class<U> service, Consumer<ServiceDependencyBuilder<U>> consumer);
+    <U> B withSvc(Class<U> service, Consumer<ServiceDependencyBuilder<U>> consumer);
     
     /**
      * Adds a configuration dependency.
@@ -377,17 +383,6 @@
     }
     
     /**
-     * Adds multiple configuration dependencies in one single call. 
-     * @param pids list of configuration pids
-     * @return this builder
-     */
-    @SuppressWarnings("unchecked")
-    default B withCnf(Class<?> ... pids) {
-        Stream.of(pids).forEach(pid -> withCnf(cnf -> cnf.pid(pid)));
-        return (B) this;
-    }
-
-    /**
      * Adds a bundle dependency.
      * @param consumer the lambda used to build the bundle dependency.
      * @return this builder.
@@ -405,6 +400,25 @@
     <U> B withFuture(CompletableFuture<U> future, Consumer<FutureDependencyBuilder<U>> consumer);
     
     /**
+     * Sets the instance to invoke with the reflection based lifecycle callbacks. By default, reflection based 
+     * lifecycle callbacks (init/start/stop/destroy) methods are invoked on the component implementation instance(s).
+     * But you can set a specific callback instance using this method.
+     * <p>
+     * Specifying an instance means you can create a manager
+     * that will be invoked whenever the life cycle of a component changes and this manager
+     * can then decide how to expose this life cycle to the actual component, offering an
+     * important indirection when developing your own component models.
+     * 
+     * @see #init(String) 
+     * @see #start(String)
+     * @see #stop(String)
+     * @see #destroy(String)
+     * @param lifecycleCallbackInstance the instance the lifecycle callback will be invoked on.
+     * @return this builder.
+     */
+    B lifecycleCallbackInstance(Object lifecycleCallbackInstance);
+    
+    /**
      * Sets the name of the method used as the "init" callback. This method, when found, is
      * invoked as part of the life cycle management of the component implementation. 
      * This method is useful because when it is invoked, all required dependencies defines in the Activator
@@ -466,165 +480,100 @@
      * @return this builder.
      */
     B destroy(String callback);
-    
+         
     /**
-     * Sets the name of the methods used as init callback that is invoked on a given Object instance. 
-     * These methods, when found, are invoked on the specified instance as part of the life cycle management 
-     * of the component implementation.
-     * <p>
-     * Specifying an instance means you can create a manager
-     * that will be invoked whenever the life cycle of a component changes and this manager
-     * can then decide how to expose this life cycle to the actual component, offering an
-     * important indirection when developing your own component models.
-     * 
-     * @see #init(String)
-     * @param callbackInstance the instance the callback will be invoked on.
-     * @param callback the callback name
-     * @return this builder.
-     */
-    B init(Object callbackInstance, String callback);
-    
-    /**
-     * Sets the name of the methods used as start callback that is invoked on a given Object instance. 
-     * These methods, when found, are invoked on the specified instance as part of the life cycle management 
-     * of the component implementation.
-     * <p>
-     * Specifying an instance means you can create a manager
-     * that will be invoked whenever the life cycle of a component changes and this manager
-     * can then decide how to expose this life cycle to the actual component, offering an
-     * important indirection when developing your own component models.
-     * 
-     * @see #start(String)
-     * @param callbackInstance the instance the callback will be invoked on.
-     * @param callback the name of the start method
-     * @return this builder.
-     */
-    B start(Object callbackInstance, String callback);
-   
-    /**
-     * Sets the name of the methods used as stop callback that is invoked on a given Object instance. 
-     * These methods, when found, are invoked on the specified instance as part of the life cycle management 
-     * of the component implementation.
-     * <p>
-     * Specifying an instance means you can create a manager
-     * that will be invoked whenever the life cycle of a component changes and this manager
-     * can then decide how to expose this life cycle to the actual component, offering an
-     * important indirection when developing your own component models.
-     * 
-     * @see #stop(String)
-     * @param callbackInstance the instance the callback will be invoked on.
-     * @param callback the name of the stop method
-     * @return this builder.
-     */
-    B stop(Object callbackInstance, String callback);
-  
-    /**
-     * Sets the name of the methods used as destroy callback that is invoked on a given Object instance. 
-     * These methods, when found, are invoked on the specified instance as part of the life cycle management 
-     * of the component implementation.
-     * <p>
-     * Specifying an instance means you can create a manager
-     * that will be invoked whenever the life cycle of a component changes and this manager
-     * can then decide how to expose this life cycle to the actual component, offering an
-     * important indirection when developing your own component models.
-     * 
-     * @see #destroy(String)
-     * @param callbackInstance the instance the callback will be invoked on.
-     * @param callback the name of the destroy method
-     * @return this builder.
-     */
-    B destroy(Object callbackInstance, String callback);
-
-    /**
-     * Sets a method reference used as the "init" callback. This method reference must point to method from one 
-     * of the component instance classes. It is invoked as part of the life cycle management of the component implementation. 
+     * Sets a reference to a component implementation class "init" callback method. 
+     * This method does not take any arguments and is 
+     * invoked as part of the life cycle management of the component implementation. 
      * This method is useful because when it is invoked, all required dependencies defines in the Activator
      * are already injected, and you can then add more extra dependencies from the init() method.
      * And once all extra dependencies will be available and injected, then the "start" callback will be invoked.
-     * The method does not take any parameters.
      * 
-     * @param <U> the type of the component class on which the callback is invoked on.
-     * @param callback a method reference must point to method from one of the component instance classes.
+     * @param <T> the type of the component class on which the callback is invoked on.
+     * @param callback a method reference must point to method from the component instance class(es).
      * @return this builder
      */
-    <U> B init(CbConsumer<U> callback);
+    <T> B init(Cb<T> callback);
   
     /**
-     * Sets a method reference used as the "start" callback. This method reference must point to method from one 
-     * of the component instance classes. This method is invoked as part of the life cycle management of the component implementation. 
+     * Sets a reference to a component implementation class "start" callback method. 
+     * This method does not take any arguments and is 
+     * invoked as part of the life cycle management of the component implementation.
      * 
-     * @param <U> the type of the component class on which the callback is invoked on.
+     * @param <T> the type of the component class on which the callback is invoked on.
      * @param callback  a method reference must point to method from one of the component instance classes.
      * @return this builder.
      */
-    <U> B start(CbConsumer<U> callback);
+    <T> B start(Cb<T> callback);
    
     /**
-     * Sets a method reference used as the "stop" callback. This method reference must point to method from one 
-     * of the component instance classes. This method is invoked as part of the life cycle management of the component implementation. 
+     * Sets a reference to a component implementation class "stop" callback method. 
+     * This method does not take any arguments and is 
+     * invoked as part of the life cycle management of the component implementation.
      * 
-     * @param <U> the type of the component class on which the callback is invoked on.
+     * @param <T> the type of the component class on which the callback is invoked on.
      * @param callback  a method reference must point to method from one of the component instance classes.
      * @return this builder.
      */
-    <U> B stop(CbConsumer<U> callback);
+    <T> B stop(Cb<T> callback);
   
     /**
-     * Sets a method reference used as the "destroy" callback. This method reference must point to method from one 
-     * of the component instance classes. This method is invoked as part of the life cycle management of the component implementation. 
+     * Sets a reference to a component implementation class "destroy" callback method. 
+     * This method does not take any arguments and is 
+     * invoked as part of the life cycle management of the component implementation.
      * 
-     * @param <U> the type of the component class on which the callback is invoked on.
+     * @param <T> the type of the component class on which the callback is invoked on.
      * @param callback  a method reference must point to method from one of the component instance classes.
      * @return this builder.
      */
-    <U> B destroy(CbConsumer<U> callback);
+    <T> B destroy(Cb<T> callback);
 
     /**
-     * Sets a method reference used as the "init" callback. This method reference must point to method from one 
-     * of the component instance classes. It is invoked as part of the life cycle management of the component implementation. 
+     * Sets a reference to a component implementation class "init" callback method. 
+     * This method takes a Component argument and is  
+     * invoked as part of the life cycle management of the component implementation. 
      * This method is useful because when it is invoked, all required dependencies defines in the Activator
      * are already injected, and you can then add more extra dependencies from the init() method.
      * And once all extra dependencies will be available and injected, then the "start" callback will be invoked.
-     * The method takes as argument a Component parameter.
      * 
-     * @param <U> the type of the component class on which the callback is invoked on.
+     * @param <T> the type of the component class on which the callback is invoked on.
      * @param callback a method reference must point to method from one of the component instance classes. The method takes as argument a Component parameter.
      * @return this builder
      */
-    <U> B init(CbTypeComponent<U> callback);
+    <T> B init(CbComponent<T> callback);
     
     /**
-     * Sets a method reference used as the "start" callback. This method reference must point to method from one 
-     * of the component instance classes. This method is invoked as part of the life cycle management of the component implementation. 
-     * The method takes as argument a Component parameter.
+     * Sets a reference to a component implementation class "start" callback method. 
+     * This method takes a Component argument and is  
+     * invoked as part of the life cycle management of the component implementation.
      * 
-     * @param <U> the type of the component class on which the callback is invoked on.
+     * @param <T> the type of the component class on which the callback is invoked on.
      * @param callback a method reference must point to method from one of the component instance classes. The method takes as argument a Component parameter.
      * @return this builder.
      */
-    <U> B start(CbTypeComponent<U> callback);
+    <T> B start(CbComponent<T> callback);
   
     /**
-     * Sets a method reference used as the "stop" callback. This method reference must point to method from one 
-     * of the component instance classes. This method is invoked as part of the life cycle management of the component implementation. 
-     * The method takes as argument a Component parameter.
+     * Sets a reference to a component implementation class "stop" callback method. 
+     * This method takes a Component argument and is  
+     * invoked as part of the life cycle management of the component implementation.
      * 
-     * @param <U> the type of the component class on which the callback is invoked on.
+     * @param <T> the type of the component class on which the callback is invoked on.
      * @param callback a method reference must point to method from one of the component instance classes. The method takes as argument a Component parameter.
      * @return this builder.
      */
-    <U> B stop(CbTypeComponent<U> callback);
+    <T> B stop(CbComponent<T> callback);
   
     /**
-     * Sets a method reference used as the "destroy" callback. This method reference must point to method from one 
-     * of the component instance classes. This method is invoked as part of the life cycle management of the component implementation. 
-     * The method takes as argument a Component parameter.
+     * Sets a reference to a component implementation class "destroy" callback method. 
+     * This method takes a Component argument and is  
+     * invoked as part of the life cycle management of the component implementation.
      * 
-     * @param <U> the type of the component class on which the callback is invoked on.
+     * @param <T> the type of the component class on which the callback is invoked on.
      * @param callback a method reference must point to method from one of the component instance classes. The method takes as argument a Component parameter.
      * @return this builder.
      */
-    <U> B destroy(CbTypeComponent<U> callback);
+    <T> B destroy(CbComponent<T> callback);
 
     /**
      * Sets an Object instance method reference used as the "init" callback. It is invoked as part of the life cycle management of the component 
@@ -637,7 +586,7 @@
      * @param callback an Object instance method reference. The method does not take any parameters.
      * @return this builder
      */
-    B initInstance(Runnable callback);
+    B initInstance(InstanceCb callback);
  
     /**
      * Sets an Object instance method reference used as the "start" callback. This method reference must point to method from one 
@@ -647,7 +596,7 @@
      * @param callback an Object instance method reference. The method does not take any parameters.
      * @return this builder.
      */
-    B startInstance(Runnable callback);
+    B startInstance(InstanceCb callback);
   
     /**
      * Sets an Object instance method reference used as the "stop" callback. It is invoked as part of the life cycle management of the component 
@@ -660,7 +609,7 @@
      * @param callback an Object instance method reference. The method does not take any parameters.
      * @return this builder
      */
-    B stopInstance(Runnable callback);
+    B stopInstance(InstanceCb callback);
   
     /**
      * Sets an Object instance method reference used as the "destroy" callback. It is invoked as part of the life cycle management of the component 
@@ -673,7 +622,7 @@
      * @param callback an Object instance method reference. The method does not take any parameters.
      * @return this builder
      */
-    B destroyInstance(Runnable callback);
+    B destroyInstance(InstanceCb callback);
 
     /**
      * Sets an Object instance method reference used as the "init" callback. It is invoked as part of the life cycle management of the component 
@@ -683,10 +632,10 @@
      * And once all extra dependencies will be available and injected, then the "start" callback will be invoked.
      * The method takes as argument a Component parameter.
      * 
-     * @param callback an Object instance method reference.
+     * @param callback an Object instance method reference. The method takes as argument a Component parameter.
      * @return this builder
      */
-    B initInstance(CbComponent callback);
+    B initInstance(InstanceCbComponent callback);
    
     /**
      * Sets an Object instance method reference used as the "start" callback. This method reference must point to method from one 
@@ -696,7 +645,7 @@
      * @param callback an Object instance method reference. The method takes as argument a Component parameter.
      * @return this builder.
      */
-    B startInstance(CbComponent callback);
+    B startInstance(InstanceCbComponent callback);
     
     /**
      * Sets an Object instance method reference used as the "stop" callback. This method reference must point to method from one 
@@ -706,7 +655,7 @@
      * @param callback an Object instance method reference. The method takes as argument a Component parameter.
      * @return this builder.
      */
-    B stopInstance(CbComponent callback);
+    B stopInstance(InstanceCbComponent callback);
   
     /**
      * Sets an Object instance method reference used as the "destroy" callback. This method reference must point to method from one 
@@ -716,7 +665,7 @@
      * @param callback an Object instance method reference. The method takes as argument a Component parameter.
      * @return this builder.
      */
-    B destroyInstance(CbComponent callback);
+    B destroyInstance(InstanceCbComponent callback);
 
     /**
      * Configures OSGi object (BundleContext, Component, etc ...) that will be injected in any field having the same OSGi object type.
@@ -753,7 +702,7 @@
     /**
      * Sets the method to invoke on the service implementation to get back all
      * instances that are part of a composition and need dependencies injected.
-     * All of them will be searched for any of the dependencies. The method that
+     * All of them will be searched to inject any of the dependencies. The method that
      * is invoked must return an <code>Object[]</code>.
      * 
      * @param getCompositionMethod the method to invoke
@@ -764,7 +713,7 @@
     /**
      * Sets the instance and method to invoke to get back all instances that
      * are part of a composition and need dependencies injected. All of them
-     * will be searched for any of the dependencies. The method that is
+     * will be searched to inject any of the dependencies. The method that is
      * invoked must return an <code>Object[]</code>.
      * 
      * @param instance the instance that has the method
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ConfigurationDependencyBuilder.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ConfigurationDependencyBuilder.java
index c91a7fd..60a3537 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ConfigurationDependencyBuilder.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ConfigurationDependencyBuilder.java
@@ -1,24 +1,128 @@
 package org.apache.felix.dm.lambda;
 
+import java.util.Collection;
+import java.util.Dictionary;
+import java.util.Map;
+
 import org.apache.felix.dm.ConfigurationDependency;
-import org.apache.felix.dm.lambda.callbacks.CbComponentDictionary;
+import org.apache.felix.dm.lambda.callbacks.CbConfiguration;
+import org.apache.felix.dm.lambda.callbacks.CbConfigurationComponent;
 import org.apache.felix.dm.lambda.callbacks.CbDictionary;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponentDictionary;
-import org.apache.felix.dm.lambda.callbacks.CbTypeDictionary;
+import org.apache.felix.dm.lambda.callbacks.CbDictionaryComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbConfiguration;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbConfigurationComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbDictionary;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbDictionaryComponent;
 
 /**
  * Builds a Dependency Manager Configuration Dependency.
- * By default, the updated callback is "updated", like in original DM API.
+ * Two families of callbacks are supported: <p>
  * 
- * <p> Code example with a component that defines a Configuration Dependency. the ServiceImpl modified method
- * callback is declared using a method reference (see the "cb(ServiceImpl::modified)" code):
+ * <ul> 
+ * <li>reflection based callbacks: you specify a callback method name
+ * <li>method reference callbacks: you specify a java8 method reference
+ * </ul>
+ * 
+ * <p> Callbacks may accept a Dictionary, a Component, or a user defined configuration type interface.
+ * 
+ * If you only specify a pid, by default the callback method name is assumed to be "updated".
+ * 
+ * <p> Configuration types are a new feature that allows you to specify an interface that is implemented 
+ * by DM and such interface is then injected to your callback instead of the actual Dictionary.
+ * Using such configuration interface provides a way for creating type-safe configurations from a actual {@link Dictionary} that is
+ * normally injected by Dependency Manager.
+ * The callback accepts in argument an interface that you have to provide, and DM will inject a proxy that converts
+ * method calls from your configuration-type to lookups in the actual map or dictionary. The results of these lookups are then
+ * converted to the expected return type of the invoked configuration method.<br>
+ * As proxies are injected, no implementations of the desired configuration-type are necessary!
+ * </p>
+ * <p>
+ * The lookups performed are based on the name of the method called on the configuration type. The method names are
+ * "mangled" to the following form: <tt>[lower case letter] [any valid character]*</tt>. Method names starting with
+ * <tt>get</tt> or <tt>is</tt> (JavaBean convention) are stripped from these prefixes. For example: given a dictionary
+ * with the key <tt>"foo"</tt> can be accessed from a configuration-type using the following method names:
+ * <tt>foo()</tt>, <tt>getFoo()</tt> and <tt>isFoo()</tt>.
+ * </p>
+ * <p>
+ * The return values supported are: primitive types (or their object wrappers), strings, enums, arrays of
+ * primitives/strings, {@link Collection} types, {@link Map} types, {@link Class}es and interfaces. When an interface is
+ * returned, it is treated equally to a configuration type, that is, it is returned as a proxy.
+ * </p>
+ * <p>
+ * Arrays can be represented either as comma-separated values, optionally enclosed in square brackets. For example:
+ * <tt>[ a, b, c ]</tt> and <tt>a, b,c</tt> are both considered an array of length 3 with the values "a", "b" and "c".
+ * Alternatively, you can append the array index to the key in the dictionary to obtain the same: a dictionary with
+ * "arr.0" =&gt; "a", "arr.1" =&gt; "b", "arr.2" =&gt; "c" would result in the same array as the earlier examples.
+ * </p>
+ * <p>
+ * Maps can be represented as single string values similarly as arrays, each value consisting of both the key and value
+ * separated by a dot. Optionally, the value can be enclosed in curly brackets. Similar to array, you can use the same
+ * dot notation using the keys. For example, a dictionary with 
+ * 
+ * <pre>{@code "map" => "{key1.value1, key2.value2}"}</pre> 
+ * 
+ * and a dictionary with <p>
+ * 
+ * <pre>{@code "map.key1" => "value1", "map2.key2" => "value2"}</pre> 
+ * 
+ * result in the same map being returned.
+ * Instead of a map, you could also define an interface with the methods <tt>getKey1()</tt> and <tt>getKey2</tt> and use
+ * that interface as return type instead of a {@link Map}.
+ * </p>
+ * <p>
+ * In case a lookup does not yield a value from the underlying map or dictionary, the following rules are applied:
+ * <ol>
+ * <li>primitive types yield their default value, as defined by the Java Specification;
+ * <li>string, {@link Class}es and enum values yield <code>null</code>;
+ * <li>for arrays, collections and maps, an empty array/collection/map is returned;
+ * <li>for other interface types that are treated as configuration type a null-object is returned.
+ * </ol>
+ * </p>
+ * 
+ * <b> Sample codes: </b>
+ * 
+ * <p> Code example with a component that defines a Configuration Dependency using a specific callback method reference,
+ * and the method accepts in argument a configuration type (the pid is assumed to be the fqdn of the configuration type):
  * 
  * <pre> {@code
  * public class Activator extends DependencyManagerActivator {
- *     public void activate() throws Exception { 
+ *     public void init(BundleContext ctx, DependencyManager dm) throws Exception { 
  *         component(comp -> comp
  *           .impl(ServiceImpl.class)
- *           .withConf(conf -> conf.pid(ServiceConsumer.class).cb(ServiceImpl::modified)));  
+ *           .withConf(conf -> conf.update(MyConfig.class, ServiceImpl::modified)));  
+ *    }
+ * }
+ * }</pre>
+ * 
+ * <p> Code example with a component that defines a Configuration Dependency using a specific callback method reference
+ * which accepts a Dictionary in argument:
+ * 
+ * <pre> {@code
+ * public class Activator extends DependencyManagerActivator {
+ *     public void init(BundleContext ctx, DependencyManager dm) throws Exception { 
+ *         component(comp -> comp
+ *           .impl(ServiceImpl.class)
+ *           .withConf(conf -> conf.pid("my.pid").update(ServiceImpl::modified)));
+ *    }
+ * }
+ * }</pre>
+ * 
+ * <p> Code example which defines a configuration dependency injected in the "ServiceImpl.updated(Dictionary)" callback:
+ * 
+ * <pre> {@code
+ * public class Activator extends DependencyManagerActivator {
+ *     public void init(BundleContext ctx, DependencyManager dm) throws Exception { 
+ *         component(comp -> comp.impl(ServiceImpl.class).withConf("my.pid"));
+ *    }
+ * }
+ * }</pre>
+ * 
+ * <p> Code example with a component that defines a Configuration Dependency using a specific callback method name:
+ * 
+ * <pre> {@code
+ * public class Activator extends DependencyManagerActivator {
+ *     public void init(BundleContext ctx, DependencyManager dm) throws Exception { 
+ *         component(comp -> comp.impl(ServiceImpl.class).withConf(conf -> conf.pid("my.pid").update("modified")));  
  *    }
  * }
  * }</pre>
@@ -29,21 +133,13 @@
     /**
      * Sets the pid for this configuration dependency.
      * 
-     * @param pid the configuration dependendency pid.
+     * @param pid the configuration dependency pid.
      * @return this builder
      */
     ConfigurationDependencyBuilder pid(String pid);
     
     /**
-     * Sets the class which fqdn represents the pid for this configuration dependency. Usually, this class can optionally be annotated with metatypes bnd annotations.
-     * 
-     * @param pidClass the class which fqdn represents the pid for this configuration dependency.
-     * @return this builder
-     */
-    ConfigurationDependencyBuilder pid(Class<?> pidClass);
-    
-    /**
-     * Sets propagation of the configuration properties to the service properties (false by default). 
+     * Sets propagation of the configuration to the service properties (false by default). 
      * All public configuration properties (not starting with a dot) will be propagated to the component service properties.
      * 
      * @return this builder
@@ -57,73 +153,146 @@
      * @return this builder
      */
     ConfigurationDependencyBuilder propagate(boolean propagate);
-    
+        
     /**
-     * Configures whether or not the component instance should be instantiated at the time the updated callback is invoked. 
-     * By default, when the callback is applied on an external object instance, the component is not instantiated, but in this case
-     * you can force the creation of the component instances by calling this method.
-     * 
-     * @param needsInstance true if the component instance should be instantiated at the time the updated callback is invoked on an external object instance.
+     * Sets a callback method to call on the component implementation class(es) when the configuration is updated. When the configuration is lost, the callback is invoked
+     * with a null dictionary. The following callback signatures are supported and searched in the following order:
+     * <ol>
+     * <li>method(Dictionary)</li>
+     * <li>method(Component, Dictionary)</li>
+     * </ol>
+     *
+     * @param updateMethod the name of the callback
      * @return this builder
      */
-    ConfigurationDependencyBuilder needsInstance(boolean needsInstance);
+    ConfigurationDependencyBuilder update(String updateMethod);
     
     /**
-     * Sets a <code>callback</code> to call on the component instance(s) when the configuration is updated.
+     * Sets a callback method to call on the component implementation class(es) when the configuration is updated. The callback is invoked with a configuration type
+     * argument (null if the configuration is lost).
      * 
+     * @param configType the type of a configuration that is passed as argument to the callback
      * @param updateMethod the callback to call on the component instance(s) when the configuration is updated.
      * @return this builder
      */
-    ConfigurationDependencyBuilder cb(String updateMethod);
+    ConfigurationDependencyBuilder update(Class<?> configType, String updateMethod);
     
     /**
-     * Sets a <code>callback instance</code> to call on a given object instance when the configuration is updated.
-     * When the updated method is invoked, the Component implementation has not yet been instantiated, unless you have called
-     * the @link {@link #needsInstance(boolean)} method with "true".
+     * Sets a callback method to call on a given Object instance when the configuration is updated.  
+     * When the updated method is invoked, the Component implementation is not yet instantiated. This method
+     * can be typically used by a Factory object which needs the configuration before it can create the actual 
+     * component implementation instance(s).
+     * 
+     * When the configuration is lost, the callback is invoked with a null dictionary, and the following signatures are supported:
+     * <ol>
+     * <li>method(Dictionary)</li>
+     * <li>method(Component, Dictionary)</li>
+     * </ol>
      * 
      * @param callbackInstance the object instance on which the updatedMethod is invoked
      * @param updateMethod the callback to call on the callbackInstance when the configuration is updated.
      * @return this builder
      */
-    ConfigurationDependencyBuilder cbi(Object callbackInstance, String updateMethod);
+    ConfigurationDependencyBuilder update(Object callbackInstance, String updateMethod);
 
     /**
-     * Sets a <code>callback</code> method reference used to invoke an update method. The method reference must point to a method from one of the component
-     * implementation classes, and is invoked when the configuration is updated.
-     *
-     * @param <T> the type of the component implementation class on which the callback is invoked on.
-     * @param callback the callback method reference which must point to a method from one of the component implementation classes. The method
-     * takes as argument a Dictionary.
+     * Sets a callback method to call on a given Object instance when the configuration is updated. 
+     * When the updated method is invoked, the Component implementation is not yet instantiated. This method
+     * can be typically used by a Factory object which needs the configuration before it can create the actual 
+     * component implementation instance(s).
+     * The callback is invoked with a configuration type argument (null of the configuration is lost).
+     * 
+     * @param configType the type of a configuration that is passed as argument to the callback
+     * @param callbackInstance the object instance on which the updatedMethod is invoked
+     * @param updateMethod the callback to call on the callbackInstance when the configuration is updated.
      * @return this builder
      */
-    <T> ConfigurationDependencyBuilder cb(CbTypeDictionary<T> callback);
+    ConfigurationDependencyBuilder update(Class<?> configType, Object callbackInstance, String updateMethod);
+
+    /**
+     * Sets a reference to a "callback(Dictionary)" method from one of the component implementation classes. 
+     * The method is invoked with a Dictionary argument (which is null if the configuration is lost).
+     *
+     * @param <T> The type of the target component implementation class on which the method is invoked
+     * @param callback a reference to a method of one of the component implementation classes.
+     * @return this builder
+     */
+    <T> ConfigurationDependencyBuilder update(CbDictionary<T> callback);
+
+    /**
+     * Sets a reference to a "callback(Dictionary, Component)" method from one of the component implementation classes. 
+     * The method is invoked with Dictionary/Component arguments. When the configuration is lost, the Dictionary argument
+     * is null.
+     *
+     * @param <T> The type of the target component implementation class on which the method is invoked
+     * @param callback a reference to a method callback defined in one of the the component implementation classes.
+     * @return this builder
+     */
+    <T> ConfigurationDependencyBuilder update(CbDictionaryComponent<T> callback);
+
+    /**
+     * Sets a reference to a "callback(Configuration)" method from one of the component implementation classes. 
+     * The method is invoked with a configuration type argument (null if the configuration is lost).
+     *
+     * @param <T> The type of the target component implementation class on which the method is invoked
+     * @param <U> the type of the configuration interface accepted by the callback method.
+     * @param configType the type of a configuration that is passed as argument to the callback
+     * @param callback the callback method reference which must point to a method from one of the component implementation classes. The method
+     * takes as argument an interface which will be implemented by a dynamic proxy that wraps the actual configuration properties.
+     * @return this builder
+     */
+    <T, U> ConfigurationDependencyBuilder update(Class<U> configType, CbConfiguration<T, U> callback);
     
     /**
-     * Sets the <code>callback</code> method reference used to invoke an update method. The method reference must point to a method from one of the 
-     * component implementation classes, and is invoked when the configuration is updated.
+     * Sets a reference to a "callback(configType, Component)" method from one of the component implementation classes. 
+     * The method is invoked with two args: configuration type, Component. The configuration type argument is null if the configuration is lost.
      *
-     * @param <T> the type of the component implementation class on which the callback is invoked on.
-     * @param callback the callback method reference used to invoke an update method on the component instance(s) when the configuration is updated.
-     * The method takes as argument a Component and a Dictionary.
+     * @param <T> The type of the target component implementation class on which the method is invoked
+     * @param <U> the type of the configuration interface accepted by the callback method.
+     * @param configType the type of a configuration that is passed as argument to the callback
+     * @param callback the reference to a method from one of the component implementation classes. The method
+     * takes as argument an interface which will be implemented by a dynamic proxy that wraps the actual configuration properties. It also
+     * takes as the second argument a Component object.
      * @return this builder
      */
-    <T> ConfigurationDependencyBuilder cb(CbTypeComponentDictionary<T> callback);
-  
+    <T, U> ConfigurationDependencyBuilder update(Class<U> configType, CbConfigurationComponent<T, U> callback);
+    
     /**
-     * Sets a <code>callback instance</code> method reference used to invoke the update method. The method reference must point to an Object instance 
-     * method which takes as argument a Dictionary.
+     * Sets a reference to a "callback(Dictionary)" method from an Object instance.
      * 
-     * @param updated a method reference that points to an Object instance method which takes as argument a Dictionary.
+     * @param callback a reference to an Object instance which takes as argument a Dictionary (null if the configuration is lost).
      * @return this builder
      */
-    ConfigurationDependencyBuilder cbi(CbDictionary updated);   
+    ConfigurationDependencyBuilder update(InstanceCbDictionary callback);
+    
+    /**
+     * Sets a reference to a "callback(Dictionary, Component)" method from an Object instance. The method accepts
+     * a Dictionary and a Component object. The passed Dictionary is null in case the configuration is lost.
+     * 
+     * @param callback a reference to method from an Object instance which takes as argument a Dictionary and a Component
+     * @return this builder
+     */
+    ConfigurationDependencyBuilder update(InstanceCbDictionaryComponent callback);
 
     /**
-     * Sets a <code>callback instance</code> method reference used to invoke the update method. The method reference must point to an Object instance method 
-     * which takes as argument a Component and a Dictionary.
-     * 
-     * @param updated a method reference that points to an Object instance method which takes as argument a Component and a Dictionary.
+     * Sets a reference to a "callback(ConfigType)" method from an Object instance. The configuration type argument is null if the configuration is lost.
+     *
+     * @param <T> the type of the configuration interface accepted by the callback method.
+     * @param configType the class of the configuration that is passed as argument to the callback
+     * @param updated a reference to an Object instance which takes as argument the given configuration type
      * @return this builder
      */
-    ConfigurationDependencyBuilder cbi(CbComponentDictionary updated);   
+    <T> ConfigurationDependencyBuilder update(Class<T> configType, InstanceCbConfiguration<T> updated);  
+    
+    /**
+     * Sets a reference to a "callback(Configuration, Component)" method from an Object instance. The method accepts
+     * a configuration type and a Component object. The configuration type argument is null if the configuration is lost.
+     *
+     * @param <T> the type of the configuration interface accepted by the callback method.
+     * @param configType the class of the configuration that is passed as argument to the callback
+     * @param updated a reference to an Object instance which takes as argument a the given configuration type, and a Component object.
+     * @return this builder
+     */
+    <T> ConfigurationDependencyBuilder update(Class<T> configType, InstanceCbConfigurationComponent<T> updated);
 }
+
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/DependencyManagerActivator.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/DependencyManagerActivator.java
index ba8b078..2c2482e 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/DependencyManagerActivator.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/DependencyManagerActivator.java
@@ -27,11 +27,11 @@
  * import org.apache.felix.dm.lambda.DependencyManagerActivator;
  *
  * public class Activator extends DependencyManagerActivator {    
- *     public void activate() throws Exception {
+ *     public void init(BundleContext ctx, DependencyManager dm) throws Exception {
  *         component(comp -> comp
  *             .provides(Service.class, property -> "value")
  *             .impl(ServiceImpl.class)            
- *             .withSrv(LogService.class, ConfigurationAdmni.class) // both services are required and injected in class fields with compatible types.           
+ *             .withSvc(LogService.class, ConfigurationAdmni.class) // both services are required and injected in class fields with compatible types.           
  *     }
  * }
  * }</pre>
@@ -42,12 +42,12 @@
  * import org.apache.felix.dm.lambda.DependencyManagerActivator;
  *
  * public class Activator extends DependencyManagerActivator {    
- *     public void activate() throws Exception {
+ *     public void init(BundleContext ctx, DependencyManager dm) throws Exception {
  *         component(comp -> comp
  *             .provides(Service.class, property -> "value")
  *             .impl(ServiceImpl.class)            
- *             .withSrv(LogService.class, log -> log.cb("setLog"))              
- *             .withSrv(ConfigurationAdmni.class, cm -> cm.cb("setConfigAdmin")))                
+ *             .withSvc(LogService.class, svc -> svc.add("setLog"))              
+ *             .withSvc(ConfigurationAdmni.class, svc -> svc.add("setConfigAdmin")))                
  *     }
  * }
  * }</pre>
@@ -58,12 +58,12 @@
  * import org.apache.felix.dm.lambda.DependencyManagerActivator;
  *
  * public class Activator extends DependencyManagerActivator {    
- *     public void activate() throws Exception {
+ *     public void init(BundleContext ctx, DependencyManager dm) throws Exception {
  *         component(comp -> comp
  *             .provides(Service.class, property -> "value")
  *             .impl(ServiceImpl.class)            
- *             .withSrv(LogService.class, log -> log.cb(ServiceImpl::setLog))              
- *             .withSrv(ConfigurationAdmni.class, cm -> cm.cb(ServiceImpl::setConfigAdmin)))                
+ *             .withSvc(LogService.class, svc -> svc.add(ServiceImpl::setLog))              
+ *             .withSvc(ConfigurationAdmni.class, svc -> svc.add(ServiceImpl::setConfigAdmin)))                
  *     }
  * }
  * }</pre>
@@ -80,7 +80,7 @@
     @Override
     public void start(BundleContext context) throws Exception {
         m_manager = new DependencyManager(context);
-        activate();
+        init(context, m_manager);
     }
 
     /**
@@ -88,21 +88,22 @@
      */
     @Override
     public void stop(BundleContext context) throws Exception {
-        deactivate();
+        destroy();
     }
 
     /**
      * Sub classes must override this method in order to build some DM components.
-     * 
+     * @param ctx the context associated to the bundle
+     * @param dm the DependencyManager assocaited to this activator
      * @throws Exception if the activation fails
      */
-    protected abstract void activate() throws Exception;
+    protected abstract void init(BundleContext ctx, DependencyManager dm) throws Exception;
 
     /**
      * Sub classes may override this method that is called when the Activator is stopped.
      * @throws Exception if the deactivation fails
      */
-    protected void deactivate() throws Exception {
+    protected void destroy() throws Exception {
     }
     
     /**
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/FactoryPidAdapterBuilder.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/FactoryPidAdapterBuilder.java
index 909109c..b5771b5 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/FactoryPidAdapterBuilder.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/FactoryPidAdapterBuilder.java
@@ -1,26 +1,56 @@
 package org.apache.felix.dm.lambda;
 
-import org.apache.felix.dm.lambda.callbacks.CbComponentDictionary;
+import org.apache.felix.dm.lambda.callbacks.CbConfiguration;
+import org.apache.felix.dm.lambda.callbacks.CbConfigurationComponent;
 import org.apache.felix.dm.lambda.callbacks.CbDictionary;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponentDictionary;
-import org.apache.felix.dm.lambda.callbacks.CbTypeDictionary;
+import org.apache.felix.dm.lambda.callbacks.CbDictionaryComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbConfiguration;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbConfigurationComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbDictionary;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbDictionaryComponent;
 
 /**
  * Builds a Dependency Manager Factory Configuration Adapter Component. For each new Config Admin factory configuration matching the factoryPid, 
  * an adapter will be created based on the adapter implementation class. The adapter will be registered with the specified interface, 
  * and with the specified adapter service properties. Depending on the propagate parameter, every public factory configuration properties 
- * (which don't start with ".") will be propagated along with the adapter service properties.  
+ * (which don't start with ".") will be propagated along with the adapter service properties.
+ * 
+ * This builded supports type safe configuration types. For a given factory configuration, you can specify an interface of your choice,
+ * and DM will implement it using a dynamic proxy that converts interface methods to lookups in the actual factory configuration dictionary. 
  * 
  * <p> Example that defines a factory configuration adapter service for the "foo.bar" factory pid:
  * 
  * <pre> {@code
  * public class Activator extends DependencyManagerActivator {
- *     public void activate() throws Exception { 
+ *     public void init(BundleContext ctx, DependencyManager dm) throws Exception { 
  *         factoryPidAdapter(adapter -> adapter
  *             .impl(DictionaryImpl.class)
- *             .factoryPid("foo.bar").cb(ServiceImpl::updated)
+ *             .factoryPid("foo.bar")
+ *             .update(ServiceImpl::updated)
  *             .propagate()
- *             .withSrv(LogService.class, log -> log.optional()));
+ *             .withSvc(LogService.class, log -> log.optional()));
+ *    }
+ * }
+ * }</pre>
+ * 
+ * <p> Example that defines a factory configuration adapter using a user defined configuration type
+ * (the pid is by default assumed to match the fqdn of the configuration type):
+ * 
+ * <pre> {@code
+ * 
+ * public interface DictionaryConfiguration {
+ *     public String getLanguage();
+ *     public List<String> getWords();
+ * }
+ * 
+ * public class Activator extends DependencyManagerActivator {
+ *     public void init(BundleContext ctx, DependencyManager dm) throws Exception { 
+ *         factoryPidAdapter(adapter -> adapter
+ *             .impl(DictionaryImpl.class)
+ *             .factoryPid("foo.bar")
+ *             .update(DictionaryConfiguration.class, ServiceImpl::updated)
+ *             .propagate()
+ *             .withSvc(LogService.class, log -> log.optional()));
  *    }
  * }
  * }</pre>
@@ -32,29 +62,25 @@
      * @return this builder
      */
     FactoryPidAdapterBuilder factoryPid(String pid);
-    
-    /**
-     * Specifies a class name which fqdn represents the factory pid. Usually, this class can optionally be annotated with metatypes bnd annotations.
-     * @param pidClass the class that acts as the factory pid
-     * @return this builder
-     */
-    FactoryPidAdapterBuilder factoryPid(Class<?> pidClass);
-    
+        
     /**
      * Specifies if the public properties (not starting with a dot) should be propagated in the adapter service properties (false by default).
+     * 
      * @return this builder.
      */
     FactoryPidAdapterBuilder propagate();
     
     /**
      * Specifies if the public properties (not starting with a dot) should be propagated in the adapter service properties (false by default).
+     * 
      * @param propagate true if the public properties should be propagated in the adapter service properties (false by default).
      * @return this builder.
      */
     FactoryPidAdapterBuilder propagate(boolean propagate);
     
     /**
-     * Specifies a callback method that will be called on the component instances when the configuration is injected
+     * Specifies a callback method that will be called on the component instances when the configuration is injected.
+     * 
      * @param updateMethod the method to call on the component instances when the configuration is available ("updated" by default).
      * The following method signatures are supported:
      * 
@@ -65,10 +91,21 @@
      * 
      * @return this builder
      */
-    FactoryPidAdapterBuilder cb(String updateMethod);
+    FactoryPidAdapterBuilder update(String updateMethod);
     
     /**
-     * Specifies a callback instance method that will be called on a given object instance when the configuration is injected
+     * Sets a callback method to call on the component implementation class(es) when the configuration is updated. 
+     * The callback is invoked with a configuration type argument.
+     * 
+     * @param configType the type of a configuration that is passed as argument to the callback
+     * @param updateMethod the callback to call on the component instance(s) when the configuration is updated.
+     * @return this builder
+     */
+    FactoryPidAdapterBuilder update(Class<?> configType, String updateMethod);
+    
+    /**
+     * Specifies a callback instance method that will be called on a given object instance when the configuration is injected.
+     * 
      * @param updateMethod the method to call on the given object instance when the configuration is available ("updated" by default).
      * The following method signatures are supported:
      * 
@@ -80,41 +117,101 @@
      * @param callbackInstance the Object instance on which the updated callback will be invoked.
      * @return this builder
      */
-    FactoryPidAdapterBuilder cb(Object callbackInstance, String updateMethod);
+    FactoryPidAdapterBuilder update(Object callbackInstance, String updateMethod);
     
     /**
-     * Specifies a callback method reference that will be called on one of the component classes when the configuration is injected.
+     * Specifies a callback instance method that will be called on a given object instance when the configuration is injected.
+     * The callback is invoked with a configuration type argument.
      * 
-     * @param <U> the type of the component implementation class on which the callback is invoked on.
+     * @param configType the type of a configuration that is passed as argument to the callback
+     * @param callbackInstance the Object instance on which the updated callback will be invoked.
+     * @param updateMethod the method to call on the given object instance when the configuration is available. The callback is invoked
+     * with a configuration type argument (matching the configType you have specified.
+     * @return this builder
+     */
+    FactoryPidAdapterBuilder update(Class<?> configType, Object callbackInstance, String updateMethod);
+    
+    /**
+     * Specifies a method reference that will be called on one of the component classes when the configuration is injected.
+     * The callback is invoked with a Dictionary argument.
+     * 
+     * @param <T> the type of the component implementation class on which the callback is invoked on.
      * @param callback the method to call on one of the component classes when the configuration is available.
      * @return this builder
      */
-    <U> FactoryPidAdapterBuilder cb(CbTypeDictionary<U> callback);
+    <T> FactoryPidAdapterBuilder update(CbDictionary<T> callback);
     
     /**
-     * Specifies a callback method reference that will be called on one of the component classes when the configuration is injected
+     * Specifies a method reference that will be called on one of the component classes when the configuration is injected.
+     * The callback is invoked with a configuration type argument.
      * 
-     * @param <U> the type of the component implementation class on which the callback is invoked on.
-     * @param callback the reference to a method on one of the component classes. The method may takes as parameter a Component and a Dictionary.
+     * @param <T> the type of the component implementation class on which the callback is invoked on.
+     * @param <U> the configuration type accepted by the callback method.
+     * @param configType the type of a configuration that is passed as argument to the callback
+     * @param callback the method to call on one of the component classes when the configuration is available.
      * @return this builder
      */
-    <U> FactoryPidAdapterBuilder cb(CbTypeComponentDictionary<U> callback);
+    <T, U> FactoryPidAdapterBuilder update(Class<U> configType, CbConfiguration<T, U> callback);
     
     /**
-     * Specifies a callback instance method reference that will be called on a given object instance when the configuration is injected
+     * Specifies a method reference that will be called on one of the component classes when the configuration is injected
+     * 
+     * @param <T> the type of the component implementation class on which the callback is invoked on.
+     * @param callback the reference to a method on one of the component classes. The method may takes as parameter a Dictionary and a Component.
+     * @return this builder
+     */
+    <T> FactoryPidAdapterBuilder update(CbDictionaryComponent<T> callback);
+    
+    /**
+     * Specifies a method reference that will be called on one of the component classes when the configuration is injected.
+     * The callback is invoked with the following arguments: a configuration type, and a Component object.
+     * 
+     * @param <T> the type of the component implementation class on which the callback is invoked on.
+     * @param <U> the configuration type accepted by the callback method.
+     * @param configType the type of a configuration that is passed as argument to the callback
+     * @param callback the reference to a method on one of the component classes. The method may takes as parameter a configuration type and a Component.
+     * @return this builder
+     */
+    <T, U> FactoryPidAdapterBuilder update(Class<U> configType, CbConfigurationComponent<T, U> callback);
+
+    /**
+     * Specifies a method reference that will be called on a given object instance when the configuration is injected
      * 
      * @param callback the method to call on a given object instance when the configuration is available. The callback takes as argument a
      * a Dictionary parameter.
      * @return this builder
      */
-    FactoryPidAdapterBuilder cbi(CbDictionary callback);
+    FactoryPidAdapterBuilder update(InstanceCbDictionary callback);
 
     /**
-     * Specifies a callback instance method reference that will be called on a given object instance when the configuration is injected.
+     * Specifies a method reference that will be called on a given object instance when the configuration is injected.
+     * The callback is invoked with a type-safe configuration type argument.
      * 
+     * @param <T> the configuration type accepted by the callback method.
+     * @param configType the type of a configuration that is passed as argument to the callback
      * @param callback the method to call on a given object instance when the configuration is available. The callback takes as argument a
-     * Dictionary parameter. 
+     * a configuration type parameter.
      * @return this builder
      */
-    FactoryPidAdapterBuilder cbi(CbComponentDictionary callback);
+    <T> FactoryPidAdapterBuilder update(Class<T> configType, InstanceCbConfiguration<T> callback);
+
+    /**
+     * Specifies a method reference that will be called on a given object instance when the configuration is injected.
+     * 
+     * @param callback the method to call on a given object instance when the configuration is available. The callback takes as argument a
+     * Dictionary, and a Component parameter. 
+     * @return this builder
+     */
+    FactoryPidAdapterBuilder update(InstanceCbDictionaryComponent callback);
+
+    /**
+     * Specifies a method reference that will be called on a given object instance when the configuration is injected.
+     * 
+     * @param <T> the configuration type accepted by the callback method.
+     * @param configType the type of a configuration that is passed as argument to the callback
+     * @param callback the method to call on a given object instance when the configuration is available. The callback takes as argument a
+     * configuration type, and a Component parameter. 
+     * @return this builder
+     */
+    <T> FactoryPidAdapterBuilder update(Class<T> configType, InstanceCbConfigurationComponent<T> callback);
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/FluentProperty.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/FluentProperty.java
index 3409ea3..d030bf3 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/FluentProperty.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/FluentProperty.java
@@ -9,7 +9,7 @@
  * 
  * <pre>{@code
  * public class Activator extends DependencyManagerActivator {
- *   public void activate() throws Exception {
+ *   public void init(BundleContext ctx, DependencyManager dm) throws Exception {
  *       component(comp -> comp.impl(MyComponentImpl.class).provides(MyService.class, foo->"bar", foo2 -> 123));
  *   }
  * } 
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/FutureDependencyBuilder.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/FutureDependencyBuilder.java
index 800e306..ef4a860 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/FutureDependencyBuilder.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/FutureDependencyBuilder.java
@@ -4,7 +4,7 @@
 
 import org.apache.felix.dm.Dependency;
 import org.apache.felix.dm.lambda.callbacks.CbFuture;
-import org.apache.felix.dm.lambda.callbacks.CbTypeFuture;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbFuture;
 
 /**
  * Defines a builder for a CompletableFuture dependency.
@@ -22,7 +22,7 @@
  * <pre>{@code
  * 
  * public class Activator extends DependencyManagerActivator {
- *   public void activate() throws Exception {    	
+ *   public void init(BundleContext ctx, DependencyManager dm) throws Exception {    	
  *      String url = "http://felix.apache.org/";
  *      CompletableFuture<String> page = CompletableFuture.supplyAsync(() -> downloadSite(url));				
  *
@@ -32,7 +32,7 @@
  *      component(comp -> comp
  *          .impl(MyComponent.class)
  *          .withService(LogService.class)
- *          .withFuture(page, result -> result.cb(MyComponent::setPage)));
+ *          .withFuture(page, result -> result.complete(MyComponent::setPage)));
  *   }
  * }
  * 
@@ -58,7 +58,15 @@
      * @param callback the callback method name to invoke on the component instances, once the CompletableFuture on which we depend has completed.
      * @return this dependency.
      */
-    FutureDependencyBuilder<F> cb(String callback);
+    FutureDependencyBuilder<F> complete(String callback);
+    
+    /**
+     * Sets the callback instance method name to invoke on a given Object instance, once the CompletableFuture has completed.
+     * @param callbackInstance the object instance on which the callback must be invoked
+     * @param callback the callback method name to invoke on Object instance, once the CompletableFuture has completed.
+     * @return this dependency.
+     */
+    FutureDependencyBuilder<F> complete(Object callbackInstance, String callback);
     
     /**
      * Sets the function to invoke when the future task has completed. The function is from one of the Component implementation classes, and it accepts the
@@ -68,7 +76,7 @@
      * @param callback the function to perform when the future task as completed. 
      * @return this dependency
      */
-    <T> FutureDependencyBuilder<F> cb(CbTypeFuture<T, ? super F> callback);
+    <T> FutureDependencyBuilder<F> complete(CbFuture<T, ? super F> callback);
     
     /**
      * Sets the function to invoke asynchronously when the future task has completed. The function is from one of the Component implementation classes, 
@@ -79,7 +87,7 @@
      * @param async true if the callback should be invoked asynchronously using the default jdk execution facility, false if not.
      * @return this dependency
      */
-    <T> FutureDependencyBuilder<F> cb(CbTypeFuture<T, ? super F> callback, boolean async);
+    <T> FutureDependencyBuilder<F> complete(CbFuture<T, ? super F> callback, boolean async);
 
     /**
      * Sets the function to invoke asynchronously when the future task has completed. The function is from one of the Component implementation classes, 
@@ -90,23 +98,15 @@
      * @param executor the executor used to schedule the callback.
      * @return this dependency
      */
-    <T> FutureDependencyBuilder<F> cb(CbTypeFuture<T, ? super F> callback, Executor executor);   
+    <T> FutureDependencyBuilder<F> complete(CbFuture<T, ? super F> callback, Executor executor);   
         
     /**
-     * Sets the callback instance method name to invoke on a given Object instance, once the CompletableFuture has completed.
-     * @param callbackInstance the object instance on which the callback must be invoked
-     * @param callback the callback method name to invoke on Object instance, once the CompletableFuture has completed.
-     * @return this dependency.
-     */
-    FutureDependencyBuilder<F> cbi(Object callbackInstance, String callback);
-    
-    /**
      * Sets the callback instance to invoke when the future task has completed. The callback is a Consumer instance which accepts the
      * result of the completed future.
      * @param callback a Consumer instance which accepts the result of the completed future.
      * @return this dependency
      */
-    FutureDependencyBuilder<F> cbi(CbFuture<? super F> callback);
+    FutureDependencyBuilder<F> complete(InstanceCbFuture<? super F> callback);
     
     /**
      * Sets the callback instance to invoke when the future task has completed. The callback is a Consumer instance which accepts the
@@ -116,7 +116,7 @@
      * @param async true if the callback should be invoked asynchronously using the default jdk execution facility, false if not.
      * @return this dependency
      */
-    FutureDependencyBuilder<F> cbi(CbFuture<? super F> callback, boolean async);
+    FutureDependencyBuilder<F> complete(InstanceCbFuture<? super F> callback, boolean async);
 
     /**
      * Sets the callback instance to invoke when the future task has completed. The callback is a Consumer instance which accepts the
@@ -125,5 +125,5 @@
      * @param executor the executor to use for asynchronous execution of the callback.
      * @return this dependency
      */
-    FutureDependencyBuilder<F> cbi(CbFuture<? super F> callback, Executor executor);   
+    FutureDependencyBuilder<F> complete(InstanceCbFuture<? super F> callback, Executor executor);   
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceAdapterBuilder.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceAdapterBuilder.java
index eef4890..95dd012 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceAdapterBuilder.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceAdapterBuilder.java
@@ -10,7 +10,7 @@
  * 
  * <pre> {@code
  * public class Activator extends DependencyManagerActivator {
- *    public void activate() throws Exception { 
+ *    public void init(BundleContext ctx, DependencyManager dm) throws Exception { 
  *        adapter(Device.class, adapt -> adapt.impl(DeviceServlet.class).provides(HttpServlet.class).properties(alias -> "/device");                    
  *    }
  * }}</pre>
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceAspectBuilder.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceAspectBuilder.java
index 160975e..d611a31 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceAspectBuilder.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceAspectBuilder.java
@@ -13,8 +13,8 @@
  * 
  * <pre>{@code
  * public class Activator extends DependencyManagerActivator {
- *    public void activate() throws Exception { 
- *       aspect(LogService.class, asp -> asp.impl(SpellCheckLogAspect.class).rank(10).withSrv(Dictionary.class));
+ *    public void init(BundleContext ctx, DependencyManager dm) throws Exception { 
+ *       aspect(LogService.class, asp -> asp.impl(SpellCheckLogAspect.class).rank(10).withSvc(Dictionary.class));
  *    }
  * }} </pre>
  *
@@ -22,10 +22,11 @@
  * 
  * <pre>{@code
  * public class Activator extends DependencyManagerActivator {
- *    public void activate() throws Exception { 
- *       aspect(LogService.class, asp -> asp.impl(SpellCheckLogAspect.class).rank(10)
- *          .cb(SpellCheckLogAspect::setLogService)
- *          .withSrv(Dictionary.class, dict -> dict.cb(SpellCheckLogAspect::setDictionary)));
+ *    public void init(BundleContext ctx, DependencyManager dm) throws Exception { 
+ *       aspect(LogService.class, asp -> asp
+ *          .impl(SpellCheckLogAspect.class).rank(10)
+ *          .add(SpellCheckLogAspect::setLogService)
+ *          .withSvc(Dictionary.class, svc -> svc.add(SpellCheckLogAspect::setDictionary)));
  *    }
  * }} </pre>
  *
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceCallbacksBuilder.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceCallbacksBuilder.java
index d6190bc..53723c2 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceCallbacksBuilder.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceCallbacksBuilder.java
@@ -1,37 +1,35 @@
 package org.apache.felix.dm.lambda;
 
-import org.apache.felix.dm.lambda.callbacks.CbComponent;
-import org.apache.felix.dm.lambda.callbacks.CbComponentRef;
-import org.apache.felix.dm.lambda.callbacks.CbComponentRefService;
-import org.apache.felix.dm.lambda.callbacks.CbComponentRefServiceRefService;
-import org.apache.felix.dm.lambda.callbacks.CbComponentService;
-import org.apache.felix.dm.lambda.callbacks.CbComponentServiceService;
-import org.apache.felix.dm.lambda.callbacks.CbRef;
-import org.apache.felix.dm.lambda.callbacks.CbRefService;
 import org.apache.felix.dm.lambda.callbacks.CbRefServiceRefService;
+import org.apache.felix.dm.lambda.callbacks.CbRefServiceRefServiceComponent;
 import org.apache.felix.dm.lambda.callbacks.CbService;
+import org.apache.felix.dm.lambda.callbacks.CbServiceComponent;
+import org.apache.felix.dm.lambda.callbacks.CbServiceComponentRef;
 import org.apache.felix.dm.lambda.callbacks.CbServiceDict;
 import org.apache.felix.dm.lambda.callbacks.CbServiceMap;
+import org.apache.felix.dm.lambda.callbacks.CbServiceRef;
 import org.apache.felix.dm.lambda.callbacks.CbServiceService;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponent;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponentRef;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponentRefService;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponentRefServiceRefService;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponentService;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponentServiceService;
-import org.apache.felix.dm.lambda.callbacks.CbTypeRef;
-import org.apache.felix.dm.lambda.callbacks.CbTypeRefService;
-import org.apache.felix.dm.lambda.callbacks.CbTypeRefServiceRefService;
-import org.apache.felix.dm.lambda.callbacks.CbTypeService;
-import org.apache.felix.dm.lambda.callbacks.CbTypeServiceDict;
-import org.apache.felix.dm.lambda.callbacks.CbTypeServiceMap;
-import org.apache.felix.dm.lambda.callbacks.CbTypeServiceService;
+import org.apache.felix.dm.lambda.callbacks.CbServiceServiceComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbRefServiceRefService;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbRefServiceRefServiceComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbService;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbServiceComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbServiceComponentRef;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbServiceDict;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbServiceMap;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbServiceRef;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbServiceService;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbServiceServiceComponent;
 
 /**
  * Builds a service dependency callback (required by default).
  * 
+ * TODO: fix javadoc for method reference (do the same as in ConfigurationDependencyBuilder: use double quotes ...
+ * 
  * A Service may be injected in a bind-method of a component or an object instance using this builder.
- * The builder supports the following kind of method signatures for bind methods:
+ * The builder supports reflection based callbacks (same as with the original DM API), as well as java8 method reference based callbacks.
+ * 
+ * <p> <b> List of signatures supported using reflection based callbacks (same as original DM API): </b>
  * 
  * <pre> {@code
  * method(S service)
@@ -48,26 +46,29 @@
  * swapMethod(Component component, S oldService, S newService)
  * swapMethod(Component component, ServiceReference<S> oldRef, S old, ServiceReference<S> newRef, S newService)
  * }</pre>
- *
- * The following families of callbacks are supported:
  * 
- * <ul>
- * <li> "cb(String ... callback)": stands for "callback" and specifies a list of callbacks from the component instances. When using one arg, it stands for the "add" callback. 
- * When using two args, it stands for "add/remove" callbacks. When using three args, it stands for "add/change/remove" callbacks. When using four args, it stands for "add/change/remove/swap" callbacks. 
- * <li> "cbi(Object callbackInstance, String ... callbacks)": stands for "callback instance" and specifies some callbacks on a given object instance.
- * <li> "cb(lambda) ": stands for "callback" and specifies a method reference of a callback from a given component class.
- * <li> "cbi(lambda)": stands for "callback instance" and specifies a method reference from a given object instance.
- * <li> "sw(lambda)":  stands for "swap callback" and specifies a method reference of a swap callback from a given component class.
- * <li> "swi(lambda)": stands for "swap callback instance" and specifies a method reference of a swap callback from a given object instance.
- * </ul>
+ * <b> List of signatures supported using java 8 method references: </b>
  *
+ * <pre> {@code
+ * method(S service)
+ * method(S service, ServiceReference<S> serviceRef),
+ * method(S service, Map<String, Object> serviceProperties)
+ * method(S service, Dictionary<String, Object> serviceProperties)
+ * method(S service, Component serviceComponent)
+ * method(S service, Component serviceComponent, ServiceReference<S> serviceRef)
+ * swapMethod(S oldService, S newService)
+ * swapMethod(S oldService, S newService, Component component))
+ * swapMethod(ServiceReference<S> oldRef, S old, ServiceReference<S> newRef, S newService)
+ * swapMethod(ServiceReference<S> oldRef, S old, ServiceReference<S> newRef, S newService, Component component)
+ * }</pre>
+ * 
  * <p> Here is an example of a Component that defines a dependency of a LogService which is injected in the "bindLogService" method using a ServiceCallbacksBuilder:
- * The withSrv(...)" declaration defines a method reference on the "ComponentImpl::bindLogService" method (using a lambda):
+ * The withSvc(...)" declaration defines a method reference on the "ComponentImpl::bindLogService" method (using a lambda):
  * 
  * <pre> {@code
  * public class Activator extends DependencyManagerActivator {
- *    public void activate() throws Exception { 
- *       component(comp -> comp.impl(ComponentImpl.class).withSrv(LogService.class, log -> log.cb(ComponentImpl::bindLogService)));
+ *    public void init(BundleContext ctx, DependencyManager dm) throws Exception { 
+ *       component(comp -> comp.impl(ComponentImpl.class).withSvc(LogService.class, log -> log.add(ComponentImpl::bindLogService)));
  *    }
  * }}</pre>
  *
@@ -75,9 +76,9 @@
  * 
  * <pre> {@code
  * public class Activator extends DependencyManagerActivator {
- *    public void activate() throws Exception {
+ *    public void init(BundleContext ctx, DependencyManager dm) throws Exception {
  *       ComponentImpl impl = new ComponentImpl();
- *       component(comp -> comp.impl(impl).withSrv(LogService.class, log -> log.cbi(impl::bindLogService)));
+ *       component(comp -> comp.impl(impl).withSvc(LogService.class, log -> log.add(impl::bindLogService)));
  *    }
  * }}</pre>
  * 
@@ -85,8 +86,8 @@
  * 
  * <pre> {@code
  * public class Activator extends DependencyManagerActivator {
- *    public void activate() throws Exception {
- *       component(comp -> comp.impl(ComponentImpl::class).withSrv(LogService.class, log -> log.cb("bindLogService")));
+ *    public void init(BundleContext ctx, DependencyManager dm) throws Exception {
+ *       component(comp -> comp.impl(ComponentImpl::class).withSvc(LogService.class, log -> log.add("bindLogService")));
  *    }
  * }}</pre>
  *
@@ -94,9 +95,9 @@
  * 
  * <pre> {@code
  * public class Activator extends DependencyManagerActivator {
- *    public void activate() throws Exception {
+ *    public void init(BundleContext ctx, DependencyManager dm) throws Exception {
  *       ComponentImpl impl = new ComponentImpl();
- *       component(comp -> comp.impl(impl).withSrv(LogService.class, log -> log.cbi(impl, "bindLogService")));
+ *       component(comp -> comp.impl(impl).withSvc(LogService.class, log -> log.callbackInstance(impl).add("bindLogService")));
  *    }
  * }}</pre>
  *
@@ -106,12 +107,18 @@
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public interface ServiceCallbacksBuilder<S, B extends ServiceCallbacksBuilder<S, B>> {
+    
     /**
-     * Sets <code>callback</code> methods to invoke on the component instance(s). When a service matches the service 
-     * filter, then the service is injected using the specified callback methods. When you specify one callback, it stands for the "add" callback.
-     * When you specify two callbacks, the first one corresponds to the "add" callback, and the second one to the "remove" callback. When you specify three
-     * callbacks, the first one stands for the "add" callback, the second one for the "change" callback, and the third one for the "remove" callback.
-     * When you specify four callbacks, it stands for "add"/"change"/"remove"/swap callbacks.
+     * Sets the callback instance used for reflection based callbacks.
+     * @param callbackInstance the object on which reflection based callbacks are invoked on.
+     * @return this builder
+     */
+    B callbackInstance(Object callbackInstance);
+    
+    /**
+     * Sets <code>callback</code> methods to invoke when a service is added. When a service matches the service 
+     * filter, then the service is injected using the specified callback method. The callback is invoked on the component instances, or on the callback
+     * instance, is specified using the {@link #callbackInstance(Object)} method.
      * 
      * The following method signature are supported:
      * <pre>{@code
@@ -124,676 +131,496 @@
      * method(Component serviceComponent, ServiceReference<S> serviceRef)
      * method(Component serviceComponent, S service) 
      * method(Component serviceComponent, ServiceReference<S> serviceRef, S service)
+     * }</pre>
+     * 
+     * @param callback the add callback
+     * @return this builder
+     * @see #callbackInstance(Object)
+     */
+    B add(String callback);
+    
+    /**
+     * Sets <code>callback</code> methods to invoke when a service is changed. When a changed service matches the service 
+     * filter, then the service is injected using the specified callback method. The callback is invoked on the component instances, or on the callback
+     * instance, is specified using the {@link #callbackInstance(Object)} method.
+     * 
+     * The following method signature are supported:
+     * <pre>{@code
+     * method(S service)
+     * method(S service, Map<String, Object> serviceProperties)
+     * method(S service, Dictionary<String, Object> serviceProperties)
+     * method(ServiceReference<S> serviceRef, S service),
+     * method(ServiceReference<S> serviceRef)
+     * method(Component serviceComponent)
+     * method(Component serviceComponent, ServiceReference<S> serviceRef)
+     * method(Component serviceComponent, S service) 
+     * method(Component serviceComponent, ServiceReference<S> serviceRef, S service)
+     * }</pre>
+     * 
+     * @param callback the change callback
+     * @return this builder
+     * @see #callbackInstance(Object)
+     */
+    B change(String callback);
+
+    /**
+     * Sets <code>callback</code> methods to invoke when a service is removed. When a removed service matches the service 
+     * filter, then the specified callback in invoked with the removed service. The callback is invoked on the component instances, or on the callback
+     * instance, is specified using the {@link #callbackInstance(Object)} method.
+     * 
+     * The following method signature are supported:
+     * <pre>{@code
+     * method(S service)
+     * method(S service, Map<String, Object> serviceProperties)
+     * method(S service, Dictionary<String, Object> serviceProperties)
+     * method(ServiceReference<S> serviceRef, S service),
+     * method(ServiceReference<S> serviceRef)
+     * method(Component serviceComponent)
+     * method(Component serviceComponent, ServiceReference<S> serviceRef)
+     * method(Component serviceComponent, S service) 
+     * method(Component serviceComponent, ServiceReference<S> serviceRef, S service)
+     * }</pre>
+     * 
+     * @param callback the remove callback
+     * @return this builder
+     * @see #callbackInstance(Object)
+     */
+    B remove(String callback);
+    
+    /**
+     * Sets <code>callback</code> methods to invoke when a service is swapped. The callback is invoked on the component instances, or on the callback
+     * instance, is specified using the {@link #callbackInstance(Object)} method.
+     * 
+     * The following method signature are supported:
+     * <pre>{@code
      * swapMethod(S oldService, S newService)
      * swapMethod(ServiceReference<S> oldRef, S old, ServiceReference<S> newRef, S newService)
      * swapMethod(Component component, S oldService, S newService)
      * swapMethod(Component component, ServiceReference<S> oldRef, S old, ServiceReference<S> newRef, S newService)
      * }</pre>
      * 
-     * @param callbacks a list of callbacks (1 param: "add", 2 params: "add"/remove", 3 params: "add"/"change"/"remove", 4 params: "add"/"change"/"remove"/"swap" callbacks).
+     * @param callback the remove callback
      * @return this builder
+     * @see #callbackInstance(Object)
      */
-    B cb(String ... callbacks);
+    B swap(String callback);
     
     /**
-     * Sets <code>callback instance</code> methods to invoke on a given Object instance. When a service matches the service 
-     * filter, then the service is injected using the specified callback methods. When you specify one callback, it stands for the "add" callback.
-     * When you specify two callbacks, the first one corresponds to the "add" callback, and the second one to the "remove" callback. When you specify three
-     * callbacks, the first one stands for the "add" callback, the second one for the "change" callback, and the third one for the "remove" callback.
-     * 
-     * @param callbackInstance the object on which the callback is invoked.
-     * @param callbacks a list of callbacks (1 param : "add", 2 params : "add"/remove", 3 params : "add"/"change"/"remove", 4 params : "add"/"change"/"remove"/"swap" callbacks).
-     * @see #cb(String...)
-     * @return this builder
-     */
-    B cbi(Object callbackInstance, String ... callbacks);
-
-    /**
-     * Sets a <code>callback</code> invoked when a service is added.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the service.
+     * Sets a <code>component instance callback(Service)</code> callback. The callback is invoked when a service is added.
+     * The method reference must point to a Component implementation class method.
      * 
      * @param <T> the type of the component instance class on which the callback is invoked.
      * @param add the method reference invoked when a service is added.
      * @return this builder
      */
-    <T> B cb(CbTypeService<T, S> add);
+    <T> B add(CbService<T, S> add);
     
     /**
-     * Sets a <code>callback</code> invoked when a service is added or removed.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the service.
+     * Sets a <code>component instance callback(Service)</code> callback. The callback is invoked when a service is changed.
+     * The method reference must point to a Component implementation class method. 
      * 
      * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
+     * @param change the method reference invoked when a service is changed.
+     * @return this builder
+     */
+    <T> B change(CbService<T, S> change);
+    
+    /**
+     * Sets a <code>component instance callback(Service)</code> callback. The callback is invoked when a service is removed.
+     * The method reference must point to a Component implementation class method. 
+     * 
+     * @param <T> the type of the component instance class on which the callback is invoked.
      * @param remove the method reference invoked when a service is removed.
      * @return this builder
      */
-    <T> B cb(CbTypeService<T, S> add, CbTypeService<T, S> remove);
+    <T> B remove(CbService<T, S> remove);
   
     /**
-     * Sets a <code>callback</code> invoked when a service is added, changed, or removed.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the service.
+     * Sets a {@code component instance callback(Service, Map<String, Object>)} callback. The callback is  invoked when a service is added.
+     * The method reference must point to a Component implementation class method. 
      * 
      * @param <T> the type of the component instance class on which the callback is invoked.
      * @param add the method reference invoked when a service is added.
+     * @return this builder
+     */
+    <T> B add(CbServiceMap<T, S> add);
+    
+    /**
+     * Sets a {@code component instance callback(Service, Map<String, Object>)} callback. The callback is  invoked when a service is changed.
+     * The method reference must point to a Component implementation class method. 
+     * 
+     * @param <T> the type of the component instance class on which the callback is invoked.
      * @param change the method reference invoked when a service is changed.
-     * @param remove the method reference invoked when a service is removed.
      * @return this builder
      */
-    <T> B cb(CbTypeService<T, S> add, CbTypeService<T, S> change, CbTypeService<T, S> remove);
-    
-    /**
-     * Sets a <code>callback</code> invoked when a service is added.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the service, and a properties map.
-     * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
-     * @return this builder
-     */
-    <T> B cb(CbTypeServiceMap<T, S> add);
-    
-    /**
-     * Sets a <code>callback</code> invoked when a service is added or removed.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the service, and a properties map.
-     * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    <T> B cb(CbTypeServiceMap<T, S> add, CbTypeServiceMap<T, S> remove);
-    
-    /**
-     * Sets a <code>callback</code> invoked when a service is added, changed, or removed.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the service, and a properties map.
-     * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
-     * @param change the method reference invoked when a service is changed.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    <T> B cb(CbTypeServiceMap<T, S> add, CbTypeServiceMap<T, S> change, CbTypeServiceMap<T, S> remove);
+    <T> B change(CbServiceMap<T, S> change);
   
     /**
-     * Sets a <code>callback</code> invoked when a service is added.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the service, and a properties dictionary.
+     * Sets a {@code component instance callback(Service, Map<String, Object></code>)} callback. The callback is  invoked when a service is removed.
+     * The method reference must point to a Component implementation class method. 
      * 
      * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
-     * @return this builder
-     */
-    <T> B cb(CbTypeServiceDict<T, S> add);
-    
-    /**
-     * Sets a <code>callback</code> invoked when a service is added or removed.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the service, and a properties dictionary.
-     * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
      * @param remove the method reference invoked when a service is removed.
      * @return this builder
      */
-    <T> B cb(CbTypeServiceDict<T, S> add, CbTypeServiceDict<T, S> remove);
+    <T> B remove(CbServiceMap<T, S> remove);
     
     /**
-     * Sets a <code>callback</code> invoked when a service is added, changed, or removed.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the service, and a properties dictionary.
+     * Sets a {@code component instance callback(Service, Dictionary<String, Object>)} callback. The callback is  invoked when a service is added.
+     * The method reference must point to a Component implementation class method. 
      * 
      * @param <T> the type of the component instance class on which the callback is invoked.
      * @param add the method reference invoked when a service is added.
+     * @return this builder
+     */
+    <T> B add(CbServiceDict<T, S> add);
+    
+    /**
+     * Sets a {@code component instance callback(Service, Dictionary<String, Object>)} callback. The callback is  invoked when a service is changed.
+     * The method reference must point to a Component implementation class method. 
+     * 
+     * @param <T> the type of the component instance class on which the callback is invoked.
      * @param change the method reference invoked when a service is changed.
-     * @param remove the method reference invoked when a service is removed.
      * @return this builder
      */
-    <T> B cb(CbTypeServiceDict<T, S> add, CbTypeServiceDict<T, S> change, CbTypeServiceDict<T, S> remove);
+    <T> B change(CbServiceDict<T, S> change);
 
     /**
-     * Sets a <code>callback</code> invoked when a service is added.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the service reference, and the service.
+     * Sets a {@code component instance callback(Service, Dictionary<String, Object>)} callback. The callback is  invoked when a service is removed.
+     * The method reference must point to a Component implementation class method. 
      * 
      * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
-     * @return this builder
-     */
-    <T> B cb(CbTypeRefService<T, S> add);
-    
-    /**
-     * Sets a <code>callback</code> invoked when a service is added or removed.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the service reference, and the service.
-     * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
      * @param remove the method reference invoked when a service is removed.
      * @return this builder
      */
-    <T> B cb(CbTypeRefService<T, S> add, CbTypeRefService<T, S> remove);
+    <T> B remove(CbServiceDict<T, S> remove);
+    
+    /**
+     * Sets a <code>component instance callback(Service, ServiceReference)</code> callback. The callback is  invoked when a service is added.
+     * The method reference must point to a Component implementation class method. 
+     * @param <T> the type of the component instance class on which the callback is invoked.
+     * @param add the method reference invoked when a service is added.
+     * @return this builder
+     */
+    <T> B add(CbServiceRef<T, S> add);
+  
+    /**
+     * Sets a <code>component instance callback(Service, ServiceReference)</code> callback. The callback is  invoked when a service is changed.
+     * The method reference must point to a Component implementation class method. 
+     * 
+     * @param <T> the type of the component instance class on which the callback is invoked.
+     * @param change the method reference invoked when a service is changed.
+     * @return this builder
+     */
+    <T> B change(CbServiceRef<T, S> change);
+
+    /**
+     * Sets a <code>component instance callback(Service, ServiceReference)</code> callback. The callback is  invoked when a service is removed.
+     * The method reference must point to a Component implementation class method. 
+     * 
+     * @param <T> the type of the component instance class on which the callback is invoked.
+     * @param remove the method reference invoked when a service is removed.
+     * @return this builder
+     */
+    <T> B remove(CbServiceRef<T, S> remove);
+      
+    /**
+     * Sets a <code>component instance callback(Service, Component)</code> callback. The callback is invoked when a service is added.
+     * The method reference must point to a Component implementation class method. 
+     * 
+     * @param <T> the type of the component instance class on which the callback is invoked.
+     * @param add the method reference invoked when a service is added.
+     * @return this builder
+     */
+    <T> B add(CbServiceComponent<T, S> add);
+
+    /**
+     * Sets a <code>component instance callback(Service, Component)</code> callback. The callback is invoked when a service is changed.
+     * The method reference must point to a Component implementation class method. 
+     * 
+     * @param <T> the type of the component instance class on which the callback is invoked.
+     * @param change the method reference invoked when a service is changed.
+     * @return this builder
+     */
+    <T> B change(CbServiceComponent<T, S> change);
+
+    /**
+     * Sets a <code>component instance callback(Service, Component)</code> callback. The callback is invoked when a service is removed.
+     * The method reference must point to a Component implementation class method. 
+     * 
+     * @param <T> the type of the component instance class on which the callback is invoked.
+     * @param remove the method reference invoked when a service is removed.
+     * @return this builder
+     */
+    <T> B remove(CbServiceComponent<T, S> remove);
+    
+    /**
+     * Sets a <code>component instance callback(Service, Component, ServiceReference ref)</code> callback. The callback is invoked when a service is added.
+     * The method reference must point to a Component implementation class method.
+     * 
+     * @param <T> the type of the component instance class on which the callback is invoked.
+     * @param add the method reference invoked when a service is added.
+     * @return this builder
+     */
+    <T> B add(CbServiceComponentRef<T, S> add);
  
     /**
-     * Sets a <code>callback</code> invoked when a service is added, changed, or removed.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the service reference, and the service.
+     * Sets a <code>component instance callback(Service, Component, ServiceReference)</code> callback. The callback is invoked when a service is changed.
+     * The method reference must point to a Component implementation class method.
      * 
      * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
      * @param change the method reference invoked when a service is changed.
-     * @param remove the method reference invoked when a service is removed.
      * @return this builder
      */
-    <T> B cb(CbTypeRefService<T, S> add, CbTypeRefService<T, S> change, CbTypeRefService<T, S> remove);
+    <T> B change(CbServiceComponentRef<T, S> change);
 
     /**
-     * Sets a <code>callback</code> invoked when a service is added.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the service reference.
+     * Sets a <code>component instance callback(Service, Component, ServiceReference)</code> callback. The callback is invoked when a service is removed.
+     * The method reference must point to a Component implementation class method.
      * 
      * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
-     * @return this builder
-     */
-    <T> B cb(CbTypeRef<T, S> add);
-  
-    /**
-     * Sets a <code>callback</code> invoked when a service is added or removed.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the service reference.
-     * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
      * @param remove the method reference invoked when a service is removed.
      * @return this builder
      */
-    <T> B cb(CbTypeRef<T, S> add, CbTypeRef<T, S> remove);
-  
-    /**
-     * Sets a <code>callback</code> invoked when a service is added, changed, or removed.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the service reference.
-     * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
-     * @param change the method reference invoked when a service is changed.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    <T> B cb(CbTypeRef<T, S> add, CbTypeRef<T, S> change, CbTypeRef<T, S> remove);
-
-    /**
-     * Sets a <code>callback</code> invoked when a service is added.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the Component.
-     * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
-     * @return this builder
-     */
-    <T> B cb(CbTypeComponent<T> add);
-  
-    /**
-     * Sets a <code>callback</code> invoked when a service is added or removed.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the Component.
-     * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    <T> B cb(CbTypeComponent<T> add, CbTypeComponent<T> remove);
-  
-    /**
-     * Sets a <code>callback</code> invoked when a service is added, changed, or removed.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the Component.
-     * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
-     * @param change the method reference invoked when a service is changed.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    <T> B cb(CbTypeComponent<T> add, CbTypeComponent<T> change, CbTypeComponent<T> remove);
-
-    /**
-     * Sets a <code>callback</code> invoked when a service is added.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the Component, and the service reference.
-     * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
-     * @return this builder
-     */
-    <T> B cb(CbTypeComponentRef<T, S> add);
-  
-    /**
-     * Sets a <code>callback</code> invoked when a service is added or removed.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the Component, and the service reference.
-     * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    <T> B cb(CbTypeComponentRef<T, S> add, CbTypeComponentRef<T, S> remove);
-  
-    /**
-     * Sets a <code>callback</code> invoked when a service is added, changed, or removed.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the Component, and the service reference.
-     * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
-     * @param change the method reference invoked when a service is changed.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    <T> B cb(CbTypeComponentRef<T, S> add, CbTypeComponentRef<T, S> change, CbTypeComponentRef<T, S> remove);
-
-    /**
-     * Sets a <code>callback</code> invoked when a service is added.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the Component, and the service.
-     * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
-     * @return this builder
-     */
-    <T> B cb(CbTypeComponentService<T, S> add);
-
-    /**
-     * Sets a <code>callback</code> invoked when a service is added or removed.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the Component, and the service.
-     * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    <T> B cb(CbTypeComponentService<T, S> add, CbTypeComponentService<T, S> remove);
+    <T> B remove(CbServiceComponentRef<T, S> remove);
     
     /**
-     * Sets a <code>callback</code> invoked when a service is added, changed, or removed.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the Component, and the service.
+     * Sets an <code>object instance callback(Service)</code> callback. The callback is invoked when a service is added.
+     * The method reference must point to a method from an Object instance. 
      * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
      * @param add the method reference invoked when a service is added.
+     * @return this builder
+     */
+    B add(InstanceCbService<S> add);
+    
+    /**
+     * Sets an <code>object instance callback(Service)</code> callback. The callback is invoked when a service is changed.
+     * The method reference must point to method from an Object instance.
+     * 
      * @param change the method reference invoked when a service is changed.
+     * @return this builder
+     */
+    B change(InstanceCbService<S> change);
+
+    /**
+     * Sets an <code>object instance callback(Service)</code> callback. The callback is invoked when a service is removed.
+     * The method reference must point to method from an Object instance. 
+     * 
      * @param remove the method reference invoked when a service is removed.
      * @return this builder
      */
-    <T> B cb(CbTypeComponentService<T, S> add, CbTypeComponentService<T, S> change, CbTypeComponentService<T, S> remove);
-
+    B remove(InstanceCbService<S> remove);
+  
     /**
-     * Sets a <code>callback</code> invoked when a service is added.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the Component, the service Reference and the service.
+     * Sets an {@code object instance callback(Service, Map<String, Object>)} callback. The callback is invoked when a service is added.
+     * The method reference must point to a method from an Object instance. 
      * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
      * @param add the method reference invoked when a service is added.
      * @return this builder
      */
-    <T> B cb(CbTypeComponentRefService<T, S> add);
+    B add(InstanceCbServiceMap<S> add);
+  
+    /**
+     * Sets an {@code object instance callback(Service, Map<String, Object>)} callback. The callback is invoked when a service is changed.
+     * The method reference must point to method from an Object instance. 
+     * 
+     * @param change the method reference invoked when a service is changed.
+     * @return this builder
+     */
+    B change(InstanceCbServiceMap<S> change);
+
+    /**
+     * Sets an {@code object instance callback(Service, Map<String, Object>)} callback. The callback is invoked when a service is removed.
+     * The method reference must point to method from an Object instance. 
+     * 
+     * @param remove the method reference invoked when a service is removed.
+     * @return this builder
+     */
+    B remove(InstanceCbServiceMap<S> remove);
+  
+    /**
+     * Sets an {@code object instance callback(Service svc, Dictionary<String, Object>} callback. The callback is invoked when a service is added.
+     * The method reference must point to a method from an Object instance. 
+     * 
+     * @param add the method reference invoked when a service is added.
+     * @return this builder
+     */
+    B add(InstanceCbServiceDict<S> add);
+   
+    /**
+     * Sets an {@code object instance callback(Service, Dictionary<String, Object>)} callback. The callback is invoked when a service is changed.
+     * The method reference must point to method from an Object instance. 
+     * 
+     * @param change the method reference invoked when a service is changed.
+     * @return this builder
+     */
+    B change(InstanceCbServiceDict<S> change);
+
+    /**
+     * Sets an {@code object instance callback(Service, Dictionary<String, Object>)} callback. The callback is invoked when a service is removed.
+     * The method reference must point to method from an Object instance.
+     * 
+     * @param remove the method reference invoked when a service is removed.
+     * @return this builder
+     */
+    B remove(InstanceCbServiceDict<S> remove);
  
     /**
-     * Sets a <code>callback</code> invoked when a service is added or removed.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the Component, the service Reference and the service.
+     * Sets an <code>object instance callback(Service, ServiceReference)</code> callback. The callback is invoked when a service is added.
+     * The method reference must point to a method from an Object instance. 
      * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
      * @param add the method reference invoked when a service is added.
-     * @param remove the method reference invoked when a service is removed.
      * @return this builder
      */
-    <T> B cb(CbTypeComponentRefService<T, S> add, CbTypeComponentRefService<T, S> remove);
-    
+    B add(InstanceCbServiceRef<S> add);
+  
     /**
-     * Sets a <code>callback</code> invoked when a service is added, changed, or removed.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the Component, the service Reference and the service.
+     * Sets an <code>object instance callback(Service, ServiceReference)</code> callback. The callback is invoked when a service is changed.
+     * The method reference must point to method from an Object instance. 
      * 
-     * @param <T> the type of the component instance class on which the callback is invoked.
-     * @param add the method reference invoked when a service is added.
      * @param change the method reference invoked when a service is changed.
-     * @param remove the method reference invoked when a service is removed.
      * @return this builder
      */
-    <T> B cb(CbTypeComponentRefService<T, S> add, CbTypeComponentRefService<T, S> change, CbTypeComponentRefService<T, S> remove);
+    B change(InstanceCbServiceRef<S> change);
 
     /**
-     * Sets a <code>swap callback(Service, Service)</code> invoked when a service is swapped.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the old service and the new replacing service.
+     * Sets an <code>object instance callback(Service, ServiceReference)</code> callback. The callback is invoked when a service is removed.
+     * The method reference must point to method from an Object instance. 
+     * 
+     * @param remove the method reference invoked when a service is removed.
+     * @return this builder
+     */
+    B remove(InstanceCbServiceRef<S> remove);
+    
+    /**
+     * Sets an <code>object instance callback(Service, Component)</code> callback invoked. The callback is when a service is added.
+     * The method reference must point to a method from an Object instance. 
+     * 
+     * @param add the method reference invoked when a service is added.
+     * @return this builder
+     */
+    B add(InstanceCbServiceComponent<S> add);    
+  
+    /**
+     * Sets an <code>object instance callback(Service, Component)</code> callback invoked. The callback is when a service is changed.
+     * The method reference must point to method from an Object instance.
+     * 
+     * @param change the method reference invoked when a service is changed.
+     * @return this builder
+     */
+    B change(InstanceCbServiceComponent<S> change);
+
+    /**
+     * Sets an <code>object instance callback(Service, Component)</code> callback. The callback is invoked when a service is removed.
+     * The method reference must point to method from an Object instance. 
+     * 
+     * @param remove the method reference invoked when a service is removed.
+     * @return this builder
+     */
+    B remove(InstanceCbServiceComponent<S> remove);
+   
+    /**
+     * Sets an <code>object instance callback(Service, Component, ServiceReference)</code> callback. The callback is invoked when a service is added.
+     * The method reference must point to a method from an Object instance. 
+     * 
+     * @param add the method reference invoked when a service is added.
+     * @return this builder
+     */
+    B add(InstanceCbServiceComponentRef<S> add);
+   
+    /**
+     * Sets an <code>object instance callback(Service, Component, ServiceReference)</code> callback. The callback is invoked when a service is changed.
+     * The method reference must point to method from an Object instance. 
+     * 
+     * @param change the method reference invoked when a service is changed.
+     * @return this builder
+     */
+    B change(InstanceCbServiceComponentRef<S> change);
+    
+    /**
+     * Sets an <code>object instance callback(Service, Component, ServiceReference)</code> callback. The callback is invoked when a service is removed.
+     * The method reference must point to method from an Object instance. 
+     * 
+     * @param remove the method reference invoked when a service is removed.
+     * @return this builder
+     */
+    B remove(InstanceCbServiceComponentRef<S> remove);
+  
+    /**
+     * Sets a swap <code>component instance callback(Service, Service)</code> method reference. The callback is invoked when a service is swapped.
+     * The method reference must point to a Component implementation class method.
      * 
      * @param <T> the type of the component instance class on which the callback is invoked.
      * @param swap the method reference invoked when the service is swapped.
      * @return this builder
      */
-    <T> B sw(CbTypeServiceService<T, S> swap);
+    <T> B swap(CbServiceService<T, S> swap);
  
     /**
-     * Sets a <code>swap callback(Component, Service, Service)</code> invoked when a service is swapped.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the component, the old service and the new replacing service.
+     * Sets a wap <code>component instance callback(Service, Service, Component)</code> method reference. The callback is invoked when a service is swapped.
+     * The method reference must point to a Component implementation class method.
      * 
      * @param <T> the type of the component instance class on which the callback is invoked.
      * @param swap the method reference invoked when the service is swapped.
      * @return this builder
      */
-    <T> B sw(CbTypeComponentServiceService<T, S> swap);
+    <T> B swap(CbServiceServiceComponent<T, S> swap);
     
     /**
-     * Sets a <code>swap callback(ServiceReference, Service, ServiceReference, Service)</code> invoked when a service is swapped.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the old service reference, the old service, the new service reference, and
+     * Sets a swap <code>component instance callback(ServiceReference, Service, ServiceReference, Service)</code> method reference. The callback is invoked when a service is swapped.
+     * The method reference must point to a Component implementation class method. 
      * the new service.
      * 
      * @param <T> the type of the component instance class on which the callback is invoked.
      * @param swap the method reference invoked when the service is swapped.
      * @return this builder
      */
-    <T> B sw(CbTypeRefServiceRefService<T, S> swap);
+    <T> B swap(CbRefServiceRefService<T, S> swap);
     
     /**
-     * Sets a swap <code>callback</code> invoked when a service is swapped.
-     * The method reference must point to a Component implementation class method. Callback argument(s): the component, the old service reference, the old service, the new service reference, and
+     * Sets a swap <code>component instance callback(ServiceReference, Service, ServiceReference, Service, Component</code> method reference. The callback is invoked when a service is swapped.
+     * The method reference must point to a Component implementation class method. 
      * the new service.
      * 
      * @param <T> the type of the component instance class on which the callback is invoked.
      * @param swap the method reference invoked when the service is swapped.
      * @return this builder
      */
-    <T> B sw(CbTypeComponentRefServiceRefService<T, S> swap);
+    <T> B swap(CbRefServiceRefServiceComponent<T, S> swap);
 
     /**
-     * Sets a <code>callback instance</code> invoked when a service is added.
-     * The method reference must point to a method from an Object instance. Callback argument(s): a service.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @return this builder
-     */
-    B cbi(CbService<S> add);
-    
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added/removed.
-     * The method reference must point to method from an Object instance. Callback argument(s): a service.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    B cbi(CbService<S> add, CbService<S> remove);
-  
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added/changed/removed.
-     * The method reference must point to method from an Object instance. Callback argument(s): a service.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @param change the method reference invoked when a service is changed.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    B cbi(CbService<S> add, CbService<S> change, CbService<S> remove);
-
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added.
-     * The method reference must point to a method from an Object instance. Callback argument(s): a service and a properties Map.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @return this builder
-     */
-    B cbi(CbServiceMap<S> add);
-  
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added/removed.
-     * The method reference must point to method from an Object instance. Callback argument(s): a service and a properties Map.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    B cbi(CbServiceMap<S> add, CbServiceMap<S> remove);
-  
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added/changed/removed.
-     * The method reference must point to method from an Object instance. Callback argument(s): a service and a properties Map.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @param change the method reference invoked when a service is changed.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    B cbi(CbServiceMap<S> add, CbServiceMap<S> change, CbServiceMap<S> remove);
-
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added.
-     * The method reference must point to a method from an Object instance. Callback argument(s): a service and a properties Dictionary.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @return this builder
-     */
-    B cbi(CbServiceDict<S> add);
-   
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added/removed.
-     * The method reference must point to method from an Object instance. Callback argument(s): a service and a properties Dictionary.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    B cbi(CbServiceDict<S> add, CbServiceDict<S> remove);
- 
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added/changed/removed.
-     * The method reference must point to method from an Object instance. Callback argument(s): a service and a properties Dictionary.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @param change the method reference invoked when a service is changed.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    B cbi(CbServiceDict<S> add, CbServiceDict<S> change, CbServiceDict<S> remove);
-
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added.
-     * The method reference must point to a method from an Object instance. Callback argument(s): a service reference and a service.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @return this builder
-     */
-    B cbi(CbRefService<S> add);
-    
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added/removed.
-     * The method reference must point to method from an Object instance. Callback argument(s): a service reference and a service.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    B cbi(CbRefService<S> add, CbRefService<S> remove);
-  
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added/changed/removed.
-     * The method reference must point to method from an Object instance. Callback argument(s): a service reference and a service.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @param change the method reference invoked when a service is changed.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    B cbi(CbRefService<S> add, CbRefService<S> change, CbRefService<S> remove);
-
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added.
-     * The method reference must point to a method from an Object instance. Callback argument(s): a service reference.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @return this builder
-     */
-    B cbi(CbRef<S> add);
-  
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added/removed.
-     * The method reference must point to method from an Object instance. Callback argument(s): a service reference.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    B cbi(CbRef<S> add, CbRef<S> remove);
-    
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added/changed/removed.
-     * The method reference must point to method from an Object instance. Callback argument(s): a service reference.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @param change the method reference invoked when a service is changed.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    B cbi(CbRef<S> add, CbRef<S> change, CbRef<S> remove);
-
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added.
-     * The method reference must point to a method from an Object instance. Callback argument(s): a Component.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @return this builder
-     */
-    B cbi(CbComponent add);
-    
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added/removed.
-     * The method reference must point to method from an Object instance. Callback argument(s): a Component.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    B cbi(CbComponent add, CbComponent remove);
- 
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added/changed/removed.
-     * The method reference must point to method from an Object instance. Callback argument(s): a Component.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @param change the method reference invoked when a service is changed.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    B cbi(CbComponent add, CbComponent change, CbComponent remove);
-
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added.
-     * The method reference must point to a method from an Object instance. Callback argument(s): a Component and a service reference.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @return this builder
-     */
-    B cbi(CbComponentRef<S> add);
-  
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added/removed.
-     * The method reference must point to method from an Object instance. Callback argument(s): a Component and a service reference.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    B cbi(CbComponentRef<S> add, CbComponentRef<S> remove);
- 
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added/changed/removed.
-     * The method reference must point to method from an Object instance. Callback argument(s): a Component and a service reference.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @param change the method reference invoked when a service is changed.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    B cbi(CbComponentRef<S> add, CbComponentRef<S> change, CbComponentRef<S> remove);
-
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added.
-     * The method reference must point to a method from an Object instance. Callback argument(s): a Component and a service.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @return this builder
-     */
-    B cbi(CbComponentService<S> add);    
-  
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added/removed.
-     * The method reference must point to method from an Object instance. Callback argument(s): a Component and a service.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    B cbi(CbComponentService<S> add, CbComponentService<S> remove);
-   
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added/changed/removed.
-     * The method reference must point to method from an Object instance. Callback argument(s): a Component and a service.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @param change the method reference invoked when a service is changed.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    B cbi(CbComponentService<S> add, CbComponentService<S> change, CbComponentService<S> remove);
-
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added.
-     * The method reference must point to a method from an Object instance. Callback argument(s): a Component, a service reference, and a service.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @return this builder
-     */
-    B cbi(CbComponentRefService<S> add);
-   
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added/removed.
-     * The method reference must point to method from an Object instance. Callback argument(s): a Component, a service reference, and a service.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    B cbi(CbComponentRefService<S> add, CbComponentRefService<S> remove);
-  
-    /**
-     * Sets a <code>callback instance</code> invoked when a service is added/changed/removed.
-     * The method reference must point to method from an Object instance. Callback argument(s): a Component, a service reference, and a service.
-     * 
-     * @param add the method reference invoked when a service is added.
-     * @param change the method reference invoked when a service is changed.
-     * @param remove the method reference invoked when a service is removed.
-     * @return this builder
-     */
-    B cbi(CbComponentRefService<S> add, CbComponentRefService<S> change, CbComponentRefService<S> remove);
-    
-    /**
-     * Sets a swap <code>callback instance</code> invoked when a service is swapped.
-     * The method reference must point to a method from an Object instance. Callback argument(s): the old service, and the new service.
-     * the new service.
+     * Sets a swap <code>instance callback(Service, Service)</code> method reference. The callback is invoked when a service is swapped.
+     * The method reference must point to a method from an Object instance. 
      *
      * @param swap the method reference invoked when the service is swapped.
      * @return this builder
      */
-    B swi(CbServiceService<S> swap);
+    B swap(InstanceCbServiceService<S> swap);
    
     /**
-     * Sets a swap <code>callback instance</code> invoked when a service is swapped.
-     * The method reference must point to a method from an Object instance. Callback argument(s): the component, the old service, and the new service.
-     * the new service.
+     * Sets a swap <code>instance callback(Service, Service, Component)</code> method reference. The callback is invoked when a service is swapped.
+     * The method reference must point to a method from an Object instance. 
      *
      * @param swap the method reference invoked when the service is swapped.
      * @return this builder
      */
-    B swi(CbComponentServiceService<S> swap);
+    B swap(InstanceCbServiceServiceComponent<S> swap);
   
     /**
-     * Sets a swap <code>callback instance</code> invoked when a service is swapped.
-     * The method reference must point to a method from an Object instance. Callback argument(s): the old service reference, the old service, the 
-     * new service reference, and the new service.
+     * Sets a swap <code>instance callback(ServiceReference, Service, ServiceReference, Service)</code> method reference. The callback is invoked when a service is swapped.
+     * The method reference must point to a method from an Object instance. 
      *
      * @param swap the method reference invoked when the service is swapped.
      * @return this builder
      */
-    B swi(CbRefServiceRefService<S> swap);
+    B swap(InstanceCbRefServiceRefService<S> swap);
   
     /**
-     * Sets a swap <code>callback instance</code> invoked when a service is swapped.
-     * The method reference must point to a method from an Object instance. Callback argument(s): the component, old service reference, the old service, the 
-     * new service reference, and the new service.
+     * Sets a swap <code>instance callback(ServiceReference, Service, ServiceReference, Service, Component)</code> method reference. The callback is invoked when a service is swapped.
+     * The method reference must point to a method from an Object instance.  
      *
      * @param swap the method reference invoked when the service is swapped.
      * @return this builder
      */
-    B swi(CbComponentRefServiceRefService<S> swap);        
+    B swap(InstanceCbRefServiceRefServiceComponent<S> swap);        
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceDependencyBuilder.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceDependencyBuilder.java
index e2e4370..8ad3707 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceDependencyBuilder.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/ServiceDependencyBuilder.java
@@ -8,8 +8,10 @@
 import org.osgi.framework.ServiceReference;
 
 /**
- * Builds a Dependency Manager Service Dependency. Dependency callbacks can be defined using methods reflection like 
- * in original DM API, or using Java8 method references.
+ * Builds a Dependency Manager Service Dependency. 
+ * The Dependency is required by default, but you can
+ * control the default mode (required or optional) using the "org.apache.felix.dependencymanager.lambda.dependencymode"
+ * system property which can be set to either "required" or "optional" ("required" by default).
  * 
  * Unlike with original DM, dependencies are required by default.
  *
@@ -31,19 +33,22 @@
     ServiceDependencyBuilder<S> ref(ServiceReference<S> ref);
     
     /**
-     * Configures this dependency as optional. By default, a dependency is required.
+     * Configures this dependency as optional. By default, the dependency is required, but you can specify the default mode
+     * using the "org.apache.felix.dependencymanager.lambda.dependencymode" system property.
      * @return this builder
      */
     ServiceDependencyBuilder<S> optional();
 
     /**
-     * Configures this dependency as required. By default, a dependency is required.
+     * Configures this dependency as required.  By default, the dependency is required, but you can specify the default mode
+     * using the "org.apache.felix.dependencymanager.lambda.dependencymode" system property.
 	 * @return this builder
      */
     ServiceDependencyBuilder<S> required();
     
     /**
-     * Configures whether this dependency is required or not.
+     * Configures whether this dependency is required or not.  By default, the dependency is required, but you can specify the default mode
+     * using the "org.apache.felix.dependencymanager.lambda.dependencymode" system property.
      * 
      * @param required true if the dependency is required, false if not. Unlike with the original DM API, service dependencies are required by default.
 	 * @return this builder
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/Cb.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/Cb.java
new file mode 100644
index 0000000..3e44ac6
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/Cb.java
@@ -0,0 +1,25 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+/**
+ * Represents a java8 method reference to a zero-argument method from a given component implementation class. 
+ * <p> The type of the class on which the callback is invoked on is represented by the T generic parameter.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface Cb<T> extends SerializableLambda {
+    /**
+     * Invokes the callback method on the given component implementation instance.
+     * @param t the component implementation instance the callback is invoked on.
+     */
+    void accept(T t);
+
+    default Cb<T> andThen(Cb<? super T> after) {
+        Objects.requireNonNull(after);
+        return (T t) -> {
+            accept(t);
+            after.accept(t);
+        };
+    }
+}
\ No newline at end of file
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbBundle.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbBundle.java
index 32d24b4..268c308 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbBundle.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbBundle.java
@@ -5,23 +5,25 @@
 import org.osgi.framework.Bundle;
 
 /**
- * Represents a callback(Bundle) on an Object instance.
+ * Represents a callback(Bundle) that is invoked on a Component implementation class. 
+ * The type of the class on which the callback is invoked on is represented by the T generic parameter.
  * 
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 @FunctionalInterface
-public interface CbBundle extends SerializableLambda {
+public interface CbBundle<T> extends SerializableLambda {
     /**
-     * Handles the given argument.
+     * Handles the given arguments.
+     * @param instance the Component implementation instance on which the callback is invoked on. 
      * @param bundle the callback parameter
      */
-    void accept(Bundle bundle);
+    void accept(T instance, Bundle bundle);
 
-    default CbBundle andThen(CbBundle after) {
+    default CbBundle<T> andThen(CbBundle<? super T> after) {
         Objects.requireNonNull(after);
-        return (Bundle bundle) -> {
-            accept(bundle);
-            after.accept(bundle);
+        return (T instance, Bundle bundle) -> {
+            accept(instance, bundle);
+            after.accept(instance, bundle);
         };
     }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbBundleComponent.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbBundleComponent.java
new file mode 100644
index 0000000..58befd1
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbBundleComponent.java
@@ -0,0 +1,31 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+import org.apache.felix.dm.Component;
+import org.osgi.framework.Bundle;
+
+/**
+ * Represents a callback(Bundle, Component) that is invoked on a Component implementation class. 
+ * The type of the class on which the callback is invoked on is represented by the T generic parameter.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface CbBundleComponent<T> extends SerializableLambda {
+    /**
+     * Handles the given arguments.
+     * @param instance the Component implementation instance on which the callback is invoked on. 
+     * @param bundle the first callback parameter
+     * @param component the second callback parameter
+     */
+    void accept(T instance, Bundle bundle, Component component);
+
+    default CbBundleComponent<T> andThen(CbBundleComponent<? super T> after) {
+        Objects.requireNonNull(after);
+        return (T instance, Bundle bundle, Component component) -> {
+            accept(instance, bundle, component);
+            after.accept(instance, bundle, component);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponent.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponent.java
index e5fbf41..15bde58 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponent.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponent.java
@@ -5,23 +5,26 @@
 import org.apache.felix.dm.Component;
 
 /**
- * Represents a callback(Component)  on an Object instance.
+ * Represents a callback(Component) that is invoked on a Component implementation class. 
+ * The type of the component implementation class on which the callback is invoked on is represented by the T generic parameter.
+ * The component callback accepts in argument a Component parameter.
  * 
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 @FunctionalInterface
-public interface CbComponent {
+public interface CbComponent<T> extends SerializableLambda {
     /**
-     * Handles the given argument.
+     * Handles the given arguments.
+     * @param instance the Component implementation class instance on which the callback is invoked on. 
      * @param component the callback parameter
      */
-    void accept(Component component);
+    void accept(T instance, Component bundle);
 
-    default CbComponent andThen(CbComponent after) {
+    default CbComponent<T> andThen(CbComponent<? super T> after) {
         Objects.requireNonNull(after);
-        return (Component component) -> {
-            accept(component);
-            after.accept(component);
+        return (T instance, Component component) -> {
+            accept(instance, component);
+            after.accept(instance, component);
         };
     }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentBundle.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentBundle.java
deleted file mode 100644
index 5049a25..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentBundle.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-import org.apache.felix.dm.Component;
-import org.osgi.framework.Bundle;
-
-/**
- * Represents a callback(Component, Bundle) on an Object instance.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbComponentBundle {
-    /**
-     * Handles the given arguments.
-     * @param component the callback parameter
-     * @param bundle the callback parameter
-     */
-    void accept(Component component, Bundle bundle);
-
-    default CbComponentBundle andThen(CbComponentBundle after) {
-        Objects.requireNonNull(after);
-        return (Component component, Bundle bundle) -> {
-            accept(component, bundle);
-            after.accept(component, bundle);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentDictionary.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentDictionary.java
deleted file mode 100644
index 1c0f525..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentDictionary.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Dictionary;
-import java.util.Objects;
-
-import org.apache.felix.dm.Component;
-
-/**
- * Represents a callback(Component, Dictionary) on an Object instance.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbComponentDictionary {
-    /**
-     * Handles the given arguments.
-     * @param component a Component
-     * @param properties some service properties
-     */
-    void accept(Component component, Dictionary<String, Object> properties);
-
-    default CbComponentDictionary andThen(CbComponentDictionary after) {
-        Objects.requireNonNull(after);
-        return (Component component, Dictionary<String, Object> properties) -> {
-            accept(component, properties);
-            after.accept(component, properties);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentRef.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentRef.java
deleted file mode 100644
index 956293d..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentRef.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-import org.apache.felix.dm.Component;
-import org.osgi.framework.ServiceReference;
-
-/**
- * Represents a callback(Component, ServiceReference) on an Object instance.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbComponentRef<S> {
-    /**
-     * Handles the given arguments.
-     * @param c a Component
-     * @param ref the service reference
-     */
-    void accept(Component c, ServiceReference<S> ref);
-
-    default CbComponentRef<S> andThen(CbComponentRef<S> after) {
-        Objects.requireNonNull(after);
-        return (Component c, ServiceReference<S> ref) -> {
-            accept(c, ref);
-            after.accept(c, ref);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentRefService.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentRefService.java
deleted file mode 100644
index adf982d..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentRefService.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-import org.apache.felix.dm.Component;
-import org.osgi.framework.ServiceReference;
-
-/**
- * Represents a callback(Component, ServiceReference, Service) on an Object instance.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbComponentRefService<S> {
-    /**
-     * Handles the given arguments.
-     * @param c a Component
-     * @param ref the service reference
-     * @param service the service
-     */
-    void accept(Component c, ServiceReference<S> ref, S service);
-
-    default CbComponentRefService<S> andThen(CbComponentRefService<S> after) {
-        Objects.requireNonNull(after);
-        return (Component c, ServiceReference<S> ref, S service) -> {
-            accept(c, ref, service);
-            after.accept(c, ref, service);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentRefServiceRefService.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentRefServiceRefService.java
deleted file mode 100644
index 6ea5e2a..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentRefServiceRefService.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-import org.apache.felix.dm.Component;
-import org.osgi.framework.ServiceReference;
-
-/**
- * Represents a callback(Component, ServiceReference, Service, ServiceReference, Service) on an Object instance.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbComponentRefServiceRefService<S> {
-    /**
-     * Handles the given arguments
-     * @param c a Component
-     * @param oldRef an old swapped service reference
-     * @param old an old swapped service
-     * @param replaceRef the new service reference
-     * @param replace the new service
-     */
-    void accept(Component c, ServiceReference<S> oldRef, S old, ServiceReference<S> replaceRef, S replace);
-
-    default CbComponentRefServiceRefService<S> andThen(CbComponentRefServiceRefService<S> after) {
-        Objects.requireNonNull(after);
-        return (Component c, ServiceReference<S> oldRef, S old, ServiceReference<S> replaceRef, S replace) -> {
-            accept(c, oldRef, old, replaceRef, replace);
-            after.accept(c, oldRef, old, replaceRef, replace);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentService.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentService.java
deleted file mode 100644
index 7ddbe53..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentService.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-import org.apache.felix.dm.Component;
-
-/**
- * Represents a callback(Component, Service) on an Object instance.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbComponentService<S> {
-    /**
-     * Handles the given arguments
-     * @param c the component
-     * @param service the service
-     */
-    void accept(Component c, S service);
-
-    default CbComponentService<S> andThen(CbComponentService<S> after) {
-        Objects.requireNonNull(after);
-        return (Component c, S service) -> {
-            accept(c, service);
-            after.accept(c, service);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentServiceService.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentServiceService.java
deleted file mode 100644
index cf8190a..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbComponentServiceService.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-import org.apache.felix.dm.Component;
-
-/**
- * Represents a callback(Component, Service, Service) on an Object instance.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbComponentServiceService<S> extends SerializableLambda {
-    /**
-     * Handles the given arguments.
-     * @param c the component
-     * @param old the old service
-     * @param replace the new service
-     */
-    void accept(Component c, S old, S replace);
-
-    default CbComponentServiceService<S> andThen(CbComponentServiceService<S> after) {
-        Objects.requireNonNull(after);
-        return (Component c, S old, S replace) -> {
-            accept(c, old, replace);
-            after.accept(c, old, replace);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbConfiguration.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbConfiguration.java
new file mode 100644
index 0000000..9f8a2e8
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbConfiguration.java
@@ -0,0 +1,83 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Collection;
+import java.util.Dictionary;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Represents a callback(Configuration) that is invoked on a Component implementation class. 
+ * The callback which accepts a type-safe configuration class for wrapping properties behind a dynamic proxy interface.
+ * 
+ * <p> The T generic parameter represents the type of the class on which the callback is invoked on. 
+ * <p> The U generic parameter represents the type of the configuration class passed to the callback argument. 
+ * 
+ * <p> Using such callback provides a way for creating type-safe configurations from a actual {@link Map} or {@link Dictionary} that is
+ * normally injected by Dependency Manager.
+ * The callback accepts in argument an interface that you have to provide, and DM will inject a proxy that converts
+ * method calls from your configuration-type to lookups in the actual map or dictionary. The results of these lookups are then
+ * converted to the expected return type of the invoked configuration method.<br>
+ * As proxies are injected, no implementations of the desired configuration-type are necessary!
+ * </p>
+ * <p>
+ * The lookups performed are based on the name of the method called on the configuration type. The method names are
+ * "mangled" to the following form: <tt>[lower case letter] [any valid character]*</tt>. Method names starting with
+ * <tt>get</tt> or <tt>is</tt> (JavaBean convention) are stripped from these prefixes. For example: given a dictionary
+ * with the key <tt>"foo"</tt> can be accessed from a configuration-type using the following method names:
+ * <tt>foo()</tt>, <tt>getFoo()</tt> and <tt>isFoo()</tt>.
+ * </p>
+ * <p>
+ * The return values supported are: primitive types (or their object wrappers), strings, enums, arrays of
+ * primitives/strings, {@link Collection} types, {@link Map} types, {@link Class}es and interfaces. When an interface is
+ * returned, it is treated equally to a configuration type, that is, it is returned as a proxy.
+ * </p>
+ * <p>
+ * Arrays can be represented either as comma-separated values, optionally enclosed in square brackets. For example:
+ * <tt>[ a, b, c ]</tt> and <tt>a, b,c</tt> are both considered an array of length 3 with the values "a", "b" and "c".
+ * Alternatively, you can append the array index to the key in the dictionary to obtain the same: a dictionary with
+ * "arr.0" =&gt; "a", "arr.1" =&gt; "b", "arr.2" =&gt; "c" would result in the same array as the earlier examples.
+ * </p>
+ * <p>
+ * Maps can be represented as single string values similarly as arrays, each value consisting of both the key and value
+ * separated by a dot. Optionally, the value can be enclosed in curly brackets. Similar to array, you can use the same
+ * dot notation using the keys. For example, a dictionary with 
+ * 
+ * <pre>{@code "map" => "{key1.value1, key2.value2}"}</pre> 
+ * 
+ * and a dictionary with <p>
+ * 
+ * <pre>{@code "map.key1" => "value1", "map2.key2" => "value2"}</pre> 
+ * 
+ * result in the same map being returned.
+ * Instead of a map, you could also define an interface with the methods <tt>getKey1()</tt> and <tt>getKey2</tt> and use
+ * that interface as return type instead of a {@link Map}.
+ * 
+ * <p>
+ * In case a lookup does not yield a value from the underlying map or dictionary, the following rules are applied:
+ * <ol>
+ * <li>primitive types yield their default value, as defined by the Java Specification;
+ * <li>string, {@link Class}es and enum values yield <code>null</code>;
+ * <li>for arrays, collections and maps, an empty array/collection/map is returned;
+ * <li>for other interface types that are treated as configuration type a null-object is returned.
+ * </ol>
+ * </p>
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface CbConfiguration<T, U> extends SerializableLambda {
+    /**
+     * Handles the given arguments
+     * @param instance the Component implementation instance on which the callback is invoked on. 
+     * @param configuration the configuration proxy 
+     */
+    void accept(T instance, U configuration);
+
+    default CbConfiguration<T, U> andThen(CbConfiguration<T, U> after) {
+        Objects.requireNonNull(after);
+        return (T instance, U configuration) -> {
+            accept(instance, configuration);
+            after.accept(instance, configuration);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbConfigurationComponent.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbConfigurationComponent.java
new file mode 100644
index 0000000..1e34dc0
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbConfigurationComponent.java
@@ -0,0 +1,33 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+import org.apache.felix.dm.Component;
+
+/**
+ * Represents a callback(Configuration, Component) which accepts a configuration type for wrapping properties
+ * behind a dynamic proxy interface. For more informations about configuration type, please refer to {@link CbConfiguration}.
+ * 
+ * <p> The T generic parameter represents the type of the class on which the callback is invoked on. 
+ * <p> The U generic parameter represents the type of the configuration class passed to the callback argument. 
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface CbConfigurationComponent<T, U> extends SerializableLambda {
+    /**
+     * Handles the given arguments
+     * @param instance the Component implementation instance on which the callback is invoked on. 
+     * @param configuration the configuration proxy 
+     * @param component the callback Component 
+     */
+    void accept(T instance, U configuration, Component component);
+
+    default CbConfigurationComponent<T, U> andThen(CbConfigurationComponent<T, U> after) {
+        Objects.requireNonNull(after);
+        return (T instance, U configuration, Component component) -> {
+            accept(instance, configuration, component);
+            after.accept(instance, configuration, component);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbConsumer.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbConsumer.java
deleted file mode 100644
index 403ec7a..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbConsumer.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-/**
- * Represents a callback(T param) on an Object instance.
- * 
- * @param T the type of the callback parameter.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbConsumer<T> extends SerializableLambda {
-    /**
-     * Handles the given argument
-     * @param t the argument
-     */
-    void accept(T t);
-
-    default CbConsumer<T> andThen(CbConsumer<? super T> after) {
-        Objects.requireNonNull(after);
-        return (T t) -> {
-            accept(t);
-            after.accept(t);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbDictionary.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbDictionary.java
index dda1178..bc69d01 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbDictionary.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbDictionary.java
@@ -4,23 +4,25 @@
 import java.util.Objects;
 
 /**
- * Represents a callback(Dictionary) on an Object instance.
+ * Represents a callback(Dictionary) that is invoked on a Component implementation class. 
+ * The type of the class on which the callback is invoked on is represented by the T generic parameter.
  * 
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 @FunctionalInterface
-public interface CbDictionary {
+public interface CbDictionary<T> extends SerializableLambda {
     /**
-     * Handles the given argument.
-     * @param conf the properties
+     * Handles the given arguments.
+     * @param instance the Component implementation instance on which the callback is invoked on. 
+     * @param conf the callback argument
      */
-    void accept(Dictionary<String, Object> conf);
+    void accept(T instance, Dictionary<String, Object> conf);
 
-    default CbDictionary andThen(CbDictionary after) {
+    default CbDictionary<T> andThen(CbDictionary<? super T> after) {
         Objects.requireNonNull(after);
-        return (Dictionary<String, Object> conf) -> {
-            accept(conf);
-            after.accept(conf);
+        return (T instance, Dictionary<String, Object> conf) -> {
+            accept(instance, conf);
+            after.accept(instance, conf);
         };
     }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbDictionaryComponent.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbDictionaryComponent.java
new file mode 100644
index 0000000..daee390
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbDictionaryComponent.java
@@ -0,0 +1,31 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Dictionary;
+import java.util.Objects;
+
+import org.apache.felix.dm.Component;
+
+/**
+ * Represents a callback(Dictionary, Component) that is invoked on a Component implementation class. 
+ * The type of the class on which the callback is invoked on is represented by the T generic parameter.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface CbDictionaryComponent<T> extends SerializableLambda {
+    /**
+     * Handles the given arguments.
+     * @param instance the Component implementation instance on which the callback is invoked on. 
+     * @param conf the first callback parameter
+     * @param component the second callback parameter
+     */
+    void accept(T instance, Dictionary<String, Object> conf, Component component);
+
+    default CbDictionaryComponent<T> andThen(CbDictionaryComponent<? super T> after) {
+        Objects.requireNonNull(after);
+        return (T instance, Dictionary<String, Object> conf, Component component) -> {
+            accept(instance, conf, component);
+            after.accept(instance, conf, component);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbFuture.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbFuture.java
index bab63af..669d01b 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbFuture.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbFuture.java
@@ -3,23 +3,26 @@
 import java.util.Objects;
 
 /**
- * Represents a callback that accepts a the result of a CompletableFuture. The callback is invoked on an Object instance.
+ * Represents a callback that accepts the result of a CompletableFuture operation. The callback is invoked on a Component implementation class. 
+ * The type of the class on which the callback is invoked on is represented by the T generic parameter.
+ * The type of the result of the CompletableFuture is represented by the F generic parameter.
  * 
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 @FunctionalInterface
-public interface CbFuture<F> {
+public interface CbFuture<T, F> extends SerializableLambda {
     /**
-     * Handles the result of a CompletableFuture operation.
+     * Handles the given arguments.
+     * @param instance the Component implementation instance on which the callback is invoked on. 
      * @param future the result of a CompletableFuture operation.
      */
-    void accept(F future);
+    void accept(T instance, F future);
 
-    default CbFuture<F> andThen(CbFuture<? super F> after) {
+    default CbFuture<T, F> andThen(CbFuture<? super T, F> after) {
         Objects.requireNonNull(after);
-        return (F f) -> {
-            accept(f);
-            after.accept(f);
+        return (T instance, F future) -> {
+            accept(instance, future);
+            after.accept(instance, future);
         };
     }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbRef.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbRef.java
deleted file mode 100644
index 6e5425c..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbRef.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-import org.osgi.framework.ServiceReference;
-
-/**
- * Represents a callback(ServiceReference) on an Object instance.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbRef<S> {
-    /**
-     * Handles the given argument
-     * @param ref a service reference
-     */
-    void accept(ServiceReference<S> ref);
-
-    default CbRef<S> andThen(CbRef<S> after) {
-        Objects.requireNonNull(after);
-        return (ServiceReference<S> ref) -> {
-            after.accept(ref);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbRefService.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbRefService.java
deleted file mode 100644
index ca795f4..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbRefService.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-import org.osgi.framework.ServiceReference;
-
-/**
- * Represents a callback(ServiceReference, Service) on an Object instance.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbRefService<S> {
-    /**
-     * Handles the given arguments.
-     * @param ref a Service Reference
-     * @param service a Service
-     */
-    void accept(ServiceReference<S> ref, S service);
-
-    default CbRefService<S> andThen(CbRefService<S> after) {
-        Objects.requireNonNull(after);
-        return (ServiceReference<S> ref, S service) -> {
-            accept(ref, service);
-            after.accept(ref, service);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbRefServiceRefService.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbRefServiceRefService.java
index 7917ea3..dc05c83 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbRefServiceRefService.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbRefServiceRefService.java
@@ -5,26 +5,28 @@
 import org.osgi.framework.ServiceReference;
 
 /**
- * Represents a callback(ServiceReference, Service, ServiceReference, Service) on an Object instance.
+ * Represents a callback(ServiceReference, Service, ServiceReference, Service) that is invoked on a Component implementation class. 
+ * The type of the class on which the callback is invoked on is represented by the T generic parameter.
  * 
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 @FunctionalInterface
-public interface CbRefServiceRefService<S> {
+public interface CbRefServiceRefService<T, S> extends SerializableLambda {
     /**
-     * Handles the given arguments
-     * @param oldRef a service reference
-     * @param old a service
-     * @param replaceRef a service reference
-     * @param replace a service
+     * Handles the given arguments.
+     * @param instance the Component implementation instance on which the callback is invoked on. 
+     * @param oldRef first callback param
+     * @param old second callback param
+     * @param replaceRef third callback param
+     * @param replace fourth callback param
      */
-    void accept(ServiceReference<S> oldRef, S old, ServiceReference<S> replaceRef, S replace);
+    void accept(T instance, ServiceReference<S> oldRef, S old, ServiceReference<S> replaceRef, S replace);
 
-    default CbRefServiceRefService<S> andThen(CbRefServiceRefService<S> after) {
+    default CbRefServiceRefService<T, S> andThen(CbRefServiceRefService<? super T, S> after) {
         Objects.requireNonNull(after);
-        return (ServiceReference<S> oldRef, S old, ServiceReference<S> replaceRef, S replace) -> {
-            accept(oldRef, old, replaceRef, replace);
-            after.accept(oldRef, old, replaceRef, replace);
+        return (T instance, ServiceReference<S> oldRef, S old, ServiceReference<S> replaceRef, S replace) -> {
+            accept(instance, oldRef, old, replaceRef, replace);
+            after.accept(instance, oldRef, old, replaceRef, replace);
         };
     }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbRefServiceRefServiceComponent.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbRefServiceRefServiceComponent.java
new file mode 100644
index 0000000..63c64ca
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbRefServiceRefServiceComponent.java
@@ -0,0 +1,34 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+import org.apache.felix.dm.Component;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Represents a callback(ServiceReference, Service, ServiceReference, Service, Component) that is invoked on a Component implementation class. 
+ * The type of the class on which the callback is invoked on is represented by the T generic parameter.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface CbRefServiceRefServiceComponent<T, S> extends SerializableLambda {
+    /**
+     * Handles the given arguments.
+     * @param instance the Component implementation instance on which the callback is invoked on. 
+     * @param oldRef first callback arg
+     * @param old second callback arg
+     * @param replaceRef third callback arg
+     * @param replace fourth callback arg
+     * @param c fifth callback arg
+     */
+    void accept(T instance, ServiceReference<S> oldRef, S old, ServiceReference<S> replaceRef, S replace, Component c);
+
+    default CbRefServiceRefServiceComponent<T, S> andThen(CbRefServiceRefServiceComponent<? super T, S> after) {
+        Objects.requireNonNull(after);
+        return (T instance, ServiceReference<S> oldRef, S old, ServiceReference<S> replaceRef, S replace, Component c) -> {
+            accept(instance, oldRef, old, replaceRef, replace, c);
+            after.accept(instance, oldRef, old, replaceRef, replace, c);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbService.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbService.java
index 98ca2ab..89aba90 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbService.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbService.java
@@ -3,23 +3,25 @@
 import java.util.Objects;
 
 /**
- * Represents a callback(Service) on an Object instance.
+ * Represents a callback(Service) that is invoked on a Component implementation class. 
+ * The type of the class on which the callback is invoked on is represented by the T generic parameter.
  * 
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 @FunctionalInterface
-public interface CbService<S> {
+public interface CbService<T, S> extends SerializableLambda {
     /**
-     * Handles the given argument.
-     * @param service a Service
+     * Handles the given arguments.
+     * @param instance the Component implementation instance on which the callback is invoked on. 
+     * @param service the callback argument.
      */
-    void accept(S service);
+    void accept(T instance, S service);
 
-    default CbService<S> andThen(CbService<S> after) {
+    default CbFuture<T, S> andThen(CbFuture<? super T, S> after) {
         Objects.requireNonNull(after);
-        return (S service) -> {
-            accept(service);
-            after.accept(service);
+        return (T instance, S service) -> {
+            accept(instance, service);
+            after.accept(instance, service);
         };
     }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceComponent.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceComponent.java
new file mode 100644
index 0000000..4cd2506
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceComponent.java
@@ -0,0 +1,30 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+import org.apache.felix.dm.Component;
+
+/**
+ * Represents a callback(Service, Component) that is invoked on a Component implementation class. 
+ * The type of the class on which the callback is invoked on is represented by the T generic parameter.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface CbServiceComponent<T, S> extends SerializableLambda {
+    /**
+     * Handles the given arguments.
+     * @param instance the Component implementation instance on which the callback is invoked on. 
+     * @param service the first callback argument
+     * @param c the second callback argument
+     */
+    void accept(T instance, S service, Component c);
+
+    default CbServiceComponent<T, S> andThen(CbServiceComponent<T, S> after) {
+        Objects.requireNonNull(after);
+        return (T instance, S s, Component c) -> {
+            accept(instance, s, c);
+            after.accept(instance, s, c);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceComponentRef.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceComponentRef.java
new file mode 100644
index 0000000..959ba11
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceComponentRef.java
@@ -0,0 +1,32 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+import org.apache.felix.dm.Component;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Represents a callback(Service, Component, ServiceReference) that is invoked on a Component implementation class. 
+ * The type of the class on which the callback is invoked on is represented by the T generic parameter.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface CbServiceComponentRef<T, S> extends SerializableLambda {
+    /**
+     * Handles the given arguments.
+     * @param instance the Component implementation instance on which the callback is invoked on. 
+     * @param service the first callback parameter
+     * @param c the second callback parameter
+     * @param ref the third callback parameter
+     */
+    void accept(T instance, S service, Component c, ServiceReference<S> ref);
+
+    default CbServiceComponentRef<T, S> andThen(CbServiceComponentRef<T, S> after) {
+        Objects.requireNonNull(after);
+        return (T instance, S service, Component c, ServiceReference<S> ref) -> {
+            accept(instance, service, c, ref);
+            after.accept(instance, service, c, ref);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceDict.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceDict.java
index 0d88a18..046baf6 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceDict.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceDict.java
@@ -4,24 +4,26 @@
 import java.util.Objects;
 
 /**
- * Represents a callback(Service, Dictionary) on an Object instance.
+ * Represents a callback(Service, Dictionary) that is invoked on a Component implementation class. 
+ * The type of the class on which the callback is invoked on is represented by the T generic parameter.
  * 
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 @FunctionalInterface
-public interface CbServiceDict<S> {
+public interface CbServiceDict<T, S> extends SerializableLambda {
     /**
      * Handles the given arguments.
-     * @param service a Service
-     * @param properties a Dictionary
+     * @param instance the Component implementation instance on which the callback is invoked on. 
+     * @param service first callback arg
+     * @param properties second callback arg
      */
-    void accept(S service, Dictionary<String, Object> properties);
+    void accept(T instance, S service, Dictionary<String, Object> properties);
 
-    default CbServiceDict<S> andThen(CbServiceDict<S> after) {
+    default CbServiceDict<T, S> andThen(CbServiceDict<? super T, S> after) {
         Objects.requireNonNull(after);
-        return (S service, Dictionary<String, Object> properties) -> {
-            accept(service, properties);
-            after.accept(service, properties);
+        return (T instance, S service, Dictionary<String, Object> properties) -> {
+            accept(instance, service, properties);
+            after.accept(instance, service, properties);
         };
     }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceMap.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceMap.java
index ae1d6c0..fcf737c 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceMap.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceMap.java
@@ -4,24 +4,26 @@
 import java.util.Objects;
 
 /**
- * Represents a callback(Service, Map) on an Object instance.
+ * Represents a callback(Service, Map) that is invoked on a Component implementation class. 
+ * The type of the class on which the callback is invoked on is represented by the T generic parameter.
  * 
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 @FunctionalInterface
-public interface CbServiceMap<S> {
+public interface CbServiceMap<T, S> extends SerializableLambda {
     /**
      * Handles the given arguments.
-     * @param service a Service 
-     * @param properties a Map
+     * @param instance the Component implementation instance on which the callback is invoked on. 
+     * @param service first callback arg
+     * @param properties second callback arg
      */
-    void accept(S service, Map<String, Object> properties);
+    void accept(T instance, S service, Map<String, Object> properties);
 
-    default CbServiceMap<S> andThen(CbServiceMap<S> after) {
+    default CbServiceMap<T, S> andThen(CbServiceMap<? super T, S> after) {
         Objects.requireNonNull(after);
-        return (S service, Map<String, Object> properties) -> {
-            accept(service, properties);
-            after.accept(service, properties);
+        return (T instance, S service, Map<String, Object> properties) -> {
+            accept(instance, service, properties);
+            after.accept(instance, service, properties);
         };
     }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceRef.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceRef.java
new file mode 100644
index 0000000..5282f27
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceRef.java
@@ -0,0 +1,30 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Represents a callback(Service, ServiceReference) that is invoked on a Component implementation class. 
+ * The type of the class on which the callback is invoked on is represented by the T generic parameter.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface CbServiceRef<T, S> extends SerializableLambda {
+    /**
+     * Handles the given arguments.
+     * @param instance the Component implementation instance on which the callback is invoked on. 
+     * @param service first callback arg
+     * @param ref second callback arg
+     */
+    void accept(T instance, S service, ServiceReference<S> ref);
+
+    default CbServiceRef<T, S> andThen(CbServiceRef<? super T, S> after) {
+        Objects.requireNonNull(after);
+        return (T instance, S service, ServiceReference<S> ref) -> {
+            accept(instance, service, ref);
+            after.accept(instance, service, ref);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceService.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceService.java
index 02c4d94..91d2ab0 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceService.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceService.java
@@ -3,24 +3,26 @@
 import java.util.Objects;
 
 /**
- * Represents a callback(Service, Service) on an Object instance.
+ * Represents a swap callback(Service, Service) that is invoked on a Component implementation class. 
+ * The type of the class on which the callback is invoked on is represented by the T generic parameter.
  * 
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 @FunctionalInterface
-public interface CbServiceService<S> extends SerializableLambda {
+public interface CbServiceService<T, S> extends SerializableLambda {
     /**
-     * Handles the given argument
-     * @param old a Service
-     * @param replace a Service
+     * Handles the given arguments.
+     * @param instance the Component implementation instance on which the callback is invoked on. 
+     * @param old first callback arg
+     * @param replace second callback arg
      */
-    void accept(S old, S replace);
+    void accept(T instance, S old, S replace);
 
-    default CbServiceService<S> andThen(CbServiceService<S> after) {
+    default CbServiceService<T, S> andThen(CbServiceService<? super T, S> after) {
         Objects.requireNonNull(after);
-        return (S old, S replace) -> {
-            accept(old, replace);
-            after.accept(old, replace);
+        return (T instance, S old, S replace) -> {
+            accept(instance, old, replace);
+            after.accept(instance, old, replace);
         };
     }
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceServiceComponent.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceServiceComponent.java
new file mode 100644
index 0000000..a31fd09
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbServiceServiceComponent.java
@@ -0,0 +1,31 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+import org.apache.felix.dm.Component;
+
+/**
+ * Represents a swap callback(Service, Service, Component) that is invoked on a Component implementation class. 
+ * The type of the class on which the callback is invoked on is represented by the T generic parameter.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface CbServiceServiceComponent<T, S> extends SerializableLambda {
+    /**
+     * Handles the given arguments.
+     * @param instance the Component implementation instance on which the callback is invoked on. 
+     * @param old first callback arg
+     * @param replace second callback arg
+     * @param c third callback arg
+     */ 
+    void accept(T instance, S old, S replace, Component c);
+
+    default CbServiceServiceComponent<T, S> andThen(CbServiceServiceComponent<? super T, S> after) {
+        Objects.requireNonNull(after);
+        return (T instance, S old, S replace, Component c) -> {
+            accept(instance, old, replace, c);
+            after.accept(instance, old, replace, c);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeBundle.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeBundle.java
deleted file mode 100644
index aa6c444..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeBundle.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-import org.osgi.framework.Bundle;
-
-/**
- * Represents a callback(Bundle) that is invoked on a Component implementation class. 
- * The type of the class on which the callback is invoked on is represented by the T generic parameter.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbTypeBundle<T> extends SerializableLambda {
-    /**
-     * Handles the given arguments.
-     * @param instance the Component implementation instance on which the callback is invoked on. 
-     * @param bundle the callback parameter
-     */
-    void accept(T instance, Bundle bundle);
-
-    default CbTypeBundle<T> andThen(CbTypeBundle<? super T> after) {
-        Objects.requireNonNull(after);
-        return (T instance, Bundle bundle) -> {
-            accept(instance, bundle);
-            after.accept(instance, bundle);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponent.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponent.java
deleted file mode 100644
index 9bed1bd..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponent.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-import org.apache.felix.dm.Component;
-
-/**
- * Represents a callback(Component) that is invoked on a Component implementation class. 
- * The type of the class on which the callback is invoked on is represented by the T generic parameter.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbTypeComponent<T> extends SerializableLambda {
-    /**
-     * Handles the given arguments
-     * @param instance the Component implementation instance on which the callback is invoked on. 
-     * @param component the callback parameter 
-     */
-    void accept(T instance, Component component);
-
-    default CbTypeComponent<T> andThen(CbTypeComponent<T> after) {
-        Objects.requireNonNull(after);
-        return (T instance, Component component) -> {
-            accept(instance, component);
-            after.accept(instance, component);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentBundle.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentBundle.java
deleted file mode 100644
index 7bee3c3..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentBundle.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-import org.apache.felix.dm.Component;
-import org.osgi.framework.Bundle;
-
-/**
- * Represents a callback(Component, Bundle) that is invoked on a Component implementation class. 
- * The type of the class on which the callback is invoked on is represented by the T generic parameter.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbTypeComponentBundle<T> extends SerializableLambda {
-    /**
-     * Handles the given arguments.
-     * @param instance the Component implementation instance on which the callback is invoked on. 
-     * @param component the first callback parameter
-     * @param bundle the second callback parameter
-     */
-    void accept(T instance, Component component, Bundle bundle);
-
-    default CbTypeComponentBundle<T> andThen(CbTypeComponentBundle<? super T> after) {
-        Objects.requireNonNull(after);
-        return (T instance, Component component, Bundle bundle) -> {
-            accept(instance, component, bundle);
-            after.accept(instance, component, bundle);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentDictionary.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentDictionary.java
deleted file mode 100644
index f84c71b..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentDictionary.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Dictionary;
-import java.util.Objects;
-
-import org.apache.felix.dm.Component;
-
-/**
- * Represents a callback(Component, Dictionary) that is invoked on a Component implementation class. 
- * The type of the class on which the callback is invoked on is represented by the T generic parameter.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbTypeComponentDictionary<T> extends SerializableLambda {
-    /**
-     * Handles the given arguments.
-     * @param instance the Component implementation instance on which the callback is invoked on. 
-     * @param component the first callback parameter
-     * @param conf the second callback parameter
-     */
-    void accept(T instance, Component component, Dictionary<String, Object> conf);
-
-    default CbTypeComponentDictionary<T> andThen(CbTypeComponentDictionary<? super T> after) {
-        Objects.requireNonNull(after);
-        return (T instance, Component component, Dictionary<String, Object> conf) -> {
-            accept(instance, component, conf);
-            after.accept(instance, component, conf);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentRef.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentRef.java
deleted file mode 100644
index 19bcb7d..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentRef.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-import org.apache.felix.dm.Component;
-import org.osgi.framework.ServiceReference;
-
-/**
- * Represents a callback(Component, ServiceReference) that is invoked on a Component implementation class. 
- * The type of the class on which the callback is invoked on is represented by the T generic parameter.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbTypeComponentRef<T, S> extends SerializableLambda {
-    /**
-     * Handles the given arguments.
-     * @param instance the Component implementation instance on which the callback is invoked on. 
-     * @param c the first callback parameter
-     * @param ref the second callback parameter
-     */
-    void accept(T instance, Component c, ServiceReference<S> ref);
-
-    default CbTypeComponentRef<T, S> andThen(CbTypeComponentRef<T, S> after) {
-        Objects.requireNonNull(after);
-        return (T instance, Component c, ServiceReference<S> ref) -> {
-            accept(instance, c, ref);
-            after.accept(instance, c, ref);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentRefService.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentRefService.java
deleted file mode 100644
index c11e1a5..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentRefService.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-import org.apache.felix.dm.Component;
-import org.osgi.framework.ServiceReference;
-
-/**
- * Represents a callback(Component, ServiceReference, Service) that is invoked on a Component implementation class. 
- * The type of the class on which the callback is invoked on is represented by the T generic parameter.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbTypeComponentRefService<T, S> extends SerializableLambda {
-    /**
-     * Handles the given arguments.
-     * @param instance the Component implementation instance on which the callback is invoked on. 
-     * @param c the first callback parameter
-     * @param ref the second callback parameter
-     * @param service the third callback parameter
-     */
-    void accept(T instance, Component c, ServiceReference<S> ref, S service);
-
-    default CbTypeComponentRefService<T, S> andThen(CbTypeComponentRefService<T, S> after) {
-        Objects.requireNonNull(after);
-        return (T instance, Component c, ServiceReference<S> ref, S service) -> {
-            accept(instance, c, ref, service);
-            after.accept(instance, c, ref, service);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentRefServiceRefService.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentRefServiceRefService.java
deleted file mode 100644
index 43ac90a..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentRefServiceRefService.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-import org.apache.felix.dm.Component;
-import org.osgi.framework.ServiceReference;
-
-/**
- * Represents a callback(Component, ServiceReference, Service, ServiceReference, Service) that is invoked on a Component implementation class. 
- * The type of the class on which the callback is invoked on is represented by the T generic parameter.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbTypeComponentRefServiceRefService<T, S> extends SerializableLambda {
-    /**
-     * Handles the given arguments.
-     * @param instance the Component implementation instance on which the callback is invoked on. 
-     * @param c first callback param
-     * @param oldRef second callback param
-     * @param old third callback param
-     * @param replaceRef fourth callback param
-     * @param replace fifth callback param
-     */
-    void accept(T instance, Component c, ServiceReference<S> oldRef, S old, ServiceReference<S> replaceRef, S replace);
-
-    default CbTypeComponentRefServiceRefService<T, S> andThen(CbTypeComponentRefServiceRefService<? super T, S> after) {
-        Objects.requireNonNull(after);
-        return (T instance, Component c, ServiceReference<S> oldRef, S old, ServiceReference<S> replaceRef,
-            S replace) -> {
-            accept(instance, c, oldRef, old, replaceRef, replace);
-            after.accept(instance, c, oldRef, old, replaceRef, replace);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentService.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentService.java
deleted file mode 100644
index 705533d..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentService.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-import org.apache.felix.dm.Component;
-
-/**
- * Represents a callback(Component, Service) that is invoked on a Component implementation class. 
- * The type of the class on which the callback is invoked on is represented by the T generic parameter.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbTypeComponentService<T, S> extends SerializableLambda {
-    /**
-     * Handles the given arguments.
-     * @param instance the Component implementation instance on which the callback is invoked on. 
-     * @param c first callback param
-     * @param service second callback param
-     */
-    void accept(T instance, Component c, S service);
-
-    default CbTypeComponentService<T, S> andThen(CbTypeComponentService<T, S> after) {
-        Objects.requireNonNull(after);
-        return (T instance, Component c, S s) -> {
-            accept(instance, c, s);
-            after.accept(instance, c, s);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentServiceDict.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentServiceDict.java
deleted file mode 100644
index 3fe4403..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentServiceDict.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Dictionary;
-import java.util.Objects;
-
-import org.apache.felix.dm.Component;
-
-/**
- * Represents a callback(Component, ServiceReference, Dictionary) that is invoked on a Component implementation class. 
- * The type of the class on which the callback is invoked on is represented by the T generic parameter.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbTypeComponentServiceDict<T, S> extends SerializableLambda {
-    /**
-     * Handles the given arguments.
-     * @param instance the Component implementation instance on which the callback is invoked on. 
-     * @param c first callback param
-     * @param service second callback param
-     * @param props third callback param
-     */
-    void accept(T instance, Component c, S service, Dictionary<String, Object> props);
-
-    default CbTypeComponentServiceDict<T, S> andThen(CbTypeComponentServiceDict<T, S> after) {
-        Objects.requireNonNull(after);
-        return (T instance, Component c, S s, Dictionary<String, Object> props) -> {
-            accept(instance, c, s, props);
-            after.accept(instance, c, s, props);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentServiceMap.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentServiceMap.java
deleted file mode 100644
index 509cdc4..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentServiceMap.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Map;
-import java.util.Objects;
-
-import org.apache.felix.dm.Component;
-
-/**
- * Represents a callback(Component, ServiceReference, Service, Service Reference, Service) that is invoked on a Component implementation class. 
- * The type of the class on which the callback is invoked on is represented by the T generic parameter.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbTypeComponentServiceMap<T, S> extends SerializableLambda {
-    /**
-     * Handles the given arguments.
-     * @param instance the Component implementation instance on which the callback is invoked on. 
-     * @param c first callback param
-     * @param service second callback param
-     * @param props third callback param
-     */
-    void accept(T instance, Component c, S service, Map<String, Object> props);
-
-    default CbTypeComponentServiceMap<T, S> andThen(CbTypeComponentServiceMap<T, S> after) {
-        Objects.requireNonNull(after);
-        return (T instance, Component c, S s, Map<String, Object> props) -> {
-            accept(instance, c, s, props);
-            after.accept(instance, c, s, props);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentServiceService.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentServiceService.java
deleted file mode 100644
index d234a91..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeComponentServiceService.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-import org.apache.felix.dm.Component;
-
-/**
- * Represents a callback(Component, Service, Service) that is invoked on a Component implementation class. 
- * The type of the class on which the callback is invoked on is represented by the T generic parameter.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbTypeComponentServiceService<T, S> extends SerializableLambda {
-    /**
-     * Handles the given arguments.
-     * @param instance the Component implementation instance on which the callback is invoked on. 
-     * @param c first callback param
-     * @param old second callback param
-     * @param replace third callback param
-     */ 
-    void accept(T instance, Component c, S old, S replace);
-
-    default CbTypeComponentServiceService<T, S> andThen(CbTypeComponentServiceService<? super T, S> after) {
-        Objects.requireNonNull(after);
-        return (T instance, Component c, S old, S replace) -> {
-            accept(instance, c, old, replace);
-            after.accept(instance, c, old, replace);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeDictionary.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeDictionary.java
deleted file mode 100644
index 8d4ceb1..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeDictionary.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Dictionary;
-import java.util.Objects;
-
-/**
- * Represents a callback(Dictionary) that is invoked on a Component implementation class. 
- * The type of the class on which the callback is invoked on is represented by the T generic parameter.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbTypeDictionary<T> extends SerializableLambda {
-    /**
-     * Handles the given arguments.
-     * @param instance the Component implementation instance on which the callback is invoked on. 
-     * @param conf first callback param
-     */
-    void accept(T instance, Dictionary<String, Object> conf);
-
-    default CbTypeDictionary<T> andThen(CbTypeDictionary<? super T> after) {
-        Objects.requireNonNull(after);
-        return (T instance, Dictionary<String, Object> conf) -> {
-            accept(instance, conf);
-            after.accept(instance, conf);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeFuture.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeFuture.java
deleted file mode 100644
index 54b0d72..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeFuture.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-/**
- * Represents a callback that accepts the result of a CompletableFuture operation. The callback is invoked on a Component implementation class. 
- * The type of the class on which the callback is invoked on is represented by the T generic parameter.
- * The type of the result of the CompletableFuture is represented by the F generic parameter.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbTypeFuture<T, F> extends SerializableLambda {
-    /**
-     * Handles the given arguments.
-     * @param instance the Component implementation instance on which the callback is invoked on. 
-     * @param future the result of a CompletableFuture operation.
-     */
-    void accept(T instance, F future);
-
-    default CbTypeFuture<T, F> andThen(CbTypeFuture<? super T, F> after) {
-        Objects.requireNonNull(after);
-        return (T instance, F future) -> {
-            accept(instance, future);
-            after.accept(instance, future);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeRef.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeRef.java
deleted file mode 100644
index 36fa87c..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeRef.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-import org.osgi.framework.ServiceReference;
-
-/**
- * Represents a callback(ServiceReference) that is invoked on a Component implementation class. 
- * The type of the class on which the callback is invoked on is represented by the T generic parameter.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbTypeRef<T, S> extends SerializableLambda {
-    /**
-     * Handles the given arguments.
-     * @param instance the Component implementation instance on which the callback is invoked on. 
-     * @param service first callback param
-     */
-    void accept(T instance, ServiceReference<S> service);
-
-    default CbTypeRef<T, S> andThen(CbTypeRef<? super T, S> after) {
-        Objects.requireNonNull(after);
-        return (T instance, ServiceReference<S> ref) -> {
-            accept(instance, ref);
-            after.accept(instance, ref);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeRefService.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeRefService.java
deleted file mode 100644
index 099416d..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeRefService.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-import org.osgi.framework.ServiceReference;
-
-/**
- * Represents a callback(ServiceReference, Service) that is invoked on a Component implementation class. 
- * The type of the class on which the callback is invoked on is represented by the T generic parameter.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbTypeRefService<T, S> extends SerializableLambda {
-    /**
-     * Handles the given arguments.
-     * @param instance the Component implementation instance on which the callback is invoked on. 
-     * @param ref first callback param
-     * @param service second callback param
-     */
-    void accept(T instance, ServiceReference<S> ref, S service);
-
-    default CbTypeRefService<T, S> andThen(CbTypeRefService<? super T, S> after) {
-        Objects.requireNonNull(after);
-        return (T instance, ServiceReference<S> ref, S service) -> {
-            accept(instance, ref, service);
-            after.accept(instance, ref, service);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeRefServiceRefService.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeRefServiceRefService.java
deleted file mode 100644
index ccb9142..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeRefServiceRefService.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-import org.osgi.framework.ServiceReference;
-
-/**
- * Represents a callback(ServiceReference, Service, ServiceReference, Service) that is invoked on a Component implementation class. 
- * The type of the class on which the callback is invoked on is represented by the T generic parameter.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbTypeRefServiceRefService<T, S> extends SerializableLambda {
-    /**
-     * Handles the given arguments.
-     * @param instance the Component implementation instance on which the callback is invoked on. 
-     * @param oldRef first callback param
-     * @param old second callback param
-     * @param replaceRef third callback param
-     * @param replace fourth callback param
-     */
-    void accept(T instance, ServiceReference<S> oldRef, S old, ServiceReference<S> replaceRef, S replace);
-
-    default CbTypeRefServiceRefService<T, S> andThen(CbTypeRefServiceRefService<? super T, S> after) {
-        Objects.requireNonNull(after);
-        return (T instance, ServiceReference<S> oldRef, S old, ServiceReference<S> replaceRef, S replace) -> {
-            accept(instance, oldRef, old, replaceRef, replace);
-            after.accept(instance, oldRef, old, replaceRef, replace);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeService.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeService.java
deleted file mode 100644
index 01f518b..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeService.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-/**
- * Represents a callback(Service) that is invoked on a Component implementation class. 
- * The type of the class on which the callback is invoked on is represented by the T generic parameter.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbTypeService<T, S> extends SerializableLambda {
-    /**
-     * Handles the given arguments.
-     * @param instance the Component implementation instance on which the callback is invoked on. 
-     * @param service first callback param
-     */
-    void accept(T instance, S service);
-
-    default CbTypeFuture<T, S> andThen(CbTypeFuture<? super T, S> after) {
-        Objects.requireNonNull(after);
-        return (T instance, S service) -> {
-            accept(instance, service);
-            after.accept(instance, service);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeServiceDict.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeServiceDict.java
deleted file mode 100644
index 01c8abb..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeServiceDict.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Dictionary;
-import java.util.Objects;
-
-/**
- * Represents a callback(Component, Dictionary) that is invoked on a Component implementation class. 
- * The type of the class on which the callback is invoked on is represented by the T generic parameter.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbTypeServiceDict<T, S> extends SerializableLambda {
-    /**
-     * Handles the given arguments.
-     * @param instance the Component implementation instance on which the callback is invoked on. 
-     * @param service first callback param
-     * @param properties second callback param
-     */
-    void accept(T instance, S service, Dictionary<String, Object> properties);
-
-    default CbTypeServiceDict<T, S> andThen(CbTypeServiceDict<? super T, S> after) {
-        Objects.requireNonNull(after);
-        return (T instance, S service, Dictionary<String, Object> properties) -> {
-            accept(instance, service, properties);
-            after.accept(instance, service, properties);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeServiceMap.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeServiceMap.java
deleted file mode 100644
index bfe875e..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeServiceMap.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * Represents a callback(Component, Map) that is invoked on a Component implementation class. 
- * The type of the class on which the callback is invoked on is represented by the T generic parameter.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbTypeServiceMap<T, S> extends SerializableLambda {
-    /**
-     * Handles the given arguments.
-     * @param instance the Component implementation instance on which the callback is invoked on. 
-     * @param service first callback param
-     * @param properties second callback param
-     */
-    void accept(T instance, S service, Map<String, Object> properties);
-
-    default CbTypeServiceMap<T, S> andThen(CbTypeServiceMap<? super T, S> after) {
-        Objects.requireNonNull(after);
-        return (T instance, S service, Map<String, Object> properties) -> {
-            accept(instance, service, properties);
-            after.accept(instance, service, properties);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeServiceService.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeServiceService.java
deleted file mode 100644
index a81aa72..0000000
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/CbTypeServiceService.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.apache.felix.dm.lambda.callbacks;
-
-import java.util.Objects;
-
-/**
- * Represents a callback(Service, Service) that is invoked on a Component implementation class. 
- * The type of the class on which the callback is invoked on is represented by the T generic parameter.
- * 
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-@FunctionalInterface
-public interface CbTypeServiceService<T, S> extends SerializableLambda {
-    /**
-     * Handles the given arguments.
-     * @param instance the Component implementation instance on which the callback is invoked on. 
-     * @param old first callback param
-     * @param replace second callback param
-     */
-    void accept(T instance, S old, S replace);
-
-    default CbTypeServiceService<T, S> andThen(CbTypeServiceService<? super T, S> after) {
-        Objects.requireNonNull(after);
-        return (T instance, S old, S replace) -> {
-            accept(instance, old, replace);
-            after.accept(instance, old, replace);
-        };
-    }
-}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCb.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCb.java
new file mode 100644
index 0000000..1e1f6f6
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCb.java
@@ -0,0 +1,24 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+/**
+ * Represents a method reference to a no-args callback method from an arbitrary Object instance.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface InstanceCb {
+    /**
+     * Implements the callback method.
+     */
+    void cb();
+
+    default InstanceCb andThen(InstanceCb after) {
+        Objects.requireNonNull(after);
+        return () -> {
+            cb();
+            after.cb();
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbBundle.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbBundle.java
new file mode 100644
index 0000000..400d6a3
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbBundle.java
@@ -0,0 +1,27 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+import org.osgi.framework.Bundle;
+
+/**
+ * Represents a callback(Bundle) on an Object instance.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface InstanceCbBundle extends SerializableLambda {
+    /**
+     * Handles the given argument.
+     * @param bundle the callback parameter
+     */
+    void accept(Bundle bundle);
+
+    default InstanceCbBundle andThen(InstanceCbBundle after) {
+        Objects.requireNonNull(after);
+        return (Bundle bundle) -> {
+            accept(bundle);
+            after.accept(bundle);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbBundleComponent.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbBundleComponent.java
new file mode 100644
index 0000000..d0ae29b
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbBundleComponent.java
@@ -0,0 +1,29 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+import org.apache.felix.dm.Component;
+import org.osgi.framework.Bundle;
+
+/**
+ * Represents a callback(Bundle, Component) on an Object instance.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface InstanceCbBundleComponent {
+    /**
+     * Handles the given arguments.
+     * @param component the callback parameter
+     * @param bundle the callback parameter
+     */
+    void accept(Bundle bundle, Component component);
+
+    default InstanceCbBundleComponent andThen(InstanceCbBundleComponent after) {
+        Objects.requireNonNull(after);
+        return (Bundle bundle, Component component) -> {
+            accept(bundle, component);
+            after.accept(bundle, component);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbComponent.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbComponent.java
new file mode 100644
index 0000000..20888fd
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbComponent.java
@@ -0,0 +1,27 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+import org.apache.felix.dm.Component;
+
+/**
+ * Represents a callback(Component)  on an Object instance.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface InstanceCbComponent {
+    /**
+     * Handles the given argument.
+     * @param component the callback parameter
+     */
+    void accept(Component component);
+
+    default InstanceCbComponent andThen(InstanceCbComponent after) {
+        Objects.requireNonNull(after);
+        return (Component component) -> {
+            accept(component);
+            after.accept(component);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbConfiguration.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbConfiguration.java
new file mode 100644
index 0000000..6f60523
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbConfiguration.java
@@ -0,0 +1,28 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+/**
+ * Represents a reference to a callback on an Object instance that takes Configuration type as argument.
+ * For more informations about configuration type, please refer to {@link CbConfiguration}.
+ * 
+ * <p> The T generic parameter represents the type of the configuration class passed to the callback argument. 
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface InstanceCbConfiguration<T> extends SerializableLambda {
+    /**
+     * Handles the given argument.
+     * @param configType the configuration type
+     */
+    void accept(T configType);
+
+    default InstanceCbConfiguration<T> andThen(InstanceCbConfiguration<T> after) {
+        Objects.requireNonNull(after);
+        return (T configProxy) -> {
+            accept(configProxy);
+            after.accept(configProxy);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbConfigurationComponent.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbConfigurationComponent.java
new file mode 100644
index 0000000..1feaea3
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbConfigurationComponent.java
@@ -0,0 +1,32 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+import org.apache.felix.dm.Component;
+
+/**
+ * Represents a callback(Configuration, Component) that is invoked on a Component implementation class. 
+ * The type of the class on which the callback is invoked on is represented by the T generic parameter.
+ * For more informations about configuration type, please refer to {@link CbConfiguration}.
+ * 
+ * <p> The T generic parameter represents the type of the configuration class passed to the callback argument. 
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface InstanceCbConfigurationComponent<T> extends SerializableLambda {
+    /**
+     * Handles the given arguments
+     * @param instance the Component implementation instance on which the callback is invoked on. 
+     * @param component the callback Component 
+     */
+    void accept(T instance, Component component);
+
+    default InstanceCbConfigurationComponent<T> andThen(InstanceCbConfigurationComponent<T> after) {
+        Objects.requireNonNull(after);
+        return (T instance, Component component) -> {
+            accept(instance, component);
+            after.accept(instance, component);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbDictionary.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbDictionary.java
new file mode 100644
index 0000000..53f3d02
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbDictionary.java
@@ -0,0 +1,26 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Dictionary;
+import java.util.Objects;
+
+/**
+ * Represents a callback(Dictionary) on an Object instance.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface InstanceCbDictionary {
+    /**
+     * Handles the given argument.
+     * @param conf the properties
+     */
+    void accept(Dictionary<String, Object> conf);
+
+    default InstanceCbDictionary andThen(InstanceCbDictionary after) {
+        Objects.requireNonNull(after);
+        return (Dictionary<String, Object> conf) -> {
+            accept(conf);
+            after.accept(conf);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbDictionaryComponent.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbDictionaryComponent.java
new file mode 100644
index 0000000..20f1a0b
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbDictionaryComponent.java
@@ -0,0 +1,29 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Dictionary;
+import java.util.Objects;
+
+import org.apache.felix.dm.Component;
+
+/**
+ * Represents a callback(Dictionary, Component) on an Object instance.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface InstanceCbDictionaryComponent {
+    /**
+     * Handles the given arguments.
+     * @param properties some service properties
+     * @param component a Component
+     */
+    void accept(Dictionary<String, Object> properties, Component component);
+
+    default InstanceCbDictionaryComponent andThen(InstanceCbDictionaryComponent after) {
+        Objects.requireNonNull(after);
+        return (Dictionary<String, Object> properties, Component component) -> {
+            accept(properties, component);
+            after.accept(properties, component);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbFuture.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbFuture.java
new file mode 100644
index 0000000..f2b2662
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbFuture.java
@@ -0,0 +1,25 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+/**
+ * Represents a callback that accepts the result of a CompletableFuture. The callback is invoked on an Object instance.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface InstanceCbFuture<F> {
+    /**
+     * Handles the result of a CompletableFuture operation.
+     * @param future the result of a CompletableFuture operation.
+     */
+    void accept(F future);
+
+    default InstanceCbFuture<F> andThen(InstanceCbFuture<? super F> after) {
+        Objects.requireNonNull(after);
+        return (F f) -> {
+            accept(f);
+            after.accept(f);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbRefServiceRefService.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbRefServiceRefService.java
new file mode 100644
index 0000000..297e109
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbRefServiceRefService.java
@@ -0,0 +1,30 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Represents a swap callback(ServiceReference, Service, ServiceReference, Service) on an Object instance.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface InstanceCbRefServiceRefService<S> {
+    /**
+     * Handles the given arguments
+     * @param oldRef the old service reference
+     * @param old the old service
+     * @param replaceRef the replace service reference
+     * @param replace the replace service
+     */
+    void accept(ServiceReference<S> oldRef, S old, ServiceReference<S> replaceRef, S replace);
+
+    default InstanceCbRefServiceRefService<S> andThen(InstanceCbRefServiceRefService<S> after) {
+        Objects.requireNonNull(after);
+        return (ServiceReference<S> oldRef, S old, ServiceReference<S> replaceRef, S replace) -> {
+            accept(oldRef, old, replaceRef, replace);
+            after.accept(oldRef, old, replaceRef, replace);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbRefServiceRefServiceComponent.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbRefServiceRefServiceComponent.java
new file mode 100644
index 0000000..60c5378
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbRefServiceRefServiceComponent.java
@@ -0,0 +1,32 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+import org.apache.felix.dm.Component;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Represents a swap callback(ServiceReference, Service, ServiceReference, Service, Component) on an Object instance.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface InstanceCbRefServiceRefServiceComponent<S> {
+    /**
+     * Handles the given arguments
+     * @param oldRef an old swapped service reference
+     * @param old an old swapped service
+     * @param replaceRef the new service reference
+     * @param replace the new service
+     * @param c a Component
+     */
+    void accept(ServiceReference<S> oldRef, S old, ServiceReference<S> replaceRef, S replace, Component c);
+
+    default InstanceCbRefServiceRefServiceComponent<S> andThen(InstanceCbRefServiceRefServiceComponent<S> after) {
+        Objects.requireNonNull(after);
+        return (ServiceReference<S> oldRef, S old, ServiceReference<S> replaceRef, S replace, Component c) -> {
+            accept(oldRef, old, replaceRef, replace, c);
+            after.accept(oldRef, old, replaceRef, replace, c);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbService.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbService.java
new file mode 100644
index 0000000..1755c52
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbService.java
@@ -0,0 +1,27 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+/**
+ * Represents a callback(Service) on an Object instance.
+ * 
+ * <p> The type of the service passed in argument to the callback is defined by the "S" generic parameter.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface InstanceCbService<S> {
+    /**
+     * Handles the given argument.
+     * @param service a Service
+     */
+    void accept(S service);
+
+    default InstanceCbService<S> andThen(InstanceCbService<S> after) {
+        Objects.requireNonNull(after);
+        return (S service) -> {
+            accept(service);
+            after.accept(service);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceComponent.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceComponent.java
new file mode 100644
index 0000000..cd3eb08
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceComponent.java
@@ -0,0 +1,30 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+import org.apache.felix.dm.Component;
+
+/**
+ * Represents a callback(Service, Component) on an Object instance.
+ * 
+ * <p> The type of the service passed in argument to the callback is defined by the "S" generic parameter.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface InstanceCbServiceComponent<S> {
+    /**
+     * Handles the given arguments
+     * @param c the component
+     * @param service the service
+     */
+    void accept(S service, Component c);
+
+    default InstanceCbServiceComponent<S> andThen(InstanceCbServiceComponent<S> after) {
+        Objects.requireNonNull(after);
+        return (S service, Component c) -> {
+            accept(service, c);
+            after.accept(service, c);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceComponentRef.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceComponentRef.java
new file mode 100644
index 0000000..2d48a98
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceComponentRef.java
@@ -0,0 +1,32 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+import org.apache.felix.dm.Component;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Represents a callback(Service, Component, ServiceReference) on an Object instance.
+ * 
+ * <p> The type of the service passed in argument to the callback is defined by the "S" generic parameter.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface InstanceCbServiceComponentRef<S> {
+    /**
+     * Handles the given arguments.
+     * @param c a Component
+     * @param ref the service reference
+     * @param service the service
+     */
+    void accept(S service, Component c, ServiceReference<S> ref);
+
+    default InstanceCbServiceComponentRef<S> andThen(InstanceCbServiceComponentRef<S> after) {
+        Objects.requireNonNull(after);
+        return (S service, Component c, ServiceReference<S> ref) -> {
+            accept(service, c, ref);
+            after.accept(service, c, ref);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceDict.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceDict.java
new file mode 100644
index 0000000..a65422b
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceDict.java
@@ -0,0 +1,29 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Dictionary;
+import java.util.Objects;
+
+/**
+ * Represents a callback(Service, Dictionary) on an Object instance.
+ * 
+ * <p> The type of the service passed in argument to the callback is defined by the "S" generic parameter.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface InstanceCbServiceDict<S> {
+    /**
+     * Handles the given arguments.
+     * @param service a Service
+     * @param properties a Dictionary
+     */
+    void accept(S service, Dictionary<String, Object> properties);
+
+    default InstanceCbServiceDict<S> andThen(InstanceCbServiceDict<S> after) {
+        Objects.requireNonNull(after);
+        return (S service, Dictionary<String, Object> properties) -> {
+            accept(service, properties);
+            after.accept(service, properties);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceMap.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceMap.java
new file mode 100644
index 0000000..733a15f
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceMap.java
@@ -0,0 +1,29 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Represents a callback(Service, Map) on an Object instance.
+ * 
+ * <p> The type of the service passed in argument to the callback is defined by the "S" generic parameter.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface InstanceCbServiceMap<S> {
+    /**
+     * Handles the given arguments.
+     * @param service a Service 
+     * @param properties a Map
+     */
+    void accept(S service, Map<String, Object> properties);
+
+    default InstanceCbServiceMap<S> andThen(InstanceCbServiceMap<S> after) {
+        Objects.requireNonNull(after);
+        return (S service, Map<String, Object> properties) -> {
+            accept(service, properties);
+            after.accept(service, properties);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceRef.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceRef.java
new file mode 100644
index 0000000..1b22c05
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceRef.java
@@ -0,0 +1,30 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Represents a callback(Service, ServiceReference) on an Object instance.
+ * 
+ * <p> The type of the service passed in argument to the callback is defined by the "S" generic parameter.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface InstanceCbServiceRef<S> {
+    /**
+     * Handles the given arguments.
+     * @param ref a Service Reference
+     * @param service a Service
+     */
+    void accept(S service, ServiceReference<S> ref);
+
+    default InstanceCbServiceRef<S> andThen(InstanceCbServiceRef<S> after) {
+        Objects.requireNonNull(after);
+        return (S service, ServiceReference<S> ref) -> {
+            accept(service, ref);
+            after.accept(service, ref);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceService.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceService.java
new file mode 100644
index 0000000..1f5077b
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceService.java
@@ -0,0 +1,28 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+/**
+ * Represents a swap callback(Service, Service) on an Object instance.
+ * 
+ * <p> The type of the service passed in argument to the callback is defined by the "S" generic parameter.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface InstanceCbServiceService<S> extends SerializableLambda {
+    /**
+     * Handles the given argument
+     * @param old a Service
+     * @param replace a Service
+     */
+    void accept(S old, S replace);
+
+    default InstanceCbServiceService<S> andThen(InstanceCbServiceService<S> after) {
+        Objects.requireNonNull(after);
+        return (S old, S replace) -> {
+            accept(old, replace);
+            after.accept(old, replace);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceServiceComponent.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceServiceComponent.java
new file mode 100644
index 0000000..d48a9bb
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/callbacks/InstanceCbServiceServiceComponent.java
@@ -0,0 +1,31 @@
+package org.apache.felix.dm.lambda.callbacks;
+
+import java.util.Objects;
+
+import org.apache.felix.dm.Component;
+
+/**
+ * Represents a swap callback(Service, Service, Component) on an Object instance.
+ * 
+ * <p> The type of the service passed in argument to the callback is defined by the "S" generic parameter.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@FunctionalInterface
+public interface InstanceCbServiceServiceComponent<S> extends SerializableLambda {
+    /**
+     * Handles the given arguments.
+     * @param c the component
+     * @param old the old service
+     * @param replace the new service
+     */
+    void accept(S old, S replace, Component c);
+
+    default InstanceCbServiceServiceComponent<S> andThen(InstanceCbServiceServiceComponent<S> after) {
+        Objects.requireNonNull(after);
+        return (S old, S replace, Component c) -> {
+            accept(old, replace, c);
+            after.accept(old, replace, c);
+        };
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/AdapterBase.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/AdapterBase.java
index 1fd3038..f8b6fef 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/AdapterBase.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/AdapterBase.java
@@ -12,9 +12,10 @@
 import org.apache.felix.dm.lambda.FluentProperty;
 import org.apache.felix.dm.lambda.FutureDependencyBuilder;
 import org.apache.felix.dm.lambda.ServiceDependencyBuilder;
+import org.apache.felix.dm.lambda.callbacks.Cb;
 import org.apache.felix.dm.lambda.callbacks.CbComponent;
-import org.apache.felix.dm.lambda.callbacks.CbConsumer;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCb;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbComponent;
 
 /**
  * Methods common to extended components like adapters or aspects.
@@ -156,18 +157,18 @@
         return (B) this;
     }
     
-    default B withSrv(Class<?> service, String filter) {
-        andThenBuild(compBuilder -> compBuilder.withSrv(service, filter));
+    default B withSvc(Class<?> service, String filter) {
+        andThenBuild(compBuilder -> compBuilder.withSvc(service, filter));
         return (B) this;
     }
 
-    default B withSrv(Class<?> ... services) {
-        andThenBuild(compBuilder -> compBuilder.withSrv(services));
+    default B withSvc(Class<?> ... services) {
+        andThenBuild(compBuilder -> compBuilder.withSvc(services));
         return (B) this;
     }
 
-    default <U> B withSrv(Class<U> service, Consumer<ServiceDependencyBuilder<U>> consumer) {
-        andThenBuild(compBuilder -> compBuilder.withSrv(service, consumer));
+    default <U> B withSvc(Class<U> service, Consumer<ServiceDependencyBuilder<U>> consumer) {
+        andThenBuild(compBuilder -> compBuilder.withSvc(service, consumer));
         return (B) this;
     }
     
@@ -186,6 +187,11 @@
         return (B) this;
     }
     
+    default B lifecycleCallbackInstance(Object lifecycleCallbackInstance) {
+        andThenBuild(compBuilder -> compBuilder.lifecycleCallbackInstance(lifecycleCallbackInstance));
+        return (B) this;
+    }
+    
     default B init(String callback) {
         andThenBuild(compBuilder -> compBuilder.init(callback));
         return (B) this;
@@ -205,103 +211,83 @@
         andThenBuild(compBuilder -> compBuilder.destroy(callback));
         return (B) this;
     }
-    
-    default B init(Object callbackInstance, String callback) {
-        andThenBuild(compBuilder -> compBuilder.init(callbackInstance, callback));
-        return (B) this;
-    }
-    
-    default B start(Object callbackInstance, String callback) {
-        andThenBuild(compBuilder -> compBuilder.start(callbackInstance, callback));
-        return (B) this;
-    }
-
-    default B stop(Object callbackInstance, String callback) {
-        andThenBuild(compBuilder -> compBuilder.stop(callbackInstance, callback));
-        return (B) this;
-    }
-
-    default B destroy(Object callbackInstance, String callback) {
-        andThenBuild(compBuilder -> compBuilder.destroy(callbackInstance, callback));
-        return (B) this;
-    }
-    
-    default <U> B init(CbConsumer<U> callback) {
+        
+    default <U> B init(Cb<U> callback) {
         andThenBuild(compBuilder -> compBuilder.init(callback));
         return (B) this;
     }
     
-    default <U> B start(CbConsumer<U> callback) {
+    default <U> B start(Cb<U> callback) {
         andThenBuild(compBuilder -> compBuilder.start(callback));
         return (B) this;
     }
 
-    default <U> B stop(CbConsumer<U> callback) {
+    default <U> B stop(Cb<U> callback) {
         andThenBuild(compBuilder -> compBuilder.stop(callback));
         return (B) this;
     }
 
-    default <U> B destroy(CbConsumer<U> callback) {
+    default <U> B destroy(Cb<U> callback) {
         andThenBuild(compBuilder -> compBuilder.destroy(callback));
         return (B) this;
     }
         
-    default <U> B init(CbTypeComponent<U> callback) {
+    default <U> B init(CbComponent<U> callback) {
         andThenBuild(compBuilder -> compBuilder.init(callback));
         return (B) this;
     }
         
-    default <U> B start(CbTypeComponent<U> callback) {
+    default <U> B start(CbComponent<U> callback) {
         andThenBuild(compBuilder -> compBuilder.start(callback));
         return (B) this;
     }
         
-    default <U> B stop(CbTypeComponent<U> callback) {
+    default <U> B stop(CbComponent<U> callback) {
         andThenBuild(compBuilder -> compBuilder.stop(callback));
         return (B) this;
     }
         
-    default <U> B destroy(CbTypeComponent<U> callback) {
+    default <U> B destroy(CbComponent<U> callback) {
         andThenBuild(compBuilder -> compBuilder.destroy(callback));
         return (B) this;
     }
         
-    default B initInstance(Runnable callback) {
+    default B initInstance(InstanceCb callback) {
         andThenBuild(compBuilder -> compBuilder.initInstance(callback));
         return (B) this;
     }
         
-    default B startInstance(Runnable callback) {
+    default B startInstance(InstanceCb callback) {
         andThenBuild(compBuilder -> compBuilder.startInstance(callback));
         return (B) this;
     }
         
-    default B stopInstance(Runnable callback) {
+    default B stopInstance(InstanceCb callback) {
         andThenBuild(compBuilder -> compBuilder.stopInstance(callback));
         return (B) this;
     }
         
-    default B destroyInstance(Runnable callback) {
+    default B destroyInstance(InstanceCb callback) {
         andThenBuild(compBuilder -> compBuilder.destroyInstance(callback));
         return (B) this;
     }
         
-    default B initInstance(CbComponent callback) {
+    default B initInstance(InstanceCbComponent callback) {
         andThenBuild(compBuilder -> compBuilder.initInstance(callback));
         return (B) this;
     }
 
-    default B startInstance(CbComponent callback) {
+    default B startInstance(InstanceCbComponent callback) {
         andThenBuild(compBuilder -> compBuilder.startInstance(callback));
         return (B) this;
     }
 
-    default B stopInstance(CbComponent callback) {
+    default B stopInstance(InstanceCbComponent callback) {
         andThenBuild(compBuilder -> compBuilder.stopInstance(callback));
         return (B) this;
     }
 
-    default B destroyInstance(CbComponent callback) {
+    default B destroyInstance(InstanceCbComponent callback) {
         andThenBuild(compBuilder -> compBuilder.destroyInstance(callback));
         return (B) this;
     }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/BundleAdapterBuilderImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/BundleAdapterBuilderImpl.java
index 8cd257e..bb13512 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/BundleAdapterBuilderImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/BundleAdapterBuilderImpl.java
@@ -12,9 +12,9 @@
 import org.apache.felix.dm.lambda.BundleAdapterBuilder;
 import org.apache.felix.dm.lambda.ComponentBuilder;
 import org.apache.felix.dm.lambda.callbacks.CbBundle;
-import org.apache.felix.dm.lambda.callbacks.CbComponentBundle;
-import org.apache.felix.dm.lambda.callbacks.CbTypeBundle;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponentBundle;
+import org.apache.felix.dm.lambda.callbacks.CbBundleComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbBundle;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbBundleComponent;
 import org.osgi.framework.Bundle;
 
 public class BundleAdapterBuilderImpl implements AdapterBase<BundleAdapterBuilder>, BundleAdapterBuilder {
@@ -82,45 +82,44 @@
         return this;
     }
 
-    public BundleAdapterBuilder cb(String ... callbacks) {
-        return cbi(null, callbacks);
+    public BundleAdapterBuilder add(String callback) {
+        return callbacks(callback, null, null);
     }
     
-    public BundleAdapterBuilder cbi(Object callbackInstance, String ... callbacks) {
-        switch (callbacks.length) {
-        case 1:
-            return cbi(callbackInstance, callbacks[0], null, null);
-            
-        case 2:
-            return cbi(callbackInstance, callbacks[0], null, callbacks[1]);
-            
-        case 3:
-            return cbi(callbackInstance, callbacks[0], callbacks[1], callbacks[2]);
-            
-        default:
-            throw new IllegalArgumentException("wrong number of arguments: " + callbacks.length + ". " +
-                "Possible arguments: [add], [add, remove] or [add, change, remove]");
-        }
+    public BundleAdapterBuilder change(String callback) {
+        return callbacks(null, callback, null);
     }
     
-    private BundleAdapterBuilder cbi(Object callbackInstance, String add, String change, String remove) {
-        checkHasNoMethodRefs();
+    public BundleAdapterBuilder remove(String callback) {
+        return callbacks(null, null, callback);
+    }
+    
+    public BundleAdapterBuilder callbackInstance(Object callbackInstance) {
         m_callbackInstance = callbackInstance;
-        m_add = add;
-        m_change = change;
-        m_remove = remove;
         return this;
     }
     
-    public <T> BundleAdapterBuilder cb(CbTypeBundle<T> add) {
-        return cb(add, (CbTypeBundle<T>) null, (CbTypeBundle<T>) null);
+    private BundleAdapterBuilder callbacks(String add, String change, String remove) {
+        checkHasNoMethodRefs();
+        m_add = add != null ? add : m_add;
+        m_change = change != null ? change : m_change;
+        m_remove = remove != null ? remove : m_remove;
+        return this;
+    }
+    
+    public <T> BundleAdapterBuilder add(CbBundle<T> add) {
+        return callbacks(add, (CbBundle<T>) null, (CbBundle<T>) null);
     }
 
-    public <T> BundleAdapterBuilder cb(CbTypeBundle<T> add, CbTypeBundle<T> remove) {
-        return cb(add, null, remove);
+    public <T> BundleAdapterBuilder change(CbBundle<T> change) {
+        return callbacks(null, change, null);
     }
 
-    public <T> BundleAdapterBuilder cb(CbTypeBundle<T> add, CbTypeBundle<T> change, CbTypeBundle<T> remove) {
+    public <T> BundleAdapterBuilder remove(CbBundle<T> remove) {
+        return callbacks(null, null, remove);
+    }
+
+    private <T> BundleAdapterBuilder callbacks(CbBundle<T> add, CbBundle<T> change, CbBundle<T> remove) {
         if (add != null) {
             Class<T> type = Helpers.getLambdaArgType(add, 0);
             setComponentCallbackRef(Cb.ADD, type, (instance, component, bundle) -> { add.accept((T) instance, bundle); });
@@ -136,57 +135,69 @@
         return this;
     }
     
-    public BundleAdapterBuilder cbi(CbBundle add) {
-        return cbi(add, null, null);
-    }
-
-    public BundleAdapterBuilder cbi(CbBundle add, CbBundle remove) {
-        return cbi(add, null, remove);
+    public BundleAdapterBuilder add(InstanceCbBundle add) {
+        return callbacks(add, null, null);
     }
     
-    public BundleAdapterBuilder cbi(CbBundle add, CbBundle change, CbBundle remove) {
+    public BundleAdapterBuilder change(InstanceCbBundle change) {
+        return callbacks(null, change, null);
+    }
+
+    public BundleAdapterBuilder remove(InstanceCbBundle remove) {
+        return callbacks(null, null, remove);
+    }
+
+    public BundleAdapterBuilder callbacks(InstanceCbBundle add, InstanceCbBundle change, InstanceCbBundle remove) {
         if (add != null) setInstanceCallbackRef(Cb.ADD, (instance, component, bundle) -> { add.accept(bundle); });
         if (change != null) setInstanceCallbackRef(Cb.CHG, (instance, component, bundle) -> { change.accept(bundle); });
         if (remove != null) setInstanceCallbackRef(Cb.REM, (instance, component, bundle) -> { remove.accept(bundle); });
         return this;
     }
     
-    public <T> BundleAdapterBuilder cb(CbTypeComponentBundle<T> add) {
-        return cb((CbTypeComponentBundle<T>) add, (CbTypeComponentBundle<T>) null, (CbTypeComponentBundle<T>) null);
+    public <T> BundleAdapterBuilder add(CbBundleComponent<T> add) {
+        return callbacks(add, null, null);
     }
     
-    public <T> BundleAdapterBuilder cb(CbTypeComponentBundle<T> add, CbTypeComponentBundle<T> remove) {
-        return cb(add, null, remove);
+    public <T> BundleAdapterBuilder change(CbBundleComponent<T> change) {
+        return callbacks(null, change, null);
     }
     
-    public <T> BundleAdapterBuilder cb(CbTypeComponentBundle<T> add, CbTypeComponentBundle<T> change, CbTypeComponentBundle<T> remove) {
+    public <T> BundleAdapterBuilder remove(CbBundleComponent<T> remove) {
+        return callbacks(null, null, remove);
+    }
+    
+    public <T> BundleAdapterBuilder callbacks(CbBundleComponent<T> add, CbBundleComponent<T> change, CbBundleComponent<T> remove) {
         if (add != null) {
             Class<T> type = Helpers.getLambdaArgType(add, 0);
-            return setComponentCallbackRef(Cb.ADD, type, (instance, component, bundle) -> { add.accept((T) instance, component, bundle); });
+            return setComponentCallbackRef(Cb.ADD, type, (instance, component, bundle) -> { add.accept((T) instance, bundle, component); });
         }
         if (change != null) {
             Class<T> type = Helpers.getLambdaArgType(change, 0);
-            return setComponentCallbackRef(Cb.CHG, type, (instance, component, bundle) -> { change.accept((T) instance, component, bundle); });
+            return setComponentCallbackRef(Cb.CHG, type, (instance, component, bundle) -> { change.accept((T) instance, bundle, component); });
         }
         if (remove != null) {
             Class<T> type = Helpers.getLambdaArgType(remove, 0);
-            return setComponentCallbackRef(Cb.ADD, type, (instance, component, bundle) -> { remove.accept((T) instance, component, bundle); });
+            return setComponentCallbackRef(Cb.ADD, type, (instance, component, bundle) -> { remove.accept((T) instance, bundle, component); });
         }
         return this;
     }
     
-    public BundleAdapterBuilder cbi(CbComponentBundle add) {
-        return cbi(add, null, null);
+    public BundleAdapterBuilder add(InstanceCbBundleComponent add) {
+        return callbacks(add, null, null);
     }
     
-    public BundleAdapterBuilder cbi(CbComponentBundle add, CbComponentBundle remove) {
-        return cbi(add, null, remove);
+    public BundleAdapterBuilder change(InstanceCbBundleComponent change) {
+        return callbacks(null, change, null);
     }
-
-    public BundleAdapterBuilder cbi(CbComponentBundle add, CbComponentBundle change, CbComponentBundle remove) {
-        if (add != null) setInstanceCallbackRef(Cb.ADD, (instance, component, bundle) -> { add.accept(component, bundle); });
-        if (change != null) setInstanceCallbackRef(Cb.CHG, (instance, component, bundle) -> { change.accept(component, bundle); });
-        if (remove != null) setInstanceCallbackRef(Cb.REM, (instance, component, bundle) -> { remove.accept(component, bundle); });
+    
+    public BundleAdapterBuilder remove(InstanceCbBundleComponent remove) {
+        return callbacks(null, null, remove);
+    }
+    
+    public BundleAdapterBuilder callbacks(InstanceCbBundleComponent add, InstanceCbBundleComponent change, InstanceCbBundleComponent remove) {
+        if (add != null) setInstanceCallbackRef(Cb.ADD, (instance, component, bundle) -> { add.accept(bundle, component); });
+        if (change != null) setInstanceCallbackRef(Cb.CHG, (instance, component, bundle) -> { change.accept(bundle, component); });
+        if (remove != null) setInstanceCallbackRef(Cb.REM, (instance, component, bundle) -> { remove.accept(bundle, component); });
         return this;
     }
 
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/BundleDependencyBuilderImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/BundleDependencyBuilderImpl.java
index fe77432..7cd6717 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/BundleDependencyBuilderImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/BundleDependencyBuilderImpl.java
@@ -6,7 +6,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.function.Supplier;
+import java.util.function.Function;
 import java.util.stream.Stream;
 
 import org.apache.felix.dm.BundleDependency;
@@ -14,9 +14,9 @@
 import org.apache.felix.dm.DependencyManager;
 import org.apache.felix.dm.lambda.BundleDependencyBuilder;
 import org.apache.felix.dm.lambda.callbacks.CbBundle;
-import org.apache.felix.dm.lambda.callbacks.CbComponentBundle;
-import org.apache.felix.dm.lambda.callbacks.CbTypeBundle;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponentBundle;
+import org.apache.felix.dm.lambda.callbacks.CbBundleComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbBundle;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbBundleComponent;
 import org.osgi.framework.Bundle;
 
 @SuppressWarnings("unchecked")
@@ -34,7 +34,7 @@
 	private boolean m_propagate;
 	private Object m_propagateInstance;
 	private String m_propagateMethod;
-	private Supplier<Dictionary<?, ?>> m_propagateSupplier;
+	private Function<Bundle, Dictionary<?, ?>> m_propagateCallback;
 	private final Component m_component;
     
     enum Cb {
@@ -55,13 +55,14 @@
 	 */
 	private class Propagate {
 		@SuppressWarnings("unused")
-		Dictionary<?, ?> propagate() {
-			return m_propagateSupplier.get();
+		Dictionary<?, ?> propagate(Bundle bundle) {
+			return m_propagateCallback.apply(bundle);
 		}
 	}
 
     public BundleDependencyBuilderImpl (Component component) {
         m_component = component;
+        m_required = Helpers.isDependencyRequiredByDefault(component);
     }
 
     @Override
@@ -121,7 +122,7 @@
 
     @Override
     public BundleDependencyBuilder propagate(Object instance, String method) {
-        if (m_propagateSupplier != null || m_propagate) throw new IllegalStateException("Propagate callback already set.");
+        if (m_propagateCallback != null || m_propagate) throw new IllegalStateException("Propagate callback already set.");
         Objects.nonNull(method);
         Objects.nonNull(instance);
         m_propagateInstance = instance;
@@ -130,42 +131,38 @@
     }
 
     @Override
-    public BundleDependencyBuilder propagate(Supplier<Dictionary<?, ?>> instance) {
+    public BundleDependencyBuilder propagate(Function<Bundle, Dictionary<?, ?>> instance) {
         if (m_propagateInstance != null || m_propagate) throw new IllegalStateException("Propagate callback already set.");
-        m_propagateSupplier = instance;
+        m_propagateCallback = instance;
         return this;
     }
-        
-    public BundleDependencyBuilder cb(String ... callbacks) {
-        return cb(null, callbacks);
-    }
     
     @Override
-    public BundleDependencyBuilder cb(Object callbackInstance, String ... callbacks) {
-        switch (callbacks.length) {
-        case 1:
-            cbi(callbackInstance, callbacks[0], null, null);
-            break;
-            
-        case 2:
-            cbi(callbackInstance, callbacks[0], null, callbacks[1]);
-            break;
-            
-        case 3:
-            cbi(callbackInstance, callbacks[0], callbacks[1], callbacks[2]);
-            break;
-            
-        default:
-            throw new IllegalArgumentException("wrong number of arguments: " + callbacks.length + ". " +
-                "Possible arguments: [add], [add, remove] or [add, change, remove]");
-        }
+    public BundleDependencyBuilder callbackInstance(Object callbackInstance) {
+        m_instance = callbackInstance;
+        return this;
+    }
 
+    @Override
+    public BundleDependencyBuilder add(String add) {
+        callbacks(add, null, null);
         return this;
     }
     
-    private BundleDependencyBuilder cbi(Object callbackInstance, String added, String changed, String removed) {
+    @Override
+    public BundleDependencyBuilder change(String change) {
+        callbacks(null, change, null);
+        return this;
+    }
+    
+    @Override
+    public BundleDependencyBuilder remove(String remove) {
+        callbacks(null, null, remove);
+        return this;
+    }
+            
+    private BundleDependencyBuilder callbacks(String added, String changed, String removed) {
         requiresNoMethodRefs();
-        m_instance = callbackInstance;
         m_added = added != null ? added : m_added;
         m_changed = changed != null ? changed : m_changed;
         m_removed = removed != null ? removed : m_removed;
@@ -174,17 +171,21 @@
     }
 
     @Override
-    public <T> BundleDependencyBuilder cb(CbTypeBundle<T> add) {
-        return cb(add, null, null);
+    public <T> BundleDependencyBuilder add(CbBundle<T> add) {
+        return callbacks(add, null, null);
     }
     
     @Override
-    public <T> BundleDependencyBuilder cb(CbTypeBundle<T> add, CbTypeBundle<T> remove) {
-        return cb(add, null, remove);
+    public <T> BundleDependencyBuilder change(CbBundle<T> change) {
+        return callbacks(null, change, null);
     }
     
     @Override
-    public <T> BundleDependencyBuilder cb(CbTypeBundle<T> add, CbTypeBundle<T> change, CbTypeBundle<T> remove) {
+    public <T> BundleDependencyBuilder remove(CbBundle<T> remove) {
+        return callbacks(null, null, remove);
+    }
+    
+    private <T> BundleDependencyBuilder callbacks(CbBundle<T> add, CbBundle<T> change, CbBundle<T> remove) {
         if (add != null) {
             setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), (inst, component, bundle) -> add.accept ((T) inst, bundle));
         }
@@ -198,41 +199,49 @@
     }
 
     @Override
-    public <T> BundleDependencyBuilder cb(CbTypeComponentBundle<T> add) {
-        return cb(add, null, null);
+    public <T> BundleDependencyBuilder add(CbBundleComponent<T> add) {
+        return callbacks(add, null, null);
     }
     
     @Override
-    public <T> BundleDependencyBuilder cb(CbTypeComponentBundle<T> add, CbTypeComponentBundle<T> remove) {
-        return cb(add, null, remove);
+    public <T> BundleDependencyBuilder change(CbBundleComponent<T> change) {
+        return callbacks(null, change, null);
     }
     
     @Override
-    public <T> BundleDependencyBuilder cb(CbTypeComponentBundle<T> add, CbTypeComponentBundle<T> change, CbTypeComponentBundle<T> remove) {
+    public <T> BundleDependencyBuilder remove(CbBundleComponent<T> remove) {
+        return callbacks(null, null, remove);
+    }
+    
+    private <T> BundleDependencyBuilder callbacks(CbBundleComponent<T> add, CbBundleComponent<T> change, CbBundleComponent<T> remove) {
         if (add != null) {
-            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), (inst, component, bundle) -> add.accept ((T) inst, component, bundle));
+            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), (inst, component, bundle) -> add.accept ((T) inst, bundle, component));
         }
         if (change != null) {
-            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 0), (inst, component, bundle) -> change.accept ((T) inst, component, bundle));
+            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 0), (inst, component, bundle) -> change.accept ((T) inst, bundle, component));
         }
         if (remove != null) {
-            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 0), (inst, component, bundle) -> remove.accept ((T) inst, component, bundle));
+            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 0), (inst, component, bundle) -> remove.accept ((T) inst, bundle, component));
         }
         return this;  
     }
     
     @Override
-    public BundleDependencyBuilder cbi(CbBundle add) {
-        return cbi(add, null, null);
+    public BundleDependencyBuilder add(InstanceCbBundle add) {
+        return callbacks(add, null, null);
     }
     
     @Override
-    public BundleDependencyBuilder cbi(CbBundle add, CbBundle remove) {
-        return cbi(add, null, remove);
+    public BundleDependencyBuilder change(InstanceCbBundle change) {
+        return callbacks(null, change, null);
     }
     
     @Override
-    public BundleDependencyBuilder cbi(CbBundle add, CbBundle change, CbBundle remove) {
+    public BundleDependencyBuilder remove(InstanceCbBundle remove) {
+        return callbacks(null, null, remove);
+    }
+    
+    private BundleDependencyBuilder callbacks(InstanceCbBundle add, InstanceCbBundle change, InstanceCbBundle remove) {
         if (add != null) setInstanceCallbackRef(Cb.ADD, (inst, component, bundle) -> add.accept(bundle));
         if (change != null) setInstanceCallbackRef(Cb.CHG, (inst, component, bundle) -> change.accept(bundle));
         if (remove != null) setInstanceCallbackRef(Cb.REM, (inst, component, bundle) -> remove.accept(bundle));
@@ -240,20 +249,24 @@
     }
 
     @Override
-    public BundleDependencyBuilder cbi(CbComponentBundle add) {
-        return cbi(add, null, null);
+    public BundleDependencyBuilder add(InstanceCbBundleComponent add) {
+        return callbacks(add, null, null);
     }
     
     @Override
-    public BundleDependencyBuilder cbi(CbComponentBundle add, CbComponentBundle remove) {
-        return cbi(add, null, remove);
+    public BundleDependencyBuilder change(InstanceCbBundleComponent add) {
+        return callbacks(add, null, null);
+    }
+
+    @Override
+    public BundleDependencyBuilder remove(InstanceCbBundleComponent remove) {
+        return callbacks(null, null, remove);
     }
     
-    @Override
-    public BundleDependencyBuilder cbi(CbComponentBundle add, CbComponentBundle change, CbComponentBundle remove) {
-        if (add != null) setInstanceCallbackRef(Cb.ADD, (inst, component, bundle) -> add.accept(component, bundle));
-        if (change != null) setInstanceCallbackRef(Cb.CHG, (inst, component, bundle) -> change.accept(component, bundle));
-        if (remove != null) setInstanceCallbackRef(Cb.REM, (inst, component, bundle) -> remove.accept(component, bundle));
+    private BundleDependencyBuilder callbacks(InstanceCbBundleComponent add, InstanceCbBundleComponent change, InstanceCbBundleComponent remove) {
+        if (add != null) setInstanceCallbackRef(Cb.ADD, (inst, component, bundle) -> add.accept(bundle, component));
+        if (change != null) setInstanceCallbackRef(Cb.CHG, (inst, component, bundle) -> change.accept(bundle, component));
+        if (remove != null) setInstanceCallbackRef(Cb.REM, (inst, component, bundle) -> remove.accept(bundle, component));
         return this;
     }
 
@@ -280,7 +293,7 @@
             dep.setPropagate(true);
         } else if (m_propagateInstance != null) {
             dep.setPropagate(m_propagateInstance, m_propagateMethod);
-        } else if (m_propagateSupplier != null) {
+        } else if (m_propagateCallback != null) {
         	dep.setPropagate(new Propagate(), "propagate");
         }
         
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/CompletableFutureDependencyImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/CompletableFutureDependencyImpl.java
index d41456f..ae03fdf 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/CompletableFutureDependencyImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/CompletableFutureDependencyImpl.java
@@ -14,7 +14,7 @@
 import org.apache.felix.dm.context.EventType;
 import org.apache.felix.dm.lambda.FutureDependencyBuilder;
 import org.apache.felix.dm.lambda.callbacks.CbFuture;
-import org.apache.felix.dm.lambda.callbacks.CbTypeFuture;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbFuture;
 import org.osgi.service.log.LogService;
 
 public class CompletableFutureDependencyImpl<F> extends AbstractDependency<CompletableFutureDependencyImpl<F>> implements FutureDependencyBuilder<F> {
@@ -23,8 +23,8 @@
 	private Component m_comp;
 	private boolean m_async;
 	private Executor m_exec;
-    private CbFuture<F> m_accept = (future) -> {};
-    private CbTypeFuture<Object, F> m_accept2;
+    private InstanceCbFuture<F> m_accept = (future) -> {};
+    private CbFuture<Object, F> m_accept2;
     private Class<?> m_accept2Type;
     
 	public CompletableFutureDependencyImpl(Component c, CompletableFuture<F> future) {
@@ -51,24 +51,24 @@
 	}
 
 	@Override
-    public FutureDependencyBuilder<F> cb(String callback) {
-	    return cbi(null, callback);
+    public FutureDependencyBuilder<F> complete(String callback) {
+	    return complete(null, callback);
 	}
 	
 	@Override
-    public FutureDependencyBuilder<F> cbi(Object callbackInstance, String callback) {
+    public FutureDependencyBuilder<F> complete(Object callbackInstance, String callback) {
 	    super.setCallbacks(callbackInstance, callback, null);
 	    return this;
 	}
 
 	@Override
-	public <T> FutureDependencyBuilder<F> cb(CbTypeFuture<T, ? super F> consumer) {
-	    return cb(consumer, false);
+	public <T> FutureDependencyBuilder<F> complete(CbFuture<T, ? super F> consumer) {
+	    return complete(consumer, false);
 	}
 
 	@SuppressWarnings("unchecked")
 	@Override
-	public <T> FutureDependencyBuilder<F> cb(CbTypeFuture<T, ? super F> consumer, boolean async) {
+	public <T> FutureDependencyBuilder<F> complete(CbFuture<T, ? super F> consumer, boolean async) {
 	    m_accept2Type = Helpers.getLambdaArgType(consumer, 0);;
 	    m_accept2 = (instance, result) -> consumer.accept((T) instance, result);
 	    m_async = async;
@@ -76,28 +76,28 @@
 	}   
 
 	@Override
-	public <T> FutureDependencyBuilder<F> cb(CbTypeFuture<T, ? super F> consumer, Executor executor) {
-	    cb(consumer, true /* async */);
+	public <T> FutureDependencyBuilder<F> complete(CbFuture<T, ? super F> consumer, Executor executor) {
+	    complete(consumer, true /* async */);
 	    m_exec = executor;
 	    return this;
 	}
 
 	@Override
-	public FutureDependencyBuilder<F> cbi(CbFuture<? super F> consumer) {
-	    cbi(consumer, false);
+	public FutureDependencyBuilder<F> complete(InstanceCbFuture<? super F> consumer) {
+	    complete(consumer, false);
 		return this;
 	}
 	
 	@Override
-	public FutureDependencyBuilder<F> cbi(CbFuture<? super F> consumer, boolean async) {
+	public FutureDependencyBuilder<F> complete(InstanceCbFuture<? super F> consumer, boolean async) {
 	    m_accept = m_accept.andThen(future -> consumer.accept(future));
 	    m_async = async;
 	    return this;
 	}   
 
     @Override
-    public FutureDependencyBuilder<F> cbi(CbFuture<? super F> consumer, Executor executor) {
-        cbi(consumer, true /* async */);
+    public FutureDependencyBuilder<F> complete(InstanceCbFuture<? super F> consumer, Executor executor) {
+        complete(consumer, true /* async */);
         m_exec = executor;
         return this;
     }
@@ -212,7 +212,7 @@
 	}
     
     /**
-     * Injects the completed fiture result in a method by reflection.
+     * Injects the completed future result in a method by reflection.
      * We try to find a method which has in its signature a parameter that is compatible with the future result
      * (including any interfaces the result may implements).
      * 
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ComponentBuilderImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ComponentBuilderImpl.java
index a5bab10..66631cf 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ComponentBuilderImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ComponentBuilderImpl.java
@@ -29,9 +29,10 @@
 import org.apache.felix.dm.lambda.FluentProperty;
 import org.apache.felix.dm.lambda.FutureDependencyBuilder;
 import org.apache.felix.dm.lambda.ServiceDependencyBuilder;
+import org.apache.felix.dm.lambda.callbacks.Cb;
 import org.apache.felix.dm.lambda.callbacks.CbComponent;
-import org.apache.felix.dm.lambda.callbacks.CbConsumer;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCb;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbComponent;
 
 public class ComponentBuilderImpl implements ComponentBuilder<ComponentBuilderImpl> {
     private final List<DependencyBuilder<?>> m_dependencyBuilders = new ArrayList<>();
@@ -369,12 +370,12 @@
     }
 
     @Override
-    public ComponentBuilderImpl withSrv(Class<?> service, String filter) {
-        return withSrv(service, srv->srv.filter(filter));
+    public ComponentBuilderImpl withSvc(Class<?> service, String filter) {
+        return withSvc(service, srv->srv.filter(filter));
     }   
 
     @Override
-    public ComponentBuilderImpl withSrv(Class<?> ... services) {
+    public ComponentBuilderImpl withSvc(Class<?> ... services) {
         for (Class<?> s : services) {
             doWithService(s);
         }
@@ -387,7 +388,7 @@
     }
 
     @Override
-    public <U> ComponentBuilderImpl withSrv(Class<U> service, Consumer<ServiceDependencyBuilder<U>> consumer) {
+    public <U> ComponentBuilderImpl withSvc(Class<U> service, Consumer<ServiceDependencyBuilder<U>> consumer) {
         ServiceDependencyBuilder<U> dep = new ServiceDependencyBuilderImpl<>(m_component, service);
         consumer.accept(dep);
         m_dependencyBuilders.add(dep);
@@ -418,6 +419,11 @@
         return this;
     }
     
+    public ComponentBuilderImpl lifecycleCallbackInstance(Object callbackInstance) {
+        m_callbackInstance = callbackInstance;
+        return this;
+    }    
+
     public ComponentBuilderImpl init(String callback) {
         ensureHasNoLifecycleMethodRefs();
         m_init = callback;
@@ -442,132 +448,112 @@
         return this;
     }
     
-    public ComponentBuilderImpl init(Object callbackInstance, String callback) {
-        m_callbackInstance = callbackInstance;
-        return init(callback);
-    }    
-
-    public ComponentBuilderImpl start(Object callbackInstance, String callback) {
-        m_callbackInstance = callbackInstance;
-        return start(callback);
-    }    
-
-    public ComponentBuilderImpl stop(Object callbackInstance, String callback) {
-        m_callbackInstance = callbackInstance;
-        return stop(callback);
-    }    
-
-    public ComponentBuilderImpl destroy(Object callbackInstance, String callback) {
-        m_callbackInstance = callbackInstance;
-        return destroy(callback);
-    }    
-
     @SuppressWarnings("unchecked")
     @Override
-    public <U> ComponentBuilderImpl init(CbConsumer<U> callback) {
+    public <T> ComponentBuilderImpl init(Cb<T> callback) {
         if (callback != null) {
-            setComponentCallbackRef(INIT, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((U) inst));
+            setComponentCallbackRef(INIT, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst));
         }
         return this;
     }
 
     @SuppressWarnings("unchecked")
     @Override
-    public <U> ComponentBuilderImpl start(CbConsumer<U> callback) {
+    public <T> ComponentBuilderImpl start(Cb<T> callback) {
         if (callback != null) {
-            setComponentCallbackRef(START, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((U) inst));
+            setComponentCallbackRef(START, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst));
         }
         return this;
     }
 
     @SuppressWarnings("unchecked")
     @Override
-    public <U> ComponentBuilderImpl stop(CbConsumer<U> callback) {
+    public <T> ComponentBuilderImpl stop(Cb<T> callback) {
         if (callback != null) {
-            setComponentCallbackRef(STOP, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((U) inst));
+            setComponentCallbackRef(STOP, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst));
         }
         return this;
     }
 
     @SuppressWarnings("unchecked")
     @Override
-    public <U> ComponentBuilderImpl destroy(CbConsumer<U> callback) {
+    public <T> ComponentBuilderImpl destroy(Cb<T> callback) {
         if (callback != null) {
-            setComponentCallbackRef(DESTROY, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((U) inst));
+            setComponentCallbackRef(DESTROY, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst));
         }
         return this;
     }
 
    @SuppressWarnings("unchecked")
    @Override
-    public <U> ComponentBuilderImpl init(CbTypeComponent<U> callback) {
+    public <T> ComponentBuilderImpl init(CbComponent<T> callback) {
         if (callback != null) {
-            setComponentCallbackRef(INIT, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((U) inst, component));
+            setComponentCallbackRef(INIT, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst, component));
         }
         return this;
     }
             
    @SuppressWarnings("unchecked")
    @Override
-    public <U> ComponentBuilderImpl start(CbTypeComponent<U> callback) {
+    public <T> ComponentBuilderImpl start(CbComponent<T> callback) {
         if (callback != null) {
-            setComponentCallbackRef(START, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((U) inst, component));
+            setComponentCallbackRef(START, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst, component));
         }
         return this;
     }
             
    @SuppressWarnings("unchecked")
    @Override
-    public <U> ComponentBuilderImpl stop(CbTypeComponent<U> callback) {
+    public <T> ComponentBuilderImpl stop(CbComponent<T> callback) {
         if (callback != null) {
-            setComponentCallbackRef(STOP, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((U) inst, component));
+            setComponentCallbackRef(STOP, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst, component));
         }
         return this;
     }
             
    @SuppressWarnings("unchecked")
    @Override
-    public <U> ComponentBuilderImpl destroy(CbTypeComponent<U> callback) {
+    public <T> ComponentBuilderImpl destroy(CbComponent<T> callback) {
         if (callback != null) {
-            setComponentCallbackRef(DESTROY, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((U) inst, component));
+            setComponentCallbackRef(DESTROY, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst, component));
         }
         return this;
     }
             
     @Override
-    public ComponentBuilderImpl initInstance(Runnable callback) {
+    public ComponentBuilderImpl initInstance(InstanceCb callback) {
         if (callback != null) {
-            setInstanceCallbackRef(INIT, (inst, component) -> callback.run());
+            setInstanceCallbackRef(INIT, (inst, component) -> callback.cb());
         }
         return this;
     }
     
     @Override
-    public ComponentBuilderImpl startInstance(Runnable callback) {
+    public ComponentBuilderImpl startInstance(InstanceCb callback) {
         if (callback != null) {
-            setInstanceCallbackRef(START, (inst, component) -> callback.run());
+            setInstanceCallbackRef(START, (inst, component) -> callback.cb());
         }
         return this;
     }
 
     @Override
-    public ComponentBuilderImpl stopInstance(Runnable callback) {
+    public ComponentBuilderImpl stopInstance(InstanceCb callback) {
         if (callback != null) {
-            setInstanceCallbackRef(STOP, (inst, component) -> callback.run());
+            setInstanceCallbackRef(STOP, (inst, component) -> callback.cb());
         }
         return this;
     }
 
     @Override
-    public ComponentBuilderImpl destroyInstance(Runnable callback) {
+    public ComponentBuilderImpl destroyInstance(InstanceCb callback) {
         if (callback != null) {
-            setInstanceCallbackRef(DESTROY, (inst, component) -> callback.run());
+            setInstanceCallbackRef(DESTROY, (inst, component) -> callback.cb());
         }
         return this;
     }
         
     @Override
-    public ComponentBuilderImpl initInstance(CbComponent callback) {
+    public ComponentBuilderImpl initInstance(InstanceCbComponent callback) {
         if (callback != null) {
             setInstanceCallbackRef(INIT, (inst, component) -> callback.accept(component));
         }
@@ -575,7 +561,7 @@
     }
   
     @Override
-    public ComponentBuilderImpl startInstance(CbComponent callback) {
+    public ComponentBuilderImpl startInstance(InstanceCbComponent callback) {
         if (callback != null) {
             setInstanceCallbackRef(START, (inst, component) -> callback.accept(component));
         }
@@ -583,7 +569,7 @@
     }
 
     @Override
-    public ComponentBuilderImpl stopInstance(CbComponent callback) {
+    public ComponentBuilderImpl stopInstance(InstanceCbComponent callback) {
         if (callback != null) {
             setInstanceCallbackRef(STOP, (inst, component) -> callback.accept(component));
         }
@@ -591,7 +577,7 @@
     }
 
     @Override
-    public ComponentBuilderImpl destroyInstance(CbComponent callback) {
+    public ComponentBuilderImpl destroyInstance(InstanceCbComponent callback) {
         if (callback != null) {
             setInstanceCallbackRef(DESTROY, (inst, component) -> callback.accept(component));
         }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ConfigurationDependencyBuilderImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ConfigurationDependencyBuilderImpl.java
index 89f48c6..2d8f2d9 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ConfigurationDependencyBuilderImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ConfigurationDependencyBuilderImpl.java
@@ -8,23 +8,28 @@
 
 import org.apache.felix.dm.Component;
 import org.apache.felix.dm.ConfigurationDependency;
+import org.apache.felix.dm.context.ComponentContext;
 import org.apache.felix.dm.lambda.ConfigurationDependencyBuilder;
-import org.apache.felix.dm.lambda.callbacks.CbComponentDictionary;
+import org.apache.felix.dm.lambda.callbacks.CbConfiguration;
+import org.apache.felix.dm.lambda.callbacks.CbConfigurationComponent;
 import org.apache.felix.dm.lambda.callbacks.CbDictionary;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponentDictionary;
-import org.apache.felix.dm.lambda.callbacks.CbTypeDictionary;
+import org.apache.felix.dm.lambda.callbacks.CbDictionaryComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbConfiguration;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbConfigurationComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbDictionary;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbDictionaryComponent;
 
 public class ConfigurationDependencyBuilderImpl implements ConfigurationDependencyBuilder {
     private String m_pid;
     private boolean m_propagate;
     private final Component m_component;
-    private String m_updateMethodName;
+    private String m_updateMethodName = "updated";
     private Object m_updateCallbackInstance;
     private boolean m_hasMethodRefs;
     private boolean m_hasReflectionCallback;
     private final List<MethodRef<Object>> m_refs = new ArrayList<>();
     private boolean m_hasComponentCallbackRefs;
-    private boolean m_needsInstance = false;
+    private Class<?> m_configType;
     
     @FunctionalInterface
     interface MethodRef<I> {
@@ -40,13 +45,7 @@
         m_pid = pid;
         return this;
     }
-
-    @Override
-    public ConfigurationDependencyBuilder pid(Class<?> pidClass) {
-        m_pid = pidClass.getName();
-        return this;
-    }
-
+    
     @Override
     public ConfigurationDependencyBuilder propagate() {
         m_propagate = true;
@@ -59,58 +58,107 @@
         return this;
     }
 
-    public ConfigurationDependencyBuilder cb(String update) {
+    public ConfigurationDependencyBuilder update(String update) {
         checkHasNoMethodRefs();
         m_hasReflectionCallback = true;
         m_updateMethodName = update;
         return this;
     }
     
-    public ConfigurationDependencyBuilder cbi(Object callbackInstance, String update) {
+    public ConfigurationDependencyBuilder update(Class<?> configType, String updateMethod) {
+        m_configType = configType;
+        return update(updateMethod);
+    }
+
+    public ConfigurationDependencyBuilder update(Object callbackInstance, String update) {
         m_updateCallbackInstance = callbackInstance;
-        cb(update);
+        update(update);
         return this;
     }
-
-    public ConfigurationDependencyBuilder needsInstance(boolean needsInstance) {
-        m_needsInstance = needsInstance;
-        return this;
+    
+    public ConfigurationDependencyBuilder update(Class<?> configType, Object callbackInstance, String update) {
+        m_updateCallbackInstance = callbackInstance;
+        return update(callbackInstance, update);        
     }
 
     @Override
-    public <T> ConfigurationDependencyBuilder cb(CbTypeDictionary<T>  callback) {
-        Class<T> type = Helpers.getLambdaArgType(callback, 0);
-        return setComponentCallbackRef(type, (instance, component, props) -> { callback.accept((T) instance, props); });
+    public <T> ConfigurationDependencyBuilder update(CbDictionary<T> callback) {
+        Class<T> componentType = Helpers.getLambdaArgType(callback, 0);
+        return setComponentCallbackRef(componentType, (instance, component, props) -> { 
+            callback.accept((T) instance, props);
+        }); 
     }
 
     @Override
-    public <T> ConfigurationDependencyBuilder cb(CbTypeComponentDictionary<T>  callback) {
-        Class<T> type = Helpers.getLambdaArgType(callback, 0);
-        return setComponentCallbackRef(type, (instance, component, props) -> { callback.accept((T) instance, component, props); });
+    public <T> ConfigurationDependencyBuilder update(CbDictionaryComponent<T> callback) {
+        Class<T> componentType = Helpers.getLambdaArgType(callback, 0);
+        return setComponentCallbackRef(componentType, (instance, component, props) -> { 
+            callback.accept((T) instance, props, component);
+        }); 
     }
 
     @Override
-    public ConfigurationDependencyBuilder cbi(CbDictionary callback) {
-        return setInstanceCallbackRef((instance, component, props) -> { callback.accept(props); });
+    public <T, U> ConfigurationDependencyBuilder update(Class<U> configClass, CbConfiguration<T, U> callback) {
+        Class<T> componentType = Helpers.getLambdaArgType(callback, 0);
+        m_pid = m_pid == null ? configClass.getName() : m_pid;
+        return setComponentCallbackRef(componentType, (instance, component, props) -> { 
+            U configProxy = ((ComponentContext) m_component).createConfigurationProxy(configClass, props);            
+            callback.accept((T) instance, configProxy);
+        }); 
+    }
+
+    @Override
+    public <T, U> ConfigurationDependencyBuilder update(Class<U> configClass, CbConfigurationComponent<T, U> callback) {
+        Class<T> componentType = Helpers.getLambdaArgType(callback, 0);
+        m_pid = m_pid == null ? configClass.getName() : m_pid;
+        return setComponentCallbackRef(componentType, (instance, component, props) -> { 
+            U configProxy = ((ComponentContext) m_component).createConfigurationProxy(configClass, props);            
+            callback.accept((T) instance, configProxy, component);
+        }); 
+    }
+
+    @Override
+    public ConfigurationDependencyBuilder update(InstanceCbDictionary callback) {
+        return setInstanceCallbackRef((instance, component, props) -> { 
+            callback.accept(props);
+        });
+    }
+
+    @Override
+    public ConfigurationDependencyBuilder update(InstanceCbDictionaryComponent callback) {
+        return setInstanceCallbackRef((instance, component, props) -> { 
+            callback.accept(props, component);
+        });
+    }
+
+    public <T> ConfigurationDependencyBuilder update(Class<T> configClass, InstanceCbConfiguration<T> updated) {
+        m_pid = m_pid == null ? configClass.getName() : m_pid;
+        return setInstanceCallbackRef((instance, component, props) -> { 
+            T configProxy = ((ComponentContext) m_component).createConfigurationProxy(configClass, props);
+            updated.accept(configProxy);
+        });
+    }
+    
+    public <T> ConfigurationDependencyBuilder update(Class<T> configClass, InstanceCbConfigurationComponent<T> updated) {
+        m_pid = m_pid == null ? configClass.getName() : m_pid;
+        return setInstanceCallbackRef((instance, component, props) -> { 
+            T configProxy = ((ComponentContext) m_component).createConfigurationProxy(configClass, props);
+            updated.accept(configProxy, component);
+        });
     }
     
     @Override
-    public ConfigurationDependencyBuilder cbi(CbComponentDictionary callback) {
-        return setInstanceCallbackRef((instance, component, props) -> { callback.accept(component, props); });
-    }
-
-    @Override
     public ConfigurationDependency build() {
+        String pid = m_pid == null ? (m_configType != null ? m_configType.getName() : null) : m_pid;
+        if (pid == null) {
+            throw new IllegalStateException("Pid not specified");
+        }
         ConfigurationDependency dep = m_component.getDependencyManager().createConfigurationDependency();
         Objects.nonNull(m_pid);
-        dep.setPid(m_pid);
+        dep.setPid(pid);
         dep.setPropagate(m_propagate);
         if (m_updateMethodName != null) {
-            if (m_updateCallbackInstance != null) {
-                dep.setCallback(m_updateCallbackInstance, m_updateMethodName, m_needsInstance);
-            } else {
-                dep.setCallback(m_updateMethodName);
-            }
+            dep.setCallback(m_updateCallbackInstance, m_updateMethodName, m_configType);
         } else if (m_refs.size() > 0) {
             // setup an internal callback object. When config is updated, we have to call each registered 
             // method references. 
@@ -121,7 +169,7 @@
                 void updated(Component comp, Dictionary<String, Object> props) {
                     m_refs.forEach(mref -> mref.accept(null, comp, props));
                 }
-            }, "updated", m_hasComponentCallbackRefs||m_needsInstance);
+            }, "updated", m_hasComponentCallbackRefs);
         }
         return dep;
     }
@@ -129,6 +177,7 @@
     private <T> ConfigurationDependencyBuilder setInstanceCallbackRef(MethodRef<T> ref) {
         checkHasNoReflectionCallbacks();
         m_hasMethodRefs = true;
+        m_updateMethodName = null;
         m_refs.add((instance, component, props) -> ref.accept(null, component, props));
         return this;
     }
@@ -136,6 +185,7 @@
     @SuppressWarnings("unchecked")
     private <T> ConfigurationDependencyBuilder setComponentCallbackRef(Class<T> type, MethodRef<T> ref) {
         checkHasNoReflectionCallbacks();
+        m_updateMethodName = null;
         m_hasMethodRefs = true;
         m_hasComponentCallbackRefs = true;
         m_refs.add((instance, component, props) -> {
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/FactoryPidAdapterBuilderImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/FactoryPidAdapterBuilderImpl.java
index c3ee095..4bec193 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/FactoryPidAdapterBuilderImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/FactoryPidAdapterBuilderImpl.java
@@ -9,12 +9,17 @@
 
 import org.apache.felix.dm.Component;
 import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.dm.context.ComponentContext;
 import org.apache.felix.dm.lambda.ComponentBuilder;
 import org.apache.felix.dm.lambda.FactoryPidAdapterBuilder;
-import org.apache.felix.dm.lambda.callbacks.CbComponentDictionary;
+import org.apache.felix.dm.lambda.callbacks.CbConfiguration;
+import org.apache.felix.dm.lambda.callbacks.CbConfigurationComponent;
 import org.apache.felix.dm.lambda.callbacks.CbDictionary;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponentDictionary;
-import org.apache.felix.dm.lambda.callbacks.CbTypeDictionary;
+import org.apache.felix.dm.lambda.callbacks.CbDictionaryComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbConfiguration;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbConfigurationComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbDictionary;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbDictionaryComponent;
 
 public class FactoryPidAdapterBuilderImpl implements AdapterBase<FactoryPidAdapterBuilder>, FactoryPidAdapterBuilder {
     private String m_factoryPid;
@@ -27,6 +32,7 @@
     private boolean m_hasReflectionCallback;
     private Consumer<ComponentBuilder<?>> m_compBuilder = (componentBuilder -> {});
     private final List<MethodRef<Object>> m_refs = new ArrayList<>();
+    private Class<?> m_configType;
 
     @FunctionalInterface
     interface MethodRef<I> {
@@ -58,12 +64,6 @@
     }
 
     @Override
-    public FactoryPidAdapterBuilder factoryPid(Class<?> pidClass) {
-        m_factoryPid = pidClass.getName();
-        return this;
-    }
-
-    @Override
     public FactoryPidAdapterBuilder propagate() {
         m_propagate = true;
         return this;
@@ -75,39 +75,91 @@
         return this;
     }
 
-    public FactoryPidAdapterBuilder cb(String update) {
+    @Override
+    public FactoryPidAdapterBuilder update(String update) {
         checkHasNoMethodRefs();
         m_hasReflectionCallback = true;
         m_updateMethodName = update;
         return this;
     }
     
-    public FactoryPidAdapterBuilder cb(Object callbackInstance, String update) {
-        cb(update);
+    @Override
+    public FactoryPidAdapterBuilder update(Class<?> configType, String updateMethod) {
+        update(updateMethod);
+        m_configType = configType;
+        return this;
+    }
+    
+    @Override
+    public FactoryPidAdapterBuilder update(Object callbackInstance, String update) {
+        update(update);
         m_updateCallbackInstance = callbackInstance;
         return this;
     }
     
     @Override
-    public <U> FactoryPidAdapterBuilder cb(CbTypeDictionary<U> callback) {
-        Class<U> type = Helpers.getLambdaArgType(callback, 0);
-        return setComponentCallbackRef(type, (instance, component, props) -> { callback.accept((U) instance, props); });
+    public FactoryPidAdapterBuilder update(Class<?> configType, Object callbackInstance, String updateMethod) {
+        update(callbackInstance, updateMethod);
+        m_configType = configType;
+        return this;
     }
     
     @Override
-    public <U> FactoryPidAdapterBuilder cb(CbTypeComponentDictionary<U> callback) {
-        Class<U> type = Helpers.getLambdaArgType(callback, 0);
-        return setComponentCallbackRef(type, (instance, component, props) -> { callback.accept((U) instance, component, props); });
+    public <T> FactoryPidAdapterBuilder update(CbDictionary<T> callback) {
+        Class<T> type = Helpers.getLambdaArgType(callback, 0);
+        return setComponentCallbackRef(type, (instance, component, props) -> { callback.accept((T) instance, props); });
+    }
+    
+    @Override
+    public <T, U> FactoryPidAdapterBuilder update(Class<U> configType, CbConfiguration<T, U> callback) {
+        Class<T> type = Helpers.getLambdaArgType(callback, 0);
+        m_factoryPid = m_factoryPid == null ? configType.getName() : m_factoryPid;
+        return setComponentCallbackRef(type, (instance, component, props) -> {
+            U configProxy = ((ComponentContext) component).createConfigurationProxy(configType, props);            
+            callback.accept((T) instance, configProxy); 
+        });
+    }
+    
+    @Override
+    public <T> FactoryPidAdapterBuilder update(CbDictionaryComponent<T> callback) {
+        Class<T> type = Helpers.getLambdaArgType(callback, 0);
+        return setComponentCallbackRef(type, (instance, component, props) -> { callback.accept((T) instance, props, component); });
     }
 
     @Override
-    public FactoryPidAdapterBuilder cbi(CbDictionary callback) {
+    public <T, U> FactoryPidAdapterBuilder update(Class<U> configType, CbConfigurationComponent<T, U> callback) {
+        Class<T> type = Helpers.getLambdaArgType(callback, 0);
+        m_factoryPid = m_factoryPid == null ? configType.getName() : m_factoryPid;
+        return setComponentCallbackRef(type, (instance, component, props) -> { 
+            U configProxy = ((ComponentContext) component).createConfigurationProxy(configType, props);            
+            callback.accept((T) instance, configProxy, component); 
+        });
+    }
+
+    @Override
+    public FactoryPidAdapterBuilder update(InstanceCbDictionary callback) {
         return setInstanceCallbackRef((instance, component, props) -> { callback.accept(props); });
     }
+    
+    @Override
+    public <T> FactoryPidAdapterBuilder update(Class<T> configType, InstanceCbConfiguration<T> callback) {
+        return setInstanceCallbackRef((instance, component, props) -> { 
+            T configProxy = ((ComponentContext) component).createConfigurationProxy(configType, props);            
+            callback.accept(configProxy);
+        });
+    }
 
     @Override
-    public FactoryPidAdapterBuilder cbi(CbComponentDictionary callback) {
-        return setInstanceCallbackRef((instance, component, props) -> { callback.accept(component, props); });
+    public FactoryPidAdapterBuilder update(InstanceCbDictionaryComponent callback) {
+        return setInstanceCallbackRef((instance, component, props) -> { callback.accept(props, component); });
+    }
+
+    @Override
+    public <T> FactoryPidAdapterBuilder update(Class<T> configType, InstanceCbConfigurationComponent<T> callback) {
+        return setInstanceCallbackRef((instance, component, props) -> { 
+            T configProxy = ((ComponentContext) component).createConfigurationProxy(configType, props);            
+            callback.accept(configProxy, component);
+        });
     }
 
     @Override
@@ -124,14 +176,14 @@
             };
             c = m_dm.createFactoryConfigurationAdapterService(m_factoryPid, "updated", m_propagate, wrapCallback);
         } else {
-            c = m_dm.createFactoryConfigurationAdapterService(m_factoryPid, m_updateMethodName, m_propagate, m_updateCallbackInstance);
+            c = m_dm.createFactoryConfigurationAdapterService(m_factoryPid, m_updateMethodName, m_propagate, m_updateCallbackInstance, m_configType);
         }
         ComponentBuilderImpl cb = new ComponentBuilderImpl(c, false);
         m_compBuilder.accept (cb);
         return cb.build();
     }
     
-    private <U> FactoryPidAdapterBuilder setInstanceCallbackRef(MethodRef<U> ref) {
+    private <T> FactoryPidAdapterBuilder setInstanceCallbackRef(MethodRef<T> ref) {
         checkHasNoReflectionCallbacks();
         m_hasMethodRefs = true;
         m_refs.add((instance, component, props) -> ref.accept(null, component, props));
@@ -139,7 +191,7 @@
     }
     
     @SuppressWarnings("unchecked")
-    private <U> FactoryPidAdapterBuilder setComponentCallbackRef(Class<U> type, MethodRef<U> ref) {
+    private <T> FactoryPidAdapterBuilder setComponentCallbackRef(Class<T> type, MethodRef<T> ref) {
         checkHasNoReflectionCallbacks();
         m_hasMethodRefs = true;
         m_refs.add((instance, component, props) -> {
@@ -147,7 +199,7 @@
                 .filter(impl -> Helpers.getClass(impl).equals(type))
                 .findFirst()
                 .orElseThrow(() -> new IllegalStateException("The method reference " + ref + " does not match any available component impl classes."));
-            ref.accept((U) componentImpl, component, props);
+            ref.accept((T) componentImpl, component, props);
         });
         return this;
     }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/Helpers.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/Helpers.java
index 50eb73c..d879e9c 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/Helpers.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/Helpers.java
@@ -12,6 +12,7 @@
 import java.util.stream.Stream;
 
 import org.apache.felix.dm.Component;
+import org.apache.felix.dm.context.ComponentContext;
 import org.apache.felix.dm.lambda.callbacks.SerializableLambda;
 
 /**
@@ -19,8 +20,31 @@
  */
 public class Helpers {
 	private final static Pattern LAMBDA_INSTANCE_METHOD_TYPE = Pattern.compile("(L[^;]+)+");
+	private final static String DEFAULT_DEPENDENCY_MODE = "org.apache.felix.dependencymanager.lambda.dependencymode";
+	private final static String REQUIRED = "required";
+	private final static String OPTIONAL = "optional";
 
 	/**
+	 * Tests if a dependency is required by default.
+	 * By default, a dependency is required, but you can configure the mode of a dependency, by configure the
+	 * DEFAULT_DEPENDENCY_MODE property in the bundle context properties. This property can take as value:
+	 * <ul><li>"required" meaning that dependencies are required by default,
+	 * <li>"optional" meaning that dependencies are optional by default.
+	 * </ul>
+	 * By default, a dependency is required.
+	 */
+	static boolean isDependencyRequiredByDefault(Component component) {
+	    String property = ((ComponentContext) component).getBundleContext().getProperty(DEFAULT_DEPENDENCY_MODE);
+	    if (REQUIRED.equalsIgnoreCase(property)) {
+	        return true;
+	    } else if (OPTIONAL.equalsIgnoreCase(property)) {
+	        return false;
+	    } else {
+	        return true;
+	    }
+	}
+	
+	/**
 	 * Gets the class name of a given object.
 	 * @param obj the object whose class has to be returned.
 	 */
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ServiceCallbacksBuilderImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ServiceCallbacksBuilderImpl.java
index 33188ac..deb6a47 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ServiceCallbacksBuilderImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ServiceCallbacksBuilderImpl.java
@@ -4,38 +4,30 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
 import java.util.stream.Stream;
 
 import org.apache.felix.dm.Component;
 import org.apache.felix.dm.lambda.ServiceCallbacksBuilder;
-import org.apache.felix.dm.lambda.callbacks.CbComponent;
-import org.apache.felix.dm.lambda.callbacks.CbComponentRef;
-import org.apache.felix.dm.lambda.callbacks.CbComponentRefService;
-import org.apache.felix.dm.lambda.callbacks.CbComponentRefServiceRefService;
-import org.apache.felix.dm.lambda.callbacks.CbComponentService;
-import org.apache.felix.dm.lambda.callbacks.CbComponentServiceService;
-import org.apache.felix.dm.lambda.callbacks.CbRef;
-import org.apache.felix.dm.lambda.callbacks.CbRefService;
 import org.apache.felix.dm.lambda.callbacks.CbRefServiceRefService;
+import org.apache.felix.dm.lambda.callbacks.CbRefServiceRefServiceComponent;
 import org.apache.felix.dm.lambda.callbacks.CbService;
+import org.apache.felix.dm.lambda.callbacks.CbServiceComponent;
+import org.apache.felix.dm.lambda.callbacks.CbServiceComponentRef;
 import org.apache.felix.dm.lambda.callbacks.CbServiceDict;
 import org.apache.felix.dm.lambda.callbacks.CbServiceMap;
+import org.apache.felix.dm.lambda.callbacks.CbServiceRef;
 import org.apache.felix.dm.lambda.callbacks.CbServiceService;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponent;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponentRef;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponentRefService;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponentRefServiceRefService;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponentService;
-import org.apache.felix.dm.lambda.callbacks.CbTypeComponentServiceService;
-import org.apache.felix.dm.lambda.callbacks.CbTypeRef;
-import org.apache.felix.dm.lambda.callbacks.CbTypeRefService;
-import org.apache.felix.dm.lambda.callbacks.CbTypeRefServiceRefService;
-import org.apache.felix.dm.lambda.callbacks.CbTypeService;
-import org.apache.felix.dm.lambda.callbacks.CbTypeServiceDict;
-import org.apache.felix.dm.lambda.callbacks.CbTypeServiceMap;
-import org.apache.felix.dm.lambda.callbacks.CbTypeServiceService;
+import org.apache.felix.dm.lambda.callbacks.CbServiceServiceComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbRefServiceRefService;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbRefServiceRefServiceComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbService;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbServiceComponent;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbServiceComponentRef;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbServiceDict;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbServiceMap;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbServiceRef;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbServiceService;
+import org.apache.felix.dm.lambda.callbacks.InstanceCbServiceServiceComponent;
 import org.osgi.framework.ServiceReference;
 
 /**
@@ -119,39 +111,29 @@
         return (B) this;
     }
 	
-    public B cb(String ... callbacks) {
-        return cbi(null, callbacks);
-    }
-    
-    public B cbi(Object callbackInstance, String ... callbacks) {
-        Objects.nonNull(callbacks);
-        switch (callbacks.length) {
-        case 1:
-            cb(callbackInstance, callbacks[0], null, null, null);
-            break;
-            
-        case 2:
-            cb(callbackInstance, callbacks[0], null, callbacks[1], null);
-            break;
-            
-        case 3:
-            cb(callbackInstance, callbacks[0], callbacks[1], callbacks[2], null);
-            break;
-            
-        case 4:
-            cb(callbackInstance, callbacks[0], callbacks[1], callbacks[2], callbacks[3]);
-            break;
-            
-        default:
-            throw new IllegalArgumentException("wrong number of arguments: " + callbacks.length + ". " +
-                "Possible arguments: [add], [add, remove], [add, change, remove], or [add, change, remove, swap]");
-        }
+    public B callbackInstance(Object callbackInstance) {
+        m_callbackInstance = callbackInstance;
         return (B) this;
     }
     
-    private B cb(Object callbackInstance, String added, String changed, String removed, String swapped) {
+    public B add(String add) {
+        return callbacks(add, null, null, null);
+    }
+        
+    public B change(String change) {
+        return callbacks(null, change, null, null);
+    }
+        
+    public B remove(String remove) {
+        return callbacks(null, null, remove, null);
+    }
+        
+    public B swap(String swap) {
+        return callbacks(null, null, null, swap);
+    }
+        
+    private B callbacks(String added, String changed, String removed, String swapped) {
 		requiresNoMethodRefs();
-        m_callbackInstance = callbackInstance;
 		m_added = added != null ? added : m_added;
 		m_changed = changed != null ? changed : m_changed;
 		m_removed = removed != null ? removed : m_removed;
@@ -160,15 +142,19 @@
 		return (B) this;
 	}
 
-    public <T> B cb(CbTypeService<T, S> add) {
-        return cb(add, null, null);
+    public <T> B add(CbService<T, S> add) {
+        return callbacks(add, null, null);
     }
     
-    public <T> B cb(CbTypeService<T, S> add, CbTypeService<T, S> remove) {
-        return cb(add, null, remove);
+    public <T> B change(CbService<T, S> change) {
+        return callbacks(null, change, null);
     }
     
-    public <T> B cb(CbTypeService<T, S> add, CbTypeService<T, S> change, CbTypeService<T, S> remove) {
+    public <T> B remove(CbService<T, S> remove) {
+        return callbacks(null, null, remove);
+    }
+    
+    private <T> B callbacks(CbService<T, S> add, CbService<T, S> change, CbService<T, S> remove) {
         if (add != null)
             setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), (inst, comp, ref, srv) -> add.accept((T) inst, srv));
         if (change != null)
@@ -178,15 +164,19 @@
         return (B) this;
     }
 
-    public B cbi(CbService<S> add) {
-        return cbi(add, null, null);
+    public B add(InstanceCbService<S> add) {
+        return callbacks(add, null, null);
     }
     
-    public B cbi(CbService<S> add, CbService<S> remove) {
-        return cbi(add, null, remove);
+    public B change(InstanceCbService<S> change) {
+        return callbacks(null, change, null);
     }
 
-    public B cbi(CbService<S> add, CbService<S> change, CbService<S> remove) {
+    public B remove(InstanceCbService<S> remove) {
+        return callbacks(null, null, remove);
+    }
+
+    public B callbacks(InstanceCbService<S> add, InstanceCbService<S> change, InstanceCbService<S> remove) {
         if (add != null)
             setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> add.accept(srv));
         if (change != null)
@@ -196,15 +186,19 @@
         return (B) this;        
     }
     
-    public <T> B cb(CbTypeServiceMap<T, S> add) {
-        return cb(add, null, null);
+    public <T> B add(CbServiceMap<T, S> add) {
+        return callbacks(add, null, null);
     }
     
-    public <T> B cb(CbTypeServiceMap<T, S> add, CbTypeServiceMap<T, S> remove) {
-        return cb(add, null, remove);
+    public <T> B change(CbServiceMap<T, S> change) {
+        return callbacks(null, change, null);
     }
-
-    public <T> B cb(CbTypeServiceMap<T, S> add, CbTypeServiceMap<T, S> change, CbTypeServiceMap<T, S> remove) {
+    
+    public <T> B remove(CbServiceMap<T, S> remove) {
+        return callbacks(null, null, remove);
+    }
+    
+    public <T> B callbacks(CbServiceMap<T, S> add, CbServiceMap<T, S> change, CbServiceMap<T, S> remove) {
         if (add != null)
             setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), (inst, comp, ref, srv) -> add.accept((T) inst, srv, new SRefAsMap(ref)));
         if (change != null)
@@ -214,15 +208,19 @@
         return (B) this;        
     }
     
-    public B cbi(CbServiceMap<S> add) {
-        return cbi(add, null, null);
+    public B add(InstanceCbServiceMap<S> add) {
+        return callbacks(add, null, null);
     }
     
-    public B cbi(CbServiceMap<S> add, CbServiceMap<S> remove) {
-        return cbi(add, null, remove);
+    public B change(InstanceCbServiceMap<S> change) {
+        return callbacks(null, change, null);
     }
 
-    public B cbi(CbServiceMap<S> add, CbServiceMap<S> change, CbServiceMap<S> remove) {
+    public B remove(InstanceCbServiceMap<S> remove) {
+        return callbacks(null, null, remove);
+    }
+
+    public B callbacks(InstanceCbServiceMap<S> add, InstanceCbServiceMap<S> change, InstanceCbServiceMap<S> remove) {
         if (add != null)
             setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> add.accept(srv, new SRefAsMap(ref)));   
         if (change != null)
@@ -232,15 +230,19 @@
         return (B) this;        
     }
 
-    public <T> B cb(CbTypeServiceDict<T, S> add) {
-        return cb(add, null, null);
-    }
-
-    public <T> B cb(CbTypeServiceDict<T, S> add, CbTypeServiceDict<T, S> remove) {
-        return cb(add, null, remove);
+    public <T> B add(CbServiceDict<T, S> add) {
+        return callbacks(add, null, null);
     }
     
-    public <T> B cb(CbTypeServiceDict<T, S> add, CbTypeServiceDict<T, S> change, CbTypeServiceDict<T, S> remove) {
+    public <T> B change(CbServiceDict<T, S> change) {
+        return callbacks(null, change, null);
+    }
+    
+    public <T> B remove(CbServiceDict<T, S> remove) {
+        return callbacks(null, null, remove);
+    }
+    
+    public <T> B callbacks(CbServiceDict<T, S> add, CbServiceDict<T, S> change, CbServiceDict<T, S> remove) {
         if (add != null)
             setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), (inst, comp, ref, srv) -> add.accept((T) inst, srv, new SRefAsDictionary(ref)));
         if (change != null) 
@@ -250,15 +252,19 @@
         return (B) this;  
     }
 
-    public B cbi(CbServiceDict<S> add) {
-        return cbi(add, null, null);
+    public B add(InstanceCbServiceDict<S> add) {
+        return callbacks(add, null, null);
     }
     
-    public B cbi(CbServiceDict<S> add, CbServiceDict<S> remove) {
-        return cbi(add, null, remove);
+    public B change(InstanceCbServiceDict<S> change) {
+        return callbacks(null, change, null);
     }
 
-    public B cbi(CbServiceDict<S> add, CbServiceDict<S> change, CbServiceDict<S> remove) {
+    public B remove(InstanceCbServiceDict<S> remove) {
+        return callbacks(null, null, remove);
+    }
+
+    public B callbacks(InstanceCbServiceDict<S> add, InstanceCbServiceDict<S> change, InstanceCbServiceDict<S> remove) {
         if (add != null)
             setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> add.accept(srv, new SRefAsDictionary(ref)));   
         if (change != null)
@@ -267,261 +273,178 @@
             setInstanceCallbackRef(Cb.REM, (inst, comp, ref, srv) -> remove.accept(srv, new SRefAsDictionary(ref)));
         return (B) this;        
     }
-
-    public <T> B cb(CbTypeRefService<T, S> add) {
-        return cb(add, null, null);
+    
+    public <T> B add(CbServiceRef<T, S> add) {
+        return callbacks(add, null, null);
     }
 
-    public <T> B cb(CbTypeRefService<T, S> add, CbTypeRefService<T, S> remove) {
-        return cb(add, null, remove);
+    public <T> B change(CbServiceRef<T, S> change) {
+        return callbacks(null, change, null);
     }
 
-    public <T> B cb(CbTypeRefService<T, S> add, CbTypeRefService<T, S> change, CbTypeRefService<T, S> remove) {
+    public <T> B remove(CbServiceRef<T, S> remove) {
+        return callbacks(null, null, remove);
+    }
+
+    public <T> B callbacks(CbServiceRef<T, S> add, CbServiceRef<T, S> change, CbServiceRef<T, S> remove) {
         if (add != null)
-            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), (inst, comp, ref, srv) -> add.accept((T) inst, ref, srv)); 
+            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), (inst, comp, ref, srv) -> add.accept((T) inst, srv, ref));
         if (change != null)
-            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 0), (inst, comp, ref, srv) -> change.accept((T) inst, ref, srv)); 
+            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 0), (inst, comp, ref, srv) -> change.accept((T) inst, srv, ref)); 
         if (remove != null)
-            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 0), (inst, comp, ref, srv) -> remove.accept((T) inst, ref, srv)); 
+            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 0), (inst, comp, ref, srv) -> remove.accept((T) inst, srv, ref)); 
         return (B) this;
     }
 
-    public B cbi(CbRefService<S> add) {
-        return cbi(add, null, null);
+    public B add(InstanceCbServiceRef<S> add) {
+        return callbacks(add, null, null);
     }
 
-    public B cbi(CbRefService<S> add, CbRefService<S> remove) {
-        return cbi(add, null, remove);
+    public B change(InstanceCbServiceRef<S> change) {
+        return callbacks(null, change, null);
     }
 
-    public B cbi(CbRefService<S> add, CbRefService<S> change, CbRefService<S> remove) {
+    public B remove(InstanceCbServiceRef<S> remove) {
+        return callbacks(null, null, remove);
+    }
+
+    public B callbacks(InstanceCbServiceRef<S> add, InstanceCbServiceRef<S> change, InstanceCbServiceRef<S> remove) {
         if (add != null)
-            setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> add.accept(ref, srv)); 
+            setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> add.accept(srv, ref)); 
         if (change != null)
-            setInstanceCallbackRef(Cb.CHG, (inst, comp, ref, srv) -> change.accept(ref, srv)); 
+            setInstanceCallbackRef(Cb.CHG, (inst, comp, ref, srv) -> change.accept(srv, ref)); 
         if (remove != null)
-            setInstanceCallbackRef(Cb.REM, (inst, comp, ref, srv) -> remove.accept(ref, srv)); 
+            setInstanceCallbackRef(Cb.REM, (inst, comp, ref, srv) -> remove.accept(srv, ref)); 
         return (B) this;
     }
     
-    public <T> B cb(CbTypeRef<T, S> add) {
-        return cb(add, null, null);
+    public <T> B add(CbServiceComponent<T, S>  add) {
+        return callbacks(add, null, null);
     }
 
-    public <T> B cb(CbTypeRef<T, S> add, CbTypeRef<T, S> remove) {
-        return cb(add, null, remove);
+    public <T> B change(CbServiceComponent<T, S>  change) {
+        return callbacks(null, change, null);
     }
 
-    public <T> B cb(CbTypeRef<T, S> add, CbTypeRef<T, S> change, CbTypeRef<T, S> remove) {
+    public <T> B remove(CbServiceComponent<T, S>  remove) {
+        return callbacks(null, null, remove);
+    }
+
+    private <T> B callbacks(CbServiceComponent<T, S>  add, CbServiceComponent<T, S>  change, CbServiceComponent<T, S>  remove) {
         if (add != null)
-            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), (inst, comp, ref, srv) -> add.accept((T) inst, ref));
+            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), (inst, comp, ref, srv) -> add.accept((T) inst, srv, comp)); 
         if (change != null)
-            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 0), (inst, comp, ref, srv) -> change.accept((T) inst, ref)); 
+            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 0), (inst, comp, ref, srv) -> change.accept((T) inst, srv, comp)); 
         if (remove != null)
-            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 0), (inst, comp, ref, srv) -> remove.accept((T) inst, ref)); 
+            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 0), (inst, comp, ref, srv) -> remove.accept((T) inst, srv, comp)); 
         return (B) this;
     }
 
-    public B cbi(CbRef<S> add) {
-        return cbi(add, null, null);
+    public B add(InstanceCbServiceComponent<S> add) {
+        return callbacks(add, null, null);
     }
 
-    public B cbi(CbRef<S> add, CbRef<S> remove) {
-        return cbi(add, null, remove);
+    public B change(InstanceCbServiceComponent<S> change) {
+        return callbacks(null, change, null);
     }
 
-    public B cbi(CbRef<S> add, CbRef<S> change, CbRef<S> remove) {
+    public B remove(InstanceCbServiceComponent<S> remove) {
+        return callbacks(null, null, remove);
+    }
+
+    public B callbacks(InstanceCbServiceComponent<S> add, InstanceCbServiceComponent<S> change, InstanceCbServiceComponent<S> remove) {
         if (add != null)
-            setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> add.accept(ref)); 
+            setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> add.accept(srv, comp));
         if (change != null)
-            setInstanceCallbackRef(Cb.CHG, (inst, comp, ref, srv) -> change.accept(ref)); 
+            setInstanceCallbackRef(Cb.CHG, (inst, comp, ref, srv) -> change.accept(srv, comp));
         if (remove != null)
-            setInstanceCallbackRef(Cb.REM, (inst, comp, ref, srv) -> remove.accept(ref)); 
+            setInstanceCallbackRef(Cb.REM, (inst, comp, ref, srv) -> remove.accept(srv, comp));
         return (B) this;
     }
 
-    public <T> B cb(CbTypeComponent<T> add) {
-        return cb(add, null, null);
+    public <T> B add(CbServiceComponentRef<T, S>  add) {
+        return callbacks(add, null, null);
     }
 
-    public <T> B cb(CbTypeComponent<T> add, CbTypeComponent<T> remove) {
-        return cb(add, null, remove);
+    public <T> B change(CbServiceComponentRef<T, S>  change) {
+        return callbacks(null, change, null);
     }
 
-    public <T> B cb(CbTypeComponent<T> add, CbTypeComponent<T> change, CbTypeComponent<T> remove) {
+    public <T> B remove(CbServiceComponentRef<T, S>  remove) {
+        return callbacks(null, null, remove);
+    }
+
+    private <T> B callbacks(CbServiceComponentRef<T, S>  add, CbServiceComponentRef<T, S>  change, CbServiceComponentRef<T, S>  remove) {
         if (add != null)
-            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), (inst, comp, ref, srv) -> add.accept((T) inst, comp));              
+            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), (inst, comp, ref, srv) -> add.accept((T) inst, srv, comp, ref)); 
         if (change != null)
-            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 0), (inst, comp, ref, srv) -> change.accept((T) inst, comp));              
+            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 0), (inst, comp, ref, srv) -> change.accept((T) inst, srv, comp, ref)); 
         if (remove != null)
-            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 0), (inst, comp, ref, srv) -> remove.accept((T) inst, comp)); 
+            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 0), (inst, comp, ref, srv) -> remove.accept((T) inst, srv, comp, ref)); 
         return (B) this;
     }
 
-    public B cbi(CbComponent add) {
-        return cbi(add, null, null);
+    public B add(InstanceCbServiceComponentRef<S> add) {
+        return callbacks(add, null, null);
     }
 
-    public B cbi(CbComponent add, CbComponent remove) {
-        return cbi(add, null, remove);
+    public B change(InstanceCbServiceComponentRef<S> change) {
+        return callbacks(null, change, null);
     }
 
-    public B cbi(CbComponent add, CbComponent change, CbComponent remove) {
+    public B remove(InstanceCbServiceComponentRef<S> remove) {
+        return callbacks(null, null, remove);
+    }
+
+    public B callbacks(InstanceCbServiceComponentRef<S> add, InstanceCbServiceComponentRef<S> change, InstanceCbServiceComponentRef<S> remove) {
         if (add != null)
-            setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> add.accept(comp)); 
+            setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> add.accept(srv, comp, ref));
         if (change != null)
-            setInstanceCallbackRef(Cb.CHG, (inst, comp, ref, srv) -> change.accept(comp)); 
+            setInstanceCallbackRef(Cb.CHG, (inst, comp, ref, srv) -> change.accept(srv, comp, ref));
         if (remove != null)
-            setInstanceCallbackRef(Cb.REM, (inst, comp, ref, srv) -> remove.accept(comp)); 
+            setInstanceCallbackRef(Cb.REM, (inst, comp, ref, srv) -> remove.accept(srv, comp, ref));
         return (B) this;
     }
 
-    public <T> B cb(CbTypeComponentRef<T, S>  add) {
-        return cb(add, null, null);
-    }
-
-    public <T> B cb(CbTypeComponentRef<T, S>  add, CbTypeComponentRef<T, S>  remove) {
-        return cb(add, null, remove);
-    }
-
-    public <T> B cb(CbTypeComponentRef<T, S>  add, CbTypeComponentRef<T, S>  change, CbTypeComponentRef<T, S>  remove) {
-        if (add != null)
-            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), (inst, comp, ref, srv) -> add.accept((T) inst, comp, ref));              
-        if (change != null)
-            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 0), (inst, comp, ref, srv) -> change.accept((T) inst, comp, ref)); 
-        if (remove != null)
-            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 0), (inst, comp, ref, srv) -> remove.accept((T) inst, comp, ref)); 
-        return (B) this;      
-    }
-
-    public B cbi(CbComponentRef<S> add) {
-        return cbi(add, null, null);
-    }
-
-    public B cbi(CbComponentRef<S> add, CbComponentRef<S> remove) {
-        return cbi(add, null, remove);
-    }
-
-    public B cbi(CbComponentRef<S> add, CbComponentRef<S> change, CbComponentRef<S> remove) {
-        if (add != null)
-            setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> add.accept(comp, ref));
-        if (change != null)
-            setInstanceCallbackRef(Cb.CHG, (inst, comp, ref, srv) -> change.accept(comp, ref));
-        if (remove != null)
-            setInstanceCallbackRef(Cb.REM, (inst, comp, ref, srv) -> remove.accept(comp, ref));
-        return (B) this;
-    }
-
-    public <T> B cb(CbTypeComponentService<T, S>  add) {
-        return cb(add, null, null);
-    }
-
-    public <T> B cb(CbTypeComponentService<T, S>  add, CbTypeComponentService<T, S>  remove) {
-        return cb(add, null, remove);
-    }
-
-    public <T> B cb(CbTypeComponentService<T, S>  add, CbTypeComponentService<T, S>  change, CbTypeComponentService<T, S>  remove) {
-        if (add != null)
-            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), (inst, comp, ref, srv) -> add.accept((T) inst, comp, srv)); 
-        if (change != null)
-            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 0), (inst, comp, ref, srv) -> change.accept((T) inst, comp, srv)); 
-        if (remove != null)
-            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 0), (inst, comp, ref, srv) -> remove.accept((T) inst, comp, srv)); 
-        return (B) this;
-    }
-
-    public B cbi(CbComponentService<S> add) {
-        return cbi(add, null, null);
-    }
-
-    public B cbi(CbComponentService<S> add, CbComponentService<S> remove) {
-        return cbi(add, null, remove);
-    }
-
-    public B cbi(CbComponentService<S> add, CbComponentService<S> change, CbComponentService<S> remove) {
-        if (add != null)
-            setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> add.accept(comp, srv));
-        if (change != null)
-            setInstanceCallbackRef(Cb.CHG, (inst, comp, ref, srv) -> change.accept(comp, srv));
-        if (remove != null)
-            setInstanceCallbackRef(Cb.REM, (inst, comp, ref, srv) -> remove.accept(comp, srv));
-        return (B) this;
-    }
-
-    public <T> B cb(CbTypeComponentRefService<T, S>  add) {
-        return cb(add, null, null);
-    }
-
-    public <T> B cb(CbTypeComponentRefService<T, S>  add, CbTypeComponentRefService<T, S>  remove) {
-        return cb(add, null, remove);
-    }
-
-    public <T> B cb(CbTypeComponentRefService<T, S>  add, CbTypeComponentRefService<T, S>  change, CbTypeComponentRefService<T, S>  remove) {
-        if (add != null)
-            setComponentCallbackRef(Cb.ADD, Helpers.getLambdaArgType(add, 0), (inst, comp, ref, srv) -> add.accept((T) inst, comp, ref, srv)); 
-        if (change != null)
-            setComponentCallbackRef(Cb.CHG, Helpers.getLambdaArgType(change, 0), (inst, comp, ref, srv) -> change.accept((T) inst, comp, ref, srv)); 
-        if (remove != null)
-            setComponentCallbackRef(Cb.REM, Helpers.getLambdaArgType(remove, 0), (inst, comp, ref, srv) -> remove.accept((T) inst, comp, ref, srv)); 
-        return (B) this;
-    }
-
-    public B cbi(CbComponentRefService<S> add) {
-        return cbi(add, null, null);
-    }
-
-    public B cbi(CbComponentRefService<S> add, CbComponentRefService<S> remove) {
-        return cbi(add, null, remove);
-    }
-
-    public B cbi(CbComponentRefService<S> add, CbComponentRefService<S> change, CbComponentRefService<S> remove) {
-        if (add != null)
-            setInstanceCallbackRef(Cb.ADD, (inst, comp, ref, srv) -> add.accept(comp, ref, srv));
-        if (change != null)
-            setInstanceCallbackRef(Cb.CHG, (inst, comp, ref, srv) -> change.accept(comp, ref, srv));
-        if (remove != null)
-            setInstanceCallbackRef(Cb.REM, (inst, comp, ref, srv) -> remove.accept(comp, ref, srv));
-        return (B) this;
-    }
-
-    public <T> B sw(CbTypeServiceService<T, S> swap) {
+    public <T> B swap(CbServiceService<T, S> swap) {
         Class<T> type = Helpers.getLambdaArgType(swap, 0);
         return setComponentSwapCallbackRef(type, (inst, component, oref, oserv, nref, nserv) ->
             swap.accept((T) inst, oserv, nserv));                              
     }
 
-    public <T> B sw(CbTypeComponentServiceService<T, S> swap) {
+    @Override
+    public <T> B swap(CbServiceServiceComponent<T, S> swap) {
         Class<T> type = Helpers.getLambdaArgType(swap, 0);
         return setComponentSwapCallbackRef(type, (inst, component, oref, oserv, nref, nserv) ->
-            swap.accept((T) inst, component, oserv, nserv));                              
+            swap.accept((T) inst, oserv, nserv, component));                              
     }
 
-    public <T> B sw(CbTypeRefServiceRefService<T, S> swap) {
+    public <T> B swap(CbRefServiceRefService<T, S> swap) {
         Class<T> type = Helpers.getLambdaArgType(swap, 0);
         return setComponentSwapCallbackRef(type, (inst, component, oref, oserv, nref, nserv) ->
             swap.accept((T) inst, oref, oserv, nref, nserv));                              
     }
     
-    public <T> B sw(CbTypeComponentRefServiceRefService<T, S> swap) {
+    public <T> B swap(CbRefServiceRefServiceComponent<T, S> swap) {
         Class<T> type = Helpers.getLambdaArgType(swap, 0);
         return setComponentSwapCallbackRef(type, (inst, component, oref, oserv, nref, nserv) ->
-            swap.accept((T) inst, component, oref, oserv, nref, nserv));                              
+            swap.accept((T) inst, oref, oserv, nref, nserv, component));                              
     }
     
-    public B swi(CbServiceService<S> swap) {
+    public B swap(InstanceCbServiceService<S> swap) {
         return setInstanceSwapCallbackRef((inst, component, oref, oserv, nref, nserv) -> swap.accept(oserv, nserv));
     }
 
-    public B swi(CbComponentServiceService<S> swap) {
-        return setInstanceSwapCallbackRef((inst, component, oref, oserv, nref, nserv) -> swap.accept(component, oserv, nserv));
+    public B swap(InstanceCbServiceServiceComponent<S> swap) {
+        return setInstanceSwapCallbackRef((inst, component, oref, oserv, nref, nserv) -> swap.accept(oserv, nserv, component));
     }
 
-    public B swi(CbRefServiceRefService<S> swap) {
+    public B swap(InstanceCbRefServiceRefService<S> swap) {
         return setInstanceSwapCallbackRef((inst, component, oref, oserv, nref, nserv) -> swap.accept(oref, oserv, nref, nserv));
     }
     
-    public B swi(CbComponentRefServiceRefService<S> swap) {
-        return setInstanceSwapCallbackRef((inst, component, oref, oserv, nref, nserv) -> swap.accept(component, oref, oserv, nref, nserv));
+    public B swap(InstanceCbRefServiceRefServiceComponent<S> swap) {
+        return setInstanceSwapCallbackRef((inst, component, oref, oserv, nref, nserv) -> swap.accept(oref, oserv, nref, nserv, component));
     }
     
     protected <I> B setComponentCallbackRef(Cb cbType, Class<I> type, MethodRef<I, S> ref) {
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ServiceDependencyBuilderImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ServiceDependencyBuilderImpl.java
index 6892b1b..7a512a3 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ServiceDependencyBuilderImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ServiceDependencyBuilderImpl.java
@@ -27,6 +27,7 @@
         super(service);
         m_serviceIface = service;
         m_component = component;
+        m_required = Helpers.isDependencyRequiredByDefault(component);
     }
 
     public ServiceDependencyBuilder<S> filter(String filter) {