Finished to apply the recommendations made by Jan Willen regarding the new dm-lambda library.
By default, dependencies are optional, like in the original DM API.
Removed ambiguous methods in ComponentBuilder interface (initInstance/startInstance ...).


git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1732779 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/dependencymanager/org.apache.felix.dependencymanager.benchmark/src/org/apache/felix/dm/benchmark/controller/impl/ScenarioControllerImpl.java b/dependencymanager/org.apache.felix.dependencymanager.benchmark/src/org/apache/felix/dm/benchmark/controller/impl/ScenarioControllerImpl.java
index b27e312..29bb32e 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.benchmark/src/org/apache/felix/dm/benchmark/controller/impl/ScenarioControllerImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.benchmark/src/org/apache/felix/dm/benchmark/controller/impl/ScenarioControllerImpl.java
@@ -232,9 +232,7 @@
     private void forEachScenarioBundle(List<String> tests, Consumer<Bundle> consumer) {
         tests.stream().forEach(test -> {
             Optional<Bundle> bundle = Stream.of(m_bctx.getBundles()).filter(b -> b.getSymbolicName().equals(test)).findFirst();
-            bundle.ifPresent(b -> {
-                consumer.accept(b);
-            });
+            bundle.ifPresent(consumer::accept);
         });   
     }
     
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/bnd.bnd b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/bnd.bnd
index a11c3fd..e0940c8 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/bnd.bnd
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/bnd.bnd
@@ -44,8 +44,11 @@
 javac.source:          1.8
 javac.target:          1.8
 -tester: biz.aQute.junit
+
+# all tests are configured to assume that dependencies are required by default
 -runproperties:  \
 	org.apache.felix.dependencymanager.loglevel=2,\
+	org.apache.felix.dependencymanager.lambda.defaultRequiredDependency=org.apache.felix.dm.lambda.itest,\
 	org.apache.felix.log.maxSize=100000,\
 	org.apache.felix.log.storeDebug=true,\
 	gosh.args=--noshutdown
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 54c9d58..1560d2d 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)).withSvc(AdaptedService.class).build();
+        Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(AdaptedService.class, true).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/AdapterWithCallbackInstanceTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AdapterWithCallbackInstanceTest.java
index ac8db12..4dd4c76 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,7 +41,7 @@
 
         ServiceProvider serviceProvider = new ServiceProvider(e);
         Component provider = component(m).provides(OriginalService.class).impl(serviceProvider).build();
-        Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(AdaptedService.class).build();
+        Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(AdaptedService.class, true).build();
         
         ServiceAdapterCallbackInstance callbackInstance = new ServiceAdapterCallbackInstance(e);
         Component adapter = adapter(m, OriginalService.class)
@@ -82,7 +82,7 @@
 
         ServiceProvider serviceProvider = new ServiceProvider(e);
         Component provider = component(m).provides(OriginalService.class).impl(serviceProvider).build();
-        Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(AdaptedService.class).build();
+        Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(AdaptedService.class, true).build();
         
         ServiceAdapterCallbackInstance callbackInstance = new ServiceAdapterCallbackInstance(e);
         Component adapter = adapter(m, OriginalService.class, adp -> adp
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 87747ae..c3df8d5 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).withSvc(ServiceInterface3.class).build();
+        Component sc = component(m).impl(new ServiceConsumer(e)).autoAdd(false).withSvc(ServiceInterface3.class, true).build();
         Component sa = adapter(m, ServiceInterface.class).provides(ServiceInterface3.class).impl(new ServiceAdapter(e)).build();
         m.add(sc);
         m.add(sp);
@@ -106,7 +106,7 @@
         }
         public void init() {
             m_ensure.step(1);
-            component(m_component, c->c.withSvc(ServiceInterface2.class));
+            component(m_component, c->c.withSvc(ServiceInterface2.class, true));
         }
         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 10e2f08..502a587 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
@@ -117,7 +117,7 @@
 
         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)).add("addA").change("changeA").remove("removeA").build();
-        Component c = component(m).impl(new CImpl()).provides(C.class).withSvc(A.class, "(foo=bar)").build();
+        Component c = component(m).impl(new CImpl()).provides(C.class).withSvc(A.class, "(foo=bar)", true).build();
                       
         m.add(a);
         m.add(c);
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 6e16f25..c2f43d3 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)).withSvc(ServiceInterface.class).build();
+        Component sc = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class, true).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/AutoConfigTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/AutoConfigTest.java
index 904cf69..65eacfd 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).withSvc(Provider.class).build();
+        return component(dm).impl(consumer).withSvc(Provider.class, true).build();
     }
 
     public static interface Provider extends Runnable {      
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/CFDependencyTest.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/CFDependencyTest.java
index 2e89d51..6b70661 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/CFDependencyTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.itest/src/org/apache/felix/dm/lambda/itest/CFDependencyTest.java
@@ -39,7 +39,7 @@
         // Create a consumer depending on a Provider and on the result of a CF.
         // (the CF dependency is added from the Consumer.init() method).
         CompletableFuture<String> cf = new CompletableFuture<>();
-        Component consumer = component(dm).impl(new Consumer(cf)).withSvc(Provider.class).build();
+        Component consumer = component(dm).impl(new Consumer(cf)).withSvc(Provider.class, true).build();
                         
         // Create provider
         Component provider = component(dm).impl(new ProviderImpl()).provides(Provider.class).build();
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 27c8d4f..256cad8 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
@@ -54,6 +54,30 @@
         m_ensure.waitForStep(5, 5000);
     }
     
+    public void testSimple2() throws Exception {
+        final DependencyManager dm = getDM();
+
+        // Create consumer (dependency is required by default using builder api).
+        component(dm, comp -> comp
+                .factory(Consumer::new)
+                .withSvc(Provider.class, srv -> srv.filter("(name=provider2)").add("add").remove("remove"))
+                .withSvc(Provider.class, "(name=provider1)", "m_autoConfiguredProvider", true));
+                
+        // Create providers (auto added to dependency manager)
+        component(dm, comp -> comp
+                .impl(new Provider() { public String toString() { return "provider1";}})
+                .provides(Provider.class).properties("name", "provider1"));
+                
+        component(dm, comp -> comp
+                .impl(new Provider() { public String toString() { return "provider2";}})
+                .provides(Provider.class).properties("name", "provider2"));
+                
+        m_ensure.waitForStep(2, 5000);
+        dm.clear();
+        m_ensure.waitForStep(5, 5000);
+    }
+
+    
     public static interface Provider {    	
     }
     
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 e13f41f..099d417 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))
-            .withSvc(ServiceInterface.class, ServiceInterface2.class).build();
+            .withSvc(true, 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))
-            .withSvc(ServiceInterface.class, ServiceInterface2.class).build();
+            .withSvc(true, 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 d6759dd..28145a9 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).withSvc(ConfigurationAdmin.class).build();
+        Component s1 = component(m).impl(configurator).withSvc(ConfigurationAdmin.class, true).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).update(adapterUpdate).propagate().provides(AdapterService.class, "foo", "bar")            
-            .withSvc(AdapterExtraDependency.class)
+            .withSvc(AdapterExtraDependency.class, true)
             .build();
                     
         // Create extra adapter service dependency upon which our adapter depends on.
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 01a3d93..f4deb80 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,7 +45,7 @@
         m_e = new Ensure();
         
         // Create the component that creates a configuration.
-        Component configurator = component(m).impl(new Configurator("foobar")).withSvc(ConfigurationAdmin.class).build();
+        Component configurator = component(m).impl(new Configurator("foobar")).withSvc(ConfigurationAdmin.class, true).build();
         
         // Create the object that has to be injected with the configuration before its create method is called.
         MyFactory factory = new MyFactory();
@@ -67,7 +67,7 @@
         m_e = new Ensure();
         
         // Create the component that creates a configuration.
-        Component configurator = component(m).impl(new Configurator("foobar")).withSvc(ConfigurationAdmin.class).build();
+        Component configurator = component(m).impl(new Configurator("foobar")).withSvc(ConfigurationAdmin.class, true).build();
         
         // Create the object that has to be injected with the configuration before its create method is called.
         MyFactory factory = new MyFactory();
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 def5566..2375cf4 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
@@ -44,7 +44,7 @@
         Component sp = component(m)
             .impl(ServiceProvider.class)
             .provides(ServiceInterface.class, "foo", "bar")                            
-            .init(ServiceProvider::init).start(ServiceProvider::start).stop(ServiceProvider::stop)
+            .init("init").start("start").stop("stop")
             .build();
         
         Component sc = component(m)
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 0d55e23..292e9a4 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
@@ -35,7 +35,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)).withSvc(ServiceInterface.class).build();
+       Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class, true).build();
        m.add(provider);
        m.add(providerWithHighRank);
        m.add(consumer);
@@ -55,7 +55,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)).withSvc(ServiceInterface.class).build();
+       Component consumer = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class, true).build();
        m.add(provider2);
        m.add(consumer);
        e.waitForStep(3, 5000);
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 7192423..e88360b 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,7 +34,7 @@
         // 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()).withSvc(ServiceInterface2.class).build();
+        Component sc = component(m).impl(new ServiceConsumer()).withSvc(ServiceInterface2.class, true).build();
            
         Component sc2 = component(m) // all dependencies are optional
             .impl(new ServiceConsumerNamedInjection(false, false)) 
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 4b9e95a..bc7b132 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,7 +33,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)).withSvc(ServiceInterface.class).build();
+        Component sc = component(m).impl(new ServiceConsumer(e)).withSvc(ServiceInterface.class, true).build();
         		
         Component sc2 = component(m).impl(new ServiceConsumerCallbacks(e))
             .withSvc(ServiceInterface.class, srv -> srv.required(false).add(ServiceConsumerCallbacks::add).remove(ServiceConsumerCallbacks::remove))
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 677b08d..f9f8ac1 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
@@ -18,6 +18,7 @@
  */
 package org.apache.felix.dm.lambda.itest;
 
+import static org.apache.felix.dm.lambda.DependencyManagerActivator.adapter;
 import static org.apache.felix.dm.lambda.DependencyManagerActivator.component;
 import static org.apache.felix.dm.lambda.DependencyManagerActivator.serviceDependency;
 
@@ -110,7 +111,7 @@
         TemporalServiceProvider2 provider2 = new TemporalServiceProvider2(e);
         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);
+        Component sc = adapter(m, Adaptee.class).impl(consumer).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();
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/dictionary.bndrun b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/dictionary.bndrun
index 08d70ca..523f3a3 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/dictionary.bndrun
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/dictionary.bndrun
@@ -36,9 +36,8 @@
 	org.apache.felix.webconsole;version=4.2.2,\
 	org.apache.felix.http.api;version=2.3.0,\
 	org.apache.felix.http.servlet-api;version=1.0.0,\
-	org.apache.felix.http.jetty;version="[2.3.0,2.3.0]"
+	org.apache.felix.http.jetty;version='[2.3.0,2.3.0]'
 	
-
 -runproperties:  \
 	org.apache.felix.dependencymanager.loglevel=2,\
 	org.apache.felix.log.maxSize=100000,\
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 dbb3c3c..248ff52 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
@@ -29,13 +29,14 @@
 /**
  * Creates a "Provider" service. The implementation for this service (ProviderImpl) is
  * created using a factory class (ProviderFactory) that also creates some other helper classes 
- * (ProviderComposite1 and ProviderComposite2) that are internally used by ProviderImpl.
+ * that are internally used by ProviderImpl (ProviderComposite1 and ProviderComposite2).
  * 
  * The ProviderFactory is also injected with a Configuration that can be used by the Factory
  * when creating the ProviderImpl, ProviderComposite1, and ProviderComposite2 classes.
  * 
  * The LogService in only injected to the ProviderImpl and the ProviderComposite1 classes.
- * Both composites are called in their "start" callbacks, when all required dependencies are available.
+ * objects being part of the composition are called in "start" lifecycle callback when all 
+ * required dependencies are available.
  * 
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
@@ -53,11 +54,10 @@
         // before creating the composition of classes.
         component(comp -> comp
             .factory(factory::create, factory::getComposition)
-            .start(ProviderImpl::start) // only call start on ProviderImpl
-            .withSvc(LogService.class, srv -> srv.add(ProviderImpl::bind).add(ProviderComposite1::bind))
+            .withSvc(LogService.class, svc -> svc.required().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).withSvc(ConfigurationAdmin.class));
+        component(comp -> comp.impl(Configurator.class).withSvc(ConfigurationAdmin.class, true));
     }    
 }
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 793a50d..8600e54 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
@@ -46,8 +46,8 @@
         // Creates a component that simply displays all available DeviceParameter adapter services.
         component(comp -> comp
             .impl(DeviceAccessConsumer.class)
-            .withSvc(LogService.class)
-            .withSvc(DeviceAccess.class, device -> device.add(DeviceAccessConsumer::add)));       
+            .withSvc(LogService.class, true)
+            .withSvc(DeviceAccess.class, device -> device.required().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/DeviceAccessImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda.samples/src/org/apache/felix/dm/lambda/samples/device/DeviceAccessImpl.java
index 5b4033d..b241202 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())
-            .withSvc(DeviceParameter.class, srv -> srv.filter("(device.id=" + device.getDeviceId() + ")")));
+            .withSvc(DeviceParameter.class, svc -> svc.filter("(device.id=" + device.getDeviceId() + ")")));
     }
     
     @Override
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 8e4482e..40f38f0 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
@@ -42,7 +42,7 @@
             .provides(DictionaryService.class)
             .propagate()
             .update(DictionaryConfiguration.class, DictionaryImpl::updated)
-            .withSvc(LogService.class));
+            .withSvc(LogService.class, true));
                             
         // Create the Dictionary Aspect that decorates any registered Dictionary service. For each Dictionary, an instance of the 
         // DictionaryAspect service is created).
@@ -50,14 +50,13 @@
             .impl(DictionaryAspect.class)
             .filter("(lang=en)").rank(10)
             .withCnf(conf -> conf.update(DictionaryAspectConfiguration.class, DictionaryAspect::addWords))
-            .withSvc(LogService.class));
+            .withSvc(LogService.class, true));
                     
         // 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"}) 
-            .withSvc(DictionaryService.class)
-            .withSvc(LogService.class));
+            .withSvc(true, LogService.class, DictionaryService.class));
     }
 }
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 ed1b499..87328f9 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
@@ -53,7 +53,7 @@
      * Our Dictionary language.
      */
     private String m_lang;
-
+    
     /**
      * Our service will be initialized from ConfigAdmin.
      * @param config The configuration where we'll lookup our words list (key=".words").
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 7e884e3..26fb28d 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
@@ -36,7 +36,6 @@
         component(comp -> comp
             .factory(ProviderFactory::new, ProviderFactory::create)       
             .provides(Provider.class)
-            .start(ProviderImpl::start)                      
-            .withSvc(LogService.class, log -> log.add(ProviderImpl::set)));
+            .withSvc(LogService.class, log -> log.required().add(ProviderImpl::set)));
     }
 }
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 a1e9a9e..3a11dd6 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
@@ -51,7 +51,7 @@
         component(comp -> comp
             .factory(() -> new PageLinksImpl("http://felix.apache.org/"))
             .provides(PageLinks.class)
-            .withSvc(LogService.class, log -> log.add(PageLinksImpl::bind)));
+            .withSvc(LogService.class, log -> log.required().add(PageLinksImpl::bind)));
         
         // Just wait for the PageLinks service and display all links found from the Felix web site.
         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 f74f1bb..32f1de7 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
@@ -20,14 +20,16 @@
 
 import static org.apache.felix.dm.lambda.DependencyManagerActivator.component;
 
+import java.io.BufferedReader;
 import java.io.IOException;
+import java.io.InputStreamReader;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Scanner;
 import java.util.concurrent.CompletableFuture;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 import org.apache.felix.dm.Component;
 import org.osgi.service.log.LogService;
@@ -73,19 +75,12 @@
 		return m_links;
 	}
 
-	private String download(String url) {
-		try (Scanner in = new Scanner(new URL(url).openStream())) {
-			StringBuilder builder = new StringBuilder();
-			while (in.hasNextLine()) {
-				builder.append(in.nextLine());
-				builder.append("\n");
-			}
-			return builder.toString();
-		} catch (IOException ex) {
-			RuntimeException rex = new RuntimeException();
-			rex.initCause(ex);
-			throw rex;
-		}
+	public static String download(String url) { 
+	    try (BufferedReader buffer = new BufferedReader(new InputStreamReader(new URL(url).openStream()))) { 
+	        return buffer.lines().collect(Collectors.joining("\n"));
+	    } catch (IOException ex) {
+	        throw new RuntimeException(ex);
+	    }
 	}
 	
 	private List<String> parseLinks(String content) {		 
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 8281f14..0757d59 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
@@ -28,6 +28,8 @@
 import org.osgi.service.log.LogService;
 
 /**
+ * Hello world example.
+ * 
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public class Activator extends DependencyManagerActivator {
@@ -35,26 +37,29 @@
     public void init(BundleContext ctx, DependencyManager dm) throws Exception {
     	out.println("type \"log warn\" to see the logs emitted by this test.");
     	
+        // 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.factory(() -> new Configurator(Configuration.class.getName()))
+            .withSvc(ConfigurationAdmin.class, svc -> svc.required().add(Configurator::bind)));
+
     	// Creates a Service Provider (property names are deduced from lambda parameter names).
-    	// (service dependencies are required by default)
+    	// The provider depends on a required log service, injected by reflection on compatible class fields.
+    	
         component(comp -> comp.impl(ServiceProviderImpl.class)
             .provides(ServiceProvider.class, p1 -> "v1", p2 -> 123)
-            .withSvc(LogService.class));
+            .withSvc(LogService.class, true /* required */));
             
-        // Creates a Service Consumer. we depend on LogService, EventAdmin and on our ServiceProvider.
-        // (LogService and EventAdmin are declared in one single method call).
+        // Creates a Service Consumer which depends on LogService, EventAdmin and on the ServiceProvider.
+        // LogService and EventAdmin are declared in one single method call, and are injected in class fields.
         // We also depend on a configuration. the configuration callback is assumed to be the "ServiceConsumer.updated" method which 
         // takes as argument a "Configuration" interface. This interface is used to wrap the actual properties behind a dynamic proxy 
         // that is implemented by Dependency Manager.
         // The pid is assumed to be by default the fqdn of the specified Configuration interface ("org.apache.felix.dm.lambda.samples.hello.Configuration").
-        component(comp -> comp.impl(ServiceConsumer.class)
-            .withSvc(LogService.class, EventAdmin.class)
-            .withSvc(ServiceProvider.class, srv -> srv.filter("(p1=v1)")) 
-            .withCnf(Configuration.class));  // shortcut for "withCnf(Configuration.class, cnf -> cnf.updated(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.factory(() -> new Configurator(Configuration.class.getName()))
-            .withSvc(ConfigurationAdmin.class, srv -> srv.add(Configurator::bind)));
+        component(comp -> comp.impl(ServiceConsumer.class)
+            .withSvc(true /* required */, LogService.class, EventAdmin.class)
+            .withSvc(ServiceProvider.class, "(p1=v1)", true /* required */) 
+            .withCnf(Configuration.class));        
     }
 }
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 ef5cc8c..6d296b5 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
@@ -32,7 +32,7 @@
     volatile EventAdmin eventAdmin;
 
     public void updated(Configuration conf) {
-        System.out.println(conf.getFoo()); 
+        // conf.getFoo() returns "bar" 
     }
     
     public void start() {
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 99af097..846e7a1 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
@@ -34,7 +34,7 @@
      * as volatile will ensure safe publication if the log service is replaced at runtime.
      */
     volatile LogService log;
-
+    
     void start() {
         // Default lifecycle start calback (all required dependencies have been injected when start is called, 
         // and all optional dependency callbacks will be invoked after the start method. This allows to easily 
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 02dab2c..f589f82 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
@@ -30,7 +30,6 @@
 
 /**
  * Builds a Dependency Manager Bundle Dependency. 
- * When a bundle dependency is not explicitly defined as "required" or "optional", then it is assumed to be required by default.
  * 
  * <p> Example of a Pojo Component which tracks a started bundle having a given bundle symbolic name:
  * 
@@ -80,6 +79,13 @@
     public BundleDependencyBuilder required();
 
     /**
+     * Sets the dependency to be optional.
+     * 
+     * @return the bundle dependency builder
+     */
+    public BundleDependencyBuilder optional();
+
+    /**
      * Sets the bundle to depend on directly.
      * 
      * @param bundle the bundle to depend on
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 21919ab..2298f62 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
@@ -26,8 +26,6 @@
 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.InstanceCb;
 import org.apache.felix.dm.lambda.callbacks.InstanceCbComponent;
 
@@ -38,13 +36,13 @@
  * required dependencies are available. This interface is also the base interface for extended components like 
  * aspects, adapters, etc ...
  *
- * <p> Example of a component that depends on a ConfigurationAdmin service. The dependency is injected by reflection
- * on a class field which type matches the ConfigurationAdmin interface:
+ * <p> Example of a component that depends on a LogServce service. The dependency is injected by reflection
+ * on fields having a compatible type with the LogService interface:
  * 
  * <pre>{@code
  * public class Activator extends DependencyManagerActivator {
  *   public void init(BundleContext ctx, DependencyManager dm) throws Exception {
- *       component(comp -> comp.impl(Configurator.class).withSvc(ConfigurationAdmin.class));
+ *       component(comp -> comp.impl(Pojo.class).withSvc(LogService.class));
  *   }
  * }
  * } </pre>
@@ -356,32 +354,81 @@
     B properties(FluentProperty ... properties);  
 
     /**
-     * Adds a required/autoconfig service dependency.
-     * 
-     * @param service the service dependency filter
-     * @param filter the service filter
-     * @return this builder
-     */
-    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 withSvc(Class<?> ... services);
-           
-    /**
      * Adds a service dependency built using a Consumer lambda that is provided with a ServiceDependencyBuilder. 
      * 
      * @param <U> the type of the dependency service
      * @param service the service
-     * @param consumer the lambda for building the service dependency
+     * @param consumer the lambda used to build the service dependency
      * @return this builder.
      */
     <U> B withSvc(Class<U> service, Consumer<ServiceDependencyBuilder<U>> consumer);
     
     /**
+     * Adds in one shot multiple service dependencies injected in compatible class fields.
+     * 
+     * @param services some dependencies to inject in compatible class fields.
+     * @return this builder
+     */
+    @SuppressWarnings("unchecked")
+    default B withSvc(Class<?> ... services) {
+        Stream.of(services).forEach(s -> withSvc(s, svc -> svc.autoConfig()));
+        return (B) this;
+    }
+
+    /**
+     * Adds in one shot multiple service dependencies injected in compatible class fields.
+     * 
+     * @param required true if the dependency is required, false if not
+     * @param services some dependencies to inject in compatible class fields.
+     * @return this builder
+     */
+    @SuppressWarnings("unchecked")
+    default B withSvc(boolean required, Class<?> ... services) {
+        Stream.of(services).forEach(s -> withSvc(s, svc -> svc.required(required)));
+        return (B) this;
+    }
+    
+    /**
+     * Adds a service dependency injected in compatible class fields.
+     * 
+     * @param service a service dependency
+     * @param required true if the dependency is required, false if not
+     * @return this builder
+     */
+    @SuppressWarnings("unchecked")
+    default B withSvc(Class<?> service, boolean required) {
+        withSvc(service, svc -> svc.required(required));
+        return (B) this;
+    }
+      
+    /**
+     * Adds a service dependency injected in compatible class fields.
+     * 
+     * @param <T> the service dependency type
+     * @param service the service dependency.
+     * @param filter the service filter
+     * @param required true if the dependency is required, false if not
+     * @return this builder
+     */
+    default <T> B withSvc(Class<T> service, String filter, boolean required) {
+        return withSvc(service, svc -> svc.filter(filter).required(required));
+    }
+    
+    /**
+     * Adds a service dependency injected in a given compatible class field.
+     * 
+     * @param <T> the service dependency type
+     * @param service the service dependency
+     * @param filter the service filter
+     * @param field the class field when the dependency has to be injected
+     * @param required true if the dependency is required, false if not
+     * @return this builder
+     */
+    default <T> B withSvc(Class<T> service, String filter, String field, boolean required) {
+        return withSvc(service, svc -> svc.filter(filter).autoConfig(field).required(required));
+    }
+    
+    /**
      * Adds a configuration dependency.
      * @param consumer the lambda used to build the configuration dependency.
      * @return this builder.
@@ -402,6 +449,8 @@
     /**
      * Adds a configuration dependency using a configuration type. The configuration is injected in an updated callback which takes in argument
      * an implementation of the specified configuration type.
+     * 
+     * @param configType the configuration type that will be injected to the "updated" callback
      * @return this builder
      * @see ConfigurationDependencyBuilder
      */
@@ -425,26 +474,7 @@
      * @return this builder.
      */
     <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. 
@@ -464,7 +494,52 @@
     B init(String callback);
     
     /**
-     * Sets the name of the method used as the "start" callback. This method, when found, is
+     * Sets a callback instance and 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
+     * 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.
+     * <p>The dependency manager will look for a method of this name with the following signatures,
+     * in this order:
+     * <ol>
+     * <li>method(Component component)</li>
+     * <li>method()</li>
+     * </ol>
+     * 
+     * @param callbackInstance a callback instance object the callback is invoked on
+     * @param callback the callback name
+     * @return this builder.
+     */
+    B init(Object callbackInstance, String 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 
+     * 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 callback an Object instance method reference. The method does not take any parameters.
+     * @return this builder
+     */
+    B init(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 
+     * 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 callback an Object instance method reference. The method takes as argument a Component parameter.
+     * @return this builder
+     */
+    B init(InstanceCbComponent callback);
+   
+    /**
+     * Sets a callback instance and the name of the method used as the "start" callback. This method, when found, is
      * invoked as part of the life cycle management of the component implementation. <p>The
      * dependency manager will look for a method of this name with the following signatures,
      * in this order:
@@ -479,6 +554,42 @@
     B start(String callback);
     
     /**
+     * Sets the name of the method used as the "start" callback. This method, when found, is
+     * invoked as part of the life cycle management of the component implementation. <p>The
+     * dependency manager will look for a method of this name with the following signatures,
+     * in this order:
+     * <ol>
+     * <li>method(Component component)</li>
+     * <li>method()</li>
+     * </ol>
+     * 
+     * @param callbackInstance a callback instance object the callback is invoked on
+     * @param callback the callback name
+     * @return this builder.
+     */
+    B start(Object callbackInstance, String callback);
+
+    /**
+     * Sets an Object instance method reference used as the "start" callback. 
+     * This method is invoked as part of the life cycle management of the component implementation. 
+     * The method does not take any parameters.
+     *
+     * @param callback an Object instance method reference. The method does not take any parameters.
+     * @return this builder.
+     */
+    B start(InstanceCb callback);
+  
+    /**
+     * Sets an Object instance method reference used as the "start" callback.
+     * This method is invoked as part of the life cycle management of the component implementation. 
+     * The method takes as argument a Component parameter.
+     *
+     * @param callback an Object instance method reference. The method takes as argument a Component parameter.
+     * @return this builder.
+     */
+    B start(InstanceCbComponent callback);
+    
+    /**
      * Sets the name of the method used as the "stop" callback. This method, when found, is
      * invoked as part of the life cycle management of the component implementation. <p>The
      * dependency manager will look for a method of this name with the following signatures,
@@ -494,6 +605,45 @@
     B stop(String callback);
     
     /**
+     * Sets a callback instance and the name of the method used as the "stop" callback. This method, when found, is
+     * invoked as part of the life cycle management of the component implementation. <p>The
+     * dependency manager will look for a method of this name with the following signatures,
+     * in this order:
+     * <ol>
+     * <li>method(Component component)</li>
+     * <li>method()</li>
+     * </ol>
+     * 
+     * @param callbackInstance a callback instance object the callback is invoked on
+     * @param callback the callback name
+     * @return this builder.
+     */
+    B stop(Object callbackInstance, String 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 
+     * 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 callback an Object instance method reference. The method does not take any parameters.
+     * @return this builder
+     */
+    B stop(InstanceCb callback);
+  
+    /**
+     * Sets an Object instance method reference used as the "stop" callback. 
+     * This method is invoked as part of the life cycle management of the component implementation. 
+     * The method takes as argument a Component parameter.
+     *
+     * @param callback an Object instance method reference. The method takes as argument a Component parameter.
+     * @return this builder.
+     */
+    B stop(InstanceCbComponent callback);
+  
+    /**
      * Sets the name of the method used as the "destroy" callback. This method, when found, is
      * invoked as part of the life cycle management of the component implementation. <p>The
      * dependency manager will look for a method of this name with the following signatures,
@@ -507,138 +657,24 @@
      * @return this builder.
      */
     B destroy(String callback);
-         
-    /**
-     * 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.
-     * 
-     * @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 implementation class(es).
-     * @return this builder
-     */
-    <T> B init(Cb<T> callback);
-  
-    /**
-     * 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 <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 implementation classes.
-     * @return this builder.
-     */
-    <T> B start(Cb<T> callback);
-   
-    /**
-     * 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 <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 implementation classes.
-     * @return this builder.
-     */
-    <T> B stop(Cb<T> callback);
-  
-    /**
-     * 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 <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 implementation classes.
-     * @return this builder.
-     */
-    <T> B destroy(Cb<T> callback);
-
-    /**
-     * 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.
-     * 
-     * @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 implementation classes. The method takes as argument a Component parameter.
-     * @return this builder
-     */
-    <T> B init(CbComponent<T> callback);
     
     /**
-     * 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.
+     * Sets a callback instance and the name of the method used as the "destroy" callback. This method, when found, is
+     * invoked as part of the life cycle management of the component implementation. <p>The
+     * dependency manager will look for a method of this name with the following signatures,
+     * in this order:
+     * <ol>
+     * <li>method(Component component)</li>
+     * <li>method()</li>
+     * </ol>
      * 
-     * @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 implementation classes. The method takes as argument a Component parameter.
+     * @param callbackInstance a callback instance object the callback is invoked on
+     * @param callback the callback name
      * @return this builder.
      */
-    <T> B start(CbComponent<T> callback);
-  
-    /**
-     * 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 <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 implementation classes. The method takes as argument a Component parameter.
-     * @return this builder.
-     */
-    <T> B stop(CbComponent<T> callback);
-  
-    /**
-     * 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 <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 implementation classes. The method takes as argument a Component parameter.
-     * @return this builder.
-     */
-    <T> B destroy(CbComponent<T> callback);
+    B destroy(Object callbackInstance, String 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 
-     * 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 callback an Object instance method reference. The method does not take any parameters.
-     * @return this builder
-     */
-    B initInstance(InstanceCb callback);
- 
-    /**
-     * Sets an Object instance method reference used as the "start" callback. 
-     * This method is invoked as part of the life cycle management of the component implementation. 
-     * The method does not take any parameters.
-     *
-     * @param callback an Object instance method reference. The method does not take any parameters.
-     * @return this builder.
-     */
-    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 
-     * 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 callback an Object instance method reference. The method does not take any parameters.
-     * @return this builder
-     */
-    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 
      * implementation. 
      * This method is useful because when it is invoked, all required dependencies defines in the Activator
@@ -649,42 +685,9 @@
      * @param callback an Object instance method reference. The method does not take any parameters.
      * @return this builder
      */
-    B destroyInstance(InstanceCb callback);
+    B destroy(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 
-     * 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 callback an Object instance method reference. The method takes as argument a Component parameter.
-     * @return this builder
-     */
-    B initInstance(InstanceCbComponent callback);
-   
-    /**
-     * Sets an Object instance method reference used as the "start" callback.
-     * This method is invoked as part of the life cycle management of the component implementation. 
-     * The method takes as argument a Component parameter.
-     *
-     * @param callback an Object instance method reference. The method takes as argument a Component parameter.
-     * @return this builder.
-     */
-    B startInstance(InstanceCbComponent callback);
-    
-    /**
-     * Sets an Object instance method reference used as the "stop" callback. 
-     * This method is invoked as part of the life cycle management of the component implementation. 
-     * The method takes as argument a Component parameter.
-     *
-     * @param callback an Object instance method reference. The method takes as argument a Component parameter.
-     * @return this builder.
-     */
-    B stopInstance(InstanceCbComponent callback);
-  
-    /**
      * Sets an Object instance method reference used as the "destroy" callback. 
      * This method is invoked as part of the life cycle management of the component implementation. 
      * The method takes as argument a Component parameter.
@@ -692,7 +695,7 @@
      * @param callback an Object instance method reference. The method takes as argument a Component parameter.
      * @return this builder.
      */
-    B destroyInstance(InstanceCbComponent callback);
+    B destroy(InstanceCbComponent callback);
 
     /**
      * Configures OSGi object (BundleContext, Component, etc ...) that will be injected in any field having the same OSGi object type.
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 2dfb297..d30b3b3 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
@@ -85,6 +85,11 @@
  *     }
  * }
  * }</pre>
+ * 
+ * When a dependency is not explicitly defined as "required" or "optional", 
+ * then it is assumed to be optional by default, like it is the case with the original DM API.
+ * You can change the default mode using the "org.apache.felix.dependencymanager.lambda.defaultRequiredDependency system property"
+ * (see Felix dm-lambda online documentation).
  */
 public abstract class DependencyManagerActivator implements BundleActivator {    
 	/**
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 b30cacf..c1c5ecd 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
@@ -40,8 +40,7 @@
 import org.apache.felix.dm.lambda.callbacks.InstanceCbServiceServiceComponent;
 
 /**
- * Builds a service dependency callback. When a service dependency is not explicitly defined as "required" or "optional", 
- * then it is assumed to be required by default.
+ * Builds a service dependency callback. 
  * 
  * <p> A Service may be injected in a bind-method of a component or an object instance using this builder.
  * The builder supports reflection based callbacks (same as with the original DM API), as well as java8 method reference based callbacks.
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 83f2015..cfcc5f8 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
@@ -27,8 +27,6 @@
 
 /**
  * Builds a Dependency Manager Service Dependency. 
- * <p> When a service dependency is not explicitly defined as "required" or "optional", then it is assumed to be required by default.
- * 
  * <p> Sample code:
  * 
  * <pre> {@code
@@ -36,11 +34,13 @@
  *    public void init(BundleContext ctx, DependencyManager dm) throws Exception {
  *       component(comp -> comp
  *          .impl(Pojo.class)
- *          .withSrv(ConfigurationAdmin.class, "(vendor=apache)") // required service with a filter, injected in class field
- *          .withSrv(Coordinator.class, LogService.class) // varargs of required dependencies injected on class fields
- *          .withSrv(HttpService.class, svc -> srv.add(Pojo::setHttpService)) // required dependency injected using a method ref
- *          .withSrv(ConnectorService.class, svc -> svc.optional()) // optional dependency, injected in class field with a NullObject if unavailable (before start() callback).
- *          .withSrv(Tracked.class, srv -> srv.optional().add(Pojo::addTracked)) // optional dependency, injected using method ref, after the start() callback
+ *          .withSvc(ConfigurationAdmin.class, LogService.class) // varargs of optional (possibly NullObjects) dependencies injected in compatible class fields
+ *          .withSvc(true, Coordinator.class, LogService.class) // varargs of required dependencies injected in compatible class fields
+ *          .withSvc(ConfigurationAdmin.class, "(vendor=apache)") // service with a filter, injected in compatible class fields
+ *          .withSvc(ConfigurationAdmin.class, "(vendor=apache)", true) // required service with a filter, injected in compatible class fields
+ *          .withSvc(ConfigurationAdmin.class, "(vendor=apache)", true, "field") // required service with a filter, injected in a given class field name
+ *          .withSvc(HttpService.class, svc -> svc.required().add(Pojo::setHttpService)) // required dependency injected using a method reference
+ *          .withSvc(Tracked.class, svc -> svc.optional().add(Pojo::addTracked)) // optional dependency, injected using method ref, after the start() callback
  *    }
  * }}</pre>
  * 
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 024f9d9..97ed19c 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
@@ -35,7 +35,7 @@
      */
     void accept(T instance, S service);
 
-    default CbFuture<T, S> andThen(CbFuture<? super T, S> after) {
+    default CbService<T, S> andThen(CbService<? super T, S> after) {
         Objects.requireNonNull(after);
         return (T instance, S service) -> {
             accept(instance, service);
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
index 4b90a0e..47da62c 100644
--- 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
@@ -30,13 +30,13 @@
     /**
      * Implements the callback method.
      */
-    void cb();
+    void callback();
 
     default InstanceCb andThen(InstanceCb after) {
         Objects.requireNonNull(after);
         return () -> {
-            cb();
-            after.cb();
+            callback();
+            after.callback();
         };
     }
 }
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 3ac9066..d9f17b5 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
@@ -30,8 +30,6 @@
 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.InstanceCb;
 import org.apache.felix.dm.lambda.callbacks.InstanceCbComponent;
 
@@ -175,16 +173,6 @@
         return (B) this;
     }
     
-    default B withSvc(Class<?> service, String filter) {
-        andThenBuild(compBuilder -> compBuilder.withSvc(service, filter));
-        return (B) this;
-    }
-
-    default B withSvc(Class<?> ... services) {
-        andThenBuild(compBuilder -> compBuilder.withSvc(services));
-        return (B) this;
-    }
-
     default <U> B withSvc(Class<U> service, Consumer<ServiceDependencyBuilder<U>> consumer) {
         andThenBuild(compBuilder -> compBuilder.withSvc(service, consumer));
         return (B) this;
@@ -204,13 +192,23 @@
         andThenBuild(compBuilder -> compBuilder.withFuture(future, consumer));
         return (B) this;
     }
-    
-    default B lifecycleCallbackInstance(Object lifecycleCallbackInstance) {
-        andThenBuild(compBuilder -> compBuilder.lifecycleCallbackInstance(lifecycleCallbackInstance));
+        
+    default B init(String callback) {
+        andThenBuild(compBuilder -> compBuilder.init(callback));
         return (B) this;
     }
     
-    default B init(String callback) {
+    default B init(Object callbackInstance, String callback) {
+        andThenBuild(compBuilder -> compBuilder.init(callbackInstance, callback));
+        return (B) this;
+    }
+    
+    default B init(InstanceCb callback) {
+        andThenBuild(compBuilder -> compBuilder.init(callback));
+        return (B) this;
+    }
+        
+    default B init(InstanceCbComponent callback) {
         andThenBuild(compBuilder -> compBuilder.init(callback));
         return (B) this;
     }
@@ -220,95 +218,60 @@
         return (B) this;
     }
 
+    default B start(Object callbackInstance, String callback) {
+        andThenBuild(compBuilder -> compBuilder.start(callbackInstance, callback));
+        return (B) this;
+    }
+
+    default B start(InstanceCb callback) {
+        andThenBuild(compBuilder -> compBuilder.start(callback));
+        return (B) this;
+    }
+        
+    default B start(InstanceCbComponent callback) {
+        andThenBuild(compBuilder -> compBuilder.start(callback));
+        return (B) this;
+    }
+
     default B stop(String callback) {
         andThenBuild(compBuilder -> compBuilder.stop(callback));
         return (B) this;
     }
 
+    default B stop(Object callbackInstance, String callback) {
+        andThenBuild(compBuilder -> compBuilder.stop(callbackInstance, callback));
+        return (B) this;
+    }
+
+    default B stop(InstanceCb callback) {
+        andThenBuild(compBuilder -> compBuilder.stop(callback));
+        return (B) this;
+    }
+        
+    default B stop(InstanceCbComponent callback) {
+        andThenBuild(compBuilder -> compBuilder.stop(callback));
+        return (B) this;
+    }
+
     default B destroy(String callback) {
         andThenBuild(compBuilder -> compBuilder.destroy(callback));
         return (B) this;
     }
         
-    default <U> B init(Cb<U> callback) {
-        andThenBuild(compBuilder -> compBuilder.init(callback));
+    default B destroy(Object callbackInstance, String callback) {
+        andThenBuild(compBuilder -> compBuilder.destroy(callbackInstance, callback));
         return (B) this;
     }
-    
-    default <U> B start(Cb<U> callback) {
-        andThenBuild(compBuilder -> compBuilder.start(callback));
-        return (B) this;
-    }
-
-    default <U> B stop(Cb<U> callback) {
-        andThenBuild(compBuilder -> compBuilder.stop(callback));
-        return (B) this;
-    }
-
-    default <U> B destroy(Cb<U> callback) {
+        
+    default B destroy(InstanceCb callback) {
         andThenBuild(compBuilder -> compBuilder.destroy(callback));
         return (B) this;
     }
-        
-    default <U> B init(CbComponent<U> callback) {
-        andThenBuild(compBuilder -> compBuilder.init(callback));
-        return (B) this;
-    }
-        
-    default <U> B start(CbComponent<U> callback) {
-        andThenBuild(compBuilder -> compBuilder.start(callback));
-        return (B) this;
-    }
-        
-    default <U> B stop(CbComponent<U> callback) {
-        andThenBuild(compBuilder -> compBuilder.stop(callback));
-        return (B) this;
-    }
-        
-    default <U> B destroy(CbComponent<U> callback) {
+     
+    default B destroy(InstanceCbComponent callback) {
         andThenBuild(compBuilder -> compBuilder.destroy(callback));
         return (B) this;
     }
-        
-    default B initInstance(InstanceCb callback) {
-        andThenBuild(compBuilder -> compBuilder.initInstance(callback));
-        return (B) this;
-    }
-        
-    default B startInstance(InstanceCb callback) {
-        andThenBuild(compBuilder -> compBuilder.startInstance(callback));
-        return (B) this;
-    }
-        
-    default B stopInstance(InstanceCb callback) {
-        andThenBuild(compBuilder -> compBuilder.stopInstance(callback));
-        return (B) this;
-    }
-        
-    default B destroyInstance(InstanceCb callback) {
-        andThenBuild(compBuilder -> compBuilder.destroyInstance(callback));
-        return (B) this;
-    }
-        
-    default B initInstance(InstanceCbComponent callback) {
-        andThenBuild(compBuilder -> compBuilder.initInstance(callback));
-        return (B) this;
-    }
-
-    default B startInstance(InstanceCbComponent callback) {
-        andThenBuild(compBuilder -> compBuilder.startInstance(callback));
-        return (B) this;
-    }
-
-    default B stopInstance(InstanceCbComponent callback) {
-        andThenBuild(compBuilder -> compBuilder.stopInstance(callback));
-        return (B) this;
-    }
-
-    default B destroyInstance(InstanceCbComponent callback) {
-        andThenBuild(compBuilder -> compBuilder.destroyInstance(callback));
-        return (B) this;
-    }
 
    default B autoConfig(Class<?> clazz, boolean autoConfig) {
         andThenBuild(compBuilder -> compBuilder.autoConfig(clazz, autoConfig));
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 e800443..35b25e7 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
@@ -45,7 +45,7 @@
 	private Object m_instance;
 	private boolean m_autoConfig = true;
 	private boolean m_autoConfigInvoked = false;
-	private boolean m_required = true;
+	private boolean m_required;
 	private Bundle m_bundle;
 	private String m_filter;
 	private int m_stateMask = -1;
@@ -54,6 +54,7 @@
 	private String m_propagateMethod;
 	private Function<Bundle, Dictionary<?, ?>> m_propagateCallback;
 	private final Component m_component;
+	private boolean m_requiredSet;
     
     enum Cb {
         ADD,        
@@ -98,8 +99,14 @@
     @Override
     public BundleDependencyBuilder required(boolean required) {
         m_required = required;
+        m_requiredSet = true;
         return this;
     }
+    
+    @Override
+    public BundleDependencyBuilder optional() {
+        return required(false);
+    }
 
     @Override
     public BundleDependencyBuilder required() {
@@ -292,6 +299,9 @@
         DependencyManager dm = m_component.getDependencyManager();
 
         BundleDependency dep = dm.createBundleDependency();
+        if (! m_requiredSet) {
+            m_required = Helpers.isDependencyRequiredByDefault(m_component);
+        }
         dep.setRequired(m_required);
         
         if (m_filter != null) {
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 a8e698b..6d1f27e 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
@@ -40,6 +40,7 @@
 import org.apache.felix.dm.Component;
 import org.apache.felix.dm.Dependency;
 import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.dm.context.ComponentContext;
 import org.apache.felix.dm.lambda.BundleDependencyBuilder;
 import org.apache.felix.dm.lambda.ComponentBuilder;
 import org.apache.felix.dm.lambda.ConfigurationDependencyBuilder;
@@ -47,8 +48,6 @@
 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.InstanceCb;
 import org.apache.felix.dm.lambda.callbacks.InstanceCbComponent;
 
@@ -62,23 +61,26 @@
     private Object m_factory;
     private boolean m_factoryHasComposite;	
     private boolean m_autoAdd = true;
-    protected final Map<ComponentCallback, List<MethodRef<Object>>> m_refs = new HashMap<>();
+    protected final Map<ComponentCallback, MethodRef> m_refs = new HashMap<>();
     private Object m_compositionInstance;
     private String m_compositionMethod;
     private String m_init;
-    private String m_stop;
     private String m_start;
+    private String m_stop;
     private String m_destroy;
-    private Object m_callbackInstance;
     private String m_factoryCreateMethod;
     private boolean m_hasFactoryRef;   
-    private boolean m_hasFactory;   
+    private boolean m_hasFactory;
+    private Object m_initCallbackInstance;
+    private Object m_startCallbackInstance;
+    private Object m_stopCallbackInstance;
+    private Object m_destroyCallbackInstance;   
     
     enum ComponentCallback { INIT, START, STOP, DESTROY };
     
     @FunctionalInterface
-    interface MethodRef<I> {
-        public void accept(I instance, Component c);
+    interface MethodRef {
+        public void accept(Component c);
     }
 
     public ComponentBuilderImpl(DependencyManager dm) {
@@ -297,6 +299,10 @@
             public Object create() {
                 return create.get();
             }
+            @Override
+            public String toString() {
+                return create.getClass().getName() + " (Factory)";
+            }
         };
         return this;
     }
@@ -314,6 +320,10 @@
                 U factoryImpl = supplier.get();
                 return create.apply(factoryImpl);
             }
+            @Override
+            public String toString() {
+                return supplier.getClass().getName() + " (Factory)";
+            }
         }; 
         return this;
     }
@@ -335,6 +345,11 @@
             public Object[] getComposite() { // Create Factory instance
                 return getComposite.get();
             }
+            
+            @Override
+            public String toString() {
+                return create.getClass().getName() + " (Factory)";
+            }
         };
         m_factoryHasComposite = true;
         return this;
@@ -361,6 +376,11 @@
             public Object[] getComposite() { 
                 return factoryGetComposite.apply(m_factoryInstance);
             }
+            
+            @Override
+            public String toString() {
+                return factorySupplier.getClass().getName() + " (Factory)";
+            }
         }; 
         m_factoryHasComposite = true;
         return this;
@@ -388,31 +408,13 @@
     }
 
     @Override
-    public ComponentBuilderImpl withSvc(Class<?> service, String filter) {
-        return withSvc(service, srv->srv.filter(filter));
-    }   
-
-    @Override
-    public ComponentBuilderImpl withSvc(Class<?> ... services) {
-        for (Class<?> s : services) {
-            doWithService(s);
-        }
-        return this;
-    }   
-
-    private <U> void doWithService(Class<U> service) {
-        ServiceDependencyBuilder<U> dep = new ServiceDependencyBuilderImpl<>(m_component, service);
-        m_dependencyBuilders.add(dep);
-    }
-
-    @Override
     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);
         return this;
     }   
-    
+        
     @Override
     public ComponentBuilderImpl withCnf(Consumer<ConfigurationDependencyBuilder> consumer) {
         ConfigurationDependencyBuilder dep = new ConfigurationDependencyBuilderImpl(m_component);
@@ -437,168 +439,111 @@
         return this;
     }
     
-    public ComponentBuilderImpl lifecycleCallbackInstance(Object callbackInstance) {
-        m_callbackInstance = callbackInstance;
-        return this;
-    }    
-
     public ComponentBuilderImpl init(String callback) {
-        ensureHasNoLifecycleMethodRefs();
         m_init = callback;
         return this;
     }
     
+    public ComponentBuilderImpl init(Object callbackInstance, String callback) {
+        init(callback);
+        m_initCallbackInstance = callbackInstance;
+        return this;
+    }
+
+    @Override
+    public ComponentBuilderImpl init(InstanceCb callback) {
+        setCallbackMethodRef(INIT, component -> callback.callback());
+        m_init = null;
+        m_initCallbackInstance = null;
+        return this;
+    }
+    
+    @Override
+    public ComponentBuilderImpl init(InstanceCbComponent callback) {
+        setCallbackMethodRef(INIT, component -> callback.accept(component));
+        m_init = null;
+        m_initCallbackInstance = null;
+        return this;
+    }
+  
     public ComponentBuilderImpl start(String callback) {
-        ensureHasNoLifecycleMethodRefs();
         m_start = callback;
         return this;
     }
+    
+    public ComponentBuilderImpl start(Object callbackInstance, String callback) {
+        start(callback);
+        m_startCallbackInstance = callbackInstance;
+        return this;
+    }
+
+    @Override
+    public ComponentBuilderImpl start(InstanceCb callback) {
+        setCallbackMethodRef(START, component -> callback.callback());
+        m_start = null;
+        m_startCallbackInstance = null;
+        return this;
+    }
+    
+    @Override
+    public ComponentBuilderImpl start(InstanceCbComponent callback) {
+        setCallbackMethodRef(START, component -> callback.accept(component));
+        m_start = null;
+        m_startCallbackInstance = null;
+        return this;
+    }
 
     public ComponentBuilderImpl stop(String callback) {
-        ensureHasNoLifecycleMethodRefs();
         m_stop = callback;
         return this;
     }
     
+    public ComponentBuilderImpl stop(Object callbackInstance, String callback) {
+        stop(callback);
+        m_stopCallbackInstance = callbackInstance;
+        return this;
+    }
+
+    @Override
+    public ComponentBuilderImpl stop(InstanceCb callback) {
+        setCallbackMethodRef(STOP, component -> callback.callback());
+        m_stop = null;
+        m_stopCallbackInstance = null;
+        return this;
+    }
+
+    @Override
+    public ComponentBuilderImpl stop(InstanceCbComponent callback) {
+        setCallbackMethodRef(STOP, component -> callback.accept(component));
+        m_stop = null;
+        m_stopCallbackInstance = null;
+        return this;
+    }
+
     public ComponentBuilderImpl destroy(String callback) {
-        ensureHasNoLifecycleMethodRefs();
         m_destroy = callback;
         return this;
     }
-    
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T> ComponentBuilderImpl init(Cb<T> callback) {
-        if (callback != null) {
-            setComponentCallbackRef(INIT, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst));
-        }
-        return this;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T> ComponentBuilderImpl start(Cb<T> callback) {
-        if (callback != null) {
-            setComponentCallbackRef(START, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst));
-        }
-        return this;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T> ComponentBuilderImpl stop(Cb<T> callback) {
-        if (callback != null) {
-            setComponentCallbackRef(STOP, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst));
-        }
-        return this;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T> ComponentBuilderImpl destroy(Cb<T> callback) {
-        if (callback != null) {
-            setComponentCallbackRef(DESTROY, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst));
-        }
-        return this;
-    }
-
-   @SuppressWarnings("unchecked")
-   @Override
-    public <T> ComponentBuilderImpl init(CbComponent<T> callback) {
-        if (callback != null) {
-            setComponentCallbackRef(INIT, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst, component));
-        }
-        return this;
-    }
-            
-   @SuppressWarnings("unchecked")
-   @Override
-    public <T> ComponentBuilderImpl start(CbComponent<T> callback) {
-        if (callback != null) {
-            setComponentCallbackRef(START, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst, component));
-        }
-        return this;
-    }
-            
-   @SuppressWarnings("unchecked")
-   @Override
-    public <T> ComponentBuilderImpl stop(CbComponent<T> callback) {
-        if (callback != null) {
-            setComponentCallbackRef(STOP, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst, component));
-        }
-        return this;
-    }
-            
-   @SuppressWarnings("unchecked")
-   @Override
-    public <T> ComponentBuilderImpl destroy(CbComponent<T> callback) {
-        if (callback != null) {
-            setComponentCallbackRef(DESTROY, Helpers.getLambdaArgType(callback, 0), (inst, component) -> callback.accept((T) inst, component));
-        }
-        return this;
-    }
-            
-    @Override
-    public ComponentBuilderImpl initInstance(InstanceCb callback) {
-        if (callback != null) {
-            setInstanceCallbackRef(INIT, (inst, component) -> callback.cb());
-        }
-        return this;
-    }
-    
-    @Override
-    public ComponentBuilderImpl startInstance(InstanceCb callback) {
-        if (callback != null) {
-            setInstanceCallbackRef(START, (inst, component) -> callback.cb());
-        }
+           
+    public ComponentBuilderImpl destroy(Object callbackInstance, String callback) {
+        destroy(callback);
+        m_destroyCallbackInstance = callbackInstance;
         return this;
     }
 
     @Override
-    public ComponentBuilderImpl stopInstance(InstanceCb callback) {
-        if (callback != null) {
-            setInstanceCallbackRef(STOP, (inst, component) -> callback.cb());
-        }
-        return this;
-    }
-
-    @Override
-    public ComponentBuilderImpl destroyInstance(InstanceCb callback) {
-        if (callback != null) {
-            setInstanceCallbackRef(DESTROY, (inst, component) -> callback.cb());
-        }
+    public ComponentBuilderImpl destroy(InstanceCb callback) {
+        setCallbackMethodRef(DESTROY, component -> callback.callback());
+        m_destroy = null;
+        m_destroyCallbackInstance = null;
         return this;
     }
         
     @Override
-    public ComponentBuilderImpl initInstance(InstanceCbComponent callback) {
-        if (callback != null) {
-            setInstanceCallbackRef(INIT, (inst, component) -> callback.accept(component));
-        }
-        return this;
-    }
-  
-    @Override
-    public ComponentBuilderImpl startInstance(InstanceCbComponent callback) {
-        if (callback != null) {
-            setInstanceCallbackRef(START, (inst, component) -> callback.accept(component));
-        }
-        return this;
-    }
-
-    @Override
-    public ComponentBuilderImpl stopInstance(InstanceCbComponent callback) {
-        if (callback != null) {
-            setInstanceCallbackRef(STOP, (inst, component) -> callback.accept(component));
-        }
-        return this;
-    }
-
-    @Override
-    public ComponentBuilderImpl destroyInstance(InstanceCbComponent callback) {
-        if (callback != null) {
-            setInstanceCallbackRef(DESTROY, (inst, component) -> callback.accept(component));
-        }
+    public ComponentBuilderImpl destroy(InstanceCbComponent callback) {
+        setCallbackMethodRef(DESTROY, component -> callback.accept(component));
+        m_destroy = null;
+        m_destroyCallbackInstance = null;
         return this;
     }
     
@@ -625,13 +570,23 @@
                } else {
                    m_component.setFactory(m_factory, m_factoryCreateMethod);
                }
-           }
-            
-           if (m_refs.size() > 0) {
-        	   setLifecycleMethodRefs();
-           } else if (hasLifecleMethods()) {
-               m_component.setCallbacks(m_callbackInstance, m_init, m_start, m_stop, m_destroy);
-           }
+           }                       
+           
+           if (hasCallbacks()) { // either method refs on some object instances, or a callback (reflection) on some object instances.   
+               if (m_refs.get(INIT) == null) {
+                   setCallbackMethodRef(INIT, component -> invokeCallbacks(component, m_initCallbackInstance, m_init, "init"));
+               }
+               if (m_refs.get(START) == null) {
+                   setCallbackMethodRef(START, component -> invokeCallbacks(component, m_startCallbackInstance, m_start, "start"));
+               }
+               if (m_refs.get(STOP) == null) {
+                   setCallbackMethodRef(STOP, component -> invokeCallbacks(component, m_stopCallbackInstance, m_stop, "stop"));
+               }
+               if (m_refs.get(DESTROY) == null) {
+                   setCallbackMethodRef(DESTROY, component -> invokeCallbacks(component, m_destroyCallbackInstance, m_destroy, "destroy"));
+               }
+               setInternalCallbacks();                
+            }
         }
         
         if (m_dependencyBuilders.size() > 0) {
@@ -642,79 +597,54 @@
         }
         return m_component;
     }
-
-    private boolean hasLifecleMethods() {
-        return m_init != null || m_start != null || m_stop != null || m_destroy != null;
-    }
-    
-    private boolean hasLifecleMethodRefs() {
-        return m_refs.size() > 0;
-    }
-    
-    private void ensureHasNoLifecycleMethods() {
-        if (hasLifecleMethods()) {
-            throw new IllegalStateException("Can't mix method references and name names for lifecycle callbacks");
-        }
-    }
-    
-    private void ensureHasNoLifecycleMethodRefs() {
-        if (hasLifecleMethodRefs()) {
-            throw new IllegalStateException("Can't mix method references and name names for lifecycle callbacks");
-        }
-    }
-
-    protected <U> ComponentBuilderImpl setInstanceCallbackRef(ComponentCallback cbType, MethodRef<U> ref) {
-        ensureHasNoLifecycleMethods();
-        List<MethodRef<Object>> list = m_refs.computeIfAbsent(cbType, l -> new ArrayList<>());
-        list.add((instance, component) -> {
-            ref.accept(null, component);
-        });
-        return this;
-    }
-
-    @SuppressWarnings("unchecked")
-    private <U> ComponentBuilderImpl setComponentCallbackRef(ComponentCallback cbType, Class<U> type, MethodRef<U> callback) {
-        ensureHasNoLifecycleMethods();
-        if (type.equals(Object.class)) {
-            throw new IllegalStateException("callback does not seam to be one from the possible component implementation classes");
-        }
-        List<MethodRef<Object>> list = m_refs.computeIfAbsent(cbType, l -> new ArrayList<>());
-        list.add((instance, component) -> {
-            Object componentImpl = Stream.of(component.getInstances())
-                .filter(impl -> Helpers.getClass(impl).equals(type))
-                .findFirst()
-                .orElseThrow(() -> new IllegalStateException("The method reference " + callback + " does not match any available component impl classes."));   
-            callback.accept((U) componentImpl, component);
-        });
-        return this;
-    }
         
+    private boolean hasCallbacks() {
+        return m_refs.size() > 0 || m_init != null || m_start != null || m_stop != null || m_destroy != null;
+    }
+
+    private void invokeCallbacks(Component component, Object callbackInstance, String callback, String defaultCallback) {
+        boolean logIfNotFound = (callback != null);
+        callback = callback != null ? callback : defaultCallback;
+        ComponentContext ctx = (ComponentContext) component;
+        Object[] instances = callbackInstance != null ? new Object[] { callbackInstance } : ctx.getInstances();
+
+        ctx.invokeCallbackMethod(instances, callback, 
+            new Class[][] {{ Component.class }, {}}, 
+            new Object[][] {{ component }, {}},
+            logIfNotFound);
+    }
+    
+    private ComponentBuilderImpl setCallbackMethodRef(ComponentCallback cbType, MethodRef ref) {
+        m_refs.put(cbType,  ref);
+        return this;
+    }
+            
     @SuppressWarnings("unused")
-    private void setLifecycleMethodRefs() {
+    private void setInternalCallbacks() {
         Object cb = new Object() {
             void init(Component comp) {
-            	invokeLfcleCallbacks(ComponentCallback.INIT, comp);
+                invokeLifecycleCallback(ComponentCallback.INIT, comp);
             }
 
             void start(Component comp) {
-            	invokeLfcleCallbacks(ComponentCallback.START, comp);
+                invokeLifecycleCallback(ComponentCallback.START, comp);
             }
 
             void stop(Component comp) {
-            	invokeLfcleCallbacks(ComponentCallback.STOP, comp);
+                invokeLifecycleCallback(ComponentCallback.STOP, comp);
             }
 
             void destroy(Component comp) {
-            	invokeLfcleCallbacks(ComponentCallback.DESTROY, comp);
+                invokeLifecycleCallback(ComponentCallback.DESTROY, comp);
             }
         };
         m_component.setCallbacks(cb, "init", "start", "stop", "destroy");
     }
     
-    private void invokeLfcleCallbacks(ComponentCallback cbType, Component component) {
-        m_refs.computeIfPresent(cbType, (k, mrefs) -> {
-            mrefs.forEach(mref -> mref.accept(null, component));
-            return mrefs;
+    private void invokeLifecycleCallback(ComponentCallback cbType, Component component) {        
+        m_refs.computeIfPresent(cbType, (k, mref) -> {
+            mref.accept(component);
+            return mref;
          });
     }
 
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 2fd6dee..c7c96b7 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
@@ -30,14 +30,17 @@
 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;
+import org.osgi.framework.BundleContext;
 
 /**
  * Various helper methods related to generics and lambda expressions.
  */
 public class Helpers {
 	private final static Pattern LAMBDA_INSTANCE_METHOD_TYPE = Pattern.compile("(L[^;]+)+");
-
+	private final static String DEFAULT_REQUIRED_DEPENDENCY = "org.apache.felix.dependencymanager.lambda.defaultRequiredDependency";
+	
 	/**
 	 * Gets the class name of a given object.
 	 * @param obj the object whose class has to be returned.
@@ -129,6 +132,29 @@
     }
 
     /**
+     * Is a dependency required by default ?
+     * 
+     * @param c the component on which the dependency is added
+     * @param ctx the bundle context
+     * @return true if the dependency is required by default, false if not
+     */
+    public static boolean isDependencyRequiredByDefault(Component c) {
+        BundleContext ctx = ((ComponentContext) c).getBundleContext();
+        String defaultRequiredDependency = ctx.getProperty(DEFAULT_REQUIRED_DEPENDENCY);
+        if (defaultRequiredDependency != null) {
+            defaultRequiredDependency = defaultRequiredDependency.trim();
+            String componentName = c.getComponentDeclaration().getName();
+            for (String pkg : defaultRequiredDependency.split(",")) {
+                if (componentName.startsWith(pkg)) {
+                    return true;
+                }
+            }            
+        }        
+        
+        return false;
+    }
+    
+    /**
      * Extracts the actual types of all lambda generic parameters.
      * Example: for "BiConsumer<String, Integer>", this method returns ["java.lang.String", "java.lang.Integer"].
      */
@@ -161,5 +187,5 @@
             .findFirst()
             .orElseThrow(() -> new RuntimeException("Lambda Method not found"));
     }
-    
+
 }
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 28929a2..ffa8d1f 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
@@ -33,13 +33,14 @@
     private final Component m_component;
     private String m_filter;
     private ServiceReference<S> m_ref;
-    private boolean m_required = true;
+    private boolean m_required;
     private String m_debug;
     private boolean m_propagate;
     private Object m_propagateInstance;
     private String m_propagateMethod;
     private Object m_defaultImpl;
     private long m_timeout = -1;
+    private boolean m_requiredSet;
 
     public ServiceDependencyBuilderImpl(Component component, Class<S> service) {
         super(service);
@@ -67,6 +68,7 @@
 
     public ServiceDependencyBuilder<S> required(boolean required) {
         m_required = required;
+        m_requiredSet = true;
         return this;
     }
 
@@ -119,6 +121,7 @@
 
     public ServiceDependencyBuilder<S> timeout(long timeout) {
         m_timeout = timeout;
+        required();
         return this;
     }
 
@@ -129,12 +132,18 @@
         if (m_ref != null && m_filter != null) {
             throw new IllegalArgumentException("Can not set ref and filter at the same time");
         }
+        if (m_serviceIface == null && (m_ref == null || m_filter == null)) {
+            throw new IllegalArgumentException("service interface not specified, and no service reference or service filter specified.");
+        }
         ServiceDependency sd = m_timeout > -1 ? dm.createTemporalServiceDependency(m_timeout) : dm.createServiceDependency();
         if (m_ref != null) {
             sd.setService(m_serviceIface, m_ref);
         } else {
             sd.setService(m_serviceIface, m_filter);
         }
+        if (! m_requiredSet) {
+            m_required = Helpers.isDependencyRequiredByDefault(m_component);
+        }
         sd.setRequired(m_required);
         sd.setDefaultImplementation(m_defaultImpl);
         if (m_debug != null) {
diff --git a/dependencymanager/release/resources/changelog.txt b/dependencymanager/release/resources/changelog.txt
index d81582a..8cc8ad5 100644
--- a/dependencymanager/release/resources/changelog.txt
+++ b/dependencymanager/release/resources/changelog.txt
@@ -12,16 +12,18 @@
     * [FELIX-5188] - No error log when a factory pid adapter update callback is not found
     * [FELIX-5192] - ConfigurationDependency race condition when component is stopped
     * [FELIX-5193] - Factory Pid Adapter race condition when component is stopped
-
+    * [FELIX-5200] - Factory configuration adapter not restarted
+    
 ** Improvement
-    * [FELIX-4689] - Create a more fluent syntax for the dependency manager builder
+    * [FELIX-5126] - Build DM using Java 8
     * [FELIX-5164] - Add support for callback instance in Aspects
     * [FELIX-5177] - Support injecting configuration proxies
     * [FELIX-5180] - Support for Java8 Repeatable Properties in DM annotations.
     * [FELIX-5182] - Cleanup DM samples
+    * [FELIX-5201] - Improve how components are displayed with gogo shell
 
 ** New Feature
-    * [FELIX-5126] - Build DM using Java 8
+    * [FELIX-4689] - Create a more fluent syntax for the dependency manager builder
 
 Release Notes - Felix - Version org.apache.felix.dependencymanager-r6
 ======================================================================