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 1d3759c..c34775a 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
@@ -18,7 +18,12 @@
  */
 package org.apache.felix.dm.index;
 
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceEvent;
 import org.osgi.framework.ServiceListener;
@@ -39,7 +44,6 @@
         }
         else {
             m_context.addServiceListener(listener, filter);
-//            super.addServiceListener(listener, filter);
         }
     }
 
@@ -50,7 +54,6 @@
         }
         else {
             m_context.addServiceListener(listener);
-//            super.addServiceListener(listener);
         }
     }
 
@@ -61,7 +64,6 @@
         }
         else {
             m_context.removeServiceListener(listener);
-//            super.removeServiceListener(listener);
         }
     }
 
@@ -69,47 +71,52 @@
         // first we ask the cache if there is an index for our request (class and filter combination)
         FilterIndex filterIndex = m_cache.hasFilterIndexFor(clazz, filter);
         if (filterIndex != null) {
-            ServiceReference[] result = filterIndex.getAllServiceReferences(clazz, filter);
-            // TODO filter for assignability
-            return result;
+            List /* <ServiceReference> */ result = filterIndex.getAllServiceReferences(clazz, filter);
+            Iterator iterator = result.iterator();
+            while (iterator.hasNext()) {
+                ServiceReference reference = (ServiceReference) iterator.next();
+                String[] list = (String[]) reference.getProperty(Constants.OBJECTCLASS);
+                for (int i = 0; i < list.length; i++) {
+                    if (!reference.isAssignableTo(m_context.getBundle(), list[i])) {
+                        iterator.remove();
+                        break;
+                    }
+                }
+            }
+            return (ServiceReference[]) result.toArray(new ServiceReference[result.size()]);
         }
         else {
             // if they don't know, we ask the real bundle context instead
             return m_context.getServiceReferences(clazz, filter);
         }
-        
     }
 
     public ServiceReference[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
-        // TODO implement
-        return m_context.getAllServiceReferences(clazz, filter);
+        // first we ask the cache if there is an index for our request (class and filter combination)
+        FilterIndex filterIndex = m_cache.hasFilterIndexFor(clazz, filter);
+        if (filterIndex != null) {
+            List /* <ServiceReference> */ result = filterIndex.getAllServiceReferences(clazz, filter);
+            return (ServiceReference[]) result.toArray(new ServiceReference[result.size()]);
+        }
+        else {
+            // if they don't know, we ask the real bundle context instead
+            return m_context.getAllServiceReferences(clazz, filter);
+        }
     }
 
     public ServiceReference getServiceReference(String clazz) {
-        // TODO implement
-        return m_context.getServiceReference(clazz);
+        ServiceReference[] references;
+        try {
+            references = getServiceReferences(clazz, null);
+            Arrays.sort(references);
+            return references[references.length - 1];
+        }
+        catch (InvalidSyntaxException e) {
+            throw new Error("Invalid filter syntax thrown for null filter.", e);
+        }
     }
 
     public void serviceChanged(ServiceEvent event) {
         m_cache.serviceChangedForFilterIndices(event);
-//        Entry[] entries = synchronizeCollection();
-//        for (int i = 0; i < entries.length; i++) {
-//            Entry serviceListenerFilterEntry = entries[i];
-//            ServiceListener serviceListener = (ServiceListener) serviceListenerFilterEntry.getKey();
-//            String filter = (String) serviceListenerFilterEntry.getValue();
-//            if (filter == null) {
-//                serviceListener.serviceChanged(event);
-//            }
-//            else {
-//                try {
-//                    if (m_context.createFilter(filter).match(event.getServiceReference())) {
-//                        serviceListener.serviceChanged(event);
-//                    }
-//                }
-//                catch (InvalidSyntaxException e) {
-//                    e.printStackTrace();
-//                }
-//            }
-//        }
     }
 }
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 00206ae..f77887e 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
@@ -18,10 +18,11 @@
  */
 package org.apache.felix.dm.index;
 
+import java.util.List;
+
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceEvent;
 import org.osgi.framework.ServiceListener;
-import org.osgi.framework.ServiceReference;
 
 /**
  * A filter index is an interface you can implement to create your own, optimized index for specific filter expressions.
@@ -34,7 +35,7 @@
     /** Determines if the combination of class and filter is applicable for this filter index. */
     public boolean isApplicable(String clazz, String filter);
     /** Returns all service references that match the specified class and filter. */
-    public ServiceReference[] getAllServiceReferences(String clazz, String filter);
+    public List /* <ServiceReference> */ getAllServiceReferences(String clazz, String filter);
     /** Invoked whenever a service event occurs. */
     public void serviceChanged(ServiceEvent event);
     /** Adds a service listener to this filter index. */
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 e7e0185..5e10b77 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
@@ -81,7 +81,7 @@
         tracker.close();
     }
 
-    public ServiceReference[] getAllServiceReferences(String clazz, String filter) {
+    public List /* <ServiceReference> */ getAllServiceReferences(String clazz, String filter) {
         List /* <ServiceReference> */ result = new ArrayList();
         List keys = createKeysFromFilter(clazz, filter);
         Iterator iterator = keys.iterator();
@@ -95,12 +95,7 @@
                 }
             }
         }
-        if (result.size() == 0) {
-            return null;
-        }
-        else {
-            return (ServiceReference[]) result.toArray(new ServiceReference[result.size()]);
-        }
+        return result;
     }
 
     public Object addingService(ServiceReference reference) {
@@ -118,13 +113,13 @@
 
     public void addedService(ServiceReference reference, Object service) {
         if (isApplicable(reference.getPropertyKeys())) {
-            update(reference);
+            add(reference);
         }
     }
 
     public void modifiedService(ServiceReference reference, Object service) {
         if (isApplicable(reference.getPropertyKeys())) {
-            update(reference);
+            modify(reference);
         }
     }
 
@@ -133,11 +128,41 @@
             remove(reference);
         }
     }
-    
-    public void update(ServiceReference reference) {
+
+    public void add(ServiceReference reference) {
         List /* <String> */ keys = createKeys(reference);
         synchronized (m_keyToServiceReferencesMap) {
-            // TODO any 'old' references that are still in the index need to be removed in case of an update
+            for (int i = 0; i < keys.size(); i++) {
+                List /* <ServiceReference> */ references = (List) m_keyToServiceReferencesMap.get(keys.get(i));
+                if (references == null) {
+                    references = new ArrayList();
+                    m_keyToServiceReferencesMap.put(keys.get(i), references);
+                }
+                references.add(reference);
+            }
+        }
+    }
+
+    public void modify(ServiceReference reference) {
+        List /* <String> */ keys = createKeys(reference);
+        synchronized (m_keyToServiceReferencesMap) {
+            // TODO this is a quite expensive linear scan over the existing collection
+            // because we first need to remove any existing references and they can be
+            // all over the place :)
+            Iterator iterator = m_keyToServiceReferencesMap.values().iterator();
+            while (iterator.hasNext()) {
+                List /* <ServiceReference> */ list = (List) iterator.next();
+                if (list != null) {
+                    Iterator i2 = list.iterator();
+                    while (i2.hasNext()) {
+                        ServiceReference ref = (ServiceReference) i2.next();
+                        if (ref.equals(reference)) {
+                            i2.remove();
+                        }
+                    }
+                }
+            }
+            
             for (int i = 0; i < keys.size(); i++) {
                 List /* <ServiceReference> */ references = (List) m_keyToServiceReferencesMap.get(keys.get(i));
                 if (references == null) {
@@ -282,7 +307,6 @@
     }
     
     private List /* <String> */ createKeysFromFilter(String clazz, String filter) {
-        // TODO array support
         List result = new ArrayList();
         StringBuffer index = new StringBuffer();
         Iterator iterator = m_propertyKeys.iterator();
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 2b4b4b2..7f4f871 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,7 +29,6 @@
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceEvent;
 import org.osgi.framework.ServiceListener;
-import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 
 public class ServiceRegistryCache implements ServiceListener, CommandProvider {
@@ -136,15 +135,10 @@
                 a2 = ci.nextArgument();
             }
             if (filterIndex.isApplicable(a1, a2)) {
-                ServiceReference[] references = filterIndex.getAllServiceReferences(a1, a2);
-                if (references == null) {
-                    ci.println("No results.");
-                }
-                else {
-                    ci.println("Found " + references.length + " references:");
-                    for (int i = 0; i < references.length; i++) {
-                        ci.println("" + i + " - " + references[i]);
-                    }
+                List /* <ServiceReference> */ references = filterIndex.getAllServiceReferences(a1, a2);
+                ci.println("Found " + references.size() + " references:");
+                for (int i = 0; i < references.size(); i++) {
+                    ci.println("" + i + " - " + references.get(i));
                 }
             }
             else {
