diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterServiceImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterServiceImpl.java
index 89eba25..7bb6f75 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterServiceImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterServiceImpl.java
@@ -48,7 +48,7 @@
      */
     public AdapterServiceImpl(DependencyManager dm, Class adapteeInterface, String adapteeFilter, String autoConfig, String add, String change, String remove) {
         super(dm.createComponent()); // This service will be filtered by our super class, allowing us to take control.
-        m_service.setImplementation(new AdapterImpl(adapteeInterface, adapteeFilter, autoConfig, add, change, remove))
+        m_component.setImplementation(new AdapterImpl(adapteeInterface, adapteeFilter, autoConfig, add, change, remove))
                  .add(dm.createServiceDependency()
                       .setService(adapteeInterface, adapteeFilter)
                       .setAutoConfig(false)
@@ -92,7 +92,7 @@
                     props.put(key, m_serviceProperties.get(key));
                 }
             }
-            List dependencies = m_service.getDependencies();
+            List dependencies = m_component.getDependencies();
             dependencies.remove(0);
             ServiceDependency dependency = m_manager.createServiceDependency()
                  .setService(m_adapteeInterface, ref)
@@ -112,7 +112,7 @@
                 .setCallbacks(m_callbackObject, m_init, m_start, m_stop, m_destroy) // if not set, no effect
                 .add(dependency);
             
-            configureAutoConfigState(service, m_service);
+            configureAutoConfigState(service, m_component);
             
             for (int i = 0; i < dependencies.size(); i++) {
                 service.add(((Dependency) dependencies.get(i)).createCopy());
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectServiceImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectServiceImpl.java
index fe1bdd0..0e28f76 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectServiceImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectServiceImpl.java
@@ -41,7 +41,7 @@
     public AspectServiceImpl(DependencyManager dm, Class aspectInterface, String aspectFilter, int ranking, String autoConfig, String add, String change, String remove)
     { 
         super(dm.createComponent()); // This service will be filtered by our super class, allowing us to take control.
-        m_service.setImplementation(new AspectImpl(aspectInterface, aspectFilter, ranking, autoConfig, add, change, remove))
+        m_component.setImplementation(new AspectImpl(aspectInterface, aspectFilter, ranking, autoConfig, add, change, remove))
              .add(dm.createServiceDependency()
                   .setService(aspectInterface, createDependencyFilterForAspect(aspectFilter))
                   .setAutoConfig(false)
@@ -82,7 +82,7 @@
         }
         
         public Component createService(Object[] params) {
-            List dependencies = m_service.getDependencies();
+            List dependencies = m_component.getDependencies();
             // remove our internal dependency
             dependencies.remove(0);
             // replace it with one that points to the specific service that just was passed in
@@ -104,7 +104,7 @@
                 .setCallbacks(m_callbackObject, m_init, m_start, m_stop, m_destroy) // if not set, no effect
                 .add(dependency);
             
-            configureAutoConfigState(service, m_service);
+            configureAutoConfigState(service, m_component);
             
             for (int i = 0; i < dependencies.size(); i++) {
                 service.add(((Dependency) dependencies.get(i)).createCopy());
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/BundleAdapterServiceImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/BundleAdapterServiceImpl.java
index f666a92..f620ae3 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/BundleAdapterServiceImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/BundleAdapterServiceImpl.java
@@ -42,7 +42,7 @@
     public BundleAdapterServiceImpl(DependencyManager dm, int bundleStateMask, String bundleFilter, boolean propagate)
     {
         super(dm.createComponent()); // This service will be filtered by our super class, allowing us to take control.
-        m_service.setImplementation(new BundleAdapterImpl(bundleStateMask, bundleFilter, propagate))
+        m_component.setImplementation(new BundleAdapterImpl(bundleStateMask, bundleFilter, propagate))
                  .add(dm.createBundleDependency()
                       .setFilter(bundleFilter)
                       .setStateMask(bundleStateMask)
@@ -70,7 +70,7 @@
                     props.put(key, m_serviceProperties.get(key));
                 }
             }
-            List dependencies = m_service.getDependencies();
+            List dependencies = m_component.getDependencies();
             // the first dependency is always the dependency on the bundle, which
             // will be replaced with a more specific dependency below
             dependencies.remove(0);
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ComponentImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ComponentImpl.java
index 5733254..3bd4040 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ComponentImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ComponentImpl.java
@@ -1108,11 +1108,11 @@
         if (properties != null) {
             Enumeration enumeration = properties.keys();
             while (enumeration.hasMoreElements()) {
-                String key = (String) enumeration.nextElement();
+                Object key = enumeration.nextElement();
                 if (result.length() > 0) {
                     result.append(',');
                 }
-                result.append(key);
+                result.append(key.toString());
                 result.append('=');
                 Object value = properties.get(key);
                 if (value instanceof String[]) {
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FactoryConfigurationAdapterServiceImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FactoryConfigurationAdapterServiceImpl.java
index f697500..fb7652d 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FactoryConfigurationAdapterServiceImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FactoryConfigurationAdapterServiceImpl.java
@@ -48,7 +48,7 @@
         super(dm.createComponent()); // This service will be filtered by our super class, allowing us to take control.
         Hashtable props = new Hashtable();
         props.put(Constants.SERVICE_PID, factoryPid);
-        m_service
+        m_component
             .setInterface(ManagedServiceFactory.class.getName(), props)
             .setImplementation(new AdapterImpl(factoryPid, update, propagate));
     }
@@ -58,7 +58,7 @@
         super(dm.createComponent()); // This service will be filtered by our super class, allowing us to take control.
         Hashtable props = new Hashtable();
         props.put(Constants.SERVICE_PID, factoryPid);
-        m_service
+        m_component
             .setInterface(ManagedServiceFactory.class.getName(), props)
             .setImplementation(new MetaTypeAdapterImpl(factoryPid, update, propagate,
                 bctx, logger, heading, description,
@@ -132,7 +132,7 @@
             Dictionary serviceProperties = m_propagate ? mergeSettings(m_serviceProperties, settings) : m_serviceProperties;
             newService.setInterface(m_serviceInterfaces, serviceProperties);
             newService.setImplementation(impl);
-            List dependencies = m_service.getDependencies();
+            List dependencies = m_component.getDependencies();
             newService.add(dependencies);
             newService.setComposition(m_compositionInstance, m_compositionMethod); // if not set, no effect
             newService.setCallbacks(m_callbackObject, m_init, m_start, m_stop, m_destroy); // if not set, no effect
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FilterService.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FilterService.java
index 9779290..76a7e84 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FilterService.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FilterService.java
@@ -24,19 +24,22 @@
 import java.util.List;
 
 import org.apache.felix.dm.Component;
+import org.apache.felix.dm.ComponentDeclaration;
+import org.apache.felix.dm.ComponentDependencyDeclaration;
 import org.apache.felix.dm.ComponentStateListener;
 import org.apache.felix.dm.Dependency;
 import org.apache.felix.dm.DependencyManager;
+import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
 
 /**
- * This class allows to filter a Service interface. All Aspect/Adapters extends this class
- * in order to add functionality to the default Service implementation.
+ * This class allows to filter a Component interface. All Aspect/Adapters extend this class
+ * in order to add functionality to the default Component implementation.
  * 
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
-public class FilterService implements Component {
-    protected ComponentImpl m_service;
+public class FilterService implements Component, ComponentDeclaration {
+    protected ComponentImpl m_component;
     protected List m_stateListeners = new ArrayList();
     protected String m_init = "init";
     protected String m_start = "start";
@@ -52,16 +55,16 @@
     protected Dictionary m_serviceProperties;
 
     public FilterService(Component service) {
-        m_service = (ComponentImpl) service;
+        m_component = (ComponentImpl) service;
     }
 
     public Component add(Dependency dependency) {
-        m_service.add(dependency);
+        m_component.add(dependency);
         // Add the dependency (if optional) to all already instantiated services.
         // If the dependency is required, our internal service will be stopped/restarted, so in this case
         // we have nothing to do.
         if (! dependency.isRequired()) {
-            AbstractDecorator ad = (AbstractDecorator) m_service.getService();
+            AbstractDecorator ad = (AbstractDecorator) m_component.getService();
             if (ad != null)
             {
                 ad.addDependency(dependency);
@@ -71,7 +74,7 @@
     }
 
     public Component add(List dependencies) {
-        m_service.add(dependencies);
+        m_component.add(dependencies);
         // Add the dependencies to all already instantiated services.
         // If one dependency from the list is required, we have nothing to do, since our internal
         // service will be stopped/restarted.
@@ -83,7 +86,7 @@
         }
         // Ok, the list contains no required dependencies: add optionals dependencies in already instantiated
         // services.
-        AbstractDecorator ad = (AbstractDecorator) m_service.getService();
+        AbstractDecorator ad = (AbstractDecorator) m_component.getService();
         if (ad != null) {
             ad.addDependencies(dependencies);
         }
@@ -95,18 +98,18 @@
             m_stateListeners.add(listener);
         }
         // Add the listener to all already instantiated services.
-        AbstractDecorator ad = (AbstractDecorator) m_service.getService();
+        AbstractDecorator ad = (AbstractDecorator) m_component.getService();
         if (ad != null) {
             ad.addStateListener(listener);
         }
     }
 
     public List getDependencies() {
-        return m_service.getDependencies();
+        return m_component.getDependencies();
     }
 
     public Object getService() {
-        return m_service.getService();
+        return m_component.getService();
     }
 
     public synchronized Dictionary getServiceProperties() {
@@ -114,17 +117,17 @@
     }
 
     public ServiceRegistration getServiceRegistration() {
-        return m_service.getServiceRegistration();
+        return m_component.getServiceRegistration();
     }
 
     public Component remove(Dependency dependency) {
-        m_service.remove(dependency);
+        m_component.remove(dependency);
         // Remove the dependency (if optional) from all already instantiated services.
         // If the dependency is required, our internal service will be stopped, so in this case
         // we have nothing to do.
         if (!dependency.isRequired())
         {
-            AbstractDecorator ad = (AbstractDecorator) m_service.getService();
+            AbstractDecorator ad = (AbstractDecorator) m_component.getService();
             if (ad != null)
             {
                 ad.removeDependency(dependency);
@@ -138,14 +141,14 @@
             m_stateListeners.remove(listener);
         }
         // Remove the listener from all already instantiated services.
-        AbstractDecorator ad = (AbstractDecorator) m_service.getService();
+        AbstractDecorator ad = (AbstractDecorator) m_component.getService();
         if (ad != null) {
             ad.removeStateListener(listener);
         }
     }
 
     public synchronized Component setCallbacks(Object instance, String init, String start, String stop, String destroy) {
-        m_service.ensureNotActive();
+        m_component.ensureNotActive();
         m_callbackObject = instance;
         m_init = init;
         m_start = start;
@@ -160,20 +163,20 @@
     }
 
     public synchronized Component setComposition(Object instance, String getMethod) {
-        m_service.ensureNotActive();
+        m_component.ensureNotActive();
         m_compositionInstance = instance;
         m_compositionMethod = getMethod;
         return this;
     }
 
     public synchronized Component setComposition(String getMethod) {
-        m_service.ensureNotActive();
+        m_component.ensureNotActive();
         m_compositionMethod = getMethod;
         return this;
     }
 
     public synchronized Component setFactory(Object factory, String createMethod) {
-        m_service.ensureNotActive();
+        m_component.ensureNotActive();
         m_factory = factory;
         m_factoryCreateMethod = createMethod;
         return this;
@@ -184,7 +187,7 @@
     }
 
     public synchronized Component setImplementation(Object implementation) {
-        m_service.ensureNotActive();
+        m_component.ensureNotActive();
         m_serviceImpl = implementation;
         return this;
     }
@@ -194,7 +197,7 @@
     }
 
     public synchronized Component setInterface(String[] serviceInterfaces, Dictionary properties) {
-        m_service.ensureNotActive();
+        m_component.ensureNotActive();
         if (serviceInterfaces != null) {
             m_serviceInterfaces = new String[serviceInterfaces.length];
             System.arraycopy(serviceInterfaces, 0, m_serviceInterfaces, 0, serviceInterfaces.length);
@@ -209,7 +212,7 @@
         }
         // Set the properties to all already instantiated services.
         if (serviceProperties != null) {
-            AbstractDecorator ad = (AbstractDecorator) m_service.getService();
+            AbstractDecorator ad = (AbstractDecorator) m_component.getService();
             if (ad != null) {
                 ad.setServiceProperties(serviceProperties);
             }
@@ -218,40 +221,56 @@
     }
 
     public void start() {
-        m_service.start();
+        m_component.start();
     }
 
     public void stop() {
-        m_service.stop();
+        m_component.stop();
     }
     
     public void invokeCallbackMethod(Object[] instances, String methodName, Class[][] signatures, Object[][] parameters) {
-        m_service.invokeCallbackMethod(instances, methodName, signatures, parameters);
+        m_component.invokeCallbackMethod(instances, methodName, signatures, parameters);
     }
     
     public Object[] getCompositionInstances() {
-        return m_service.getCompositionInstances();
+        return m_component.getCompositionInstances();
     }
     
     public DependencyManager getDependencyManager() {
-        return m_service.getDependencyManager();
+        return m_component.getDependencyManager();
     }
 
     public Component setAutoConfig(Class clazz, boolean autoConfig) {
-        m_service.setAutoConfig(clazz, autoConfig);
+        m_component.setAutoConfig(clazz, autoConfig);
         return this;
     }
 
     public Component setAutoConfig(Class clazz, String instanceName) {
-        m_service.setAutoConfig(clazz, instanceName);
+        m_component.setAutoConfig(clazz, instanceName);
         return this;
     }
     
     public boolean getAutoConfig(Class clazz) {
-        return m_service.getAutoConfig(clazz);
+        return m_component.getAutoConfig(clazz);
     }
     
     public String getAutoConfigInstance(Class clazz) {
-        return m_service.getAutoConfigInstance(clazz);
+        return m_component.getAutoConfigInstance(clazz);
+    }
+
+    public ComponentDependencyDeclaration[] getComponentDependencies() {
+        return m_component.getComponentDependencies();
+    }
+
+    public String getName() {
+        return m_component.getName();
+    }
+
+    public int getState() {
+        return m_component.getState();
+    }
+
+    public BundleContext getBundleContext() {
+        return m_component.getBundleContext();
     };
 }
\ No newline at end of file
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ResourceAdapterServiceImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ResourceAdapterServiceImpl.java
index ab45808..d083421 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ResourceAdapterServiceImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ResourceAdapterServiceImpl.java
@@ -47,7 +47,7 @@
         super(dm.createComponent()); // This service will be filtered by our super class, allowing us to take control.
         m_callbackInstance = callbackInstance;
         m_callbackChanged = callbackChanged;
-        m_service.setImplementation(new ResourceAdapterImpl(resourceFilter, propagate))
+        m_component.setImplementation(new ResourceAdapterImpl(resourceFilter, propagate))
             .add(dm.createResourceDependency()
                  .setFilter(resourceFilter)
                  .setAutoConfig(false)
@@ -58,7 +58,7 @@
         super(dm.createComponent()); // This service will be filtered by our super class, allowing us to take control.
         m_callbackInstance = callbackInstance;
         m_callbackChanged = callbackChanged;
-        m_service.setImplementation(new ResourceAdapterImpl(resourceFilter, propagateCallbackInstance, propagateCallbackMethod))
+        m_component.setImplementation(new ResourceAdapterImpl(resourceFilter, propagateCallbackInstance, propagateCallbackMethod))
             .add(dm.createResourceDependency()
                  .setFilter(resourceFilter)
                  .setAutoConfig(false)
@@ -96,7 +96,7 @@
                     props.put(key, m_serviceProperties.get(key));
                 }
             }
-            List dependencies = m_service.getDependencies();
+            List dependencies = m_component.getDependencies();
             // the first dependency is always the dependency on the resource, which
             // will be replaced with a more specific dependency below
             dependencies.remove(0);
