diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ListenerHandler.java b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ListenerHandler.java
index a93a84b..415ff63 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ListenerHandler.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ListenerHandler.java
@@ -16,6 +16,8 @@
  */
 package org.apache.felix.http.base.internal.handler;
 
+import java.util.EventListener;
+
 import org.apache.felix.http.base.internal.context.ExtServletContext;
 import org.apache.felix.http.base.internal.runtime.ListenerInfo;
 import org.osgi.service.http.runtime.dto.DTOConstants;
@@ -24,21 +26,21 @@
  * The listener handler handles the initialization and destruction of listener
  * objects.
  */
-public abstract class ListenerHandler<T> implements Comparable<ListenerHandler<T>>
+public abstract class ListenerHandler implements Comparable<ListenerHandler>
 {
     private final long contextServiceId;
 
-    private final ListenerInfo<T> listenerInfo;
+    private final ListenerInfo listenerInfo;
 
     private final ExtServletContext context;
 
-    private T listener;
+    private EventListener listener;
 
     protected volatile int useCount;
 
     public ListenerHandler(final long contextServiceId,
             final ExtServletContext context,
-            final ListenerInfo<T> listenerInfo)
+            final ListenerInfo listenerInfo)
     {
         this.contextServiceId = contextServiceId;
         this.context = context;
@@ -46,7 +48,7 @@
     }
 
     @Override
-    public int compareTo(final ListenerHandler<T> other)
+    public int compareTo(final ListenerHandler other)
     {
         return this.listenerInfo.compareTo(other.listenerInfo);
     }
@@ -61,17 +63,17 @@
         return this.contextServiceId;
     }
 
-    public T getListener()
+    public EventListener getListener()
     {
         return listener;
     }
 
-    protected void setListener(final T f)
+    protected void setListener(final EventListener f)
     {
         this.listener = f;
     }
 
-    public ListenerInfo<T> getListenerInfo()
+    public ListenerInfo getListenerInfo()
     {
         return this.listenerInfo;
     }
@@ -138,7 +140,7 @@
         {
             return false;
         }
-        final ListenerHandler<T> other = (ListenerHandler<T>) obj;
+        final ListenerHandler other = (ListenerHandler) obj;
         return listenerInfo.equals(other.listenerInfo);
     }
 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/WhiteboardListenerHandler.java b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/WhiteboardListenerHandler.java
index b17210a..a9edbe6 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/WhiteboardListenerHandler.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/WhiteboardListenerHandler.java
@@ -16,6 +16,8 @@
  */
 package org.apache.felix.http.base.internal.handler;
 
+import java.util.EventListener;
+
 import org.apache.felix.http.base.internal.context.ExtServletContext;
 import org.apache.felix.http.base.internal.runtime.ListenerInfo;
 import org.osgi.framework.BundleContext;
@@ -25,13 +27,13 @@
 /**
  * Listener handler for listeners registered through the http whiteboard.
  */
-public final class WhiteboardListenerHandler<T> extends ListenerHandler<T>
+public final class WhiteboardListenerHandler extends ListenerHandler
 {
     private final BundleContext bundleContext;
 
     public WhiteboardListenerHandler(final long contextServiceId,
             final ExtServletContext context,
-            final ListenerInfo<T> listenerInfo,
+            final ListenerInfo listenerInfo,
             final BundleContext bundleContext)
     {
         super(contextServiceId, context, listenerInfo);
@@ -47,8 +49,8 @@
             return -1;
         }
 
-        final ServiceReference<T> serviceReference = getListenerInfo().getServiceReference();
-        final ServiceObjects<T> so = this.bundleContext.getServiceObjects(serviceReference);
+        final ServiceReference<EventListener> serviceReference = getListenerInfo().getServiceReference();
+        final ServiceObjects<EventListener> so = this.bundleContext.getServiceObjects(serviceReference);
 
         this.setListener((so == null ? null : so.getService()));
 
@@ -67,13 +69,13 @@
     @Override
     public boolean destroy()
     {
-        final T s = this.getListener();
+        final EventListener s = this.getListener();
         if ( s != null )
         {
             if ( super.destroy() )
             {
 
-                final ServiceObjects<T> so = this.bundleContext.getServiceObjects(getListenerInfo().getServiceReference());
+                final ServiceObjects<EventListener> so = this.bundleContext.getServiceObjects(getListenerInfo().getServiceReference());
                 if (so != null)
                 {
                     so.ungetService(s);
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/EventListenerRegistry.java b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/EventListenerRegistry.java
index 392ba71..132c71f 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/EventListenerRegistry.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/EventListenerRegistry.java
@@ -35,14 +35,7 @@
 import javax.servlet.http.HttpSessionListener;
 
 import org.apache.felix.http.base.internal.handler.ListenerHandler;
-import org.apache.felix.http.base.internal.runtime.HttpSessionAttributeListenerInfo;
-import org.apache.felix.http.base.internal.runtime.HttpSessionIdListenerInfo;
-import org.apache.felix.http.base.internal.runtime.HttpSessionListenerInfo;
 import org.apache.felix.http.base.internal.runtime.ListenerInfo;
-import org.apache.felix.http.base.internal.runtime.ServletContextAttributeListenerInfo;
-import org.apache.felix.http.base.internal.runtime.ServletContextListenerInfo;
-import org.apache.felix.http.base.internal.runtime.ServletRequestAttributeListenerInfo;
-import org.apache.felix.http.base.internal.runtime.ServletRequestListenerInfo;
 import org.osgi.service.http.runtime.dto.FailedListenerDTO;
 import org.osgi.service.http.runtime.dto.ListenerDTO;
 import org.osgi.service.http.runtime.dto.ServletContextDTO;
@@ -91,154 +84,88 @@
     }
 
     /**
-     * Add servlet context listener
+     * Add  listeners
      *
-     * @param handler
+     * @param listener handler
      */
-    public void addServletContextListener(@Nonnull final ListenerHandler<ServletContextListener> handler)
+    public void addListeners(@Nonnull final ListenerHandler handler)
     {
-        this.contextListeners.add(handler);
+        if ( handler.getListenerInfo().isListenerType(ServletContextListener.class.getName()))
+        {
+            this.contextListeners.add(handler);
+        }
+        if ( handler.getListenerInfo().isListenerType(ServletContextAttributeListener.class.getName()))
+        {
+            this.contextAttributeListeners.add(handler);
+        }
+        if ( handler.getListenerInfo().isListenerType(HttpSessionListener.class.getName()))
+        {
+            this.sessionListeners.add(handler);
+        }
+        if ( handler.getListenerInfo().isListenerType(HttpSessionIdListener.class.getName()))
+        {
+            this.sessionIdListeners.add(handler);
+        }
+        if ( handler.getListenerInfo().isListenerType(HttpSessionAttributeListener.class.getName()))
+        {
+            this.sessionAttributeListeners.add(handler);
+        }
+        if ( handler.getListenerInfo().isListenerType(ServletRequestListener.class.getName()))
+        {
+            this.requestListeners.add(handler);
+        }
+        if ( handler.getListenerInfo().isListenerType(ServletRequestAttributeListener.class.getName()))
+        {
+            this.requestAttributeListeners.add(handler);
+        }
     }
 
     /**
-     * Remove servlet context listener
+     * Remove listeners
      *
      * @param info
      */
-    public void removeServletContextListener(@Nonnull final ServletContextListenerInfo info)
+    public void removeListeners(@Nonnull final ListenerInfo info)
     {
-        this.contextListeners.remove(info);
+        if ( info.isListenerType(ServletContextListener.class.getName()))
+        {
+            this.contextListeners.remove(info);
+        }
+        if ( info.isListenerType(ServletContextAttributeListener.class.getName()))
+        {
+            this.contextAttributeListeners.remove(info);
+        }
+        if ( info.isListenerType(HttpSessionListener.class.getName()))
+        {
+            this.sessionListeners.remove(info);
+        }
+        if ( info.isListenerType(HttpSessionIdListener.class.getName()))
+        {
+            this.sessionIdListeners.remove(info);
+        }
+        if ( info.isListenerType(HttpSessionAttributeListener.class.getName()))
+        {
+            this.sessionAttributeListeners.remove(info);
+        }
+        if ( info.isListenerType(ServletRequestListener.class.getName()))
+        {
+            this.requestListeners.remove(info);
+        }
+        if ( info.isListenerType(ServletRequestAttributeListener.class.getName()))
+        {
+            this.requestAttributeListeners.remove(info);
+        }
     }
 
-    /**
-     * Add servlet context attribute listener
-     *
-     * @param handler
-     */
-    public void addServletContextAttributeListener(@Nonnull final ListenerHandler<ServletContextAttributeListener> handler)
-    {
-        this.contextAttributeListeners.add(handler);
-    }
-
-    /**
-     * Remove servlet context attribute listener
-     *
-     * @param info
-     */
-    public void removeServletContextAttributeListener(@Nonnull final ServletContextAttributeListenerInfo info)
-    {
-        this.contextAttributeListeners.remove(info);
-    }
-
-    /**
-     * Add session attribute listener
-     *
-     * @param handler
-     */
-    public void addSessionAttributeListener(@Nonnull final ListenerHandler<HttpSessionAttributeListener> handler)
-    {
-        this.sessionAttributeListeners.add(handler);
-    }
-
-    /**
-     * Remove session attribute listener
-     *
-     * @param info
-     */
-    public void removeSessionAttributeListener(@Nonnull final HttpSessionAttributeListenerInfo info)
-    {
-        this.sessionAttributeListeners.remove(info);
-    }
-
-    /**
-     * Add session listener
-     *
-     * @param handler
-     */
-    public void addSessionListener(@Nonnull final ListenerHandler<HttpSessionListener> handler)
-    {
-        this.sessionListeners.add(handler);
-    }
-
-    /**
-     * Remove session listener
-     *
-     * @param info
-     */
-    public void removeSessionListener(@Nonnull final HttpSessionListenerInfo info)
-    {
-        this.sessionListeners.remove(info);
-    }
-
-    /**
-     * Add session id listener
-     *
-     * @param handler
-     */
-    public void addSessionIdListener(@Nonnull final ListenerHandler<HttpSessionIdListener> handler)
-    {
-        this.sessionIdListeners.add(handler);
-    }
-
-    /**
-     * Remove session id listener
-     *
-     * @param info
-     */
-    public void removeSessionIdListener(@Nonnull final HttpSessionIdListenerInfo info)
-    {
-        this.sessionIdListeners.remove(info);
-    }
-
-    /**
-     * Add request listener
-     *
-     * @param handler
-     */
-    public void addServletRequestListener(@Nonnull final ListenerHandler<ServletRequestListener> handler)
-    {
-        this.requestListeners.add(handler);
-    }
-
-    /**
-     * Remove request listener
-     *
-     * @param info
-     */
-    public void removeServletRequestListener(@Nonnull final ServletRequestListenerInfo info)
-    {
-        this.requestListeners.remove(info);
-    }
-
-    /**
-     * Add request attribute listener
-     *
-     * @param handler
-     */
-    public void addServletRequestAttributeListener(@Nonnull final ListenerHandler<ServletRequestAttributeListener> handler)
-    {
-        this.requestAttributeListeners.add(handler);
-    }
-
-    /**
-     * Remove request attribute listener
-     *
-     * @param info
-     */
-    public void removeServletRequestAttributeListener(@Nonnull final ServletRequestAttributeListenerInfo info)
-    {
-        this.requestAttributeListeners.remove(info);
-    }
-
-    public ListenerHandler<ServletContextListener> getServletContextListener(@Nonnull final ListenerInfo<ServletContextListener> info)
+    public ListenerHandler getServletContextListener(@Nonnull final ListenerInfo info)
     {
         return this.contextListeners.getListenerHandler(info);
     }
 
     public void contextInitialized() {
-        for (final ListenerHandler<ServletContextListener> l : contextListeners.getActiveHandlers())
+        for (final ListenerHandler l : contextListeners.getActiveHandlers())
         {
-            final ServletContextListener listener = l.getListener();
+            final ServletContextListener listener = (ServletContextListener)l.getListener();
             if ( listener != null )
             {
                 listener.contextInitialized(new ServletContextEvent(l.getContext()));
@@ -247,9 +174,9 @@
     }
 
     public void contextDestroyed() {
-        for (final ListenerHandler<ServletContextListener> l : contextListeners.getActiveHandlers())
+        for (final ListenerHandler l : contextListeners.getActiveHandlers())
         {
-            final ServletContextListener listener = l.getListener();
+            final ServletContextListener listener = (ServletContextListener) l.getListener();
             if ( listener != null )
             {
                 listener.contextDestroyed(new ServletContextEvent(l.getContext()));
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/HandlerRegistry.java b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/HandlerRegistry.java
index a3fd974..e419cac 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/HandlerRegistry.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/HandlerRegistry.java
@@ -26,9 +26,7 @@
 
 import org.apache.felix.http.base.internal.handler.FilterHandler;
 import org.apache.felix.http.base.internal.handler.ServletHandler;
-import org.apache.felix.http.base.internal.runtime.FilterInfo;
 import org.apache.felix.http.base.internal.runtime.ServletContextHelperInfo;
-import org.apache.felix.http.base.internal.runtime.ServletInfo;
 import org.apache.felix.http.base.internal.runtime.dto.FailedDTOHolder;
 import org.osgi.service.http.runtime.dto.ServletContextDTO;
 
@@ -112,29 +110,7 @@
         }
     }
 
-    public void addFilter(@Nonnull final FilterHandler handler)
-    {
-        final PerContextHandlerRegistry reg = this.getRegistry(handler.getContextServiceId());
-        // TODO - check whether we need to handle the null case as well
-        //        it shouldn't be required as we only get here if the context exists
-        if ( reg != null )
-        {
-            reg.addFilter(handler);
-        }
-    }
-
-    public void removeFilter(final long contextId, @Nonnull final FilterInfo info, final boolean destroy)
-    {
-        final PerContextHandlerRegistry reg = this.getRegistry(contextId);
-        // TODO - check whether we need to handle the null case as well
-        //        it shouldn't be required as we only get here if the context exists
-        if ( reg != null )
-        {
-            reg.removeFilter(info, destroy);
-        }
-    }
-
-    private PerContextHandlerRegistry getRegistry(final long key)
+    public PerContextHandlerRegistry getRegistry(final long key)
     {
         final List<PerContextHandlerRegistry> list = this.registrations;
         for(final PerContextHandlerRegistry r : list)
@@ -196,29 +172,6 @@
         return EMPTY_FILTER_HANDLER;
     }
 
-    public void addServlet(final ServletHandler handler)
-    {
-        final PerContextHandlerRegistry reg = this.getRegistry(handler.getContextServiceId());
-        // TODO - check whether we need to handle the null case as well
-        //        it shouldn't be required as we only get here if the context exists
-        if ( reg != null )
-        {
-            reg.addServlet(handler);
-        }
-    }
-
-    public void removeServlet(final long contextId, final ServletInfo info, final boolean destroy)
-    {
-        final PerContextHandlerRegistry reg = this.getRegistry(contextId);
-        // TODO - check whether we need to handle the null case as well
-        //        it shouldn't be required as we only get here if the context exists
-        if ( reg != null )
-        {
-            reg.removeServlet(info, destroy);
-        }
-
-    }
-
     public PathResolution resolveServlet(@Nonnull final String requestURI)
     {
         final List<PerContextHandlerRegistry> regs = this.registrations;
@@ -265,8 +218,8 @@
         return null;
     }
 
-    public boolean getRuntimeInfo(final ServletContextDTO dto,
-            final FailedDTOHolder failedDTOHolder)
+    public boolean getRuntimeInfo(@Nonnull final ServletContextDTO dto,
+            @Nonnull final FailedDTOHolder failedDTOHolder)
     {
         final PerContextHandlerRegistry reg = this.getRegistry(dto.serviceId);
         if ( reg != null )
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/ListenerMap.java b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/ListenerMap.java
index fdbc4f0..da56b8c 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/ListenerMap.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/ListenerMap.java
@@ -18,6 +18,7 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.EventListener;
 import java.util.Iterator;
 import java.util.List;
 import java.util.NoSuchElementException;
@@ -30,7 +31,7 @@
 import org.osgi.service.http.runtime.dto.FailedListenerDTO;
 import org.osgi.service.http.runtime.dto.ListenerDTO;
 
-public class ListenerMap<T> {
+public class ListenerMap<T extends EventListener> {
 
     private volatile List<ListenerRegistrationStatus<T>> handlers = Collections.emptyList();
 
@@ -44,9 +45,9 @@
     private static final class ListenerRegistrationStatus<T> implements Comparable<ListenerRegistrationStatus<T>>
     {
         private final int result;
-        private final ListenerHandler<T> handler;
+        private final ListenerHandler handler;
 
-        public ListenerRegistrationStatus(@Nonnull final ListenerHandler<T> handler, final int result)
+        public ListenerRegistrationStatus(@Nonnull final ListenerHandler handler, final int result)
         {
             this.handler = handler;
             this.result = result;
@@ -57,7 +58,7 @@
             return this.result;
         }
 
-        public @Nonnull ListenerHandler<T> getHandler()
+        public @Nonnull ListenerHandler getHandler()
         {
             return this.handler;
         }
@@ -79,7 +80,7 @@
         this.handlers = Collections.emptyList();
     }
 
-    public synchronized void add(final ListenerHandler<T> handler)
+    public synchronized void add(final ListenerHandler handler)
     {
         final int reason = handler.init();
         final ListenerRegistrationStatus<T> status = new ListenerRegistrationStatus<T>(handler, reason);
@@ -90,7 +91,7 @@
         this.handlers = newList;
     }
 
-    public synchronized void remove(final ListenerInfo<T> info)
+    public synchronized void remove(final ListenerInfo info)
     {
         final List<ListenerRegistrationStatus<T>> newList = new ArrayList<ListenerMap.ListenerRegistrationStatus<T>>(this.handlers);
         final Iterator<ListenerRegistrationStatus<T>> i = newList.iterator();
@@ -110,7 +111,7 @@
         }
     }
 
-    public ListenerHandler<T> getListenerHandler(@Nonnull final ListenerInfo<T> info)
+    public ListenerHandler getListenerHandler(@Nonnull final ListenerInfo info)
     {
         final List<ListenerRegistrationStatus<T>> list = this.handlers;
         for(final ListenerRegistrationStatus<T> status : list)
@@ -123,14 +124,14 @@
         return null;
     }
 
-    public Iterable<ListenerHandler<T>> getActiveHandlers()
+    public Iterable<ListenerHandler> getActiveHandlers()
     {
         final List<ListenerRegistrationStatus<T>> list = this.handlers;
         final Iterator<ListenerRegistrationStatus<T>> iter = list.iterator();
-        final Iterator<ListenerHandler<T>> newIter = new Iterator<ListenerHandler<T>>()
+        final Iterator<ListenerHandler> newIter = new Iterator<ListenerHandler>()
         {
 
-            private ListenerHandler<T> next;
+            private ListenerHandler next;
 
             {
                 peek();
@@ -156,13 +157,13 @@
             }
 
             @Override
-            public ListenerHandler<T> next()
+            public ListenerHandler next()
             {
                 if ( this.next == null )
                 {
                     throw new NoSuchElementException();
                 }
-                final ListenerHandler<T> result = this.next;
+                final ListenerHandler result = this.next;
                 peek();
                 return result;
             }
@@ -173,11 +174,11 @@
                 throw new UnsupportedOperationException();
             }
         };
-        return new Iterable<ListenerHandler<T>>()
+        return new Iterable<ListenerHandler>()
         {
 
             @Override
-            public Iterator<ListenerHandler<T>> iterator()
+            public Iterator<ListenerHandler> iterator()
             {
                 return newIter;
             }
@@ -186,7 +187,7 @@
 
     public Iterable<T> getActiveListeners()
     {
-        final Iterator<ListenerHandler<T>> iter = this.getActiveHandlers().iterator();
+        final Iterator<ListenerHandler> iter = this.getActiveHandlers().iterator();
         final Iterator<T> newIter = new Iterator<T>()
         {
 
@@ -196,13 +197,14 @@
                 peek();
             }
 
+            @SuppressWarnings("unchecked")
             private void peek()
             {
                 next = null;
                 while ( next == null && iter.hasNext() )
                 {
-                    final ListenerHandler<T> handler = iter.next();
-                    next = handler.getListener();
+                    final ListenerHandler handler = iter.next();
+                    next = (T)handler.getListener();
                 }
             }
 
@@ -260,10 +262,6 @@
                     if ( dto.serviceId == status.getHandler().getListenerInfo().getServiceId() )
                     {
                         found = true;
-                        final String[] types = new String[dto.types.length + 1];
-                        System.arraycopy(dto.types, 0, types, 0, dto.types.length);
-                        types[dto.types.length] = status.getHandler().getListenerInfo().getListenerName();
-                        dto.types = types;
                     }
                     index++;
                 }
@@ -284,10 +282,6 @@
                          && dto.failureReason == status.getResult() )
                     {
                         found = true;
-                        final String[] types = new String[dto.types.length + 1];
-                        System.arraycopy(dto.types, 0, types, 0, dto.types.length);
-                        types[dto.types.length] = status.getHandler().getListenerInfo().getListenerName();
-                        dto.types = types;
                     }
                     index++;
                 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PerContextHandlerRegistry.java b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PerContextHandlerRegistry.java
index 51e942e..cf9d624 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PerContextHandlerRegistry.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/registry/PerContextHandlerRegistry.java
@@ -20,13 +20,24 @@
 import javax.annotation.Nonnull;
 import javax.servlet.DispatcherType;
 
+import org.apache.felix.http.base.internal.context.ExtServletContext;
 import org.apache.felix.http.base.internal.handler.FilterHandler;
+import org.apache.felix.http.base.internal.handler.HttpServiceServletHandler;
+import org.apache.felix.http.base.internal.handler.ListenerHandler;
 import org.apache.felix.http.base.internal.handler.ServletHandler;
+import org.apache.felix.http.base.internal.handler.WhiteboardFilterHandler;
+import org.apache.felix.http.base.internal.handler.WhiteboardListenerHandler;
+import org.apache.felix.http.base.internal.handler.WhiteboardServletHandler;
 import org.apache.felix.http.base.internal.runtime.FilterInfo;
+import org.apache.felix.http.base.internal.runtime.ListenerInfo;
+import org.apache.felix.http.base.internal.runtime.ResourceInfo;
 import org.apache.felix.http.base.internal.runtime.ServletContextHelperInfo;
 import org.apache.felix.http.base.internal.runtime.ServletInfo;
 import org.apache.felix.http.base.internal.runtime.dto.FailedDTOHolder;
 import org.apache.felix.http.base.internal.service.HttpServiceFactory;
+import org.apache.felix.http.base.internal.service.ResourceServlet;
+import org.apache.felix.http.base.internal.whiteboard.ContextHandler;
+import org.osgi.service.http.runtime.dto.DTOConstants;
 import org.osgi.service.http.runtime.dto.ServletContextDTO;
 
 /**
@@ -145,33 +156,142 @@
     }
 
     /**
-     * Add a servlet
-     * @param handler The servlet handler
+     * Register a servlet.
+     * @param contextInfo The servlet context helper info
+     * @param servletInfo The servlet info
      */
-    public void addServlet(@Nonnull final ServletHandler handler)
+    public int registerServlet(@Nonnull final ContextHandler contextHandler,
+            @Nonnull final ServletInfo servletInfo)
     {
+        final ExtServletContext context = contextHandler.getServletContext(servletInfo.getServiceReference().getBundle());
+        if ( context == null )
+        {
+            return DTOConstants.FAILURE_REASON_SERVLET_CONTEXT_FAILURE;
+        }
+        final ServletHandler handler = new WhiteboardServletHandler(
+                contextHandler.getContextInfo().getServiceId(),
+                context,
+                servletInfo, contextHandler.getBundleContext());
         this.servletRegistry.addServlet(handler);
         this.errorPageRegistry.addServlet(handler);
+        return -1;
     }
 
     /**
-     * Remove a servlet
-     * @param info The servlet info
+     * Unregister a servlet
+     * @param contextInfo The servlet context helper info
+     * @param servletInfo The servlet info
      */
-    public void removeServlet(@Nonnull final ServletInfo info, final boolean destroy)
+    public void unregisterServlet(@Nonnull final ContextHandler contextHandler, @Nonnull final ServletInfo servletInfo)
     {
-        this.servletRegistry.removeServlet(info, destroy);
-        this.errorPageRegistry.removeServlet(info, destroy);
+        this.servletRegistry.removeServlet(servletInfo, true);
+        this.errorPageRegistry.removeServlet(servletInfo, true);
+        contextHandler.ungetServletContext(servletInfo.getServiceReference().getBundle());
     }
 
-    public void addFilter(@Nonnull final FilterHandler handler)
+    /**
+     * Register a filter
+     * @param contextInfo The servlet context helper info
+     * @param filterInfo The filter info
+     */
+    public int registerFilter(@Nonnull  final ContextHandler contextHandler,
+            @Nonnull final FilterInfo filterInfo)
     {
+        final ExtServletContext context = contextHandler.getServletContext(filterInfo.getServiceReference().getBundle());
+        if ( context == null )
+        {
+            return DTOConstants.FAILURE_REASON_SERVLET_CONTEXT_FAILURE;
+        }
+        final FilterHandler handler = new WhiteboardFilterHandler(
+                contextHandler.getContextInfo().getServiceId(),
+                context,
+                filterInfo, contextHandler.getBundleContext());
         this.filterRegistry.addFilter(handler);
+        return -1;
     }
 
-    public void removeFilter(@Nonnull final FilterInfo info, final boolean destroy)
+    /**
+     * Unregister a filter
+     * @param contextInfo The servlet context helper info
+     * @param filterInfo The filter info
+     */
+    public void unregisterFilter(@Nonnull final ContextHandler contextHandler, @Nonnull final FilterInfo filterInfo)
     {
-        this.filterRegistry.removeFilter(info, destroy);
+        this.filterRegistry.removeFilter(filterInfo, true);
+        contextHandler.ungetServletContext(filterInfo.getServiceReference().getBundle());
+    }
+
+    /**
+     * Register listeners
+     *
+     * @param contextHandler The context handler
+     * @param info The listener info
+     * @return {@code -1} on successful registration, failure code otherwise
+     */
+    public int registerListeners(@Nonnull final ContextHandler contextHandler,
+            @Nonnull final ListenerInfo info)
+    {
+        final ExtServletContext context = contextHandler.getServletContext(info.getServiceReference().getBundle());
+        if ( context == null )
+        {
+            return DTOConstants.FAILURE_REASON_SERVLET_CONTEXT_FAILURE;
+        }
+        final ListenerHandler handler = new WhiteboardListenerHandler(
+                contextHandler.getContextInfo().getServiceId(),
+                context,
+                info,
+                contextHandler.getBundleContext());
+        this.eventListenerRegistry.addListeners(handler);
+        return -1;
+    }
+
+    /**
+     * Unregister listeners
+     *
+     * @param contextHandler The context handler
+     * @param info The listener info
+     */
+    public void unregisterListeners(@Nonnull final ContextHandler contextHandler, @Nonnull final ListenerInfo info)
+    {
+        this.eventListenerRegistry.removeListeners(info);
+        contextHandler.ungetServletContext(info.getServiceReference().getBundle());
+    }
+
+    /**
+     * Register a resource.
+     * @param contextInfo The servlet context helper info
+     * @param resourceInfo The resource info
+     */
+    public int registerResource(@Nonnull final ContextHandler contextHandler,
+            @Nonnull final ResourceInfo resourceInfo)
+    {
+        final ServletInfo servletInfo = new ServletInfo(resourceInfo);
+
+        final ExtServletContext context = contextHandler.getServletContext(servletInfo.getServiceReference().getBundle());
+        if ( context == null )
+        {
+            return DTOConstants.FAILURE_REASON_SERVLET_CONTEXT_FAILURE;
+        }
+
+        final ServletHandler handler = new HttpServiceServletHandler(
+                contextHandler.getContextInfo().getServiceId(),
+                context,
+                servletInfo, new ResourceServlet(resourceInfo.getPrefix()));
+
+        this.servletRegistry.addServlet(handler);
+        return -1;
+    }
+
+    /**
+     * Unregister a resource.
+     * @param contextInfo The servlet context helper info
+     * @param resourceInfo The resource info
+     */
+    public void unregisterResource(@Nonnull final ContextHandler contextHandler, @Nonnull final ResourceInfo resourceInfo)
+    {
+        final ServletInfo servletInfo = new ServletInfo(resourceInfo);
+        this.servletRegistry.removeServlet(servletInfo, true);
+        contextHandler.ungetServletContext(servletInfo.getServiceReference().getBundle());
     }
 
     public FilterHandler[] getFilterHandlers(@CheckForNull final ServletHandler servletHandler,
@@ -211,4 +331,40 @@
         // collect listeners
         this.eventListenerRegistry.getRuntimeInfo(dto, failedDTOHolder.failedListenerDTOs);
     }
+
+    /**
+     * Add a filter for the http service.
+     * @param handler The filter handler
+     */
+    public void registerFilter(@Nonnull final FilterHandler handler) {
+        this.filterRegistry.addFilter(handler);
+    }
+
+    /**
+     * Add a servlet for the http service.
+     * @param handler The servlet handler
+     */
+    public void registerServlet(@Nonnull final ServletHandler handler) {
+        this.servletRegistry.addServlet(handler);
+        this.errorPageRegistry.addServlet(handler);
+    }
+
+    /**
+     * Remove a servlet for the http service.
+     * @param servletInfo The servlet info
+     * @param destroy Destroy the servlet
+     */
+    public void unregisterServlet(@Nonnull final ServletInfo servletInfo, final boolean destroy) {
+        this.servletRegistry.removeServlet(servletInfo, destroy);
+        this.errorPageRegistry.removeServlet(servletInfo, destroy);
+    }
+
+    /**
+     * Remove a filter for the http service.
+     * @param info The filter info
+     * @param destroy Destroy the filter
+     */
+    public void unregisterFilter(@Nonnull final FilterInfo info, final boolean destroy) {
+        this.filterRegistry.removeFilter(info, destroy);
+    }
 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/HttpSessionAttributeListenerInfo.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/HttpSessionAttributeListenerInfo.java
deleted file mode 100644
index da52c22..0000000
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/HttpSessionAttributeListenerInfo.java
+++ /dev/null
@@ -1,34 +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.http.base.internal.runtime;
-
-import javax.servlet.http.HttpSessionAttributeListener;
-
-import org.osgi.framework.ServiceReference;
-
-/**
- * Info object for registered servlet context listeners
- */
-public final class HttpSessionAttributeListenerInfo extends ListenerInfo<HttpSessionAttributeListener>
-{
-    public HttpSessionAttributeListenerInfo(final ServiceReference<HttpSessionAttributeListener> ref)
-    {
-        super(ref, HttpSessionAttributeListener.class.getName());
-    }
-}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/HttpSessionIdListenerInfo.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/HttpSessionIdListenerInfo.java
deleted file mode 100644
index 0d8296d..0000000
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/HttpSessionIdListenerInfo.java
+++ /dev/null
@@ -1,34 +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.http.base.internal.runtime;
-
-import javax.servlet.http.HttpSessionIdListener;
-
-import org.osgi.framework.ServiceReference;
-
-/**
- * Info object for registered http session id listeners
- */
-public final class HttpSessionIdListenerInfo extends ListenerInfo<HttpSessionIdListener>
-{
-    public HttpSessionIdListenerInfo(final ServiceReference<HttpSessionIdListener> ref)
-    {
-        super(ref, HttpSessionIdListener.class.getName());
-    }
-}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/HttpSessionListenerInfo.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/HttpSessionListenerInfo.java
deleted file mode 100644
index 3473993..0000000
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/HttpSessionListenerInfo.java
+++ /dev/null
@@ -1,34 +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.http.base.internal.runtime;
-
-import javax.servlet.http.HttpSessionListener;
-
-import org.osgi.framework.ServiceReference;
-
-/**
- * Info object for registered servlet context listeners
- */
-public final class HttpSessionListenerInfo extends ListenerInfo<HttpSessionListener>
-{
-    public HttpSessionListenerInfo(final ServiceReference<HttpSessionListener> ref)
-    {
-        super(ref, HttpSessionListener.class.getName());
-    }
-}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ListenerInfo.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ListenerInfo.java
index b758bd0..9b3eeb5 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ListenerInfo.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ListenerInfo.java
@@ -18,24 +18,58 @@
  */
 package org.apache.felix.http.base.internal.runtime;
 
+import java.util.EventListener;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.annotation.Nonnull;
+import javax.servlet.ServletContextAttributeListener;
+import javax.servlet.ServletContextListener;
+import javax.servlet.ServletRequestAttributeListener;
+import javax.servlet.ServletRequestListener;
+import javax.servlet.http.HttpSessionAttributeListener;
+import javax.servlet.http.HttpSessionIdListener;
+import javax.servlet.http.HttpSessionListener;
+
+import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
 
 /**
  * Info object for registered listeners.
  */
-public abstract class ListenerInfo<T> extends WhiteboardServiceInfo<T>
+public class ListenerInfo extends WhiteboardServiceInfo<EventListener>
 {
+    private static final Set<String> ALLOWED_INTERFACES;
+    static {
+        ALLOWED_INTERFACES = new HashSet<String>();
+        ALLOWED_INTERFACES.add(HttpSessionAttributeListener.class.getName());
+        ALLOWED_INTERFACES.add(HttpSessionIdListener.class.getName());
+        ALLOWED_INTERFACES.add(HttpSessionListener.class.getName());
+        ALLOWED_INTERFACES.add(ServletContextAttributeListener.class.getName());
+        ALLOWED_INTERFACES.add(ServletContextListener.class.getName());
+        ALLOWED_INTERFACES.add(ServletRequestAttributeListener.class.getName());
+        ALLOWED_INTERFACES.add(ServletRequestListener.class.getName());
+    }
 
     private final String enabled;
 
-    private final String listenerName;
+    private final String[] types;
 
-    public ListenerInfo(final ServiceReference<T> ref, final String listenerName)
+    public ListenerInfo(final ServiceReference<EventListener> ref)
     {
         super(ref);
         this.enabled = this.getStringProperty(ref, HttpWhiteboardConstants.HTTP_WHITEBOARD_LISTENER);
-        this.listenerName = listenerName;
+        final String[] objectClass = (String[])ref.getProperty(Constants.OBJECTCLASS);
+        final Set<String> names = new HashSet<String>();
+        for(final String name : objectClass)
+        {
+            if ( ALLOWED_INTERFACES.contains(name) )
+            {
+                names.add(name);
+            }
+        }
+        this.types = names.toArray(new String[names.size()]);
     }
 
     @Override
@@ -44,8 +78,20 @@
         return super.isValid() && "true".equalsIgnoreCase(this.enabled);
     }
 
-    public String getListenerName()
+    public String[] getListenerTypes()
     {
-        return this.listenerName;
+        return this.types;
+    }
+
+    public boolean isListenerType(@Nonnull final String className)
+    {
+        for(final String t : this.types)
+        {
+            if ( t.equals(className) )
+            {
+                return true;
+            }
+        }
+        return false;
     }
 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextAttributeListenerInfo.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextAttributeListenerInfo.java
deleted file mode 100644
index 3384557..0000000
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextAttributeListenerInfo.java
+++ /dev/null
@@ -1,35 +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.http.base.internal.runtime;
-
-import javax.servlet.ServletContextAttributeListener;
-
-import org.osgi.framework.ServiceReference;
-
-/**
- * Info object for registered servlet context attribute listeners
- */
-public final class ServletContextAttributeListenerInfo extends ListenerInfo<ServletContextAttributeListener>
-{
-
-    public ServletContextAttributeListenerInfo(final ServiceReference<ServletContextAttributeListener> ref)
-    {
-        super(ref, ServletContextAttributeListener.class.getName());
-    }
-}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextListenerInfo.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextListenerInfo.java
deleted file mode 100644
index 7300276..0000000
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextListenerInfo.java
+++ /dev/null
@@ -1,34 +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.http.base.internal.runtime;
-
-import javax.servlet.ServletContextListener;
-
-import org.osgi.framework.ServiceReference;
-
-/**
- * Info object for registered servlet context listeners
- */
-public final class ServletContextListenerInfo extends ListenerInfo<ServletContextListener>
-{
-    public ServletContextListenerInfo(final ServiceReference<ServletContextListener> ref)
-    {
-        super(ref, ServletContextListener.class.getName());
-    }
-}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletRequestAttributeListenerInfo.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletRequestAttributeListenerInfo.java
deleted file mode 100644
index 7eb86d4..0000000
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletRequestAttributeListenerInfo.java
+++ /dev/null
@@ -1,34 +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.http.base.internal.runtime;
-
-import javax.servlet.ServletRequestAttributeListener;
-
-import org.osgi.framework.ServiceReference;
-
-/**
- * Info object for registered servlet context listeners
- */
-public final class ServletRequestAttributeListenerInfo extends ListenerInfo<ServletRequestAttributeListener>
-{
-    public ServletRequestAttributeListenerInfo(final ServiceReference<ServletRequestAttributeListener> ref)
-    {
-        super(ref, ServletRequestAttributeListener.class.getName());
-    }
-}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletRequestListenerInfo.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletRequestListenerInfo.java
deleted file mode 100644
index f1e41cd..0000000
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletRequestListenerInfo.java
+++ /dev/null
@@ -1,34 +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.http.base.internal.runtime;
-
-import javax.servlet.ServletRequestListener;
-
-import org.osgi.framework.ServiceReference;
-
-/**
- * Info object for registered servlet context listeners
- */
-public final class ServletRequestListenerInfo extends ListenerInfo<ServletRequestListener>
-{
-    public ServletRequestListenerInfo(final ServiceReference<ServletRequestListener> ref)
-    {
-        super(ref, ServletRequestListener.class.getName());
-    }
-}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FailedDTOHolder.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FailedDTOHolder.java
index fc2e5d2..73b00dc 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FailedDTOHolder.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/FailedDTOHolder.java
@@ -101,7 +101,7 @@
         }
         else if (info instanceof ListenerInfo)
         {
-            final FailedListenerDTO dto = (FailedListenerDTO)ListenerDTOBuilder.build((ListenerInfo<?>)info, failureCode);
+            final FailedListenerDTO dto = (FailedListenerDTO)ListenerDTOBuilder.build((ListenerInfo)info, failureCode);
             dto.servletContextId = contextId;
             this.failedListenerDTOs.add(dto);
         }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ListenerDTOBuilder.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ListenerDTOBuilder.java
index a6972c3..775d85c 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ListenerDTOBuilder.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/dto/ListenerDTOBuilder.java
@@ -18,17 +18,6 @@
  */
 package org.apache.felix.http.base.internal.runtime.dto;
 
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.servlet.ServletContextAttributeListener;
-import javax.servlet.ServletContextListener;
-import javax.servlet.ServletRequestAttributeListener;
-import javax.servlet.ServletRequestListener;
-import javax.servlet.http.HttpSessionAttributeListener;
-import javax.servlet.http.HttpSessionIdListener;
-import javax.servlet.http.HttpSessionListener;
-
 import org.apache.felix.http.base.internal.handler.ListenerHandler;
 import org.apache.felix.http.base.internal.runtime.ListenerInfo;
 import org.osgi.service.http.runtime.dto.FailedListenerDTO;
@@ -36,24 +25,12 @@
 
 public final class ListenerDTOBuilder
 {
-    private static final Set<String> ALLOWED_INTERFACES;
-    static {
-        ALLOWED_INTERFACES = new HashSet<String>();
-        ALLOWED_INTERFACES.add(HttpSessionAttributeListener.class.getName());
-        ALLOWED_INTERFACES.add(HttpSessionIdListener.class.getName());
-        ALLOWED_INTERFACES.add(HttpSessionListener.class.getName());
-        ALLOWED_INTERFACES.add(ServletContextAttributeListener.class.getName());
-        ALLOWED_INTERFACES.add(ServletContextListener.class.getName());
-        ALLOWED_INTERFACES.add(ServletRequestAttributeListener.class.getName());
-        ALLOWED_INTERFACES.add(ServletRequestListener.class.getName());
-    }
-
-    public static ListenerDTO build(final ListenerInfo<?> info, final int reason)
+   public static ListenerDTO build(final ListenerInfo info, final int reason)
     {
         final ListenerDTO dto = (reason == -1 ? new ListenerDTO() : new FailedListenerDTO());
 
         dto.serviceId = info.getServiceId();
-        dto.types = new String[] {info.getListenerName()};
+        dto.types = info.getListenerTypes();
 
         if ( reason != -1 )
         {
@@ -63,7 +40,7 @@
         return dto;
     }
 
-    public static ListenerDTO build(final ListenerHandler<?> handler, final int reason)
+    public static ListenerDTO build(final ListenerHandler handler, final int reason)
     {
         final ListenerDTO dto = build(handler.getListenerInfo(), reason);
         dto.servletContextId = handler.getContextServiceId();
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceRuntimeImpl.java b/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceRuntimeImpl.java
index 6a9f76c..f829cb1 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceRuntimeImpl.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceRuntimeImpl.java
@@ -49,7 +49,7 @@
     @Override
     public RuntimeDTO getRuntimeDTO()
     {
-        final RuntimeDTOBuilder runtimeDTOBuilder = new RuntimeDTOBuilder(contextManager.getRuntimeInfo(registry),
+        final RuntimeDTOBuilder runtimeDTOBuilder = new RuntimeDTOBuilder(contextManager.getRuntimeInfo(),
                 this.serviceReference);
         return runtimeDTOBuilder.build();
     }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/service/SharedHttpServiceImpl.java b/http/base/src/main/java/org/apache/felix/http/base/internal/service/SharedHttpServiceImpl.java
index c24b870..ea25eb4 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/service/SharedHttpServiceImpl.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/service/SharedHttpServiceImpl.java
@@ -51,9 +51,9 @@
     /**
      * Register a filter
      */
-    public boolean registerFilter(@Nonnull final FilterHandler holder)
+    public boolean registerFilter(@Nonnull final FilterHandler handler)
     {
-        this.handlerRegistry.addFilter(holder);
+        this.handlerRegistry.getRegistry(handler.getContextServiceId()).registerFilter(handler);
         return true;
     }
 
@@ -65,7 +65,7 @@
             @Nonnull final Servlet servlet,
             @Nonnull final ServletInfo servletInfo) throws ServletException, NamespaceException
     {
-        final ServletHandler holder = new HttpServiceServletHandler(httpContext, servletInfo, servlet);
+        final ServletHandler handler = new HttpServiceServletHandler(httpContext, servletInfo, servlet);
 
         synchronized (this.aliasMap)
         {
@@ -73,9 +73,9 @@
             {
                 throw new NamespaceException("Alias " + alias + " is already in use.");
             }
-            this.handlerRegistry.addServlet(holder);
+            this.handlerRegistry.getRegistry(handler.getContextServiceId()).registerServlet(handler);
 
-            this.aliasMap.put(alias, holder);
+            this.aliasMap.put(alias, handler);
         }
     }
 
@@ -86,14 +86,14 @@
     {
         synchronized (this.aliasMap)
         {
-            final ServletHandler holder = this.aliasMap.remove(alias);
-            if (holder == null)
+            final ServletHandler handler = this.aliasMap.remove(alias);
+            if (handler == null)
             {
                 throw new IllegalArgumentException("Nothing registered at " + alias);
             }
 
-            final Servlet s = holder.getServlet();
-            this.handlerRegistry.removeServlet(HttpServiceFactory.HTTP_SERVICE_CONTEXT_SERVICE_ID, holder.getServletInfo(), true);
+            final Servlet s = handler.getServlet();
+            this.handlerRegistry.getRegistry(handler.getContextServiceId()).unregisterServlet(handler.getServletInfo(), true);
             return s;
         }
     }
@@ -110,7 +110,7 @@
                     final Map.Entry<String, ServletHandler> entry = i.next();
                     if (entry.getValue().getServlet() == servlet)
                     {
-                        this.handlerRegistry.removeServlet(HttpServiceFactory.HTTP_SERVICE_CONTEXT_SERVICE_ID, entry.getValue().getServletInfo(), destroy);
+                        this.handlerRegistry.getRegistry(entry.getValue().getContextServiceId()).unregisterServlet(entry.getValue().getServletInfo(), destroy);
 
                         i.remove();
                         break;
@@ -121,11 +121,11 @@
         }
     }
 
-    public void unregisterFilter(final FilterHandler filter, final boolean destroy)
+    public void unregisterFilter(final FilterHandler handler, final boolean destroy)
     {
-        if (filter != null)
+        if (handler != null)
         {
-            this.handlerRegistry.removeFilter(filter.getContextServiceId(), filter.getFilterInfo(), destroy);
+            this.handlerRegistry.getRegistry(handler.getContextServiceId()).unregisterFilter(handler.getFilterInfo(), destroy);
         }
     }
 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java
index 9a57ca2..604bc2c 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java
@@ -24,6 +24,7 @@
 import javax.servlet.ServletContext;
 
 import org.apache.felix.http.base.internal.context.ExtServletContext;
+import org.apache.felix.http.base.internal.registry.HandlerRegistry;
 import org.apache.felix.http.base.internal.registry.PerContextHandlerRegistry;
 import org.apache.felix.http.base.internal.runtime.ServletContextHelperInfo;
 import org.osgi.framework.Bundle;
@@ -58,6 +59,11 @@
         this.bundle = bundle;
     }
 
+    public BundleContext getBundleContext()
+    {
+        return this.bundle.getBundleContext();
+    }
+
     public ServletContextHelperInfo getContextInfo()
     {
         return this.info;
@@ -73,7 +79,7 @@
      * Activate this context.
      * @return {@code true} if it succeeded.
      */
-    public boolean activate(final WhiteboardHttpService httpService)
+    public boolean activate(final HandlerRegistry registry)
     {
         this.registry = new PerContextHandlerRegistry(this.info);
         this.sharedContext = new SharedServletContextImpl(webContext,
@@ -89,7 +95,7 @@
         }
         else
         {
-            httpService.registerContext(this.registry);
+            registry.add(this.registry);
         }
         return activate;
     }
@@ -97,9 +103,9 @@
     /**
      * Deactivate this context.
      */
-    public void deactivate(final WhiteboardHttpService httpService)
+    public void deactivate(final HandlerRegistry registry)
     {
-        httpService.unregisterContext(this);
+        registry.remove(this.info);
         this.registry = null;
         this.sharedContext = null;
         this.ungetServletContext(bundle);
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/FailureStateHandler.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/FailureStateHandler.java
index 60285ca..19cf77e 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/FailureStateHandler.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/FailureStateHandler.java
@@ -101,7 +101,7 @@
         return false;
     }
 
-    public void getRuntime(final FailedDTOHolder failedDTOHolder) {
+    public void getRuntimeInfo(final FailedDTOHolder failedDTOHolder) {
         for(final Map.Entry<AbstractInfo<?>, FailureStatus> entry : this.serviceFailures.entrySet() )
         {
             final Iterator<Map.Entry<Integer, Set<Long>>> i = entry.getValue().reasonToContextsMapping.entrySet().iterator();
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardHttpService.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardHttpService.java
deleted file mode 100644
index b6149e8..0000000
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardHttpService.java
+++ /dev/null
@@ -1,341 +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.http.base.internal.whiteboard;
-
-import javax.annotation.Nonnull;
-import javax.servlet.ServletContextAttributeListener;
-import javax.servlet.ServletContextListener;
-import javax.servlet.ServletRequestAttributeListener;
-import javax.servlet.ServletRequestListener;
-import javax.servlet.http.HttpSessionAttributeListener;
-import javax.servlet.http.HttpSessionIdListener;
-import javax.servlet.http.HttpSessionListener;
-
-import org.apache.felix.http.base.internal.context.ExtServletContext;
-import org.apache.felix.http.base.internal.handler.FilterHandler;
-import org.apache.felix.http.base.internal.handler.HttpServiceServletHandler;
-import org.apache.felix.http.base.internal.handler.ListenerHandler;
-import org.apache.felix.http.base.internal.handler.ServletHandler;
-import org.apache.felix.http.base.internal.handler.WhiteboardFilterHandler;
-import org.apache.felix.http.base.internal.handler.WhiteboardListenerHandler;
-import org.apache.felix.http.base.internal.handler.WhiteboardServletHandler;
-import org.apache.felix.http.base.internal.registry.HandlerRegistry;
-import org.apache.felix.http.base.internal.registry.PerContextHandlerRegistry;
-import org.apache.felix.http.base.internal.runtime.FilterInfo;
-import org.apache.felix.http.base.internal.runtime.HttpSessionAttributeListenerInfo;
-import org.apache.felix.http.base.internal.runtime.HttpSessionIdListenerInfo;
-import org.apache.felix.http.base.internal.runtime.HttpSessionListenerInfo;
-import org.apache.felix.http.base.internal.runtime.ResourceInfo;
-import org.apache.felix.http.base.internal.runtime.ServletContextAttributeListenerInfo;
-import org.apache.felix.http.base.internal.runtime.ServletContextListenerInfo;
-import org.apache.felix.http.base.internal.runtime.ServletInfo;
-import org.apache.felix.http.base.internal.runtime.ServletRequestAttributeListenerInfo;
-import org.apache.felix.http.base.internal.runtime.ServletRequestListenerInfo;
-import org.apache.felix.http.base.internal.service.ResourceServlet;
-import org.osgi.framework.BundleContext;
-import org.osgi.service.http.runtime.dto.DTOConstants;
-
-public final class WhiteboardHttpService
-{
-    private final HandlerRegistry handlerRegistry;
-
-    private final BundleContext bundleContext;
-
-    /**
-     * Create a new whiteboard http service
-     * @param bundleContext
-     * @param handlerRegistry
-     */
-    public WhiteboardHttpService(final BundleContext bundleContext,
-            final HandlerRegistry handlerRegistry)
-    {
-        this.handlerRegistry = handlerRegistry;
-        this.bundleContext = bundleContext;
-    }
-
-    /**
-     * Register a servlet.
-     * @param contextInfo The servlet context helper info
-     * @param servletInfo The servlet info
-     */
-    public int registerServlet(@Nonnull final ContextHandler contextHandler,
-            @Nonnull final ServletInfo servletInfo)
-    {
-        final ExtServletContext context = contextHandler.getServletContext(servletInfo.getServiceReference().getBundle());
-        if ( context == null )
-        {
-            return DTOConstants.FAILURE_REASON_SERVLET_CONTEXT_FAILURE;
-        }
-        final ServletHandler holder = new WhiteboardServletHandler(
-                contextHandler.getContextInfo().getServiceId(),
-                context,
-                servletInfo, bundleContext);
-        handlerRegistry.addServlet(holder);
-        return -1;
-    }
-
-    /**
-     * Unregister a servlet
-     * @param contextInfo The servlet context helper info
-     * @param servletInfo The servlet info
-     */
-    public void unregisterServlet(@Nonnull final ContextHandler contextHandler, @Nonnull final ServletInfo servletInfo)
-    {
-        handlerRegistry.removeServlet(contextHandler.getContextInfo().getServiceId(), servletInfo, true);
-        contextHandler.ungetServletContext(servletInfo.getServiceReference().getBundle());
-    }
-
-    /**
-     * Register a filter
-     * @param contextInfo The servlet context helper info
-     * @param filterInfo The filter info
-     */
-    public int registerFilter(@Nonnull  final ContextHandler contextHandler,
-            @Nonnull final FilterInfo filterInfo)
-    {
-        final ExtServletContext context = contextHandler.getServletContext(filterInfo.getServiceReference().getBundle());
-        if ( context == null )
-        {
-            return DTOConstants.FAILURE_REASON_SERVLET_CONTEXT_FAILURE;
-        }
-        final FilterHandler holder = new WhiteboardFilterHandler(
-                contextHandler.getContextInfo().getServiceId(),
-                context,
-                filterInfo, bundleContext);
-        handlerRegistry.addFilter(holder);
-        return -1;
-    }
-
-    /**
-     * Unregister a filter
-     * @param contextInfo The servlet context helper info
-     * @param filterInfo The filter info
-     */
-    public void unregisterFilter(@Nonnull final ContextHandler contextHandler, @Nonnull final FilterInfo filterInfo)
-    {
-        handlerRegistry.removeFilter(contextHandler.getContextInfo().getServiceId(), filterInfo, true);
-        contextHandler.ungetServletContext(filterInfo.getServiceReference().getBundle());
-    }
-
-    public int registerListener(@Nonnull final ContextHandler contextHandler,
-            @Nonnull final ServletContextListenerInfo info)
-    {
-        final ExtServletContext context = contextHandler.getServletContext(info.getServiceReference().getBundle());
-        if ( context == null )
-        {
-            return DTOConstants.FAILURE_REASON_SERVLET_CONTEXT_FAILURE;
-        }
-        final ListenerHandler<ServletContextListener> handler = new WhiteboardListenerHandler<ServletContextListener>(
-                contextHandler.getContextInfo().getServiceId(),
-                context,
-                info,
-                bundleContext);
-        contextHandler.getRegistry().getEventListenerRegistry().addServletContextListener(handler);
-        return -1;
-    }
-
-    public void unregisterListener(@Nonnull final ContextHandler contextHandler, @Nonnull final ServletContextListenerInfo info)
-    {
-        contextHandler.getRegistry().getEventListenerRegistry().removeServletContextListener(info);
-        contextHandler.ungetServletContext(info.getServiceReference().getBundle());
-    }
-
-    public int registerListener(@Nonnull final ContextHandler contextHandler,
-            @Nonnull final ServletContextAttributeListenerInfo info)
-    {
-        final ExtServletContext context = contextHandler.getServletContext(info.getServiceReference().getBundle());
-        if ( context == null )
-        {
-            return DTOConstants.FAILURE_REASON_SERVLET_CONTEXT_FAILURE;
-        }
-        final ListenerHandler<ServletContextAttributeListener> handler = new WhiteboardListenerHandler<ServletContextAttributeListener>(
-                contextHandler.getContextInfo().getServiceId(),
-                context,
-                info,
-                bundleContext);
-        contextHandler.getRegistry().getEventListenerRegistry().addServletContextAttributeListener(handler);
-        return -1;
-    }
-
-    public void unregisterListener(@Nonnull final ContextHandler contextHandler, @Nonnull final ServletContextAttributeListenerInfo info)
-    {
-        contextHandler.getRegistry().getEventListenerRegistry().removeServletContextAttributeListener(info);
-        contextHandler.ungetServletContext(info.getServiceReference().getBundle());
-    }
-
-    public int registerListener(@Nonnull final ContextHandler contextHandler,
-            @Nonnull final HttpSessionListenerInfo info)
-    {
-        final ExtServletContext context = contextHandler.getServletContext(info.getServiceReference().getBundle());
-        if ( context == null )
-        {
-            return DTOConstants.FAILURE_REASON_SERVLET_CONTEXT_FAILURE;
-        }
-        final ListenerHandler<HttpSessionListener> handler = new WhiteboardListenerHandler<HttpSessionListener>(
-                contextHandler.getContextInfo().getServiceId(),
-                context,
-                info,
-                bundleContext);
-        contextHandler.getRegistry().getEventListenerRegistry().addSessionListener(handler);
-        return -1;
-    }
-
-    public void unregisterListener(@Nonnull final ContextHandler contextHandler, @Nonnull final HttpSessionListenerInfo info)
-    {
-        contextHandler.getRegistry().getEventListenerRegistry().removeSessionListener(info);
-        contextHandler.ungetServletContext(info.getServiceReference().getBundle());
-    }
-
-    public int registerListener(@Nonnull final ContextHandler contextHandler,
-            @Nonnull final HttpSessionIdListenerInfo info)
-    {
-        final ExtServletContext context = contextHandler.getServletContext(info.getServiceReference().getBundle());
-        if ( context == null )
-        {
-            return DTOConstants.FAILURE_REASON_SERVLET_CONTEXT_FAILURE;
-        }
-        final ListenerHandler<HttpSessionIdListener> handler = new WhiteboardListenerHandler<HttpSessionIdListener>(
-                contextHandler.getContextInfo().getServiceId(),
-                context,
-                info,
-                bundleContext);
-        contextHandler.getRegistry().getEventListenerRegistry().addSessionIdListener(handler);
-        return -1;
-    }
-
-    public void unregisterListener(@Nonnull final ContextHandler contextHandler, @Nonnull final HttpSessionIdListenerInfo info)
-    {
-        contextHandler.getRegistry().getEventListenerRegistry().removeSessionIdListener(info);
-        contextHandler.ungetServletContext(info.getServiceReference().getBundle());
-    }
-
-    public int registerListener(@Nonnull final ContextHandler contextHandler,
-            @Nonnull final HttpSessionAttributeListenerInfo info)
-    {
-        final ExtServletContext context = contextHandler.getServletContext(info.getServiceReference().getBundle());
-        if ( context == null )
-        {
-            return DTOConstants.FAILURE_REASON_SERVLET_CONTEXT_FAILURE;
-        }
-        final ListenerHandler<HttpSessionAttributeListener> handler = new WhiteboardListenerHandler<HttpSessionAttributeListener>(
-                contextHandler.getContextInfo().getServiceId(),
-                context,
-                info,
-                bundleContext);
-        contextHandler.getRegistry().getEventListenerRegistry().addSessionAttributeListener(handler);
-        return -1;
-    }
-
-    public void unregisterListener(@Nonnull final ContextHandler contextHandler, @Nonnull final HttpSessionAttributeListenerInfo info)
-    {
-        contextHandler.getRegistry().getEventListenerRegistry().removeSessionAttributeListener(info);
-        contextHandler.ungetServletContext(info.getServiceReference().getBundle());
-    }
-
-    public int registerListener(@Nonnull final ContextHandler contextHandler,
-            @Nonnull final ServletRequestListenerInfo info)
-    {
-        final ExtServletContext context = contextHandler.getServletContext(info.getServiceReference().getBundle());
-        if ( context == null )
-        {
-            return DTOConstants.FAILURE_REASON_SERVLET_CONTEXT_FAILURE;
-        }
-        final ListenerHandler<ServletRequestListener> handler = new WhiteboardListenerHandler<ServletRequestListener>(
-                contextHandler.getContextInfo().getServiceId(),
-                context,
-                info,
-                bundleContext);
-        contextHandler.getRegistry().getEventListenerRegistry().addServletRequestListener(handler);
-        return -1;
-    }
-
-    public void unregisterListener(@Nonnull final ContextHandler contextHandler, @Nonnull final ServletRequestListenerInfo info)
-    {
-        contextHandler.getRegistry().getEventListenerRegistry().removeServletRequestListener(info);
-        contextHandler.ungetServletContext(info.getServiceReference().getBundle());
-    }
-
-    public int registerListener(@Nonnull final ContextHandler contextHandler,
-            @Nonnull final ServletRequestAttributeListenerInfo info)
-    {
-        final ExtServletContext context = contextHandler.getServletContext(info.getServiceReference().getBundle());
-        if ( context == null )
-        {
-            return DTOConstants.FAILURE_REASON_SERVLET_CONTEXT_FAILURE;
-        }
-        final ListenerHandler<ServletRequestAttributeListener> handler = new WhiteboardListenerHandler<ServletRequestAttributeListener>(
-                contextHandler.getContextInfo().getServiceId(),
-                context,
-                info,
-                bundleContext);
-        contextHandler.getRegistry().getEventListenerRegistry().addServletRequestAttributeListener(handler);
-        return -1;
-    }
-
-    public void unregisterListener(@Nonnull final ContextHandler contextHandler, @Nonnull final ServletRequestAttributeListenerInfo info)
-    {
-        contextHandler.getRegistry().getEventListenerRegistry().removeServletRequestAttributeListener(info);
-        contextHandler.ungetServletContext(info.getServiceReference().getBundle());
-    }
-
-    /**
-     * Register a resource.
-     * @param contextInfo The servlet context helper info
-     * @param resourceInfo The resource info
-     */
-    public int registerResource(@Nonnull final ContextHandler contextHandler,
-            @Nonnull final ResourceInfo resourceInfo)
-    {
-        final ServletInfo servletInfo = new ServletInfo(resourceInfo);
-
-        final ExtServletContext context = contextHandler.getServletContext(servletInfo.getServiceReference().getBundle());
-        if ( context == null )
-        {
-            return DTOConstants.FAILURE_REASON_SERVLET_CONTEXT_FAILURE;
-        }
-
-        final ServletHandler holder = new HttpServiceServletHandler(
-                contextHandler.getContextInfo().getServiceId(),
-                context,
-                servletInfo, new ResourceServlet(resourceInfo.getPrefix()));
-
-        handlerRegistry.addServlet(holder);
-        return -1;
-    }
-
-    /**
-     * Unregister a resource.
-     * @param contextInfo The servlet context helper info
-     * @param resourceInfo The resource info
-     */
-    public void unregisterResource(@Nonnull final ContextHandler contextHandler, @Nonnull final ResourceInfo resourceInfo)
-    {
-        final ServletInfo servletInfo = new ServletInfo(resourceInfo);
-        handlerRegistry.removeServlet(contextHandler.getContextInfo().getServiceId(), servletInfo, true);
-        contextHandler.ungetServletContext(servletInfo.getServiceReference().getBundle());
-    }
-
-    public void registerContext(@Nonnull final PerContextHandlerRegistry registry)
-    {
-        this.handlerRegistry.add(registry);
-    }
-
-    public void unregisterContext(@Nonnull final ContextHandler contextHandler)
-    {
-        this.handlerRegistry.remove(contextHandler.getContextInfo());
-    }
-}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java
index dcf17c7..844fb5d 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java
@@ -47,16 +47,10 @@
 import org.apache.felix.http.base.internal.registry.HandlerRegistry;
 import org.apache.felix.http.base.internal.runtime.AbstractInfo;
 import org.apache.felix.http.base.internal.runtime.FilterInfo;
-import org.apache.felix.http.base.internal.runtime.HttpSessionAttributeListenerInfo;
-import org.apache.felix.http.base.internal.runtime.HttpSessionIdListenerInfo;
-import org.apache.felix.http.base.internal.runtime.HttpSessionListenerInfo;
+import org.apache.felix.http.base.internal.runtime.ListenerInfo;
 import org.apache.felix.http.base.internal.runtime.ResourceInfo;
-import org.apache.felix.http.base.internal.runtime.ServletContextAttributeListenerInfo;
 import org.apache.felix.http.base.internal.runtime.ServletContextHelperInfo;
-import org.apache.felix.http.base.internal.runtime.ServletContextListenerInfo;
 import org.apache.felix.http.base.internal.runtime.ServletInfo;
-import org.apache.felix.http.base.internal.runtime.ServletRequestAttributeListenerInfo;
-import org.apache.felix.http.base.internal.runtime.ServletRequestListenerInfo;
 import org.apache.felix.http.base.internal.runtime.WhiteboardServiceInfo;
 import org.apache.felix.http.base.internal.runtime.dto.FailedDTOHolder;
 import org.apache.felix.http.base.internal.runtime.dto.RegistryRuntime;
@@ -65,14 +59,9 @@
 import org.apache.felix.http.base.internal.service.HttpServiceRuntimeImpl;
 import org.apache.felix.http.base.internal.util.MimeTypes;
 import org.apache.felix.http.base.internal.whiteboard.tracker.FilterTracker;
-import org.apache.felix.http.base.internal.whiteboard.tracker.HttpSessionAttributeListenerTracker;
-import org.apache.felix.http.base.internal.whiteboard.tracker.HttpSessionListenerTracker;
+import org.apache.felix.http.base.internal.whiteboard.tracker.ListenersTracker;
 import org.apache.felix.http.base.internal.whiteboard.tracker.ResourceTracker;
-import org.apache.felix.http.base.internal.whiteboard.tracker.ServletContextAttributeListenerTracker;
 import org.apache.felix.http.base.internal.whiteboard.tracker.ServletContextHelperTracker;
-import org.apache.felix.http.base.internal.whiteboard.tracker.ServletContextListenerTracker;
-import org.apache.felix.http.base.internal.whiteboard.tracker.ServletRequestAttributeListenerTracker;
-import org.apache.felix.http.base.internal.whiteboard.tracker.ServletRequestListenerTracker;
 import org.apache.felix.http.base.internal.whiteboard.tracker.ServletTracker;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
@@ -104,7 +93,7 @@
     /** A map with all servlet/filter registrations, mapped by abstract info. */
     private final Map<WhiteboardServiceInfo<?>, List<ContextHandler>> servicesMap = new HashMap<WhiteboardServiceInfo<?>, List<ContextHandler>>();
 
-    private final WhiteboardHttpService httpService;
+    private final HandlerRegistry registry;
 
     private final FailureStateHandler failureStateHandler = new FailureStateHandler();
 
@@ -130,7 +119,7 @@
     {
         this.bundleContext = bundleContext;
         this.httpServiceFactory = httpServiceFactory;
-        this.httpService = new WhiteboardHttpService(this.bundleContext, registry);
+        this.registry = registry;
         this.serviceRuntime = new HttpServiceRuntimeImpl(registry, this);
         this.plugin = new HttpServicePlugin(bundleContext, this.serviceRuntime);
     }
@@ -182,18 +171,11 @@
                     }
                 }, props);
         addTracker(new FilterTracker(this.bundleContext, this));
-        addTracker(new ServletTracker(this.bundleContext, this));
+        addTracker(new ListenersTracker(this.bundleContext, this));
         addTracker(new ResourceTracker(this.bundleContext, this));
-
-        addTracker(new HttpSessionListenerTracker(this.bundleContext, this));
-        addTracker(new HttpSessionAttributeListenerTracker(this.bundleContext, this));
-
         addTracker(new ServletContextHelperTracker(this.bundleContext, this));
-        addTracker(new ServletContextListenerTracker(this.bundleContext, this));
-        addTracker(new ServletContextAttributeListenerTracker(this.bundleContext, this));
+        addTracker(new ServletTracker(this.bundleContext, this));
 
-        addTracker(new ServletRequestListenerTracker(this.bundleContext, this));
-        addTracker(new ServletRequestAttributeListenerTracker(this.bundleContext, this));
         this.plugin.register();
     }
 
@@ -284,7 +266,7 @@
      */
     private boolean activate(final ContextHandler handler)
     {
-        if ( !handler.activate(this.httpService) )
+        if ( !handler.activate(this.registry) )
         {
             return false;
         }
@@ -299,7 +281,7 @@
                 {
                     this.failureStateHandler.remove(entry.getKey());
                 }
-                if ( entry.getKey() instanceof ServletContextListenerInfo )
+                if ( entry.getKey() instanceof ListenerInfo && ((ListenerInfo)entry.getKey()).isListenerType(ServletContextListener.class.getName()) )
                 {
                     // servlet context listeners will be registered directly
                     this.registerWhiteboardService(handler, entry.getKey());
@@ -340,7 +322,7 @@
             {
                 if ( !this.failureStateHandler.remove(entry.getKey(), handler.getContextInfo().getServiceId()) )
                 {
-                    if ( entry.getKey() instanceof ServletContextListenerInfo )
+                    if ( entry.getKey() instanceof ListenerInfo && ((ListenerInfo)entry.getKey()).isListenerType(ServletContextListener.class.getName()) )
                     {
                         listeners.add(entry.getKey());
                     }
@@ -364,7 +346,7 @@
             this.unregisterWhiteboardService(handler, info);
         }
 
-        handler.deactivate(this.httpService);
+        handler.deactivate(this.registry);
     }
 
     /**
@@ -573,12 +555,12 @@
                         for(final ContextHandler h : handlerList)
                         {
                             this.registerWhiteboardService(h, info);
-                            if ( info instanceof ServletContextListenerInfo )
+                            if ( info instanceof ListenerInfo && ((ListenerInfo)info).isListenerType(ServletContextListener.class.getName()) )
                             {
-                                final ListenerHandler<ServletContextListener> handler = h.getRegistry().getEventListenerRegistry().getServletContextListener((ServletContextListenerInfo)info);
+                                final ListenerHandler handler = h.getRegistry().getEventListenerRegistry().getServletContextListener((ListenerInfo)info);
                                 if ( handler != null )
                                 {
-                                    final ServletContextListener listener = handler.getListener();
+                                    final ServletContextListener listener = (ServletContextListener)handler.getListener();
                                     if ( listener != null )
                                     {
                                         listener.contextInitialized(new ServletContextEvent(handler.getContext()));
@@ -618,12 +600,12 @@
                     {
                         if ( !failureStateHandler.remove(info, h.getContextInfo().getServiceId()) )
                         {
-                            if ( info instanceof ServletContextListenerInfo )
+                            if ( info instanceof ListenerInfo && ((ListenerInfo)info).isListenerType(ServletContextListener.class.getName()) )
                             {
-                                final ListenerHandler<ServletContextListener> handler = h.getRegistry().getEventListenerRegistry().getServletContextListener((ServletContextListenerInfo)info);
+                                final ListenerHandler handler = h.getRegistry().getEventListenerRegistry().getServletContextListener((ListenerInfo)info);
                                 if ( handler != null )
                                 {
-                                    final ServletContextListener listener = handler.getListener();
+                                    final ServletContextListener listener = (ServletContextListener) handler.getListener();
                                     if ( listener != null )
                                     {
                                         listener.contextDestroyed(new ServletContextEvent(handler.getContext()));
@@ -651,44 +633,20 @@
             int failureCode = -1;
             if ( info instanceof ServletInfo )
             {
-                failureCode = this.httpService.registerServlet(handler, (ServletInfo)info);
+                failureCode = handler.getRegistry().registerServlet(handler, (ServletInfo)info);
             }
             else if ( info instanceof FilterInfo )
             {
-                failureCode = this.httpService.registerFilter(handler, (FilterInfo)info);
+                failureCode = handler.getRegistry().registerFilter(handler, (FilterInfo)info);
             }
             else if ( info instanceof ResourceInfo )
             {
-                failureCode = this.httpService.registerResource(handler, (ResourceInfo)info);
+                failureCode = handler.getRegistry().registerResource(handler, (ResourceInfo)info);
             }
 
-            else if ( info instanceof ServletContextListenerInfo )
+            else if ( info instanceof ListenerInfo )
             {
-                failureCode = this.httpService.registerListener(handler, (ServletContextListenerInfo) info);
-            }
-            else if ( info instanceof ServletContextAttributeListenerInfo )
-            {
-                failureCode = this.httpService.registerListener(handler, (ServletContextAttributeListenerInfo) info);
-            }
-            else if ( info instanceof HttpSessionListenerInfo )
-            {
-                failureCode = this.httpService.registerListener(handler, (HttpSessionListenerInfo) info);
-            }
-            else if ( info instanceof HttpSessionAttributeListenerInfo )
-            {
-                failureCode = this.httpService.registerListener(handler, (HttpSessionAttributeListenerInfo) info);
-            }
-            else if ( info instanceof HttpSessionIdListenerInfo )
-            {
-                failureCode = this.httpService.registerListener(handler, (HttpSessionIdListenerInfo) info);
-            }
-            else if ( info instanceof ServletRequestListenerInfo )
-            {
-                failureCode = this.httpService.registerListener(handler, (ServletRequestListenerInfo) info);
-            }
-            else if ( info instanceof ServletRequestAttributeListenerInfo )
-            {
-                failureCode = this.httpService.registerListener(handler, (ServletRequestAttributeListenerInfo) info);
+                failureCode = handler.getRegistry().registerListeners(handler, (ListenerInfo) info);
             }
             else
             {
@@ -720,44 +678,20 @@
         {
             if ( info instanceof ServletInfo )
             {
-                this.httpService.unregisterServlet(handler, (ServletInfo)info);
+                handler.getRegistry().unregisterServlet(handler, (ServletInfo)info);
             }
             else if ( info instanceof FilterInfo )
             {
-                this.httpService.unregisterFilter(handler, (FilterInfo)info);
+                handler.getRegistry().unregisterFilter(handler, (FilterInfo)info);
             }
             else if ( info instanceof ResourceInfo )
             {
-                this.httpService.unregisterResource(handler, (ResourceInfo)info);
+                handler.getRegistry().unregisterResource(handler, (ResourceInfo)info);
             }
 
-            else if ( info instanceof ServletContextListenerInfo )
+            else if ( info instanceof ListenerInfo )
             {
-                this.httpService.unregisterListener(handler, (ServletContextListenerInfo) info);
-            }
-            else if ( info instanceof ServletContextAttributeListenerInfo )
-            {
-                this.httpService.unregisterListener(handler, (ServletContextAttributeListenerInfo) info);
-            }
-            else if ( info instanceof HttpSessionListenerInfo )
-            {
-                this.httpService.unregisterListener(handler, (HttpSessionListenerInfo) info);
-            }
-            else if ( info instanceof HttpSessionAttributeListenerInfo )
-            {
-                this.httpService.unregisterListener(handler, (HttpSessionAttributeListenerInfo) info);
-            }
-            else if ( info instanceof HttpSessionIdListenerInfo )
-            {
-                this.httpService.unregisterListener(handler, (HttpSessionIdListenerInfo) info);
-            }
-            else if ( info instanceof ServletRequestListenerInfo )
-            {
-                this.httpService.unregisterListener(handler, (ServletRequestListenerInfo) info);
-            }
-            else if ( info instanceof ServletRequestAttributeListenerInfo )
-            {
-                this.httpService.unregisterListener(handler, (ServletRequestAttributeListenerInfo) info);
+                handler.getRegistry().unregisterListeners(handler, (ListenerInfo) info);
             }
         }
         catch (final Exception e)
@@ -807,7 +741,7 @@
         return null;
     }
 
-    public RegistryRuntime getRuntimeInfo(final HandlerRegistry registry)
+    public RegistryRuntime getRuntimeInfo()
     {
         final FailedDTOHolder failedDTOHolder = new FailedDTOHolder();
 
@@ -833,7 +767,7 @@
                     contextHandlerList.add(list.get(0));
                 }
             }
-            this.failureStateHandler.getRuntime(failedDTOHolder);
+            this.failureStateHandler.getRuntimeInfo(failedDTOHolder);
         }
         Collections.sort(contextHandlerList);
 
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/HttpSessionAttributeListenerTracker.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/HttpSessionAttributeListenerTracker.java
deleted file mode 100644
index 64f2003..0000000
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/HttpSessionAttributeListenerTracker.java
+++ /dev/null
@@ -1,38 +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.http.base.internal.whiteboard.tracker;
-
-import javax.servlet.http.HttpSessionAttributeListener;
-
-import org.apache.felix.http.base.internal.runtime.HttpSessionAttributeListenerInfo;
-import org.apache.felix.http.base.internal.runtime.WhiteboardServiceInfo;
-import org.apache.felix.http.base.internal.whiteboard.WhiteboardManager;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-
-public final class HttpSessionAttributeListenerTracker extends WhiteboardServiceTracker<HttpSessionAttributeListener>
-{
-    public HttpSessionAttributeListenerTracker(final BundleContext context, final WhiteboardManager manager)
-    {
-        super(manager, context, createListenerFilterExpression(HttpSessionAttributeListener.class));
-    }
-
-    @Override
-    protected WhiteboardServiceInfo<HttpSessionAttributeListener> getServiceInfo(final ServiceReference<HttpSessionAttributeListener> ref) {
-        return new HttpSessionAttributeListenerInfo(ref);
-    }
-}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/HttpSessionIdListenerTracker.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/HttpSessionIdListenerTracker.java
deleted file mode 100644
index 1256862..0000000
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/HttpSessionIdListenerTracker.java
+++ /dev/null
@@ -1,38 +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.http.base.internal.whiteboard.tracker;
-
-import javax.servlet.http.HttpSessionIdListener;
-
-import org.apache.felix.http.base.internal.runtime.HttpSessionIdListenerInfo;
-import org.apache.felix.http.base.internal.runtime.WhiteboardServiceInfo;
-import org.apache.felix.http.base.internal.whiteboard.WhiteboardManager;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-
-public final class HttpSessionIdListenerTracker extends WhiteboardServiceTracker<HttpSessionIdListener>
-{
-    public HttpSessionIdListenerTracker(final BundleContext context, final WhiteboardManager manager)
-    {
-        super(manager, context, createListenerFilterExpression(HttpSessionIdListener.class));
-    }
-
-    @Override
-    protected WhiteboardServiceInfo<HttpSessionIdListener> getServiceInfo(final ServiceReference<HttpSessionIdListener> ref) {
-        return new HttpSessionIdListenerInfo(ref);
-    }
-}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/HttpSessionListenerTracker.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/HttpSessionListenerTracker.java
deleted file mode 100644
index cc351fa..0000000
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/HttpSessionListenerTracker.java
+++ /dev/null
@@ -1,38 +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.http.base.internal.whiteboard.tracker;
-
-import javax.servlet.http.HttpSessionListener;
-
-import org.apache.felix.http.base.internal.runtime.HttpSessionListenerInfo;
-import org.apache.felix.http.base.internal.runtime.WhiteboardServiceInfo;
-import org.apache.felix.http.base.internal.whiteboard.WhiteboardManager;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-
-public final class HttpSessionListenerTracker extends WhiteboardServiceTracker<HttpSessionListener>
-{
-    public HttpSessionListenerTracker(final BundleContext context, final WhiteboardManager manager)
-    {
-        super(manager, context, createListenerFilterExpression(HttpSessionListener.class));
-    }
-
-    @Override
-    protected WhiteboardServiceInfo<HttpSessionListener> getServiceInfo(final ServiceReference<HttpSessionListener> ref) {
-        return new HttpSessionListenerInfo(ref);
-    }
-}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ListenersTracker.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ListenersTracker.java
new file mode 100644
index 0000000..e758f7b
--- /dev/null
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ListenersTracker.java
@@ -0,0 +1,66 @@
+/*
+ * 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.http.base.internal.whiteboard.tracker;
+
+import java.util.EventListener;
+
+import javax.servlet.ServletContextAttributeListener;
+import javax.servlet.ServletContextListener;
+import javax.servlet.ServletRequestAttributeListener;
+import javax.servlet.ServletRequestListener;
+import javax.servlet.http.HttpSessionAttributeListener;
+import javax.servlet.http.HttpSessionIdListener;
+import javax.servlet.http.HttpSessionListener;
+
+import org.apache.felix.http.base.internal.runtime.ListenerInfo;
+import org.apache.felix.http.base.internal.runtime.WhiteboardServiceInfo;
+import org.apache.felix.http.base.internal.whiteboard.WhiteboardManager;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
+
+public final class ListenersTracker extends WhiteboardServiceTracker<EventListener>
+{
+    /**
+     * Create a filter expression for all supported listener.
+     */
+    private static String createListenersFilterExpression()
+    {
+        return String.format("(&" +
+                             "(|(objectClass=%s)(objectClass=%s)(objectClass=%s)(objectClass=%s)(objectClass=%s)(objectClass=%s)(objectClass=%s))" +
+                             "(%s=*)(!(%s~=false)))",
+                HttpSessionAttributeListener.class.getName(),
+                HttpSessionIdListener.class.getName(),
+                HttpSessionListener.class.getName(),
+                ServletContextListener.class.getName(),
+                ServletContextAttributeListener.class.getName(),
+                ServletRequestListener.class.getName(),
+                ServletRequestAttributeListener.class.getName(),
+                HttpWhiteboardConstants.HTTP_WHITEBOARD_LISTENER,
+                HttpWhiteboardConstants.HTTP_WHITEBOARD_LISTENER);
+    }
+
+    public ListenersTracker(final BundleContext context, final WhiteboardManager manager)
+    {
+        super(manager, context, createListenersFilterExpression());
+    }
+
+    @Override
+    protected WhiteboardServiceInfo<EventListener> getServiceInfo(final ServiceReference<EventListener> ref) {
+        return new ListenerInfo(ref);
+    }
+}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletContextAttributeListenerTracker.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletContextAttributeListenerTracker.java
deleted file mode 100644
index f0edbf2..0000000
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletContextAttributeListenerTracker.java
+++ /dev/null
@@ -1,38 +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.http.base.internal.whiteboard.tracker;
-
-import javax.servlet.ServletContextAttributeListener;
-
-import org.apache.felix.http.base.internal.runtime.ServletContextAttributeListenerInfo;
-import org.apache.felix.http.base.internal.runtime.WhiteboardServiceInfo;
-import org.apache.felix.http.base.internal.whiteboard.WhiteboardManager;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-
-public final class ServletContextAttributeListenerTracker extends WhiteboardServiceTracker<ServletContextAttributeListener>
-{
-    public ServletContextAttributeListenerTracker(final BundleContext context, final WhiteboardManager manager)
-    {
-        super(manager, context, createListenerFilterExpression(ServletContextAttributeListener.class));
-    }
-
-    @Override
-    protected WhiteboardServiceInfo<ServletContextAttributeListener> getServiceInfo(final ServiceReference<ServletContextAttributeListener> ref) {
-        return new ServletContextAttributeListenerInfo(ref);
-    }
-}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletContextListenerTracker.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletContextListenerTracker.java
deleted file mode 100644
index bc48043..0000000
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletContextListenerTracker.java
+++ /dev/null
@@ -1,38 +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.http.base.internal.whiteboard.tracker;
-
-import javax.servlet.ServletContextListener;
-
-import org.apache.felix.http.base.internal.runtime.ServletContextListenerInfo;
-import org.apache.felix.http.base.internal.runtime.WhiteboardServiceInfo;
-import org.apache.felix.http.base.internal.whiteboard.WhiteboardManager;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-
-public final class ServletContextListenerTracker extends WhiteboardServiceTracker<ServletContextListener>
-{
-    public ServletContextListenerTracker(final BundleContext context, final WhiteboardManager manager)
-    {
-        super(manager, context, createListenerFilterExpression(ServletContextListener.class));
-    }
-
-    @Override
-    protected WhiteboardServiceInfo<ServletContextListener> getServiceInfo(final ServiceReference<ServletContextListener> ref) {
-        return new ServletContextListenerInfo(ref);
-    }
-}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletRequestAttributeListenerTracker.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletRequestAttributeListenerTracker.java
deleted file mode 100644
index 1931d3a..0000000
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletRequestAttributeListenerTracker.java
+++ /dev/null
@@ -1,38 +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.http.base.internal.whiteboard.tracker;
-
-import javax.servlet.ServletRequestAttributeListener;
-
-import org.apache.felix.http.base.internal.runtime.ServletRequestAttributeListenerInfo;
-import org.apache.felix.http.base.internal.runtime.WhiteboardServiceInfo;
-import org.apache.felix.http.base.internal.whiteboard.WhiteboardManager;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-
-public final class ServletRequestAttributeListenerTracker extends WhiteboardServiceTracker<ServletRequestAttributeListener>
-{
-    public ServletRequestAttributeListenerTracker(final BundleContext context, final WhiteboardManager manager)
-    {
-        super(manager, context, createListenerFilterExpression(ServletRequestAttributeListener.class));
-    }
-
-    @Override
-    protected WhiteboardServiceInfo<ServletRequestAttributeListener> getServiceInfo(final ServiceReference<ServletRequestAttributeListener> ref) {
-        return new ServletRequestAttributeListenerInfo(ref);
-    }
-}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletRequestListenerTracker.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletRequestListenerTracker.java
deleted file mode 100644
index e7c2eca..0000000
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletRequestListenerTracker.java
+++ /dev/null
@@ -1,38 +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.http.base.internal.whiteboard.tracker;
-
-import javax.servlet.ServletRequestListener;
-
-import org.apache.felix.http.base.internal.runtime.ServletRequestListenerInfo;
-import org.apache.felix.http.base.internal.runtime.WhiteboardServiceInfo;
-import org.apache.felix.http.base.internal.whiteboard.WhiteboardManager;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-
-public final class ServletRequestListenerTracker extends WhiteboardServiceTracker<ServletRequestListener>
-{
-    public ServletRequestListenerTracker(final BundleContext context, final WhiteboardManager manager)
-    {
-        super(manager, context, createListenerFilterExpression(ServletRequestListener.class));
-    }
-
-    @Override
-    protected WhiteboardServiceInfo<ServletRequestListener> getServiceInfo(final ServiceReference<ServletRequestListener> ref) {
-        return new ServletRequestListenerInfo(ref);
-    }
-}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/WhiteboardServiceTracker.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/WhiteboardServiceTracker.java
index 4d32e1d..e19b860 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/WhiteboardServiceTracker.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/WhiteboardServiceTracker.java
@@ -25,7 +25,6 @@
 import org.osgi.framework.Constants;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
-import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
 import org.osgi.util.tracker.ServiceTracker;
 
 /**
@@ -39,17 +38,6 @@
     /** Map containing all info objects reported from the trackers. */
     private final Map<Long, WhiteboardServiceInfo<T>> allInfos = new ConcurrentHashMap<Long, WhiteboardServiceInfo<T>>();
 
-    /**
-     * Create a filter expression for the specific listener.
-     */
-    public static String createListenerFilterExpression(final Class<?> listenerClass)
-    {
-        return String.format("(&(objectClass=%s)(%s=*)(!(%s~=false)))",
-                listenerClass.getName(),
-                HttpWhiteboardConstants.HTTP_WHITEBOARD_LISTENER,
-                HttpWhiteboardConstants.HTTP_WHITEBOARD_LISTENER);
-    }
-
     private static org.osgi.framework.Filter createFilter(final BundleContext btx, final String expr)
     {
         try
diff --git a/http/base/src/test/java/org/apache/felix/http/base/internal/registry/HandlerRegistryTest.java b/http/base/src/test/java/org/apache/felix/http/base/internal/registry/HandlerRegistryTest.java
index 08834df..ba24f25 100644
--- a/http/base/src/test/java/org/apache/felix/http/base/internal/registry/HandlerRegistryTest.java
+++ b/http/base/src/test/java/org/apache/felix/http/base/internal/registry/HandlerRegistryTest.java
@@ -73,7 +73,7 @@
         assertTrue(registry.getRuntimeInfo(dto, holder));
         assertEquals("Precondition", 0, dto.servletDTOs.length);
 
-        registry.addServlet(handler);
+        registry.getRegistry(handler.getContextServiceId()).registerServlet(handler);
         Mockito.verify(servlet, Mockito.times(1)).init(Mockito.any(ServletConfig.class));
         assertTrue(registry.getRuntimeInfo(dto, holder));
         assertEquals(1, dto.servletDTOs.length);
@@ -81,13 +81,13 @@
 
         final ServletInfo info2 = new ServletInfo("bar", "/bar", 0, Collections.<String, String> emptyMap());
         ServletHandler handler2 = new HttpServiceServletHandler(null, info2, Mockito.mock(Servlet.class));
-        registry.addServlet(handler2);
+        registry.getRegistry(handler.getContextServiceId()).registerServlet(handler2);
         assertTrue(registry.getRuntimeInfo(dto, holder));
         assertEquals(2, dto.servletDTOs.length);
 
         final ServletInfo info3 = new ServletInfo("zar", "/foo", 0, Collections.<String, String> emptyMap());
         ServletHandler handler3 = new HttpServiceServletHandler(null,info3, Mockito.mock(Servlet.class));
-        registry.addServlet(handler3);
+        registry.getRegistry(handler.getContextServiceId()).registerServlet(handler3);
         assertTrue(registry.getRuntimeInfo(dto, holder));
         assertEquals(2, dto.servletDTOs.length);
         assertEquals(1, holder.failedServletDTOs.size());
diff --git a/http/base/src/test/java/org/apache/felix/http/base/internal/whiteboard/FailureStateHandlerTest.java b/http/base/src/test/java/org/apache/felix/http/base/internal/whiteboard/FailureStateHandlerTest.java
index 14da25d..09eaa06 100644
--- a/http/base/src/test/java/org/apache/felix/http/base/internal/whiteboard/FailureStateHandlerTest.java
+++ b/http/base/src/test/java/org/apache/felix/http/base/internal/whiteboard/FailureStateHandlerTest.java
@@ -17,25 +17,44 @@
 package org.apache.felix.http.base.internal.whiteboard;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
 import org.apache.felix.http.base.internal.runtime.ServletInfo;
 import org.apache.felix.http.base.internal.runtime.dto.FailedDTOHolder;
 import org.junit.Test;
 import org.osgi.service.http.runtime.dto.DTOConstants;
+import org.osgi.service.http.runtime.dto.FailedServletDTO;
 
 public class FailureStateHandlerTest {
 
+    private void assertContainsExactly(final List<FailedServletDTO> dtos, final long[] contextIds)
+    {
+        assertEquals(dtos.size(), contextIds.length);
+        final Set<Long> set = new HashSet<Long>();
+        for(final long l : contextIds)
+        {
+            set.add(l);
+        }
+        for(final FailedServletDTO dto : dtos)
+        {
+            assertTrue(set.remove(dto.servletContextId));
+        }
+    }
+
     @Test public void testAddRemoveNoContext()
     {
-        final ServletInfo info = new ServletInfo("test", "/test", 3, Collections.EMPTY_MAP);
+        final ServletInfo info = new ServletInfo("test", "/test", 3, Collections.<String, String> emptyMap());
 
         final FailureStateHandler handler = new FailureStateHandler();
         handler.add(info, DTOConstants.FAILURE_REASON_SHADOWED_BY_OTHER_SERVICE);
 
         final FailedDTOHolder holder = new FailedDTOHolder();
-        handler.getRuntime(holder);
+        handler.getRuntimeInfo(holder);
 
         assertEquals(1, holder.failedServletDTOs.size());
         assertEquals(DTOConstants.FAILURE_REASON_SHADOWED_BY_OTHER_SERVICE, holder.failedServletDTOs.get(0).failureReason);
@@ -43,35 +62,34 @@
         holder.failedServletDTOs.clear();
 
         handler.remove(info);
-        handler.getRuntime(holder);
+        handler.getRuntimeInfo(holder);
 
         assertEquals(0, holder.failedServletDTOs.size());
     }
 
     @Test public void testAddRemoveContext()
     {
-        final ServletInfo info1 = new ServletInfo("test", "/test", 3, Collections.EMPTY_MAP);
-        final ServletInfo info2 = new ServletInfo("test", "/test", 4, Collections.EMPTY_MAP);
+        final ServletInfo info1 = new ServletInfo("test", "/test", 3, Collections.<String, String> emptyMap());
+        final ServletInfo info2 = new ServletInfo("test", "/test", 4, Collections.<String, String> emptyMap());
 
         final FailureStateHandler handler = new FailureStateHandler();
         handler.add(info1, 1L, DTOConstants.FAILURE_REASON_SHADOWED_BY_OTHER_SERVICE);
         handler.add(info2, 2L, DTOConstants.FAILURE_REASON_SHADOWED_BY_OTHER_SERVICE);
 
         final FailedDTOHolder holder = new FailedDTOHolder();
-        handler.getRuntime(holder);
+        handler.getRuntimeInfo(holder);
 
         assertEquals(2, holder.failedServletDTOs.size());
         assertEquals(DTOConstants.FAILURE_REASON_SHADOWED_BY_OTHER_SERVICE, holder.failedServletDTOs.get(0).failureReason);
         assertEquals(DTOConstants.FAILURE_REASON_SHADOWED_BY_OTHER_SERVICE, holder.failedServletDTOs.get(1).failureReason);
-        assertEquals(1L, holder.failedServletDTOs.get(0).servletContextId);
-        assertEquals(2L, holder.failedServletDTOs.get(1).servletContextId);
+        assertContainsExactly(holder.failedServletDTOs, new long[] {1L, 2L});
 
 
         handler.remove(info1, 1L);
         handler.remove(info2, 2L);
 
         holder.failedServletDTOs.clear();
-        handler.getRuntime(holder);
+        handler.getRuntimeInfo(holder);
 
         assertEquals(0, holder.failedServletDTOs.size());
     }
