diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ConfigurationDependencyBuilderImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ConfigurationDependencyBuilderImpl.java
index 39fe9c8..b237b25 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ConfigurationDependencyBuilderImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/ConfigurationDependencyBuilderImpl.java
@@ -120,7 +120,7 @@
         Class<T> componentType = Helpers.getLambdaArgType(callback, 0);
         m_pid = m_pid == null ? configClass.getName() : m_pid;
         return setComponentCallbackRef(componentType, (instance, component, props) -> { 
-            U configProxy = ((ComponentContext) m_component).createConfigurationProxy(configClass, props);            
+            U configProxy = ((ComponentContext) m_component).createConfigurationType(configClass, props);            
             callback.accept((T) instance, configProxy);
         }); 
     }
@@ -130,7 +130,7 @@
         Class<T> componentType = Helpers.getLambdaArgType(callback, 0);
         m_pid = m_pid == null ? configClass.getName() : m_pid;
         return setComponentCallbackRef(componentType, (instance, component, props) -> { 
-            U configProxy = ((ComponentContext) m_component).createConfigurationProxy(configClass, props);            
+            U configProxy = ((ComponentContext) m_component).createConfigurationType(configClass, props);            
             callback.accept((T) instance, configProxy, component);
         }); 
     }
@@ -152,7 +152,7 @@
     public <T> ConfigurationDependencyBuilder update(Class<T> configClass, InstanceCbConfiguration<T> updated) {
         m_pid = m_pid == null ? configClass.getName() : m_pid;
         return setInstanceCallbackRef((instance, component, props) -> { 
-            T configProxy = ((ComponentContext) m_component).createConfigurationProxy(configClass, props);
+            T configProxy = ((ComponentContext) m_component).createConfigurationType(configClass, props);
             updated.accept(configProxy);
         });
     }
@@ -160,7 +160,7 @@
     public <T> ConfigurationDependencyBuilder update(Class<T> configClass, InstanceCbConfigurationComponent<T> updated) {
         m_pid = m_pid == null ? configClass.getName() : m_pid;
         return setInstanceCallbackRef((instance, component, props) -> { 
-            T configProxy = ((ComponentContext) m_component).createConfigurationProxy(configClass, props);
+            T configProxy = ((ComponentContext) m_component).createConfigurationType(configClass, props);
             updated.accept(configProxy, component);
         });
     }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/FactoryPidAdapterBuilderImpl.java b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/FactoryPidAdapterBuilderImpl.java
index 741c22b..4c4daf1 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/FactoryPidAdapterBuilderImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/lambda/impl/FactoryPidAdapterBuilderImpl.java
@@ -133,7 +133,7 @@
         Class<T> type = Helpers.getLambdaArgType(callback, 0);
         m_factoryPid = m_factoryPid == null ? configType.getName() : m_factoryPid;
         return setComponentCallbackRef(type, (instance, component, props) -> {
-            U configProxy = ((ComponentContext) component).createConfigurationProxy(configType, props);            
+            U configProxy = ((ComponentContext) component).createConfigurationType(configType, props);            
             callback.accept((T) instance, configProxy); 
         });
     }
@@ -149,7 +149,7 @@
         Class<T> type = Helpers.getLambdaArgType(callback, 0);
         m_factoryPid = m_factoryPid == null ? configType.getName() : m_factoryPid;
         return setComponentCallbackRef(type, (instance, component, props) -> { 
-            U configProxy = ((ComponentContext) component).createConfigurationProxy(configType, props);            
+            U configProxy = ((ComponentContext) component).createConfigurationType(configType, props);            
             callback.accept((T) instance, configProxy, component); 
         });
     }
@@ -162,7 +162,7 @@
     @Override
     public <T> FactoryPidAdapterBuilder update(Class<T> configType, InstanceCbConfiguration<T> callback) {
         return setInstanceCallbackRef((instance, component, props) -> { 
-            T configProxy = ((ComponentContext) component).createConfigurationProxy(configType, props);            
+            T configProxy = ((ComponentContext) component).createConfigurationType(configType, props);            
             callback.accept(configProxy);
         });
     }
@@ -175,7 +175,7 @@
     @Override
     public <T> FactoryPidAdapterBuilder update(Class<T> configType, InstanceCbConfigurationComponent<T> callback) {
         return setInstanceCallbackRef((instance, component, props) -> { 
-            T configProxy = ((ComponentContext) component).createConfigurationProxy(configType, props);            
+            T configProxy = ((ComponentContext) component).createConfigurationType(configType, props);            
             callback.accept(configProxy, component);
         });
     }
diff --git a/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/DependencyManager.java b/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/DependencyManager.java
index 87ea8df..995d17f 100644
--- a/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/DependencyManager.java
+++ b/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/DependencyManager.java
@@ -250,7 +250,7 @@
      * It will also inherit all dependencies, and if you declare the original
      * service as a member it will be injected.
      * 
-     * <h3>Usage Example</h3>
+     * <p>Usage example:
      * 
      * <blockquote><pre>
      * manager.createAdapterService(AdapteeService.class, "(foo=bar)")
@@ -275,7 +275,7 @@
      * It will also inherit all dependencies, and if you declare the original
      * service as a member it will be injected.
      * 
-     * <h3>Usage Example</h3>
+     * <p>Usage example:
      * 
      * <blockquote><pre>
      * manager.createAdapterService(AdapteeService.class, "(foo=bar)", "m_service")
@@ -301,7 +301,7 @@
      * It will also inherit all dependencies, and if you declare the original
      * service as a member it will be injected.
      * 
-     * <h3>Usage Example</h3>
+     * <p>Usage example:
      * 
      * <blockquote><pre>
      * manager.createAdapterService(AdapteeService.class, "(foo=bar)", "add", "change", "remove")
@@ -331,7 +331,7 @@
      * It will also inherit all dependencies, and if you declare the original
      * service as a member it will be injected.
      * 
-     * <h3>Usage Example</h3>
+     * <p>Usage example:
      * 
      * <blockquote><pre>
      * manager.createAdapterService(AdapteeService.class, "(foo=bar)", "add", "change", "remove", "swap")
@@ -362,7 +362,7 @@
      * It will also inherit all dependencies, and if you declare the original
      * service as a member it will be injected.
      * 
-     * <h3>Usage Example</h3>
+     * <p>Usage example:
      * 
      * <blockquote><pre>
      * manager.createAdapterService(AdapteeService.class, "(foo=bar)", "add", "change", "remove", "swap")
@@ -389,14 +389,18 @@
     }
 
     /**
-     * Creates a new Managed Service Factory Configuration Adapter. For each new Config Admin factory configuration matching
+     * Creates a new Factory Configuration Adapter. For each new factory configuration matching
      * the factoryPid, an adapter will be created based on the adapter implementation class.
      * The adapter will be registered with the specified interface, and with the specified adapter service properties.
      * Depending on the <code>propagate</code> parameter, every public factory configuration properties 
      * (which don't start with ".") will be propagated along with the adapter service properties. 
      * It will also inherit all dependencies.
+     * <p> The callback you specify may accept the following method signatures:
+     * <ul><li> updated(Dictionary)
+     * <li> updated(Component, Dictionary)
+     * </ul>
      * 
-     * <h3>Usage Example</h3>
+     * <p>Usage example:
      * 
      * <blockquote><pre>
      *  manager.createFactoryConfigurationAdapterService("MyFactoryPid",  "update", true)
@@ -407,11 +411,7 @@
      * </pre></blockquote>
      * 
      * @param factoryPid the pid matching the factory configuration
-     * @param update the adapter method name that will be notified when the factory configuration is created/updated.<p>
-     *  The following signatures are supported:<p>
-     *        <ul><li> updated(Dictionary)
-     *        <li> updated(Component, Dictionary)
-     *        </ul>
+     * @param update the adapter method name that will be notified when the factory configuration is created/updated.
      * @param propagate true if public factory configuration should be propagated to the adapter service properties
      * @return a service that acts as a factory for generating the managed service factory configuration adapter
      */
@@ -420,20 +420,20 @@
     }
 
     /**
-     * Creates a new Managed Service Factory Configuration Adapter using a specific update callback instance. 
-     * For each new Config Admin factory configuration matching the factoryPid, an adapter will be created 
+     * Creates a new Factory Configuration Adapter using a specific update callback instance. 
+     * For each new factory configuration matching the factoryPid, an adapter will be created 
      * based on the adapter implementation class.
      * The adapter will be registered with the specified interface, and with the specified adapter service properties.
      * Depending on the <code>propagate</code> parameter, every public factory configuration properties 
      * (which don't start with ".") will be propagated along with the adapter service properties. 
      * It will also inherit all dependencies.
+     * <p> The callback you specify may accept the following method signatures:
+     * <ul><li> updated(Dictionary)
+     * <li> updated(Component, Dictionary)
+     * </ul>
      * 
      * @param factoryPid the pid matching the factory configuration
-     * @param update the adapter method name that will be notified when the factory configuration is created/updated.<p>
-     *  The following signatures are supported:<p>
-     *        <ul><li> updated(Dictionary)
-     *        <li> updated(Component, Dictionary)
-     *        </ul>
+     * @param update the adapter method name that will be notified when the factory configuration is created/updated.
      * @param propagate true if public factory configuration should be propagated to the adapter service properties
      * @param callbackInstance the object on which the updated callback will be invoked.
      * @return a service that acts as a factory for generating the managed service factory configuration adapter
@@ -443,29 +443,22 @@
     }
 
     /**
-     * Creates a new Managed Service Factory Configuration Adapter. For each new Config Admin factory configuration matching
+     * Creates a new Factory Configuration Adapter. For each new factory configuration matching
      * the factoryPid, an adapter will be created based on the adapter implementation class.
      * The adapter will be registered with the specified interface, and with the specified adapter service properties.
      * Depending on the <code>propagate</code> parameter, every public factory configuration properties 
      * (which don't start with ".") will be propagated along with the adapter service properties. 
      * It will also inherit all dependencies.
-     * 
-     * <h3>Usage Example</h3>
-     * 
-     * <blockquote><pre>
-     *  manager.createFactoryConfigurationAdapterService("MyFactoryPid",  "update", true)
-     *         // The interface to use when registering adapter
-     *         .setInterface(AdapterService.class.getName(), new Hashtable() {{ put("foo", "bar"); }})
-     *         // the implementation of the adapter
-     *         .setImplementation(AdapterServiceImpl.class);
-     * </pre></blockquote>
+     * <p> The callback you specify may accept the following method signatures:
+     * <ul><li> updated(Dictionary)
+     * <li> updated(Component, Dictionary)
+     * <li> updated(ConfigurationType)
+     * <li> updated(Component, ConfigurationType)
+     * </ul>
+     * <p>The ConfigurationType parameter is an implementation of the <code>configType</code> argument.
      * 
      * @param factoryPid the pid matching the factory configuration
      * @param update the adapter method name that will be notified when the factory configuration is created/updated.<p>
-     *  The following signatures are supported:<p>
-     *        <ul><li> updated(Dictionary)
-     *        <li> updated(Component, Dictionary)
-     *        </ul>
      * @param propagate true if public factory configuration should be propagated to the adapter service properties
      * @param configType the configuration type to use instead of a dictionary. See the javadoc from {@link ConfigurationDependency} for
      * more informations about type-safe configuration.
@@ -477,20 +470,22 @@
     }
 
     /**
-     * Creates a new Managed Service Factory Configuration Adapter using a specific update callback instance. 
-     * For each new Config Admin factory configuration matching the factoryPid, an adapter will be created 
+     * Creates a new Factory Configuration Adapter using a specific update callback instance. 
+     * For each new factory configuration matching the factoryPid, an adapter will be created 
      * based on the adapter implementation class.
      * The adapter will be registered with the specified interface, and with the specified adapter service properties.
      * Depending on the <code>propagate</code> parameter, every public factory configuration properties 
      * (which don't start with ".") will be propagated along with the adapter service properties. 
      * It will also inherit all dependencies.
+     * <p> The callback you specify may accept the following method signatures:
+     * <ul><li> updated(Dictionary)
+     * <li> updated(Component, Dictionary)
+     * <li> updated(ConfigurationType)
+     * <li> updated(Component, ConfigurationType)
+     * </ul>
+     * <p>The ConfigurationType parameter is an implementation of the <code>configType</code> argument.
      * 
      * @param factoryPid the pid matching the factory configuration
-     * @param update the adapter method name that will be notified when the factory configuration is created/updated.<p>
-     *  The following signatures are supported:<p>
-     *        <ul><li> updated(Dictionary)
-     *        <li> updated(Component, Dictionary)
-     *        </ul>
      * @param propagate true if public factory configuration should be propagated to the adapter service properties
      * @param callbackInstance the object on which the updated callback will be invoked.
      * @param configType the configuration type to use instead of a dictionary.  See the javadoc from {@link ConfigurationDependency} for
@@ -502,14 +497,14 @@
     }
 
    /**
-     * Creates a new Managed Service Factory Configuration Adapter with meta type support. For each new Config Admin 
+     * Creates a new Managed Service Factory Configuration Adapter with meta type support. For each new 
      * factory configuration matching the factoryPid, an adapter will be created based on the adapter implementation 
      * class. The adapter will be registered with the specified interface, and with the specified adapter service 
      * properties. Depending on the <code>propagate</code> parameter, every public factory configuration properties 
      * (which don't start with ".") will be propagated along with the adapter service properties. 
      * It will also inherit all dependencies.
      * 
-     * <h3>Usage Example</h3>
+     * <p>Usage example:
      * 
      * <blockquote><pre>
      *       PropertyMetaData[] propertiesMetaData = new PropertyMetaData[] {
@@ -568,7 +563,7 @@
      * It will also inherit all dependencies, and if you declare the original
      * service as a member it will be injected.
      * 
-     * <h3>Usage Example</h3>
+     * <p>Usage example:
      * 
      * <blockquote><pre>
      *  manager.createBundleAdapterService(Bundle.INSTALLED | Bundle.RESOLVED | Bundle.ACTIVE, 
@@ -618,7 +613,7 @@
      * It will also inherit all dependencies, and if you declare the original
      * service as a member it will be injected.
      * 
-     * <h3>Usage Example</h3>
+     * <p>Usage example:
      * 
      * <blockquote><pre>
      *  manager.createResourceAdapterService("(&(path=/test)(repository=TestRepository))", true)
@@ -681,7 +676,7 @@
      * It will also inherit all dependencies, and if you declare the original
      * service as a member it will be injected.
      * 
-     * <h3>Usage Example</h3>
+     * <p>Usage example:
      * 
      * <blockquote><pre>
      * manager.createAspectService(ExistingService.class, "(foo=bar)", 10, "m_service")
@@ -709,7 +704,7 @@
      * It will also inherit all dependencies, and if you declare the original
      * service as a member it will be injected.
      * 
-     * <h3>Usage Example</h3>
+     * <p>Usage example:
      * 
      * <blockquote><pre>
      * manager.createAspectService(ExistingService.class, "(foo=bar)", 10)
@@ -735,7 +730,7 @@
      * It will also inherit all dependencies, and if you declare the original
      * service as a member it will be injected.
      * 
-     * <h3>Usage Example</h3>
+     * <p>Usage example:
      * 
      * <blockquote><pre>
      * manager.createAspectService(ExistingService.class, "(foo=bar)", 10, "add", "change", "remove")
@@ -766,7 +761,7 @@
      * It will also inherit all dependencies, and if you declare the original
      * service as a member it will be injected.
      * 
-     * <h3>Usage Example</h3>
+     * <p>Usage example:
      * 
      * <blockquote><pre>
      * manager.createAspectService(ExistingService.class, "(foo=bar)", 10, "add", "change", "remove")
@@ -798,7 +793,7 @@
      * It will also inherit all dependencies, and if you declare the original
      * service as a member it will be injected.
      * 
-     * <h3>Usage Example</h3>
+     * <p>Usage example:
      * 
      * <blockquote><pre>
      * manager.createAspectService(ExistingService.class, "(foo=bar)", 10, "add", "change", "remove")
diff --git a/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/ComponentContext.java b/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/ComponentContext.java
index 82b9a0e..a00a02c 100644
--- a/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/ComponentContext.java
+++ b/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/ComponentContext.java
@@ -167,5 +167,5 @@
      * @param config the configuration to wrap, cannot be <code>null</code>.
      * @return an instance of the given type that wraps the given configuration.
      */
-    public <T> T createConfigurationProxy(Class<T> type, Dictionary<?, ?> config);
+    public <T> T createConfigurationType(Class<T> type, Dictionary<?, ?> config);
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java b/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java
index e97be29..29e5992 100644
--- a/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java
+++ b/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java
@@ -341,7 +341,7 @@
     }
 
     @Override
-    public <T> T createConfigurationProxy(Class<T> type, Dictionary<?, ?> config) {
+    public <T> T createConfigurationType(Class<T> type, Dictionary<?, ?> config) {
         return Configurable.create(type,  config);
     }
     
diff --git a/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentScheduler.java b/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentScheduler.java
index e7365cc..e5140af 100644
--- a/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentScheduler.java
+++ b/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentScheduler.java
@@ -27,14 +27,12 @@
 import org.apache.felix.dm.ComponentExecutorFactory;
 import org.apache.felix.dm.context.ComponentContext;
 import org.osgi.framework.BundleContext;
-import org.osgi.service.component.ComponentFactory;
 
 /**
  * The Dependency Manager delegates all components addition/removal to this class.
  * If a ComponentExecutorFactory is registered in the OSGi registry, this class will use it to get an 
  * Executor used for components management and lifecycle callbacks.
  * 
- * @see {@link ComponentFactory}
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public class ComponentScheduler {
diff --git a/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FilterComponent.java b/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FilterComponent.java
index 5c27564..e07283c 100644
--- a/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FilterComponent.java
+++ b/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FilterComponent.java
@@ -67,8 +67,8 @@
     }
     
     @Override
-    public <T> T createConfigurationProxy(Class<T> type, Dictionary<?, ?> config) {
-        return m_component.createConfigurationProxy(type, config);
+    public <T> T createConfigurationType(Class<T> type, Dictionary<?, ?> config) {
+        return m_component.createConfigurationType(type, config);
     }
     
     @Override
