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 c675ff7..fe4bda6 100644
--- a/framework/src/main/java/org/apache/felix/framework/Felix.java
+++ b/framework/src/main/java/org/apache/felix/framework/Felix.java
@@ -3112,7 +3112,7 @@
         if (existing != null)
         {
             Set<ServiceReference<org.osgi.framework.hooks.bundle.FindHook>> hooks =
-                    getHookRegistry().getBundleFindHooks();
+                    getHookRegistry().getHooks(org.osgi.framework.hooks.bundle.FindHook.class);
             if (!hooks.isEmpty())
             {
                 Collection<Bundle> bundles = new ArrayList<Bundle>(1);
@@ -3206,7 +3206,7 @@
         }
 
         Set<ServiceReference<org.osgi.framework.hooks.bundle.FindHook>> hooks =
-                getHookRegistry().getBundleFindHooks();
+                getHookRegistry().getHooks(org.osgi.framework.hooks.bundle.FindHook.class);
         if (!hooks.isEmpty() && (bundle != null))
         {
             Collection<Bundle> bundles = new ArrayList<Bundle>(1);
@@ -3285,7 +3285,7 @@
         if ( !bundles.isEmpty() && bc.getBundle() != this )
         {
             Set<ServiceReference<org.osgi.framework.hooks.bundle.FindHook>> hooks =
-                    getHookRegistry().getBundleFindHooks();
+                    getHookRegistry().getHooks(org.osgi.framework.hooks.bundle.FindHook.class);
             if (!hooks.isEmpty())
             {
                 Collection<Bundle> shrunkBundles = new ShrinkableCollection<Bundle>(new ArrayList<Bundle>(bundles));
@@ -3359,7 +3359,7 @@
 
         // Invoke ListenerHook.removed() if filter updated.
         Set<ServiceReference<org.osgi.framework.hooks.service.ListenerHook>> listenerHooks =
-                getHookRegistry().getServiceListenerHooks();
+                getHookRegistry().getHooks(org.osgi.framework.hooks.service.ListenerHook.class);
         if (oldFilter != null)
         {
             final Collection removed = Collections.singleton(
@@ -3430,7 +3430,7 @@
         {
             // Invoke the ListenerHook.removed() on all hooks.
             Set<ServiceReference<org.osgi.framework.hooks.service.ListenerHook>> listenerHooks =
-                    getHookRegistry().getServiceListenerHooks();
+                    getHookRegistry().getHooks(org.osgi.framework.hooks.service.ListenerHook.class);
             Collection removed = Collections.singleton(listener);
             for (ServiceReference<org.osgi.framework.hooks.service.ListenerHook> sr : listenerHooks)
             {
@@ -3601,7 +3601,7 @@
 
         // activate findhooks
         Set<ServiceReference<org.osgi.framework.hooks.service.FindHook>> findHooks =
-                getHookRegistry().getServiceFindHooks();
+                getHookRegistry().getHooks(org.osgi.framework.hooks.service.FindHook.class);
         for (ServiceReference<org.osgi.framework.hooks.service.FindHook> sr : findHooks)
         {
             org.osgi.framework.hooks.service.FindHook fh = getService(this, sr, false);
diff --git a/framework/src/main/java/org/apache/felix/framework/HookRegistry.java b/framework/src/main/java/org/apache/felix/framework/HookRegistry.java
index 3f06052..55084cd 100644
--- a/framework/src/main/java/org/apache/felix/framework/HookRegistry.java
+++ b/framework/src/main/java/org/apache/felix/framework/HookRegistry.java
@@ -25,6 +25,7 @@
 import java.util.SortedSet;
 import java.util.TreeSet;
 import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceFactory;
@@ -59,7 +60,7 @@
     }
 
     private final Map<String, SortedSet<ServiceReference<?>>> m_allHooks =
-        new HashMap<String, SortedSet<ServiceReference<?>>>();
+        new ConcurrentHashMap<String, SortedSet<ServiceReference<?>>>();
 
     private final WeakHashMap<ServiceReference<?>, ServiceReference<?>> m_blackList =
             new WeakHashMap<ServiceReference<?>, ServiceReference<?>>();
@@ -119,7 +120,7 @@
         {
             if (isHook(serviceName, svcObj))
             {
-                synchronized (m_allHooks)
+                synchronized (m_allHooks) // we need to sync as we replace the value
                 {
                     SortedSet<ServiceReference<?>> hooks = m_allHooks.get(serviceName);
                     if (hooks == null)
@@ -153,7 +154,7 @@
         {
             if (isHook(serviceName, svcObj))
             {
-                synchronized (m_allHooks)
+                synchronized (m_allHooks) // we need to sync as we replace the value
                 {
                     SortedSet<ServiceReference<?>> hooks = m_allHooks.get(serviceName);
                     if (hooks != null)
@@ -180,7 +181,7 @@
         {
             if (isHook(serviceName, svcObj))
             {
-                synchronized (m_allHooks)
+                synchronized (m_allHooks) // we need to sync as we replace the value
                 {
                     SortedSet<ServiceReference<?>> hooks = m_allHooks.get(serviceName);
                     if (hooks != null)
@@ -214,26 +215,6 @@
         return Collections.emptySet();
     }
 
-    public Set<ServiceReference<org.osgi.framework.hooks.bundle.FindHook>> getBundleFindHooks()
-    {
-        return getHooks(org.osgi.framework.hooks.bundle.FindHook.class);
-    }
-
-    public Set<ServiceReference<org.osgi.framework.hooks.service.FindHook>> getServiceFindHooks()
-    {
-        return getHooks(org.osgi.framework.hooks.service.FindHook.class);
-    }
-
-    public Set<ServiceReference<org.osgi.framework.hooks.bundle.EventHook>> getBundleEventHooks()
-    {
-        return getHooks(org.osgi.framework.hooks.bundle.EventHook.class);
-    }
-
-    public Set<ServiceReference<org.osgi.framework.hooks.service.ListenerHook>> getServiceListenerHooks()
-    {
-        return getHooks(org.osgi.framework.hooks.service.ListenerHook.class);
-    }
-
     public boolean isHookBlackListed(final ServiceReference<?> sr)
     {
         synchronized ( m_blackList )
@@ -249,5 +230,4 @@
             m_blackList.put(sr, sr);
         }
     }
-
 }
