diff --git a/framework/src/main/java/org/apache/felix/framework/Felix.java b/framework/src/main/java/org/apache/felix/framework/Felix.java
index 61a698e..3682a3b 100644
--- a/framework/src/main/java/org/apache/felix/framework/Felix.java
+++ b/framework/src/main/java/org/apache/felix/framework/Felix.java
@@ -617,9 +617,9 @@
 
             // Create service registry.
             m_registry = new ServiceRegistry(m_logger, new ServiceRegistryCallbacks() {
-                public void serviceChanged(ServiceEvent event, ServiceRegistration reg)
+                public void serviceChanged(ServiceEvent event, Dictionary oldProps)
                 {
-                    fireServiceEvent(event, reg);
+                    fireServiceEvent(event, oldProps);
                 }
             });
             m_dispatcher.setServiceRegistry(m_registry);
@@ -2639,16 +2639,16 @@
             new ListenerHookInfoImpl(bundle.getBundleContext(), f));
         for (int i = 0; i < listenerHooks.size(); i++)
         {
-            ServiceRegistry.invokeHook(listenerHooks.get(i), this, new InvokeHookCallback() 
+            ServiceRegistry.invokeHook(listenerHooks.get(i), this, new InvokeHookCallback()
             {
-                public void invokeHook(Object hook) 
+                public void invokeHook(Object hook)
                 {
                     ((ListenerHook) hook).added(c);
-                }                
+                }
             });
         }
     }
-        
+
     /**
      * Implementation for BundleContext.removeServiceListener().
      * Removes service listeners from the listener list.
@@ -2764,13 +2764,13 @@
         if (m_registry.isHook(classNames, ListenerHook.class, svcObj))
         {
             Object hookRef = ServiceRegistry.getHookRef(svcObj, reg);
-            ServiceRegistry.invokeHook(hookRef, this, new InvokeHookCallback() 
+            ServiceRegistry.invokeHook(hookRef, this, new InvokeHookCallback()
             {
-                public void invokeHook(Object hook) 
+                public void invokeHook(Object hook)
                 {
                     ((ListenerHook) hook).
-                        added(m_dispatcher.wrapAllServiceListeners());                    
-                }                
+                        added(m_dispatcher.wrapAllServiceListeners());
+                }
             });
         }
 
@@ -2830,23 +2830,23 @@
         List findHooks = m_registry.getFindHooks();
         for (int i = 0; i < findHooks.size(); i++)
         {
-            ServiceRegistry.invokeHook(findHooks.get(i), this, new InvokeHookCallback() 
+            ServiceRegistry.invokeHook(findHooks.get(i), this, new InvokeHookCallback()
             {
-                public void invokeHook(Object hook) 
+                public void invokeHook(Object hook)
                 {
                     ((FindHook) hook).find(bundle.getBundleContext(),
                         className,
                         expr,
                         !checkAssignable,
                         new ShrinkableCollection(refList));
-                }                
+                }
             });
         }
 
         if (refList.size() > 0)
         {
             return (ServiceReference[]) refList.toArray(new ServiceReference[refList.size()]);
-        } 
+        }
 
         return null;
     }
@@ -3627,9 +3627,9 @@
      * @param event The service event to fire.
      * @param reg The service registration associated with the service object.
     **/
-    private void fireServiceEvent(ServiceEvent event, ServiceRegistration reg)
+    private void fireServiceEvent(ServiceEvent event, Dictionary oldProps)
     {
-        m_dispatcher.fireServiceEvent(event, reg, this);
+        m_dispatcher.fireServiceEvent(event, oldProps, this);
     }
 
     //
diff --git a/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java b/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
index 8673eb6..8e2b055 100644
--- a/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
@@ -23,6 +23,7 @@
 import java.security.PrivilegedExceptionAction;
 import java.util.*;
 
+import org.apache.felix.framework.util.MapToDictionary;
 import org.apache.felix.framework.util.StringMap;
 import org.apache.felix.framework.util.Util;
 import org.apache.felix.moduleloader.IModule;
@@ -96,7 +97,7 @@
 
     public void setProperties(Dictionary dict)
     {
-        Map oldProps, newProps;
+        Map oldProps;
         synchronized (this)
         {
             // Make sure registration is valid.
@@ -109,11 +110,9 @@
             oldProps = m_propMap;
             // Set the properties.
             initializeProperties(dict);
-            // Keep local reference to new properties.
-            newProps = m_propMap;
         }
         // Tell registry about it.
-        m_registry.servicePropertiesModified(this, oldProps, newProps);
+        m_registry.servicePropertiesModified(this, new MapToDictionary(oldProps));
     }
 
     public void unregister()
diff --git a/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java b/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java
index 09d29a6..ebd42f6 100644
--- a/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java
+++ b/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java
@@ -78,7 +78,7 @@
             // Create the service registration.
             reg = new ServiceRegistrationImpl(
                 this, bundle, classNames, new Long(m_currentServiceId++), svcObj, dict);
-                        
+
             // Keep track of registered hooks.
             addHooks(classNames, svcObj, reg);
 
@@ -91,7 +91,7 @@
         if (m_callbacks != null)
         {
             m_callbacks.serviceChanged(
-                new ServiceEvent(ServiceEvent.REGISTERED, reg.getReference()), reg);
+                new ServiceEvent(ServiceEvent.REGISTERED, reg.getReference()), null);
         }
         return reg;
     }
@@ -118,7 +118,7 @@
         if (m_callbacks != null)
         {
             m_callbacks.serviceChanged(
-                new ServiceEvent(ServiceEvent.UNREGISTERING, reg.getReference()), reg);
+                new ServiceEvent(ServiceEvent.UNREGISTERING, reg.getReference()), null);
         }
 
         // Now forcibly unget the service object for all stubborn clients.
@@ -508,12 +508,12 @@
         return bundles;
     }
 
-    void servicePropertiesModified(ServiceRegistration reg, Map oldProps, Map newProps)
+    void servicePropertiesModified(ServiceRegistration reg, Dictionary oldProps)
     {
         if (m_callbacks != null)
         {
             m_callbacks.serviceChanged(
-                new ServiceEvent(ServiceEvent.MODIFIED, reg.getReference()), reg);
+                new ServiceEvent(ServiceEvent.MODIFIED, reg.getReference()), oldProps);
         }
     }
 
@@ -701,7 +701,7 @@
     private static Object[] addHookToArray(Object[] src, Object svcObj, ServiceRegistration reg)
     {
         Object hookRef = getHookRef(svcObj, reg);
-        
+
         Object[] dst = new Object[src.length + 1];
         System.arraycopy(src, 0, dst, 0, src.length);
         dst[src.length] = hookRef;
@@ -710,11 +710,11 @@
 
     boolean isHook(String[] classNames, Class hookClass, Object svcObj)
     {
-        if (svcObj instanceof ServiceFactory) 
+        if (svcObj instanceof ServiceFactory)
         {
             return Arrays.asList(classNames).contains(hookClass.getName());
         }
-        
+
         if (hookClass.isAssignableFrom(svcObj.getClass()))
         {
             String hookName = hookClass.getName();
@@ -729,20 +729,20 @@
         return false;
     }
 
-    private void removeHook(ServiceRegistration reg) 
+    private void removeHook(ServiceRegistration reg)
     {
         Object svcObj = ((ServiceRegistrationImpl) reg).getService();
         String [] classNames = (String[]) reg.getReference().getProperty(Constants.OBJECTCLASS);
-        
-        if (isHook(classNames, EventHook.class, svcObj)) 
+
+        if (isHook(classNames, EventHook.class, svcObj))
         {
-            synchronized (m_eventHookLock) 
+            synchronized (m_eventHookLock)
             {
                 m_eventHooks = removeFromHookArray(m_eventHooks, svcObj, reg);
             }
         }
-        
-        if (isHook(classNames, FindHook.class, svcObj)) 
+
+        if (isHook(classNames, FindHook.class, svcObj))
         {
             synchronized (m_findHookLock)
             {
@@ -769,10 +769,10 @@
             boolean found = false;
             if (svcObj instanceof ServiceFactory)
             {
-                if (src[i] instanceof Object[]) 
+                if (src[i] instanceof Object[])
                 {
                     Object [] arrElem = (Object []) src[i];
-                    if (arrElem[0].equals(svcObj) && arrElem[1].equals(reg)) 
+                    if (arrElem[0].equals(svcObj) && arrElem[1].equals(reg))
                     {
                         found = true;
                     }
@@ -783,10 +783,10 @@
                 if (src[i].equals(svcObj))
                 {
                     found = true;
-                }                
+                }
             }
-            
-            if (found) 
+
+            if (found)
             {
                 idx = i;
                 break;
@@ -839,7 +839,7 @@
     }
 
     /**
-     * Returns a hook reference object that can be passed to the 
+     * Returns a hook reference object that can be passed to the
      * {@link #invokeHook(Object, Framework, InvokeHookCallback)} method.
      * @param svcObj The Service Object. Either the service itself, or a <tt>ServiceFactory</tt>
      *        object.
@@ -849,9 +849,9 @@
      *         cases the svcObj is returned as passed in. This is the behavior expected
      *         by the {@link #invokeHook(Object, Framework, InvokeHookCallback)} method.
      */
-    static Object getHookRef(Object svcObj, ServiceRegistration reg) 
+    static Object getHookRef(Object svcObj, ServiceRegistration reg)
     {
-        if (svcObj instanceof ServiceFactory) 
+        if (svcObj instanceof ServiceFactory)
         {
             return new Object[] {svcObj, reg};
         }
@@ -860,16 +860,16 @@
             return svcObj;
         }
     }
-    
+
     /**
      * Invokes a Service Registry Hook
-     * @param hookRef The hook to be invoked, this is an element on the list returned by the 
+     * @param hookRef The hook to be invoked, this is an element on the list returned by the
      *        {@link #getEventHooks()}, {@link #getFindHooks()} or {@link #getListenerHooks()}
      *        methods. It could either contain the hook object itself or an Object[2] when a
      *        ServiceFactory is used. In that case the first element is the hook ServiceFactory
      *        and the second element is its ServiceRegistration.
      * @param framework The framework that is invoking the hook, typically the Felix object.
-     * @param callback This is a callback object that is invoked with the actual hook object to 
+     * @param callback This is a callback object that is invoked with the actual hook object to
      *        be used, either the plain hook, or one obtained from the ServiceFactory.
      */
     public static void invokeHook(
@@ -877,37 +877,37 @@
     {
         Object hook;
         boolean serviceFactory;
-        if (hookRef instanceof Object[]) 
+        if (hookRef instanceof Object[])
         {
             serviceFactory = true;
-            Object[] array = (Object[]) hookRef; 
+            Object[] array = (Object[]) hookRef;
             ServiceFactory hookFactory = (ServiceFactory) array[0];
             ServiceRegistration sr = (ServiceRegistration) array[1];
             hook = hookFactory.getService(framework, sr);
         }
         else
         {
-            serviceFactory = false; 
+            serviceFactory = false;
             hook = hookRef;
         }
-        
-        try 
+
+        try
         {
             callback.invokeHook(hook);
             // TODO: SERVICE HOOKS - Check that "services in use" is handled
         }
         finally
         {
-            if (serviceFactory) 
+            if (serviceFactory)
             {
-                Object [] array = (Object []) hookRef; 
+                Object [] array = (Object []) hookRef;
                 ServiceFactory hookFactory = (ServiceFactory) array[0];
                 ServiceRegistration sr = (ServiceRegistration) array[1];
                 hookFactory.ungetService(framework, sr, hook);
             }
-        }        
-    }    
-    
+        }
+    }
+
     private static class UsageCount
     {
         public int m_count = 0;
@@ -917,6 +917,6 @@
 
     public interface ServiceRegistryCallbacks
     {
-        void serviceChanged(ServiceEvent event, ServiceRegistration reg);
+        void serviceChanged(ServiceEvent event, Dictionary oldProps);
     }
 }
\ No newline at end of file
diff --git a/framework/src/main/java/org/apache/felix/framework/util/EventDispatcher.java b/framework/src/main/java/org/apache/felix/framework/util/EventDispatcher.java
index 9b6b444..a74f0b9 100644
--- a/framework/src/main/java/org/apache/felix/framework/util/EventDispatcher.java
+++ b/framework/src/main/java/org/apache/felix/framework/util/EventDispatcher.java
@@ -22,13 +22,13 @@
 import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Dictionary;
 import java.util.EventListener;
 import java.util.EventObject;
 import java.util.Iterator;
 import java.util.List;
 import java.util.NoSuchElementException;
 
-import java.util.Set;
 import org.apache.felix.framework.InvokeHookCallback;
 import org.apache.felix.framework.Logger;
 import org.apache.felix.framework.ServiceRegistry;
@@ -45,7 +45,6 @@
 import org.osgi.framework.ServiceListener;
 import org.osgi.framework.ServicePermission;
 import org.osgi.framework.ServiceReference;
-import org.osgi.framework.ServiceRegistration;
 import org.osgi.framework.SynchronousBundleListener;
 import org.osgi.framework.hooks.service.EventHook;
 import org.osgi.framework.hooks.service.ListenerHook;
@@ -57,9 +56,8 @@
     static final int LISTENER_CLASS_OFFSET = 1;
     static final int LISTENER_OBJECT_OFFSET = 2;
     static final int LISTENER_FILTER_OFFSET = 3;
-    static final int LISTENER_MATECHEDSET_OFFSET = 4;
-    static final int LISTENER_SECURITY_OFFSET = 5;
-    static final int LISTENER_ARRAY_INCREMENT = 6;
+    static final int LISTENER_SECURITY_OFFSET = 4;
+    static final int LISTENER_ARRAY_INCREMENT = 5;
 
     private Logger m_logger = null;
     private volatile ServiceRegistry m_serviceRegistry = null;
@@ -201,7 +199,6 @@
         synchronized (this)
         {
             Object[] listeners = null;
-            Set set = null;
             Object acc = null;
 
             if (clazz == FrameworkListener.class)
@@ -231,7 +228,6 @@
                 // registrations so we can fire ServiceEvent.MODIFIED_ENDMATCH
                 // events. We need a Set even if filter is null, since the
                 // listener can be updated and have a filter added later.
-                set = new SmallSet();
                 listeners = m_serviceListeners;
             }
             else
@@ -247,7 +243,6 @@
                 listeners[LISTENER_CLASS_OFFSET] = clazz;
                 listeners[LISTENER_OBJECT_OFFSET] = l;
                 listeners[LISTENER_FILTER_OFFSET] = filter;
-                listeners[LISTENER_MATECHEDSET_OFFSET] = set;
                 listeners[LISTENER_SECURITY_OFFSET] = acc;
             }
             // Otherwise, we need to do some array copying.
@@ -263,7 +258,6 @@
                 newList[listeners.length + LISTENER_CLASS_OFFSET] = clazz;
                 newList[listeners.length + LISTENER_OBJECT_OFFSET] = l;
                 newList[listeners.length + LISTENER_FILTER_OFFSET] = filter;
-                newList[listeners.length + LISTENER_MATECHEDSET_OFFSET] = set;
                 newList[listeners.length + LISTENER_SECURITY_OFFSET] = acc;
                 listeners = newList;
             }
@@ -533,7 +527,6 @@
                     {
                         // The spec says to update the filter in this case.
                         listeners[i + LISTENER_FILTER_OFFSET] = filter;
-                        ((Set) listeners[i + LISTENER_MATECHEDSET_OFFSET]).clear();
                     }
                     return true;
                 }
@@ -607,7 +600,8 @@
         }
 
         // Fire synchronous bundle listeners immediately on the calling thread.
-        fireEventImmediately(m_logger, Request.BUNDLE_EVENT, syncListeners, event, null);
+        fireEventImmediately(
+            m_logger, Request.BUNDLE_EVENT, syncListeners, event, null);
 
         // The spec says that asynchronous bundle listeners do not get events
         // of types STARTING, STOPPING, or LAZY_ACTIVATION.
@@ -621,7 +615,7 @@
     }
 
     public void fireServiceEvent(
-        final ServiceEvent event, final ServiceRegistration reg, final Framework felix)
+        final ServiceEvent event, final Dictionary oldProps, final Framework felix)
     {
         // Take a snapshot of the listener array.
         Object[] listeners = null;
@@ -639,14 +633,14 @@
                     new ListenerBundleContextCollectionWrapper(listeners);
                 for (int i = 0; i < eventHooks.size(); i++)
                 {
-                    if (felix != null) 
+                    if (felix != null)
                     {
-                        ServiceRegistry.invokeHook(eventHooks.get(i), felix, new InvokeHookCallback() 
+                        ServiceRegistry.invokeHook(eventHooks.get(i), felix, new InvokeHookCallback()
                         {
-                            public void invokeHook(Object hook) 
+                            public void invokeHook(Object hook)
                             {
-                                ((EventHook) hook).event(event, wrapper);                            
-                            }                        
+                                ((EventHook) hook).event(event, wrapper);
+                            }
                         });
                     }
                 }
@@ -656,7 +650,8 @@
         }
 
         // Fire all service events immediately on the calling thread.
-        fireEventImmediately(m_logger, Request.SERVICE_EVENT, listeners, event, reg);
+        fireEventImmediately(
+            m_logger, Request.SERVICE_EVENT, listeners, event, oldProps);
     }
 
     private void fireEventAsynchronously(
@@ -700,8 +695,7 @@
     }
 
     private static void fireEventImmediately(
-        Logger logger, int type, Object[] listeners, EventObject event,
-        ServiceRegistration reg)
+        Logger logger, int type, Object[] listeners, EventObject event, Dictionary oldProps)
     {
         if (listeners.length > 0)
         {
@@ -713,7 +707,6 @@
                 Bundle bundle = (Bundle) listeners[i + LISTENER_BUNDLE_OFFSET];
                 EventListener l = (EventListener) listeners[i + LISTENER_OBJECT_OFFSET];
                 Filter filter = (Filter) listeners[i + LISTENER_FILTER_OFFSET];
-                Set matchedSet = (Set) listeners[i + LISTENER_MATECHEDSET_OFFSET];
                 Object acc = listeners[i + LISTENER_SECURITY_OFFSET];
                 try
                 {
@@ -728,7 +721,7 @@
                     else if (type == Request.SERVICE_EVENT)
                     {
                         invokeServiceListenerCallback(
-                            bundle, l, filter, matchedSet, acc, event, reg);
+                            bundle, l, filter, acc, event, oldProps);
                     }
                 }
                 catch (Throwable th)
@@ -801,9 +794,8 @@
     }
 
     private static void invokeServiceListenerCallback(
-        Bundle bundle, final EventListener l, Filter filter,
-        Set matchedSet, Object acc, final EventObject event,
-        final ServiceRegistration reg)
+        Bundle bundle, final EventListener l, Filter filter, Object acc,
+        final EventObject event, final Dictionary oldProps)
     {
         // Service events should be delivered to STARTING,
         // STOPPING, and ACTIVE bundles.
@@ -862,16 +854,6 @@
                     if ((l instanceof AllServiceListener) ||
                         Util.isServiceAssignable(bundle, ((ServiceEvent) event).getServiceReference()))
                     {
-                        // If we have a filter, then record the matching service
-                        // registration so we can know when to fire a MODIFIED_ENDMATCH
-                        // event if the filter no longer matches.
-                        if (filter != null)
-                        {
-                            synchronized (matchedSet)
-                            {
-                                matchedSet.add(reg);
-                            }
-                        }
                         if (System.getSecurityManager() != null)
                         {
                             AccessController.doPrivileged(new PrivilegedAction() {
@@ -892,12 +874,7 @@
                 // matched previously.
                 else if (((ServiceEvent) event).getType() == ServiceEvent.MODIFIED)
                 {
-                    boolean removed = false;
-                    synchronized (matchedSet)
-                    {
-                        removed = matchedSet.remove(reg);
-                    }
-                    if (removed)
+                    if (filter.match(oldProps))
                     {
                         final ServiceEvent se = new ServiceEvent(
                             ServiceEvent.MODIFIED_ENDMATCH,
diff --git a/framework/src/main/java/org/apache/felix/framework/util/SmallSet.java b/framework/src/main/java/org/apache/felix/framework/util/SmallSet.java
deleted file mode 100644
index 567a0c5..0000000
--- a/framework/src/main/java/org/apache/felix/framework/util/SmallSet.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * 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.framework.util;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-public class SmallSet implements Set
-{
-    private Object[] m_objs;
-    private Set m_set;
-
-    public synchronized int size()
-    {
-        if (m_objs != null)
-        {
-            return m_objs.length;
-        }
-        else if (m_set != null)
-        {
-            return m_set.size();
-        }
-        return 0;
-    }
-
-    public synchronized boolean isEmpty()
-    {
-        return (size() == 0);
-    }
-
-    public synchronized boolean contains(Object obj)
-    {
-        boolean found = false;
-        if (obj != null)
-        {
-            if (m_objs != null)
-            {
-                for (int i = 0; !found && (i < m_objs.length); i++)
-                {
-                    found = m_objs[i].equals(obj);
-                }
-            }
-            else
-            {
-                found = (m_set == null) ? false : m_set.contains(obj);
-            }
-        }
-        return found;
-    }
-
-    public synchronized Iterator iterator()
-    {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    public synchronized Object[] toArray()
-    {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    public synchronized Object[] toArray(Object[] arg0)
-    {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    public synchronized boolean add(Object obj)
-    {
-        boolean found = contains(obj);
-        if (!found)
-        {
-            if (size() < 10)
-            {
-                if (m_objs == null)
-                {
-                    m_objs = new Object[] { obj };
-                }
-                else
-                {
-                    Object[] tobjs = new Object[m_objs.length + 1];
-                    System.arraycopy(m_objs, 0, tobjs, 0, m_objs.length);
-                    tobjs[m_objs.length] = obj;
-                    m_objs = tobjs;
-                }
-            }
-            else
-            {
-                if (m_set == null)
-                {
-                    m_set = new HashSet();
-                    for (int i = 0; i < m_objs.length; i++)
-                    {
-                        m_set.add(m_objs[i]);
-                    }
-                    m_objs = null;
-                }
-                m_set.add(obj);
-            }
-        }
-        return !found;
-    }
-
-    public synchronized boolean remove(Object obj)
-    {
-        boolean found = contains(obj);
-        if (found)
-        {
-            if (size() < 10)
-            {
-                if (m_objs.length == 1)
-                {
-                    m_objs = null;
-                }
-                else
-                {
-                    int idx = -1;
-                    for (int i = 0; (idx < 0) && (i < m_objs.length); i++)
-                    {
-                        if (m_objs[i].equals(obj))
-                        {
-                            idx = i;
-                        }
-                    }
-
-                    if (idx >= 0)
-                    {
-                        Object[] tobjs = new Object[m_objs.length - 1];
-                        System.arraycopy(m_objs, 0, tobjs, 0, idx);
-                        if (idx < tobjs.length)
-                        {
-                            System.arraycopy(
-                                m_objs, idx + 1, tobjs, idx, tobjs.length - idx);
-                        }
-                        m_objs = tobjs;
-                    }
-                }
-            }
-            else
-            {
-                m_set.remove(obj);
-                if (m_set.size() < 10)
-                {
-                    m_objs = new Object[m_set.size()];
-                    int i = 0;
-                    for (Iterator it = m_set.iterator(); it.hasNext(); )
-                    {
-                        m_objs[i++] = it.next();
-                    }
-                    m_set = null;
-                }
-            }
-        }
-        return found;
-    }
-
-    public synchronized boolean containsAll(Collection arg0)
-    {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    public synchronized boolean addAll(Collection arg0)
-    {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    public synchronized boolean retainAll(Collection arg0)
-    {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    public synchronized boolean removeAll(Collection arg0)
-    {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    public synchronized void clear()
-    {
-        m_objs = null;
-        m_set = null;
-    }
-}
\ No newline at end of file
diff --git a/framework/src/test/java/org/apache/felix/framework/util/EventDispatcherListenerWrapperTest.java b/framework/src/test/java/org/apache/felix/framework/util/EventDispatcherListenerWrapperTest.java
index 90d1f20..ce0b3e7 100644
--- a/framework/src/test/java/org/apache/felix/framework/util/EventDispatcherListenerWrapperTest.java
+++ b/framework/src/test/java/org/apache/felix/framework/util/EventDispatcherListenerWrapperTest.java
@@ -49,19 +49,16 @@
             String.class,          // LISTENER_CLASS_OFFSET
             new Object(),          // LISTENER_OBJECT_OFFSET
             "(some=filter)",       // LISTENER_FILTER_OFFSET
-            null,                  // LISTENER_MATECHEDSET_OFFSET
             null,                  // LISTENER_SECURITY_OFFSET
             b2,                    // LISTENER_BUNDLE_OFFSET
             Integer.class,         // LISTENER_CLASS_OFFSET
             new Object(),          // LISTENER_OBJECT_OFFSET
             "(some.other=filter)", // LISTENER_FILTER_OFFSET
-            null,                  // LISTENER_MATECHEDSET_OFFSET
             new Integer(15),       // LISTENER_SECURITY_OFFSET
             b3,                    // LISTENER_BUNDLE_OFFSET
             BundleContext.class,   // LISTENER_CLASS_OFFSET
             new Object(),          // LISTENER_OBJECT_OFFSET
             null,                  // LISTENER_FILTER_OFFSET
-            null,                  // LISTENER_MATECHEDSET_OFFSET
             Boolean.TRUE,          // LISTENER_SECURITY_OFFSET
         };
 
@@ -138,13 +135,11 @@
             String.class,          // LISTENER_CLASS_OFFSET
             new Object(),          // LISTENER_OBJECT_OFFSET
             "(some=filter)",       // LISTENER_FILTER_OFFSET
-            null,                  // LISTENER_MATECHEDSET_OFFSET
             null,                  // LISTENER_SECURITY_OFFSET
             b2,                    // LISTENER_BUNDLE_OFFSET
             Integer.class,         // LISTENER_CLASS_OFFSET
             new Object(),          // LISTENER_OBJECT_OFFSET
             "(some.other=filter)", // LISTENER_FILTER_OFFSET
-            null,                  // LISTENER_MATECHEDSET_OFFSET
             new Integer(15)        // LISTENER_SECURITY_OFFSET
         };
 
@@ -279,19 +274,16 @@
             String.class,          // LISTENER_CLASS_OFFSET
             new Object(),          // LISTENER_OBJECT_OFFSET
             "(some=filter)",       // LISTENER_FILTER_OFFSET
-            null,                  // LISTENER_MATECHEDSET_OFFSET
             null,                  // LISTENER_SECURITY_OFFSET
             b2,                    // LISTENER_BUNDLE_OFFSET
             Integer.class,         // LISTENER_CLASS_OFFSET
             new Object(),          // LISTENER_OBJECT_OFFSET
             "(some.other=filter)", // LISTENER_FILTER_OFFSET
-            null,                  // LISTENER_MATECHEDSET_OFFSET
             new Integer(15),       // LISTENER_SECURITY_OFFSET
             b3,                    // LISTENER_BUNDLE_OFFSET
             BundleContext.class,   // LISTENER_CLASS_OFFSET
             new Object(),          // LISTENER_OBJECT_OFFSET
             null,                  // LISTENER_FILTER_OFFSET
-            null,                  // LISTENER_MATECHEDSET_OFFSET
             Boolean.TRUE,          // LISTENER_SECURITY_OFFSET
         };
 
@@ -332,19 +324,16 @@
             String.class,          // LISTENER_CLASS_OFFSET
             new Object(),          // LISTENER_OBJECT_OFFSET
             "(some=filter)",       // LISTENER_FILTER_OFFSET
-            null,                  // LISTENER_MATECHEDSET_OFFSET
             null,                  // LISTENER_SECURITY_OFFSET
             b2,                    // LISTENER_BUNDLE_OFFSET
             Integer.class,         // LISTENER_CLASS_OFFSET
             new Object(),          // LISTENER_OBJECT_OFFSET
             "(some.other=filter)", // LISTENER_FILTER_OFFSET
-            null,                  // LISTENER_MATECHEDSET_OFFSET
             new Integer(15),       // LISTENER_SECURITY_OFFSET
             b3,                    // LISTENER_BUNDLE_OFFSET
             BundleContext.class,   // LISTENER_CLASS_OFFSET
             new Object(),          // LISTENER_OBJECT_OFFSET
             null,                  // LISTENER_FILTER_OFFSET
-            null,                  // LISTENER_MATECHEDSET_OFFSET
             Boolean.TRUE,          // LISTENER_SECURITY_OFFSET
         };
 
@@ -381,19 +370,16 @@
             String.class,          // LISTENER_CLASS_OFFSET
             new Object(),          // LISTENER_OBJECT_OFFSET
             "(some=filter)",       // LISTENER_FILTER_OFFSET
-            null,                  // LISTENER_MATECHEDSET_OFFSET
             null,                  // LISTENER_SECURITY_OFFSET
             b2,                    // LISTENER_BUNDLE_OFFSET
             Integer.class,         // LISTENER_CLASS_OFFSET
             new Object(),          // LISTENER_OBJECT_OFFSET
             "(some.other=filter)", // LISTENER_FILTER_OFFSET
-            null,                  // LISTENER_MATECHEDSET_OFFSET
             new Integer(15),       // LISTENER_SECURITY_OFFSET
             b3,                    // LISTENER_BUNDLE_OFFSET
             BundleContext.class,   // LISTENER_CLASS_OFFSET
             new Object(),          // LISTENER_OBJECT_OFFSET
             null,                  // LISTENER_FILTER_OFFSET
-            null,                  // LISTENER_MATECHEDSET_OFFSET
             Boolean.TRUE,          // LISTENER_SECURITY_OFFSET
         };
 
@@ -433,13 +419,11 @@
             String.class,          // LISTENER_CLASS_OFFSET
             new Object(),          // LISTENER_OBJECT_OFFSET
             "(some=filter)",       // LISTENER_FILTER_OFFSET
-            null,                  // LISTENER_MATECHEDSET_OFFSET
             null,                  // LISTENER_SECURITY_OFFSET
             b2,                    // LISTENER_BUNDLE_OFFSET
             Integer.class,         // LISTENER_CLASS_OFFSET
             new Object(),          // LISTENER_OBJECT_OFFSET
             "(some.other=filter)", // LISTENER_FILTER_OFFSET
-            null,                  // LISTENER_MATECHEDSET_OFFSET
             new Integer(15),       // LISTENER_SECURITY_OFFSET
         };
 
@@ -484,4 +468,4 @@
 
         return b;
     }
-}
+}
\ No newline at end of file
diff --git a/framework/src/test/java/org/apache/felix/framework/util/EventDispatcherTest.java b/framework/src/test/java/org/apache/felix/framework/util/EventDispatcherTest.java
index 62a1791..b66cff9 100644
--- a/framework/src/test/java/org/apache/felix/framework/util/EventDispatcherTest.java
+++ b/framework/src/test/java/org/apache/felix/framework/util/EventDispatcherTest.java
@@ -181,4 +181,4 @@
 
         return b;
     }
-}
+}
\ No newline at end of file
