diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ServletContextHelperManager.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ServletContextHelperManager.java
index 7b74a4a..546b2f4 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ServletContextHelperManager.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ServletContextHelperManager.java
@@ -58,6 +58,16 @@
 import org.apache.felix.http.base.internal.runtime.dto.RegistryRuntime;
 import org.apache.felix.http.base.internal.runtime.dto.ServletContextHelperRuntime;
 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.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;
 import org.osgi.framework.Constants;
@@ -69,6 +79,7 @@
 import org.osgi.service.http.context.ServletContextHelper;
 import org.osgi.service.http.runtime.HttpServiceRuntime;
 import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
+import org.osgi.util.tracker.ServiceTracker;
 
 public final class ServletContextHelperManager
 {
@@ -92,17 +103,18 @@
 
     private volatile ServiceRegistration<ServletContextHelper> defaultContextRegistration;
 
+    private final List<ServiceTracker<?, ?>> trackers = new ArrayList<ServiceTracker<?, ?>>();
+
     /**
      * Create a new servlet context helper manager
      * and the default context
      */
     public ServletContextHelperManager(final BundleContext bundleContext,
-            final WhiteboardHttpService httpService,
-            final ListenerRegistry listenerRegistry)
+            final HandlerRegistry registry)
     {
         this.bundleContext = bundleContext;
-        this.httpService = httpService;
-        this.listenerRegistry = listenerRegistry;
+        this.httpService = new WhiteboardHttpService(this.bundleContext, registry);
+        this.listenerRegistry = new ListenerRegistry(bundleContext.getBundle());
     }
 
     public void start(ServletContext webContext, ServiceReference<HttpServiceRuntime> httpServiceRuntime)
@@ -145,13 +157,38 @@
                         // nothing to do
                     }
                 }, props);
+        addTracker(new FilterTracker(this.bundleContext, this));
+        addTracker(new ServletTracker(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 ServletRequestListenerTracker(this.bundleContext, this));
+        addTracker(new ServletRequestAttributeListenerTracker(this.bundleContext, this));
+    }
+
+    private void addTracker(ServiceTracker<?, ?> tracker)
+    {
+        this.trackers.add(tracker);
+        tracker.open();
     }
 
     /**
-     * Clean up the instance
+     * Stop the instance
      */
-    public void close()
+    public void stop()
     {
+        for(final ServiceTracker<?, ?> t : this.trackers)
+        {
+            t.close();
+        }
+        this.trackers.clear();
+
         // TODO cleanup
         if (this.defaultContextRegistration != null)
         {
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 acf0a86..f750db2 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
@@ -16,9 +16,7 @@
  */
 package org.apache.felix.http.base.internal.whiteboard;
 
-import java.util.ArrayList;
 import java.util.Hashtable;
-import java.util.List;
 import java.util.Set;
 
 import javax.annotation.Nonnull;
@@ -30,28 +28,15 @@
 import org.apache.felix.http.base.internal.handler.HttpSessionWrapper;
 import org.apache.felix.http.base.internal.service.HttpServiceFactory;
 import org.apache.felix.http.base.internal.service.HttpServiceRuntimeImpl;
-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.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.BundleContext;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.http.runtime.HttpServiceRuntime;
 import org.osgi.service.http.runtime.HttpServiceRuntimeConstants;
-import org.osgi.util.tracker.ServiceTracker;
 
 public final class WhiteboardManager
 {
     private final BundleContext bundleContext;
 
-    private final List<ServiceTracker<?, ?>> trackers = new ArrayList<ServiceTracker<?, ?>>();
-
     private final HttpServiceFactory httpServiceFactory;
 
     private final HttpServiceRuntimeImpl serviceRuntime;
@@ -64,7 +49,7 @@
      * Create a new whiteboard http manager
      * @param bundleContext
      * @param httpServiceFactory
-     * @param registry 
+     * @param registry
      */
     public WhiteboardManager(final BundleContext bundleContext,
             final HttpServiceFactory httpServiceFactory,
@@ -72,9 +57,7 @@
     {
         this.bundleContext = bundleContext;
         this.httpServiceFactory = httpServiceFactory;
-        WhiteboardHttpService whiteboardHttpService = new WhiteboardHttpService(this.bundleContext, registry);
-        ListenerRegistry listenerRegistry = new ListenerRegistry(bundleContext.getBundle());
-        this.contextManager = new ServletContextHelperManager(bundleContext, whiteboardHttpService, listenerRegistry);
+        this.contextManager = new ServletContextHelperManager(bundleContext, registry);
         this.serviceRuntime = new HttpServiceRuntimeImpl(registry, this.contextManager);
     }
 
@@ -88,34 +71,11 @@
                 this.serviceRuntime.getAttributes());
 
         this.contextManager.start(context, this.runtimeServiceReg.getReference());
-
-        addTracker(new FilterTracker(this.bundleContext, contextManager));
-        addTracker(new ServletTracker(this.bundleContext, this.contextManager));
-        addTracker(new ResourceTracker(this.bundleContext, this.contextManager));
-
-        addTracker(new HttpSessionListenerTracker(this.bundleContext, this.contextManager));
-        addTracker(new HttpSessionAttributeListenerTracker(this.bundleContext, this.contextManager));
-
-        addTracker(new ServletContextHelperTracker(this.bundleContext, this.contextManager));
-        addTracker(new ServletContextListenerTracker(this.bundleContext, this.contextManager));
-        addTracker(new ServletContextAttributeListenerTracker(this.bundleContext, this.contextManager));
-
-        addTracker(new ServletRequestListenerTracker(this.bundleContext, this.contextManager));
-        addTracker(new ServletRequestAttributeListenerTracker(this.bundleContext, this.contextManager));
     }
 
     public void stop()
     {
-        for(final ServiceTracker<?, ?> t : this.trackers)
-        {
-            t.close();
-        }
-        this.trackers.clear();
-
-        if ( this.contextManager != null )
-        {
-            this.contextManager.close();
-        }
+        this.contextManager.stop();
 
         if ( this.runtimeServiceReg != null )
         {
@@ -124,12 +84,6 @@
         }
     }
 
-    private void addTracker(ServiceTracker<?, ?> tracker)
-    {
-        this.trackers.add(tracker);
-        tracker.open();
-    }
-
     public void setProperties(final Hashtable<String, Object> props)
     {
         // runtime service gets the same props for now
