diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/BundleDependency.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/BundleDependency.java
index 0299fc9..90787b4 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/BundleDependency.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/BundleDependency.java
@@ -20,6 +20,9 @@
 
 import org.osgi.framework.Bundle;
 
+/**
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public interface BundleDependency extends Dependency, ComponentDependencyDeclaration {
     /**
      * Sets the callbacks for this dependency. These callbacks can be used as hooks whenever a dependency is added or removed.
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/ComponentDeclaration.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/ComponentDeclaration.java
index 1a180f2..8795160 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/ComponentDeclaration.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/ComponentDeclaration.java
@@ -18,6 +18,8 @@
  */
 package org.apache.felix.dm;
 
+import org.osgi.framework.BundleContext;
+
 /**
  * Describes a component. Component declarations form descriptions of components
  * that are managed by the dependency manager. They can be used to query their state
@@ -39,4 +41,6 @@
     public String getName();
     /** Returns the state of this component. */
     public int getState();
+    /** Returns the bundle context associated with this component. */
+    public BundleContext getBundleContext();
 }
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivation.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivation.java
index e15fd92..f0649ff 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivation.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivation.java
@@ -18,6 +18,9 @@
  */
 package org.apache.felix.dm;
 
+/**
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public interface DependencyActivation {
   public void start(DependencyService service);
   public void stop(DependencyService service);
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivatorBase.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivatorBase.java
index 817388d..eaae36a 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivatorBase.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivatorBase.java
@@ -296,7 +296,7 @@
      * @param manager the dependency manager
      */
     private void cleanup(DependencyManager manager) {
-        List services = manager.getServices();
+        List services = manager.getComponents();
         for (int i = services.size() - 1; i >= 0; i--) {
             Component service = (Component) services.get(i);
             manager.remove(service);
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyManager.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyManager.java
index 07ec03a..6826b6f 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyManager.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyManager.java
@@ -18,9 +18,13 @@
  */
 package org.apache.felix.dm;
 
+import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.felix.dm.impl.AdapterServiceImpl;
 import org.apache.felix.dm.impl.AspectServiceImpl;
@@ -56,7 +60,7 @@
     public static final String SERVICEREGISTRY_CACHE_INDICES = "dm.index"; // TODO rename
     private final BundleContext m_context;
     private final Logger m_logger;
-    private List m_services = Collections.synchronizedList(new ArrayList());
+    private List m_components = Collections.synchronizedList(new ArrayList());
 
     /**
      * Creates a new dependency manager. You need to supply the
@@ -73,10 +77,14 @@
     DependencyManager(BundleContext context, Logger logger) {
         m_context = createContext(context);
         m_logger = logger;
+        synchronized (m_dependencyManagers) {
+            m_dependencyManagers.add(new WeakReference(this));
+        }
     }
 
     // service registry cache
     private static ServiceRegistryCache m_serviceRegistryCache;
+    private static final Set /* WeakReference<DependencyManager> */ m_dependencyManagers = new HashSet();
     static {
         String index = System.getProperty(SERVICEREGISTRY_CACHE_INDICES);
         if (index != null) {
@@ -91,13 +99,26 @@
                     String[] propList = props[i].split(",");
                     m_serviceRegistryCache.addFilterIndex(new MultiPropertyExactFilter(propList));
                 }
-//                System.out.println("DM: Creating index on " + props[i]);
             }
         }
-        else {
-//            System.out.println("DM: Property 'dm.index' not found, not setting indices.");
+    }
+    
+    public static List getDependencyManagers() {
+        List /* DependencyManager */ result = new ArrayList();
+        synchronized (m_dependencyManagers) {
+            Iterator iterator = m_dependencyManagers.iterator();
+            while (iterator.hasNext()) {
+                WeakReference reference = (WeakReference) iterator.next();
+                DependencyManager manager = (DependencyManager) reference.get();
+                if (manager != null) {
+                    result.add(manager);
+                }
+                else {
+                    iterator.remove();
+                }
+            }
         }
-
+        return result;
     }
     
     private BundleContext createContext(BundleContext context) {
@@ -109,40 +130,10 @@
             return context;
         }
     }
-
-//    private BundleContext createContextX(BundleContext context) {
-//        System.out.println("DM: Enabling bundle context interceptor for bundle #" + context.getBundle().getBundleId());
-//        BundleContextInterceptor result = new BundleContextInterceptor(context);
-//        if (BundleContextInterceptor.indices() == 0) {
-//            String index = System.getProperty("dm.index");
-//            if (index != null) {
-//                String[] props = index.split(";");
-//                for (int i = 0; i < props.length; i++) {
-//                    String[] propList = props[i].split(",");
-//                    MultiPropertyExactFilter filter;
-//                    try {
-//                        filter = new MultiPropertyExactFilter(result, propList);
-//                        m_filterIndices.add(filter);
-//                        System.out.println("DM: Creating index on " + props[i]);
-//                    }
-//                    catch (InvalidSyntaxException e) {
-//                        // TODO Auto-generated catch block
-//                        e.printStackTrace();
-//                    }
-//                }
-//            }
-//            else {
-//                System.out.println("DM: Property 'dm.index' not found, not setting indices.");
-//            }
-//        }
-//        System.out.println("DM: Indices created, setting them on the interceptor.");
-//        Iterator iterator = m_filterIndices.iterator();
-//        while (iterator.hasNext()) {
-//            FilterIndex filter = (FilterIndex) iterator.next();
-//            result.addFilterIndex(filter);
-//        }
-//        return result;
-//    }
+    
+    public BundleContext getBundleContext() {
+        return m_context;
+    }
 
     /**
      * Adds a new service to the dependency manager. After the service was added
@@ -151,7 +142,7 @@
      * @param service the service to add
      */
     public void add(Component service) {
-        m_services.add(service);
+        m_components.add(service);
         service.start();
     }
 
@@ -163,7 +154,7 @@
      */
     public void remove(Component service) {
         service.stop();
-        m_services.remove(service);
+        m_components.remove(service);
     }
 
     /**
@@ -538,7 +529,7 @@
      * 
      * @return a list of services
      */
-    public List getServices() {
-        return Collections.unmodifiableList(m_services);
+    public List getComponents() {
+        return Collections.unmodifiableList(m_components);
     }
 }
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyService.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyService.java
index c4f6ee3..100b9a9 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyService.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyService.java
@@ -18,7 +18,9 @@
  */
 package org.apache.felix.dm;
 
-
+/**
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public interface DependencyService {
     /**
      * Will be called when the dependency becomes available.
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/InvocationUtil.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/InvocationUtil.java
index aae4cea..c32e8a4 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/InvocationUtil.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/InvocationUtil.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.felix.dm;
 
 import java.lang.reflect.InvocationTargetException;
@@ -5,10 +23,15 @@
 import java.lang.reflect.Modifier;
 import java.lang.reflect.Proxy;
 import java.util.Arrays;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
 
+/**
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public class InvocationUtil {
-    private static final HashMap m_methodCache = new HashMap();
+    public static final int CACHE_SIZE = 2048;
+    private static final Map /* <Key, Method> */ m_methodCache = new LRUMap(CACHE_SIZE);
     
     public static Object invokeCallbackMethod(Object instance, String methodName, Class[][] signatures, Object[][] parameters) throws NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
         Class currentClazz = instance.getClass();
@@ -55,8 +78,8 @@
         Key key = new Key(clazz, name, signature);
         Method m = null;
         synchronized (m_methodCache) {
-            if (m_methodCache.containsKey(key)) {
-                m = (Method) m_methodCache.get(key);
+            m = (Method) m_methodCache.get(key);
+            if (m != null) {
                 return m;
             }
         }
@@ -121,4 +144,16 @@
             return true;
         }
     }
+    
+    public static class LRUMap extends LinkedHashMap {
+        private final int m_size;
+        
+        public LRUMap(int size) {
+            m_size = size;
+        }
+        
+        protected boolean removeEldestEntry(java.util.Map.Entry eldest) {
+            return size() > m_size;
+        }
+    }
 }
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/PropertyMetaData.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/PropertyMetaData.java
index e7c1296..5dbc675 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/PropertyMetaData.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/PropertyMetaData.java
@@ -13,6 +13,8 @@
 
 /**
  * This interface defines meta data regarding a given configuration property.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public interface PropertyMetaData {
     /**
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceDependency.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceDependency.java
index fb073a7..d5ab781 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceDependency.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceDependency.java
@@ -20,7 +20,9 @@
 
 import java.net.URL;
 
-
+/**
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public interface ResourceDependency extends Dependency, ComponentDependencyDeclaration, ResourceHandler {
     /**
      * Sets the callbacks for this service. These callbacks can be used as hooks whenever a
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceHandler.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceHandler.java
index ad83d39..cedb4e1 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceHandler.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceHandler.java
@@ -22,6 +22,8 @@
 
 /** 
  * Service interface for anybody wanting to be notified of changes to resources. 
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public interface ResourceHandler {
     /** Name of the property that's used to describe the filter condition for a resource. */
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceUtil.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceUtil.java
index ebb1c55..564ec52 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceUtil.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceUtil.java
@@ -22,6 +22,9 @@
 import java.util.Dictionary;
 import java.util.Properties;
 
+/**
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public class ResourceUtil {
     public static Dictionary createProperties(URL url) {
         Properties props = new Properties();
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/ServiceUtil.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/ServiceUtil.java
index d5bf333..ef6cecb 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/ServiceUtil.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/ServiceUtil.java
@@ -18,12 +18,16 @@
  */
 package org.apache.felix.dm;
 
+import java.util.List;
+
 import org.osgi.framework.Bundle;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 
 /**
  * OSGi service utilities.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public class ServiceUtil {
     /**
@@ -100,14 +104,30 @@
             else {
                 buf.append("ServiceReference[unregistered]{");
             }
-            String[] keys = ref.getPropertyKeys();
-            for (int i = 0; i < keys.length; i++) {
-                if (i > 0) { 
-                    buf.append(','); 
-                }
-                buf.append(keys[i]);
-                buf.append('=');
-                Object val = ref.getProperty(keys[i]);
+            buf.append(propertiesToString(ref, null));
+            buf.append("}");
+            return buf.toString();
+        }
+    }
+    
+    /**
+     * Converts the properties of a service reference to a string.
+     * 
+     * @param ref the service reference
+     * @param exclude a list of properties to exclude, or <code>null</code> to show everything
+     * @return a string representation of the service properties
+     */
+    public static String propertiesToString(ServiceReference ref, List /* <String> */ exclude) {
+        StringBuffer buf = new StringBuffer();
+        String[] keys = ref.getPropertyKeys();
+        for (int i = 0; i < keys.length; i++) {
+            if (i > 0) { 
+                buf.append(','); 
+            }
+            buf.append(keys[i]);
+            buf.append('=');
+            Object val = ref.getProperty(keys[i]);
+            if (exclude == null || !exclude.contains(val)) {
                 if (val instanceof String[]) {
                     String[] valArray = (String[]) val;
                     StringBuffer valBuf = new StringBuffer();
@@ -125,8 +145,7 @@
                     buf.append(val.toString());
                 }
             }
-            buf.append("}");
-            return buf.toString();
         }
+        return buf.toString();
     }
 }
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/TemporalServiceDependency.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/TemporalServiceDependency.java
index cdcb294..0e0310f 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/TemporalServiceDependency.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/TemporalServiceDependency.java
@@ -12,55 +12,55 @@
 package org.apache.felix.dm;
 
 /**
-* A Temporal Service dependency that can block the caller thread between service updates. Only
-* useful for required stateless dependencies that can be replaced transparently.
-* A Dynamic Proxy is used to wrap the actual service dependency. When the dependency goes 
-* away, an attempt is made to replace it with another one which satisfies the service dependency 
-* criteria. If no service replacement is available, then any method invocation (through the 
-* dynamic proxy) will block during a configurable timeout. On timeout, an unchecked 
-* <code>IllegalStateException</code> exception is raised (but the service is not deactivated).<p>
-* 
-* <b>This class only supports required dependencies, and temporal dependencies must be accessed outside
-* the Activator (OSGi) thread, because method invocations may block the caller thread when dependencies
-* are not satisfied.
-* </b>
-*
-* <p> Sample Code:<p>
-* <blockquote>
-* 
-* <pre>
-* import org.apache.felix.dependencymanager.*;
-* 
-* public class Activator extends DependencyActivatorBase {
-*   public void init(BundleContext ctx, DependencyManager dm) throws Exception {
-*     dm.add(createService()
-*            .setImplementation(MyServer.class)
-*            .add(createTemporalServiceDependency()
-*                .setTimeout(15000)
-*                .setService(MyDependency.class)));
-*   }
-* 
-*   public void destroy(BundleContext ctx, DependencyManager dm) throws Exception {
-*   }
-* }
-* 
-* class MyServer implements Runnable {
-*   MyDependency _dependency; // Auto-Injected by reflection.
-*   void start() {
-*     (new Thread(this)).start();
-*   }
-*   
-*   public void run() {
-*     try {
-*       _dependency.doWork();
-*     } catch (IllegalStateException e) {
-*       t.printStackTrace();
-*     }
-*   }   
-* </pre>
-* 
-* </blockquote>
-*/
+ * A Temporal Service dependency that can block the caller thread between service updates. Only useful for required stateless
+ * dependencies that can be replaced transparently. A Dynamic Proxy is used to wrap the actual service dependency. When the
+ * dependency goes away, an attempt is made to replace it with another one which satisfies the service dependency criteria. If
+ * no service replacement is available, then any method invocation (through the dynamic proxy) will block during a configurable
+ * timeout. On timeout, an unchecked <code>IllegalStateException</code> exception is raised (but the service is not
+ * deactivated).
+ * <p>
+ * <b>This class only supports required dependencies, and temporal dependencies must be accessed outside the Activator (OSGi)
+ * thread, because method invocations may block the caller thread when dependencies are not satisfied. </b>
+ * <p>
+ * Sample Code:
+ * <p>
+ * <blockquote>
+ * 
+ * <pre>
+ * import org.apache.felix.dependencymanager.*;
+ * 
+ * public class Activator extends DependencyActivatorBase {
+ *   public void init(BundleContext ctx, DependencyManager dm) throws Exception {
+ *     dm.add(createService()
+ *            .setImplementation(MyServer.class)
+ *            .add(createTemporalServiceDependency()
+ *                .setTimeout(15000)
+ *                .setService(MyDependency.class)));
+ *   }
+ * 
+ *   public void destroy(BundleContext ctx, DependencyManager dm) throws Exception {
+ *   }
+ * }
+ * 
+ * class MyServer implements Runnable {
+ *   MyDependency _dependency; // Auto-Injected by reflection.
+ *   void start() {
+ *     (new Thread(this)).start();
+ *   }
+ *   
+ *   public void run() {
+ *     try {
+ *       _dependency.doWork();
+ *     } catch (IllegalStateException e) {
+ *       t.printStackTrace();
+ *     }
+ *   }
+ * </pre>
+ * 
+ * </blockquote>
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public interface TemporalServiceDependency extends ServiceDependency {
     /**
      * Sets the timeout for this temporal dependency. Specifying a timeout value of zero means that there is no timeout period,
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AbstractDecorator.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AbstractDecorator.java
index 618a211..aac7e27 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AbstractDecorator.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AbstractDecorator.java
@@ -35,6 +35,9 @@
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.cm.ConfigurationException;
 
+/**
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public abstract class AbstractDecorator  {
     protected volatile DependencyManager m_manager;
     private final Map m_services = new HashMap();
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 4aebed3..89eba25 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
@@ -32,9 +32,10 @@
 /**
  * Adapter Service implementation. This class extends the FilterService in order to catch
  * some Service methods for configuring actual adapter service implementation.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
-public class AdapterServiceImpl extends FilterService
-{
+public class AdapterServiceImpl extends FilterService {
     /**
      * Creates a new Adapter Service implementation.
      * 
@@ -45,8 +46,7 @@
      * @param change
      * @param remove
      */
-    public AdapterServiceImpl(DependencyManager dm, Class adapteeInterface, String adapteeFilter, String autoConfig, String add, String change, String remove)
-    {
+    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))
                  .add(dm.createServiceDependency()
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 d1f2a92..fe1bdd0 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
@@ -34,6 +34,8 @@
 /**
  * Aspect Service implementation. This class extends the FilterService in order to catch
  * some Service methods for configuring actual aspect service implementation.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public class AspectServiceImpl extends FilterService {
     public AspectServiceImpl(DependencyManager dm, Class aspectInterface, String aspectFilter, int ranking, String autoConfig, String add, String change, String remove)
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 043afc1..f666a92 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
@@ -22,15 +22,17 @@
 import java.util.List;
 import java.util.Properties;
 
-import org.apache.felix.dm.Dependency;
-import org.apache.felix.dm.DependencyManager;
 import org.apache.felix.dm.Component;
 import org.apache.felix.dm.ComponentStateListener;
+import org.apache.felix.dm.Dependency;
+import org.apache.felix.dm.DependencyManager;
 import org.osgi.framework.Bundle;
 
 /**
  * Bundle Adapter Service implementation. This class extends the FilterService in order to catch
  * some Service methods for configuring actual adapter service implementation.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public class BundleAdapterServiceImpl extends FilterService
 {
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 1e38e45..5733254 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
@@ -49,14 +49,16 @@
  *
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
-public class ComponentImpl implements Component, DependencyService, ComponentDeclaration {
+public class ComponentImpl implements Component, DependencyService, ComponentDeclaration, Comparable {
     private static final Class[] VOID = new Class[] {};
 	private static final ServiceRegistration NULL_REGISTRATION;
     private static final ComponentStateListener[] SERVICE_STATE_LISTENER_TYPE = new ComponentStateListener[] {};
+    private static long HIGHEST_ID = 0;
 
     private final Object SYNC = new Object();
     private final BundleContext m_context;
     private final DependencyManager m_manager;
+    private final long m_id;
 
     // configuration (static)
     private String m_callbackInit;
@@ -99,11 +101,16 @@
 	
 	// internal logging
     private final Logger m_logger;
-    private ServiceRegistration m_serviceRegistration;
+    
     private Map m_autoConfig = new HashMap();
     private Map m_autoConfigInstance = new HashMap();
+    
+    private boolean m_isStarted = false;
 
     public ComponentImpl(BundleContext context, DependencyManager manager, Logger logger) {
+        synchronized (VOID) {
+            m_id = HIGHEST_ID++;
+        }
     	m_logger = logger;
         m_state = new State((List) m_dependencies.clone(), false, false, false);
         m_context = context;
@@ -159,11 +166,7 @@
             m_executor.enqueue(new Runnable() {
                 public void run() {
                     // TODO as far as I can see there is nothing left to do here
-                    
-                    
-                    //////////unbindService(newState);
-                    
-                    
+                    // unbindService(newState);
                 }});
         }
         if (oldState.isTrackingOptional() && newState.isWaitingForRequired()) {
@@ -236,22 +239,6 @@
             m_dependencies.add(dependency);
         }
         
-//        if (dependency.isInstanceBound()) {
-//            // At this point: this dependency is added from init(): but we don't want to start it now, 
-//            // because if we start it, and if the required dependency is available, then the service.start() 
-//            // method will be called, and this is a problem if a further
-//            // required (but unavailable) dependency is then added again from the init() method ...
-//            // Once the init() method will return, the activateService method will then calculate the state changes,
-//            // but at this point, all added extra-dependencies will be known.
-//            return this;
-//        } 
-        
-        ///
-        
-//        if (oldState.isAllRequiredAvailable() || (oldState.isWaitingForRequiredInstantiated() && dependency.isRequired()) || (oldState.isWaitingForRequired() && dependency.isRequired())) {
-//        	((DependencyActivation) dependency).start(this);
-//        }
-        
         // if we're inactive, don't do anything, otherwise we might want to start
         // the dependency
         if (!oldState.isInactive()) {
@@ -395,8 +382,8 @@
     }
 
     public synchronized void start() {
-    	if (m_serviceRegistration == null) {
-	        m_serviceRegistration = m_context.registerService(ComponentDeclaration.class.getName(), this, null);
+    	if (!m_isStarted) {
+    	    m_isStarted = true;
 	        State oldState, newState;
 	        synchronized (m_dependencies) {
 	            oldState = m_state;
@@ -408,9 +395,8 @@
     }
 
     public synchronized void stop() {
-    	if (m_serviceRegistration != null) {
-	        m_serviceRegistration.unregister();
-	        m_serviceRegistration = null;
+        if (m_isStarted) {
+            m_isStarted = false;
 	        State oldState, newState;
 	        synchronized (m_dependencies) {
 	            oldState = m_state;
@@ -454,8 +440,6 @@
         return this;
     }
 	
-	
-
 	public synchronized Component setImplementation(Object implementation) {
 	    ensureNotActive();
 	    m_implementation = implementation;
@@ -1099,10 +1083,13 @@
                 }
                 sb.append(names[i]);
             }
+            sb.append('(');
+            sb.append(propertiesToString());
+            sb.append(')');
             return sb.toString();
         }
         else if (serviceName instanceof String) {
-            return serviceName.toString();
+            return serviceName.toString() + "(" + propertiesToString() + ")";
         }
         else {
             Object implementation = m_implementation;
@@ -1114,6 +1101,38 @@
             }
         }
     }
+    
+    private String propertiesToString() {
+        StringBuffer result = new StringBuffer();
+        Dictionary properties = calculateServiceProperties();
+        if (properties != null) {
+            Enumeration enumeration = properties.keys();
+            while (enumeration.hasMoreElements()) {
+                String key = (String) enumeration.nextElement();
+                if (result.length() > 0) {
+                    result.append(',');
+                }
+                result.append(key);
+                result.append('=');
+                Object value = properties.get(key);
+                if (value instanceof String[]) {
+                    String[] values = (String[]) value;
+                    result.append('{');
+                    for (int i = 0; i < values.length; i++) {
+                        if (i > 0) {
+                            result.append(',');
+                        }
+                        result.append(values[i].toString());
+                    }
+                    result.append('}');
+                }
+                else {
+                    result.append(value.toString());
+                }
+            }
+        }
+        return result.toString();
+    }
 
     public int getState() {
         return (isRegistered() ? 1 : 0);
@@ -1126,4 +1145,21 @@
     static {
         NULL_REGISTRATION = (ServiceRegistration) Proxy.newProxyInstance(ComponentImpl.class.getClassLoader(), new Class[] {ServiceRegistration.class}, new DefaultNullObject());
     }
+
+    public BundleContext getBundleContext() {
+        return m_context;
+    }
+
+    public int compareTo(Object object) {
+        if (object instanceof ComponentImpl) {
+            ComponentImpl other = (ComponentImpl) object;
+            long id1 = this.getBundleContext().getBundle().getBundleId();
+            long id2 = ((ComponentImpl) other).getBundleContext().getBundle().getBundleId();
+            if (id1 == id2) {
+                return (int)(this.m_id - other.m_id);
+            }
+            return (int)(id1 - id2);
+        }
+        return -1;
+    }
 }
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 972aa25..f697500 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
@@ -25,26 +25,26 @@
 import java.util.Hashtable;
 import java.util.List;
 
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.ComponentStateListener;
 import org.apache.felix.dm.DependencyManager;
 import org.apache.felix.dm.InvocationUtil;
 import org.apache.felix.dm.PropertyMetaData;
-import org.apache.felix.dm.Component;
-import org.apache.felix.dm.ComponentStateListener;
-import org.osgi.framework.Constants;
-import org.osgi.service.cm.ManagedServiceFactory;
 import org.apache.felix.dm.impl.metatype.MetaTypeProviderImpl;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.service.cm.ManagedServiceFactory;
 import org.osgi.service.metatype.MetaTypeProvider;
 import org.osgi.service.metatype.ObjectClassDefinition;
 
 /**
  * Factory configuration adapter service implementation. This class extends the FilterService in order to catch
  * some Service methods for configuring actual adapter service implementation.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
-public class FactoryConfigurationAdapterServiceImpl extends FilterService
-{
-    public FactoryConfigurationAdapterServiceImpl(DependencyManager dm, String factoryPid, String update, boolean propagate)
-    {
+public class FactoryConfigurationAdapterServiceImpl extends FilterService {
+    public FactoryConfigurationAdapterServiceImpl(DependencyManager dm, String factoryPid, String update, boolean propagate) {
         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);
@@ -54,23 +54,21 @@
     }
     
     public FactoryConfigurationAdapterServiceImpl(DependencyManager dm, String factoryPid, String update, boolean propagate,
-                                                  BundleContext bctx, Logger logger, String heading, String description, String localization, PropertyMetaData[] properyMetaData)
-    {
+        BundleContext bctx, Logger logger, String heading, String description, String localization, PropertyMetaData[] properyMetaData) {
         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
             .setInterface(ManagedServiceFactory.class.getName(), props)
             .setImplementation(new MetaTypeAdapterImpl(factoryPid, update, propagate,
-                                                       bctx, logger, heading, description,
-                                                       localization, properyMetaData));
+                bctx, logger, heading, description,
+                localization, properyMetaData));
     }
     
     /**
      * Creates, updates, or removes a service, when a ConfigAdmin factory configuration is created/updated or deleted.
      */
-    public class AdapterImpl extends AbstractDecorator implements ManagedServiceFactory
-    {
+    public class AdapterImpl extends AbstractDecorator implements ManagedServiceFactory {
         // Our injected dependency manager
         protected volatile DependencyManager m_dm;
         
@@ -93,8 +91,7 @@
          * @param adapterProperties
          * @param propagate
          */
-        public AdapterImpl(String factoryPid, String updateMethod, boolean propagate)
-        {
+        public AdapterImpl(String factoryPid, String updateMethod, boolean propagate) {
             m_factoryPid = factoryPid;
             m_update = updateMethod;
             m_propagate = propagate;
@@ -103,8 +100,7 @@
         /**
          * Returns the managed service factory name.
          */
-        public String getName()
-        {
+        public String getName() {
             return m_factoryPid;
         }
       
@@ -118,9 +114,9 @@
             
             try {
                 if (m_serviceImpl != null) {
-                    impl = (m_serviceImpl instanceof Class) ? 
-                        ((Class) m_serviceImpl).newInstance() : m_serviceImpl;
-                } else {
+                    impl = (m_serviceImpl instanceof Class) ? ((Class) m_serviceImpl).newInstance() : m_serviceImpl;
+                }
+                else {
                     impl = instantiateFromFactory(m_factory, m_factoryCreateMethod);
                 }
                 InvocationUtil.invokeCallbackMethod(impl, m_update, 
@@ -128,8 +124,7 @@
                     new Object[][] {{ settings }, {}});
             }
             
-            catch (Throwable t)
-            {
+            catch (Throwable t) {
                handleException(t);
             }
 
@@ -144,7 +139,6 @@
             for (int i = 0; i < m_stateListeners.size(); i ++) {
                 newService.addStateListener((ComponentStateListener) m_stateListeners.get(i));
             }
-
             return newService;
         }
 
@@ -152,14 +146,12 @@
          * Method called from our superclass, when we need to update a Service, because 
          * the configuration has changed.
          */
-        public void updateService(Object[] properties) 
-        {
+        public void updateService(Object[] properties) {
             Dictionary settings = (Dictionary) properties[0];
             Component service = (Component) properties[1];
             Object impl = service.getService();
            
-            try
-            {
+            try {
                 InvocationUtil.invokeCallbackMethod(impl, m_update, 
                     new Class[][] {{ Dictionary.class }, {}}, 
                     new Object[][] {{ settings }, {}});
@@ -169,8 +161,7 @@
                 }
             }
             
-            catch (Throwable t)
-            {
+            catch (Throwable t) {
                 handleException(t);
             }
         }   
@@ -183,8 +174,7 @@
          * @param settings
          * @return
          */
-        private Dictionary mergeSettings(Dictionary adapterProperties, Dictionary settings)
-        {
+        private Dictionary mergeSettings(Dictionary adapterProperties, Dictionary settings) {
             Dictionary props = new Hashtable();
             
             if (adapterProperties != null) {
@@ -208,8 +198,7 @@
             return props;
         }
     
-        private Object instantiateFromFactory(Object mFactory, String mFactoryCreateMethod)
-        {
+        private Object instantiateFromFactory(Object mFactory, String mFactoryCreateMethod) {
             Object factory = null;
             if (m_factory instanceof Class) {
                 try {
@@ -224,8 +213,7 @@
             }
 
             try {
-                return InvocationUtil.invokeMethod(factory, factory.getClass(), m_factoryCreateMethod,
-                                                   new Class[][] {{}}, new Object[][] {{}}, false);
+                return InvocationUtil.invokeMethod(factory, factory.getClass(), m_factoryCreateMethod, new Class[][] { {} }, new Object[][] { {} }, false);
             }
             catch (Throwable t) {
                 handleException(t);
@@ -240,14 +228,15 @@
         }
     
         private void handleException(Throwable t) {
-            if (t instanceof InvocationTargetException)
-            {
+            if (t instanceof InvocationTargetException) {
                 // Our super class will check if the target exception is itself a ConfigurationException.
                 // In this case, it will simply re-thrown.
                 throw new RuntimeException(((InvocationTargetException) t).getTargetException());
-            } else if (t instanceof RuntimeException) {
+            }
+            else if (t instanceof RuntimeException) {
                 throw (RuntimeException) t;
-            } else {
+            }
+            else {
                 throw new RuntimeException(t);
             }
         }
@@ -264,29 +253,24 @@
         public MetaTypeAdapterImpl(String factoryPid, String updateMethod, boolean propagate,
                                    BundleContext bctx, Logger logger, String heading, 
                                    String description, String localization,
-                                   PropertyMetaData[] properyMetaData)
-        {
+                                   PropertyMetaData[] properyMetaData) {
             super(factoryPid, updateMethod, propagate);
             m_metaType = new MetaTypeProviderImpl(m_factoryPid, bctx, logger, null, this);
             m_metaType.setName(heading);
             m_metaType.setDescription(description);
-            if (localization != null) 
-            {
+            if (localization != null) {
                 m_metaType.setLocalization(localization);
             }
-            for (int i = 0; i < properyMetaData.length; i ++) 
-            {
+            for (int i = 0; i < properyMetaData.length; i++) {
                 m_metaType.add(properyMetaData[i]);
             }
         }
         
-        public String[] getLocales()
-        {
+        public String[] getLocales() {
             return m_metaType.getLocales();
         }
 
-        public ObjectClassDefinition getObjectClassDefinition(String id, String locale)
-        {
+        public ObjectClassDefinition getObjectClassDefinition(String id, String locale) {
             return m_metaType.getObjectClassDefinition(id, locale);
         }
     }    
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 b3a14ac..9779290 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
@@ -32,9 +32,10 @@
 /**
  * This class allows to filter a Service interface. All Aspect/Adapters extends this class
  * in order to add functionality to the default Service implementation.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
-public class FilterService implements Component
-{
+public class FilterService implements Component {
     protected ComponentImpl m_service;
     protected List m_stateListeners = new ArrayList();
     protected String m_init = "init";
@@ -50,13 +51,11 @@
     protected String m_factoryCreateMethod;
     protected Dictionary m_serviceProperties;
 
-    public FilterService(Component service)
-    {
+    public FilterService(Component service) {
         m_service = (ComponentImpl) service;
     }
 
-    public Component add(Dependency dependency)
-    {
+    public Component add(Dependency dependency) {
         m_service.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
@@ -71,8 +70,7 @@
         return this;
     }
 
-    public Component add(List dependencies)
-    {
+    public Component add(List dependencies) {
         m_service.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
@@ -86,49 +84,40 @@
         // Ok, the list contains no required dependencies: add optionals dependencies in already instantiated
         // services.
         AbstractDecorator ad = (AbstractDecorator) m_service.getService();
-        if (ad != null)
-        {
+        if (ad != null) {
             ad.addDependencies(dependencies);
         }
         return this;
     }
 
-    public void addStateListener(ComponentStateListener listener)
-    {
-        synchronized (this)
-        {
+    public void addStateListener(ComponentStateListener listener) {
+        synchronized (this) {
             m_stateListeners.add(listener);
         }
         // Add the listener to all already instantiated services.
         AbstractDecorator ad = (AbstractDecorator) m_service.getService();
-        if (ad != null)
-        {
+        if (ad != null) {
             ad.addStateListener(listener);
         }
     }
 
-    public List getDependencies()
-    {
+    public List getDependencies() {
         return m_service.getDependencies();
     }
 
-    public Object getService()
-    {
+    public Object getService() {
         return m_service.getService();
     }
 
-    public synchronized Dictionary getServiceProperties()
-    {
+    public synchronized Dictionary getServiceProperties() {
         return m_serviceProperties;
     }
 
-    public ServiceRegistration getServiceRegistration()
-    {
+    public ServiceRegistration getServiceRegistration() {
         return m_service.getServiceRegistration();
     }
 
-    public Component remove(Dependency dependency)
-    {
+    public Component remove(Dependency dependency) {
         m_service.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
@@ -144,23 +133,18 @@
         return this;
     }
 
-    public void removeStateListener(ComponentStateListener listener)
-    {
-        synchronized (this)
-        {
+    public void removeStateListener(ComponentStateListener listener) {
+        synchronized (this) {
             m_stateListeners.remove(listener);
         }
         // Remove the listener from all already instantiated services.
         AbstractDecorator ad = (AbstractDecorator) m_service.getService();
-        if (ad != null)
-        {
+        if (ad != null) {
             ad.removeStateListener(listener);
         }
     }
 
-    public synchronized Component setCallbacks(Object instance, String init, String start, String stop,
-                                             String destroy)
-    {
+    public synchronized Component setCallbacks(Object instance, String init, String start, String stop, String destroy) {
         m_service.ensureNotActive();
         m_callbackObject = instance;
         m_init = init;
@@ -170,49 +154,42 @@
         return this;
     }
 
-    public Component setCallbacks(String init, String start, String stop, String destroy)
-    {
+    public Component setCallbacks(String init, String start, String stop, String destroy) {
         setCallbacks(null, init, start, stop, destroy);
         return this;
     }
 
-    public synchronized Component setComposition(Object instance, String getMethod)
-    {
+    public synchronized Component setComposition(Object instance, String getMethod) {
         m_service.ensureNotActive();
         m_compositionInstance = instance;
         m_compositionMethod = getMethod;
         return this;
     }
 
-    public synchronized Component setComposition(String getMethod)
-    {
+    public synchronized Component setComposition(String getMethod) {
         m_service.ensureNotActive();
         m_compositionMethod = getMethod;
         return this;
     }
 
-    public synchronized Component setFactory(Object factory, String createMethod)
-    {
+    public synchronized Component setFactory(Object factory, String createMethod) {
         m_service.ensureNotActive();
         m_factory = factory;
         m_factoryCreateMethod = createMethod;
         return this;
     }
 
-    public Component setFactory(String createMethod)
-    {
+    public Component setFactory(String createMethod) {
         return setFactory(null, createMethod);
     }
 
-    public synchronized Component setImplementation(Object implementation)
-    {
+    public synchronized Component setImplementation(Object implementation) {
         m_service.ensureNotActive();
         m_serviceImpl = implementation;
         return this;
     }
 
-    public Component setInterface(String serviceName, Dictionary properties)
-    {
+    public Component setInterface(String serviceName, Dictionary properties) {
         return setInterface(new String[] { serviceName }, properties);
     }
 
@@ -226,30 +203,25 @@
         return this;
     }
 
-    public Component setServiceProperties(Dictionary serviceProperties)
-    {
-        synchronized (this)
-        {
+    public Component setServiceProperties(Dictionary serviceProperties) {
+        synchronized (this) {
             m_serviceProperties = serviceProperties;
         }
         // Set the properties to all already instantiated services.
         if (serviceProperties != null) {
             AbstractDecorator ad = (AbstractDecorator) m_service.getService();
-            if (ad != null)
-            {
+            if (ad != null) {
                 ad.setServiceProperties(serviceProperties);
             }
         }
         return this;
     }
 
-    public void start()
-    {
+    public void start() {
         m_service.start();
     }
 
-    public void stop()
-    {
+    public void stop() {
         m_service.stop();
     }
     
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 0828b3f..ab45808 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
@@ -23,15 +23,17 @@
 import java.util.List;
 import java.util.Properties;
 
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.ComponentStateListener;
 import org.apache.felix.dm.Dependency;
 import org.apache.felix.dm.DependencyManager;
 import org.apache.felix.dm.ResourceDependency;
-import org.apache.felix.dm.Component;
-import org.apache.felix.dm.ComponentStateListener;
 
 /**
  * Resource adapter service implementation. This class extends the FilterService in order to catch
  * some Service methods for configuring actual resource adapter service implementation.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public class ResourceAdapterServiceImpl extends FilterService {
     private Object m_callbackInstance = null;
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/BundleDependencyImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/BundleDependencyImpl.java
index 07d3d74..969356b 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/BundleDependencyImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/BundleDependencyImpl.java
@@ -25,9 +25,9 @@
 import java.util.List;
 
 import org.apache.felix.dm.BundleDependency;
+import org.apache.felix.dm.ComponentDependencyDeclaration;
 import org.apache.felix.dm.Dependency;
 import org.apache.felix.dm.DependencyService;
-import org.apache.felix.dm.ComponentDependencyDeclaration;
 import org.apache.felix.dm.InvocationUtil;
 import org.apache.felix.dm.impl.DefaultNullObject;
 import org.apache.felix.dm.impl.Logger;
@@ -40,6 +40,9 @@
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.service.log.LogService;
 
+/**
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public class BundleDependencyImpl extends DependencyBase implements BundleDependency, BundleTrackerCustomizer, ComponentDependencyDeclaration {
 	private final BundleContext m_context;
 	private boolean m_isStarted;
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyBase.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyBase.java
index a3a1f7a..c3bd124 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyBase.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyBase.java
@@ -1,9 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.felix.dm.impl.dependencies;
 
 import org.apache.felix.dm.Dependency;
 import org.apache.felix.dm.DependencyActivation;
 import org.apache.felix.dm.impl.Logger;
 
+/**
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public abstract class DependencyBase implements Dependency, DependencyActivation {
     private boolean m_isRequired;
     private boolean m_isInstanceBound;
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ResourceDependencyImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ResourceDependencyImpl.java
index 4a652cb..f000c50 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ResourceDependencyImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ResourceDependencyImpl.java
@@ -25,24 +25,25 @@
 import java.util.List;
 import java.util.Properties;
 
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.ComponentDependencyDeclaration;
 import org.apache.felix.dm.Dependency;
 import org.apache.felix.dm.DependencyActivation;
 import org.apache.felix.dm.DependencyService;
 import org.apache.felix.dm.InvocationUtil;
 import org.apache.felix.dm.ResourceDependency;
 import org.apache.felix.dm.ResourceHandler;
-import org.apache.felix.dm.Component;
-import org.apache.felix.dm.ComponentDependencyDeclaration;
 import org.apache.felix.dm.impl.Logger;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.log.LogService;
 
+/**
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public class ResourceDependencyImpl extends DependencyBase implements ResourceDependency, ResourceHandler, DependencyActivation, ComponentDependencyDeclaration {
 	private volatile BundleContext m_context;
 	private volatile ServiceRegistration m_registration;
-//	private long m_resourceCounter;
-
     private Object m_callbackInstance;
     private String m_callbackAdded;
     private String m_callbackChanged;
@@ -313,63 +314,6 @@
         return this;
     }
     
-//    private void invokeCallbackMethod(Object[] instances, String methodName, Object service) {
-//        for (int i = 0; i < instances.length; i++) {
-//            try {
-//                invokeCallbackMethod(instances[i], methodName, service);
-//            }
-//            catch (NoSuchMethodException e) {
-//                m_logger.log(Logger.LOG_DEBUG, "Method '" + methodName + "' does not exist on " + instances[i] + ". Callback skipped.");
-//            }
-//        }
-//    }
-//
-//    private void invokeCallbackMethod(Object instance, String methodName, Object service) throws NoSuchMethodException {
-//        Class currentClazz = instance.getClass();
-//        boolean done = false;
-//        while (!done && currentClazz != null) {
-//            done = invokeMethod(instance, currentClazz, methodName,
-//                new Class[][] {{Resource.class}, {Object.class}, {}},
-//                new Object[][] {{service}, {service}, {}},
-//                false);
-//            if (!done) {
-//                currentClazz = currentClazz.getSuperclass();
-//            }
-//        }
-//        if (!done && currentClazz == null) {
-//            throw new NoSuchMethodException(methodName);
-//        }
-//    }
-//    
-//    private boolean invokeMethod(Object object, Class clazz, String name, Class[][] signatures, Object[][] parameters, boolean isSuper) {
-//        Method m = null;
-//        for (int i = 0; i < signatures.length; i++) {
-//            Class[] signature = signatures[i];
-//            try {
-//                m = clazz.getDeclaredMethod(name, signature);
-//                if (!(isSuper && Modifier.isPrivate(m.getModifiers()))) {
-//                    m.setAccessible(true);
-//                    try {
-//                        m.invoke(object, parameters[i]);
-//                    }
-//                    catch (InvocationTargetException e) {
-//                        m_logger.log(Logger.LOG_ERROR, "Exception while invoking method " + m + ".", e);
-//                    }
-//                    // we did find and invoke the method, so we return true
-//                    return true;
-//                }
-//            }
-//            catch (NoSuchMethodException e) {
-//                // ignore this and keep looking
-//            }
-//            catch (Exception e) {
-//                // could not even try to invoke the method
-//                m_logger.log(Logger.LOG_ERROR, "Exception while trying to invoke method " + m + ".", e);
-//            }
-//        }
-//        return false;
-//    }
-    
     private synchronized Object[] getCallbackInstances(DependencyService ds) {
         if (m_callbackInstance == null) {
             return ds.getCompositionInstances();
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/TemporalServiceDependencyImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/TemporalServiceDependencyImpl.java
index 7ae64f0..495bc22 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/TemporalServiceDependencyImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/TemporalServiceDependencyImpl.java
@@ -25,10 +25,11 @@
 import org.osgi.framework.ServiceReference;
 
 /**
-* Temporal Service dependency implementation, used to hide temporary service dependency "outage".
-* Only works with required dependency.
-* (see javadoc in {@link TemporalServiceDependency}).
-*/
+ * Temporal Service dependency implementation, used to hide temporary service dependency "outage".
+ * Only works with a required dependency.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public class TemporalServiceDependencyImpl extends ServiceDependencyImpl implements TemporalServiceDependency, InvocationHandler {
     // Max millis to wait for service availability.
     private long m_timeout = 30000;
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/metatype/AttributeDefinitionImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/metatype/AttributeDefinitionImpl.java
index 3d4711e..3a72c95 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/metatype/AttributeDefinitionImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/metatype/AttributeDefinitionImpl.java
@@ -20,67 +20,57 @@
 
 import org.osgi.service.metatype.AttributeDefinition;
 
-public class AttributeDefinitionImpl implements AttributeDefinition
-{
+/**
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class AttributeDefinitionImpl implements AttributeDefinition {
     private PropertyMetaDataImpl m_propertyMetaData;
     private Resource m_resource;
 
-    public AttributeDefinitionImpl(PropertyMetaDataImpl propertyMetaData, Resource resource)
-    {
+    public AttributeDefinitionImpl(PropertyMetaDataImpl propertyMetaData, Resource resource) {
         m_propertyMetaData = propertyMetaData;
         m_resource = resource;
     }
 
-    public int getCardinality()
-    {
+    public int getCardinality() {
         return m_propertyMetaData.getCardinality();
     }
 
-    public String[] getDefaultValue()
-    {
+    public String[] getDefaultValue() {
         return m_propertyMetaData.getDefaults();
     }
 
-    public String getDescription()
-    {
+    public String getDescription() {
         return m_resource.localize(m_propertyMetaData.getDescription());
     }
 
-    public String getID()
-    {
+    public String getID() {
         return m_propertyMetaData.getId();
     }
 
-    public String getName()
-    {
+    public String getName() {
         return m_resource.localize(m_propertyMetaData.getHeading());
     }
 
-    public String[] getOptionLabels()
-    {
+    public String[] getOptionLabels() {
         String[] labels = m_propertyMetaData.getOptionLabels();
-        if (labels != null)
-        {
-            for (int i = 0; i < labels.length; i++)
-            {
+        if (labels != null) {
+            for (int i = 0; i < labels.length; i++) {
                 labels[i] = m_resource.localize(labels[i]);
             }
         }
         return labels;
     }
 
-    public String[] getOptionValues()
-    {
+    public String[] getOptionValues() {
         return m_propertyMetaData.getOptionValues();
     }
 
-    public int getType()
-    {
+    public int getType() {
         return m_propertyMetaData.getType();
     }
 
-    public String validate(String value)
-    {
+    public String validate(String value) {
         return null;
     }
 }
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/metatype/MetaTypeProviderImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/metatype/MetaTypeProviderImpl.java
index c6711b1..a3704a2 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/metatype/MetaTypeProviderImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/metatype/MetaTypeProviderImpl.java
@@ -47,9 +47,10 @@
  * When a ConfigurationDepdendency is configured with properties metadata, we provide
  * a specific ManagedService which also implements the MetaTypeProvider interface. This interface
  * allows the MetaTypeService to retrieve our properties metadata, which will then be handled by webconsole.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
-public class MetaTypeProviderImpl implements MetaTypeProvider, ManagedService, ManagedServiceFactory
-{
+public class MetaTypeProviderImpl implements MetaTypeProvider, ManagedService, ManagedServiceFactory {
     private ManagedService m_managedServiceDelegate;
     private ManagedServiceFactory m_managedServiceFactoryDelegate;
     private List m_propertiesMetaData = new ArrayList();
@@ -61,8 +62,7 @@
     private BundleContext m_bctx;
     private String m_pid;
 
-    public MetaTypeProviderImpl(String pid, BundleContext ctx, Logger logger, ManagedService msDelegate, ManagedServiceFactory msfDelegate)
-    {
+    public MetaTypeProviderImpl(String pid, BundleContext ctx, Logger logger, ManagedService msDelegate, ManagedServiceFactory msfDelegate) {
         m_pid = pid;
         m_bctx = ctx;
         m_logger = logger;
@@ -72,10 +72,8 @@
         // By default, this file can be stored in OSGI-INF/l10n/bundle.properties (and corresponding localized version
         // in OSGI-INF/l10n/bundle_en_GB_welsh.properties,  OSGI-INF/l10n/bundle_en_GB.properties, etc ...
         // This default localization property file name can be overriden using the PropertyMetaData.setLocalization method.
-        m_localization = (String) m_bctx.getBundle().getHeaders().get(
-            Constants.BUNDLE_LOCALIZATION);
-        if (m_localization == null)
-        {
+        m_localization = (String) m_bctx.getBundle().getHeaders().get(Constants.BUNDLE_LOCALIZATION);
+        if (m_localization == null) {
             m_localization = Constants.BUNDLE_LOCALIZATION_DEFAULT_BASENAME;
         }
     }
@@ -84,8 +82,7 @@
      * Registers the metatype information of a given configuration property
      * @param property
      */
-    public void add(PropertyMetaData property)
-    {
+    public void add(PropertyMetaData property) {
         m_propertiesMetaData.add(property);
     }
 
@@ -93,8 +90,7 @@
      * A human readable description of the PID this annotation is associated with. Example: "Configuration for the PrinterService bundle".
      * @return A human readable description of the PID this annotation is associated with (may be localized)
      */
-    public void setDescription(String description)
-    {
+    public void setDescription(String description) {
         m_description = description;
     }
 
@@ -102,8 +98,7 @@
      * The label used to display the tab name (or section) where the properties are displayed. Example: "Printer Service".
      * @return The label used to display the tab name where the properties are displayed (may be localized)
      */
-    public void setName(String heading)
-    {
+    public void setName(String heading) {
         m_heading = heading;
     }
 
@@ -113,14 +108,12 @@
      * The default localization base name for the properties is OSGI-INF/l10n/bundle, but can
      * be overridden by the manifest Bundle-Localization header (see core specification, in section Localization on page 68).
      */
-    public void setLocalization(String path)
-    {
-        if (path.endsWith(".properties"))
-        {
+    public void setLocalization(String path) {
+        if (path.endsWith(".properties")) {
             throw new IllegalArgumentException(
                 "path must point to the base name of the propertie file, "
-                    + "excluding local suffixes. For example: "
-                    + "foo/bar/person is valid and matches the property file \"foo/bar/person_bundle_en_GB_welsh.properties\"");
+                + "excluding local suffixes. For example: "
+                + "foo/bar/person is valid and matches the property file \"foo/bar/person_bundle_en_GB_welsh.properties\"");
         }
         m_localization = path.startsWith("/") ? path.substring(1) : path;
     }
@@ -133,8 +126,7 @@
      * "en_GB", "en_GB_welsh" ...
      * @return the list of Locale supported by our bundle.
      */
-    public String[] getLocales()
-    {
+    public String[] getLocales() {
         int lastSlash = m_localization.lastIndexOf("/");
         String path = (lastSlash == -1) ? "/" : ("/" + m_localization.substring(0, lastSlash - 1));
         String base = (lastSlash == -1) ? m_localization : m_localization.substring(lastSlash + 1);
@@ -145,20 +137,17 @@
         }
         
         TreeSet set = new TreeSet();
-        while (e.hasMoreElements())
-        {
+        while (e.hasMoreElements()) {
             // We have found a locale property file in the form of "path/file[_language[_ country[_variation]].properties"
             // And now, we have to get the "language[_country[_variation]]" part ...
             URL url = (URL) e.nextElement();
             String name = url.getPath();
             name = name.substring(name.lastIndexOf("/") + 1);
             int underscore = name.indexOf("_");
-            if (underscore != -1)
-            {
+            if (underscore != -1) {
                 name = name.substring(underscore + 1, name.length() - ".properties".length());
             }
-            if (name.length() > 0)
-            {
+            if (name.length() > 0) {
                 set.add(name);
             }
         }
@@ -170,13 +159,10 @@
     /**
      * Returns the ObjectClassDefinition for a given Pid/Locale.
      */
-    public ObjectClassDefinition getObjectClassDefinition(String id, String locale)
-    {
-        try
-        {
+    public ObjectClassDefinition getObjectClassDefinition(String id, String locale) {
+        try {
             // Check if the id matches our PID
-            if (!id.equals(m_pid))
-            {
+            if (!id.equals(m_pid)) {
                 m_logger.log(LogService.LOG_ERROR, "id " + id + " does not match pid " + m_pid);
                 return null;
             }
@@ -186,8 +172,7 @@
                 m_description, m_propertiesMetaData, new Resource(localeProperties));
         }
 
-        catch (Throwable t)
-        {
+        catch (Throwable t) {
             m_logger.log(
                 Logger.LOG_ERROR,
                 "Unexpected exception while geting ObjectClassDefinition for " + id + " (locale="
@@ -200,8 +185,7 @@
      * We also implements the ManagedService and we just delegates the configuration handling to
      * our associated ConfigurationDependency.
      */
-    public void updated(Dictionary properties) throws ConfigurationException
-    {
+    public void updated(Dictionary properties) throws ConfigurationException {
         m_managedServiceDelegate.updated(properties);
     }
 
@@ -211,36 +195,28 @@
      * @return
      * @throws IOException
      */
-    private synchronized Properties getLocaleProperties(String locale) throws IOException
-    {
+    private synchronized Properties getLocaleProperties(String locale) throws IOException {
         locale = locale == null ? Locale.getDefault().toString() : locale;
         Properties properties = (Properties) m_localesProperties.get(locale);
-        if (properties == null)
-        {
+        if (properties == null) {
             properties = new Properties();
-            URL url = m_bctx.getBundle().getEntry(
-                m_localization + ".properties");
-            if (url != null)
-            {
+            URL url = m_bctx.getBundle().getEntry(m_localization + ".properties");
+            if (url != null) {
                 loadLocale(properties, url);
             }
 
             String path = m_localization;
             StringTokenizer tok = new StringTokenizer(locale, "_");
-            while (tok.hasMoreTokens())
-            {
+            while (tok.hasMoreTokens()) {
                 path += "_" + tok.nextToken();
                 url = m_bctx.getBundle().getEntry(path + ".properties");
-                if (url != null)
-                {
+                if (url != null) {
                     properties = new Properties(properties);
                     loadLocale(properties, url);
                 }
             }
-
             m_localesProperties.put(locale, properties);
         }
-
         return properties;
     }
 
@@ -250,43 +226,33 @@
      * @param url
      * @throws IOException
      */
-    private void loadLocale(Properties properties, URL url) throws IOException
-    {
+    private void loadLocale(Properties properties, URL url) throws IOException {
         InputStream in = null;
-        try
-        {
+        try {
             in = url.openStream();
             properties.load(in);
         }
-        finally
-        {
-            if (in != null)
-            {
-                try
-                {
+        finally {
+            if (in != null) {
+                try {
                     in.close();
                 }
-                catch (IOException ignored)
-                {
+                catch (IOException ignored) {
                 }
             }
         }
     }
 
     // ManagedServiceFactory implementation
-    
-    public void deleted(String pid)
-    {
+    public void deleted(String pid) {
         m_managedServiceFactoryDelegate.deleted(pid);
     }
 
-    public String getName()
-    {
+    public String getName() {
         return m_pid;
     }
 
-    public void updated(String pid, Dictionary properties) throws ConfigurationException
-    {
+    public void updated(String pid, Dictionary properties) throws ConfigurationException {
         m_managedServiceFactoryDelegate.updated(pid, properties);
     }
 }
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/metatype/ObjectClassDefinitionImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/metatype/ObjectClassDefinitionImpl.java
index 47e28ff..a5f66bf 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/metatype/ObjectClassDefinitionImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/metatype/ObjectClassDefinitionImpl.java
@@ -28,9 +28,10 @@
 
 /**
  * ObjectClassDefinition implementation.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
-public class ObjectClassDefinitionImpl implements ObjectClassDefinition
-{
+public class ObjectClassDefinitionImpl implements ObjectClassDefinition {
     // Our OCD name (may be localized)
     private String m_name;
     
@@ -46,8 +47,7 @@
     // The localized resource that can be used when localizing some parameters
     private Resource m_resource;
 
-    public ObjectClassDefinitionImpl(String id, String name, String description, List propertiesMetaData, Resource resource)
-    {
+    public ObjectClassDefinitionImpl(String id, String name, String description, List propertiesMetaData, Resource resource) {
         m_id = id;
         m_name = name;
         m_description = description;
@@ -57,26 +57,21 @@
 
     // --------------------- ObjectClassDefinition ----------------------------------------
 
-    public AttributeDefinition[] getAttributeDefinitions(int filter)
-    {
+    public AttributeDefinition[] getAttributeDefinitions(int filter) {
         List attrs = new ArrayList();
-        for (int i = 0; i < m_propertiesMetaData.size(); i++)
-        {
+        for (int i = 0; i < m_propertiesMetaData.size(); i++) {
             PropertyMetaDataImpl metaData = (PropertyMetaDataImpl) m_propertiesMetaData.get(i);
-            switch (filter)
-            {
+            switch (filter) {
                 case ObjectClassDefinition.ALL:
                     attrs.add(new AttributeDefinitionImpl(metaData, m_resource));
                     break;
                 case ObjectClassDefinition.OPTIONAL:
-                    if (!metaData.isRequired())
-                    {
+                    if (!metaData.isRequired()) {
                         attrs.add(new AttributeDefinitionImpl(metaData, m_resource));
                     }
                     break;
                 case ObjectClassDefinition.REQUIRED:
-                    if (metaData.isRequired())
-                    {
+                    if (metaData.isRequired()) {
                         attrs.add(new AttributeDefinitionImpl(metaData, m_resource));
                     }
                     break;
@@ -87,24 +82,20 @@
         return (AttributeDefinition[]) attrs.toArray(array);
     }
 
-    public String getDescription()
-    {
+    public String getDescription() {
         return m_resource.localize(m_description);
     }
 
-    public String getID()
-    {
+    public String getID() {
         return m_id;
     }
 
-    public InputStream getIcon(int size) throws IOException
-    {
+    public InputStream getIcon(int size) throws IOException {
         // TODO Auto-generated method stub
         return null;
     }
 
-    public String getName()
-    {
+    public String getName() {
         return m_resource.localize(m_name);
     }
 }
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/metatype/PropertyMetaDataImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/metatype/PropertyMetaDataImpl.java
index fc8cd61..50ba1bc 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/metatype/PropertyMetaDataImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/metatype/PropertyMetaDataImpl.java
@@ -29,9 +29,10 @@
 /**
  * DependencyManager PropertyMetaData Implementation. This class describes meta informations regarding
  * one given configuration property.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
-public class PropertyMetaDataImpl implements PropertyMetaData
-{
+public class PropertyMetaDataImpl implements PropertyMetaData {
     /**
      * List of option labels (may be localized)
      */
@@ -83,68 +84,56 @@
      * Mapping between java types and valid MetaType types.
      * @see {@link AttributeDefinition#getType()}
      */
-    private final static Map m_typeMapping = new HashMap()
-    {
-        {
-            put(Boolean.class, new Integer(AttributeDefinition.BOOLEAN));
-            put(Byte.class, new Integer(AttributeDefinition.BYTE));
-            put(Character.class, new Integer(AttributeDefinition.CHARACTER));
-            put(Double.class, new Integer(AttributeDefinition.FLOAT));
-            put(Integer.class, new Integer(AttributeDefinition.INTEGER));
-            put(Long.class, new Integer(AttributeDefinition.LONG));
-            put(Short.class, new Integer(AttributeDefinition.SHORT));
-            put(String.class, new Integer(AttributeDefinition.STRING));
-        }
-    };
+    private final static Map m_typeMapping = new HashMap() {{
+        put(Boolean.class, new Integer(AttributeDefinition.BOOLEAN));
+        put(Byte.class, new Integer(AttributeDefinition.BYTE));
+        put(Character.class, new Integer(AttributeDefinition.CHARACTER));
+        put(Double.class, new Integer(AttributeDefinition.FLOAT));
+        put(Integer.class, new Integer(AttributeDefinition.INTEGER));
+        put(Long.class, new Integer(AttributeDefinition.LONG));
+        put(Short.class, new Integer(AttributeDefinition.SHORT));
+        put(String.class, new Integer(AttributeDefinition.STRING));
+    }};
 
-    public PropertyMetaData addOption(String optionLabel, String optionValue)
-    {
+    public PropertyMetaData addOption(String optionLabel, String optionValue) {
         m_optionsLabels.add(optionLabel);
         m_optionsValues.add(optionValue);
         return this;
     }
 
-    public PropertyMetaData setCardinality(int cardinality)
-    {
+    public PropertyMetaData setCardinality(int cardinality) {
         m_cardinality = cardinality;
         return this;
     }
 
-    public PropertyMetaData setDefaults(String[] defaults)
-    {
+    public PropertyMetaData setDefaults(String[] defaults) {
         m_defaults = defaults;
         return this;
     }
 
-    public PropertyMetaData setDescription(String description)
-    {
+    public PropertyMetaData setDescription(String description) {
         m_description = description;
         return this;
     }
 
-    public PropertyMetaData setHeading(String heading)
-    {
+    public PropertyMetaData setHeading(String heading) {
         m_heading = heading;
         return this;
     }
 
-    public PropertyMetaData setId(String id)
-    {
+    public PropertyMetaData setId(String id) {
         m_id = id;
         return this;
     }
 
-    public PropertyMetaData setRequired(boolean required)
-    {
+    public PropertyMetaData setRequired(boolean required) {
         m_required = required;
         return this;
     }
 
-    public PropertyMetaData setType(Class classType)
-    {
+    public PropertyMetaData setType(Class classType) {
         Integer type = (Integer) m_typeMapping.get(classType);
-        if (type == null)
-        {
+        if (type == null) {
             throw new IllegalArgumentException("Invalid type: " + classType + ". Valid types are "
                 + m_typeMapping.keySet());
         }
@@ -152,50 +141,41 @@
         return this;
     }
 
-    public String[] getOptionLabels()
-    {
+    public String[] getOptionLabels() {
         String[] optionLabels = new String[m_optionsLabels.size()];
         return (String[]) m_optionsLabels.toArray(optionLabels);
     }
 
-    public String[] getOptionValues()
-    {
+    public String[] getOptionValues() {
         String[] optionValues = new String[m_optionsValues.size()];
         return (String[]) m_optionsValues.toArray(optionValues);
     }
 
-    public int getCardinality()
-    {
+    public int getCardinality() {
         return m_cardinality;
     }
 
-    public String[] getDefaults()
-    {
+    public String[] getDefaults() {
         return m_defaults;
     }
 
-    public String getDescription()
-    {
+    public String getDescription() {
         return m_description;
     }
 
-    public String getHeading()
-    {
+    public String getHeading() {
         return m_heading;
     }
 
-    public String getId()
-    {
+    public String getId() {
         return m_id;
     }
 
-    public boolean isRequired()
-    {
+    public boolean isRequired() {
         return m_required;
     }
 
-    public int getType()
-    {
+    public int getType() {
         return m_type;
     }
     
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/metatype/Resource.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/metatype/Resource.java
index 529e494..c588a0c 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/metatype/Resource.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/metatype/Resource.java
@@ -22,19 +22,18 @@
 
 /**
  * Helper class used to localize a given Property Meta Data.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
-public class Resource
-{
+public class Resource {
     private Properties m_properties;
 
     public Resource(Properties properties) {
         m_properties = properties;
     }
     
-    public String localize(String param)
-    {
-        if (m_properties != null && param != null && param.startsWith("%"))
-        {
+    public String localize(String param) {
+        if (m_properties != null && param != null && param.startsWith("%")) {
             param = param.substring(1);
             return m_properties.getProperty(param);
         }
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/index/AspectFilterIndex.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/index/AspectFilterIndex.java
index 2223f7d..ffe5b7c 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/index/AspectFilterIndex.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/index/AspectFilterIndex.java
@@ -41,6 +41,9 @@
 import org.osgi.framework.ServiceListener;
 import org.osgi.framework.ServiceReference;
 
+/**
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public class AspectFilterIndex implements FilterIndex, ServiceTrackerCustomizer {
     private static final String FILTER_START = "(&(" + Constants.OBJECTCLASS + "=";
     private static final String FILTER_SUBSTRING_0 = ")(&(|(!(" + Constants.SERVICE_RANKING + "=*))(" + Constants.SERVICE_RANKING + "<=";
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/index/BundleContextInterceptor.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/index/BundleContextInterceptor.java
index 7f4281d..4246b67 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/index/BundleContextInterceptor.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/index/BundleContextInterceptor.java
@@ -29,6 +29,9 @@
 import org.osgi.framework.ServiceListener;
 import org.osgi.framework.ServiceReference;
 
+/**
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public class BundleContextInterceptor extends BundleContextInterceptorBase {
     private final ServiceRegistryCache m_cache;
 
@@ -43,6 +46,7 @@
             filterIndex.addServiceListener(listener, filter);
         }
         else {
+//            System.out.println("BCI:Listener " + listener.getClass().getName() + " filter " + filter);
             m_context.addServiceListener(listener, filter);
         }
     }
@@ -53,6 +57,7 @@
             filterIndex.addServiceListener(listener, null);
         }
         else {
+//            System.out.println("BCI:Listener " + listener.getClass().getName() + " without filter");
             m_context.addServiceListener(listener);
         }
     }
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/index/BundleContextInterceptorBase.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/index/BundleContextInterceptorBase.java
index 9ef292f..c32225c 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/index/BundleContextInterceptorBase.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/index/BundleContextInterceptorBase.java
@@ -36,7 +36,11 @@
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 
-/** Base class for bundle context interceptors that keep track of service listeners and delegate incoming changes to them. */
+/**
+ * Base class for bundle context interceptors that keep track of service listeners and delegate incoming changes to them.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public abstract class BundleContextInterceptorBase implements BundleContext, ServiceListener {
     protected final BundleContext m_context;
     /** Keeps track of all service listeners and their optional filters. */
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/index/FilterIndex.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/index/FilterIndex.java
index f77887e..cdc2b86 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/index/FilterIndex.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/index/FilterIndex.java
@@ -26,6 +26,8 @@
 
 /**
  * A filter index is an interface you can implement to create your own, optimized index for specific filter expressions.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public interface FilterIndex {
     /** Opens this filter index. */
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/index/FilterIndexBundleContext.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/index/FilterIndexBundleContext.java
index 4b8d324..ab8f499 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/index/FilterIndexBundleContext.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/index/FilterIndexBundleContext.java
@@ -25,6 +25,9 @@
 import org.osgi.framework.ServiceEvent;
 import org.osgi.framework.ServiceListener;
 
+/**
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public class FilterIndexBundleContext extends BundleContextInterceptorBase {
     public FilterIndexBundleContext(BundleContext context) {
         super(context);
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/index/MultiPropertyExactFilter.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/index/MultiPropertyExactFilter.java
index 5e10b77..422b328 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/index/MultiPropertyExactFilter.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/index/MultiPropertyExactFilter.java
@@ -37,6 +37,9 @@
 import org.osgi.framework.ServiceListener;
 import org.osgi.framework.ServiceReference;
 
+/**
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public class MultiPropertyExactFilter implements FilterIndex, ServiceTrackerCustomizer {
     private final Object m_lock = new Object();
     private ServiceTracker m_tracker;
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/index/ServiceRegistryCache.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/index/ServiceRegistryCache.java
index 052675e..29566bf 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/index/ServiceRegistryCache.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/index/ServiceRegistryCache.java
@@ -29,6 +29,9 @@
 import org.osgi.framework.ServiceListener;
 import org.osgi.framework.ServiceRegistration;
 
+/**
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public class ServiceRegistryCache implements ServiceListener/*, CommandProvider*/ {
     private final List /* <FilterIndex> */ m_filterIndexList = new CopyOnWriteArrayList();
     private final BundleContext m_context;
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/BundleTracker.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/BundleTracker.java
index 73c3a49..9343375 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/BundleTracker.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/BundleTracker.java
@@ -1,5 +1,4 @@
 package org.apache.felix.dm.tracker;
-
 /*
  * Copyright (c) OSGi Alliance (2007, 2008). All Rights Reserved.
  * 
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/ServiceTrackerCustomizer.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/ServiceTrackerCustomizer.java
index 1422062..857e34a 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/ServiceTrackerCustomizer.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/ServiceTrackerCustomizer.java
@@ -1,5 +1,4 @@
 package org.apache.felix.dm.tracker;
-
 /*
  * Copyright (c) OSGi Alliance (2000, 2008). All Rights Reserved.
  * 
