diff --git a/pom.xml b/pom.xml
index f9ff470..649bcf8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -67,9 +67,6 @@
                             org.apache.sling.api.resource;version="[$(version;==;$(@)),$(version;=+;$(@)))",
                             *
                         </Import-Package>
-                        <DynamicImport-Package>
-                            org.apache.felix.webconsole
-                        </DynamicImport-Package>
                     </instructions>
                 </configuration>
             </plugin>
@@ -101,23 +98,11 @@
         </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.jcr.resource</artifactId>
+            <artifactId>org.apache.sling.commons.osgi</artifactId>
             <version>2.0.6</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.webconsole</artifactId>
-            <version>1.2.0</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.jackrabbit</groupId>
-            <artifactId>jackrabbit-jcr-commons</artifactId>
-            <version>1.6.0</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
         </dependency>
@@ -127,6 +112,16 @@
             <scope>compile</scope>
         </dependency>
         <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>jackrabbit-jcr-commons</artifactId>
+            <version>1.6.0</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.jcr</groupId>
+            <artifactId>jcr</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
         </dependency>
diff --git a/src/main/java/org/apache/sling/bundleresource/impl/Activator.java b/src/main/java/org/apache/sling/bundleresource/impl/Activator.java
index 2eb1821..919921d 100644
--- a/src/main/java/org/apache/sling/bundleresource/impl/Activator.java
+++ b/src/main/java/org/apache/sling/bundleresource/impl/Activator.java
@@ -18,7 +18,6 @@
  */
 package org.apache.sling.bundleresource.impl;
 
-import java.lang.reflect.Method;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -38,26 +37,6 @@
      */
     public static final String BUNDLE_RESOURCE_ROOTS = "Sling-Bundle-Resources";
 
-    /**
-     * Fully qualified name of the Web Console Plugin class. This class will be
-     * loaded dynamically to prevent issues if the Felix Web Console is not
-     * installed in the system (value is
-     * "org.apache.sling.bundleresource.impl.BundleResourceWebConsolePlugin").
-     */
-    private static final String CONSOLE_PLUGIN_CLASS = "org.apache.sling.bundleresource.impl.BundleResourceWebConsolePlugin";
-
-    /**
-     * Name of the initialization method to call on the Web Console Plugin class
-     * (value is "initPlugin").
-     */
-    private static final String METHOD_INIT = "initPlugin";
-
-    /**
-     * Name of the shutdown method to call on the Web Console Plugin class
-     * (value is "destroyPlugin").
-     */
-    private static final String METHOD_DESTROY = "destroyPlugin";
-
     /** default log */
     private final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -65,7 +44,10 @@
 
     private BundleContext bundleContext;
 
-    public void start(BundleContext context) throws Exception {
+    /**
+     * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+     */
+    public void start(final BundleContext context) throws Exception {
 
         this.bundleContext = context;
 
@@ -85,15 +67,14 @@
                 t);
         }
 
-        // hackery thing to prevent problems if the web console is not present
-        callMethod(CONSOLE_PLUGIN_CLASS, METHOD_INIT,
-            new Class<?>[] { BundleContext.class }, new Object[] { context });
-
+        BundleResourceWebConsolePlugin.initPlugin(context);
     }
 
-    public void stop(BundleContext context) throws Exception {
-        // hackery thing to prevent problems if the web console is not present
-        callMethod(CONSOLE_PLUGIN_CLASS, METHOD_DESTROY, null, null);
+    /**
+     * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+     */
+    public void stop(final BundleContext context) throws Exception {
+        BundleResourceWebConsolePlugin.destroyPlugin();
 
         context.removeBundleListener(this);
         this.bundleContext = null;
@@ -103,7 +84,7 @@
      * Loads and unloads any components provided by the bundle whose state
      * changed. If the bundle has been started, the components are loaded. If
      * the bundle is about to stop, the components are unloaded.
-     * 
+     *
      * @param event The <code>BundleEvent</code> representing the bundle state
      *            change.
      */
@@ -150,37 +131,4 @@
             brp.unregisterService();
         }
     }
-
-    /**
-     * Helper method to call the static method <code>methodName</code> on the
-     * class <code>clazzName</code> with the given <code>args</code>. This
-     * method operates exclusively using reflection to prevent any issues if the
-     * class cannot be loaded.
-     * <p>
-     * The goal is to enable running the bundle resource provider without a hard
-     * dependency on the Felix Web Console.
-     * 
-     * @param clazzName The fully qualified name of the class whose static
-     *            method is to be called.
-     * @param methodName The name of the method to call. This method must be
-     *            declared in the given class.
-     * @param argTypes The types of arguments of the methods to be able to find
-     *            the method. This may be <code>null</code> if the method has
-     *            no arguments.
-     * @param args The actual arguments to the method. This may be
-     *            <code>null</code> if the method has no arguments.
-     */
-    private void callMethod(String clazzName, String methodName,
-            Class<?>[] argTypes, Object[] args) {
-        try {
-            Class<?> clazz = getClass().getClassLoader().loadClass(clazzName);
-            Method method = clazz.getDeclaredMethod(methodName, argTypes);
-            if (!method.isAccessible()) {
-                method.setAccessible(true);
-            }
-            method.invoke(null, args);
-        } catch (Throwable t) {
-            // ignore anything
-        }
-    }
 }
diff --git a/src/main/java/org/apache/sling/bundleresource/impl/BundleResourceCache.java b/src/main/java/org/apache/sling/bundleresource/impl/BundleResourceCache.java
index fab1d11..ba9d1f5 100644
--- a/src/main/java/org/apache/sling/bundleresource/impl/BundleResourceCache.java
+++ b/src/main/java/org/apache/sling/bundleresource/impl/BundleResourceCache.java
@@ -232,6 +232,8 @@
     private static class BundleResourceMap<K, V> extends
             LinkedHashMap<String, V> {
 
+        private static final long serialVersionUID = 7455098291380945276L;
+
         /**
          * The default size of a bundle resource cache (value is 20).
          */
diff --git a/src/main/java/org/apache/sling/bundleresource/impl/BundleResourceWebConsolePlugin.java b/src/main/java/org/apache/sling/bundleresource/impl/BundleResourceWebConsolePlugin.java
index 19dd77a..3aead53 100644
--- a/src/main/java/org/apache/sling/bundleresource/impl/BundleResourceWebConsolePlugin.java
+++ b/src/main/java/org/apache/sling/bundleresource/impl/BundleResourceWebConsolePlugin.java
@@ -25,11 +25,12 @@
 import java.util.Hashtable;
 import java.util.List;
 
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.felix.webconsole.AbstractWebConsolePlugin;
-import org.apache.felix.webconsole.WebConsoleConstants;
 import org.apache.sling.api.resource.ResourceProvider;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
@@ -38,7 +39,9 @@
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.util.tracker.ServiceTracker;
 
-class BundleResourceWebConsolePlugin extends AbstractWebConsolePlugin {
+class BundleResourceWebConsolePlugin extends HttpServlet {
+
+    private static final long serialVersionUID = 566337139719695235L;
 
     private static final String LABEL = "bundleresources";
 
@@ -51,7 +54,7 @@
     //--------- setup and shutdown
 
     private static BundleResourceWebConsolePlugin INSTANCE;
-    
+
     static void initPlugin(BundleContext context) {
         if (INSTANCE == null) {
             BundleResourceWebConsolePlugin tmp = new BundleResourceWebConsolePlugin();
@@ -59,7 +62,7 @@
             INSTANCE = tmp;
         }
     }
-    
+
     static void destroyPlugin() {
         if (INSTANCE != null) {
             try {
@@ -69,27 +72,14 @@
             }
         }
     }
-    
+
     // private constructor to force using static setup and shutdown
     private BundleResourceWebConsolePlugin() {
     }
 
-    //---------- AbstractWebConsolePlugin implementation
-    
     @Override
-    public String getLabel() {
-        return LABEL;
-    }
-
-    @Override
-    public String getTitle() {
-        return "Bundle Resource Provider";
-    }
-
-    @Override
-    protected void renderContent(HttpServletRequest req, HttpServletResponse res)
-            throws IOException {
-
+    protected void doGet(final HttpServletRequest req, final HttpServletResponse res)
+    throws ServletException, IOException {
         PrintWriter pw = res.getWriter();
 
         pw.println("<table class='content' cellpadding='0' cellspacing='0' width='100%'>");
@@ -160,8 +150,6 @@
     }
 
     public void activate(BundleContext context) {
-        super.activate(context);
-
         providerTracker = new ServiceTracker(context,
             ResourceProvider.SERVICE_NAME, null) {
             @Override
@@ -189,10 +177,11 @@
             "Web Console Plugin for Bundle Resource Providers");
         props.put(Constants.SERVICE_VENDOR, "The Apache Software Foundation");
         props.put(Constants.SERVICE_PID, getClass().getName());
-        props.put(WebConsoleConstants.PLUGIN_LABEL, LABEL);
+        props.put("felix.webconsole.label", LABEL);
+        props.put("felix.webconsole.title", "Bundle Resource Provider");
 
         serviceRegistration = context.registerService(
-            WebConsoleConstants.SERVICE_NAME, this, props);
+            Servlet.class.getName(), this, props);
     }
 
     public void deactivate() {
@@ -205,8 +194,6 @@
             providerTracker.close();
             providerTracker = null;
         }
-
-        super.deactivate();
     }
 
     private String getName(Bundle bundle) {
