diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/AbstractWebConsolePlugin.java b/webconsole/src/main/java/org/apache/felix/webconsole/AbstractWebConsolePlugin.java
index 2d4a601..eb40bdc 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/AbstractWebConsolePlugin.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/AbstractWebConsolePlugin.java
@@ -95,6 +95,9 @@
 
     private static BrandingPlugin brandingPlugin = DefaultBrandingPlugin.getInstance();
 
+    private static int logLevel;
+
+
     //---------- HttpServlet Overwrites ----------------------------------------
 
     /**
@@ -155,7 +158,6 @@
         }
     }
 
-
     /**
      * Detects whether this request is intended to have the headers and
      * footers of this plugin be rendered or not. This method always returns
@@ -369,6 +371,50 @@
 
 
     /**
+     * Calls the <code>GenericServlet.log(String)</code> method if the
+     * configured log level is less than or equal to the given <code>level</code>.
+     * <p>
+     * Note, that the <code>level</code> paramter is only used to decide whether
+     * the <code>GenericServlet.log(String)</code> method is called or not. The
+     * actual implementation of the <code>GenericServlet.log</code> method is
+     * outside of the control of this method.
+     *
+     * @param level The log level at which to log the message
+     * @param message The message to log
+     */
+    public void log( int level, String message )
+    {
+        if ( logLevel >= level )
+        {
+            log( message );
+        }
+    }
+
+
+    /**
+     * Calls the <code>GenericServlet.log(String, Throwable)</code> method if
+     * the configured log level is less than or equal to the given
+     * <code>level</code>.
+     * <p>
+     * Note, that the <code>level</code> paramter is only used to decide whether
+     * the <code>GenericServlet.log(String, Throwable)</code> method is called
+     * or not. The actual implementation of the <code>GenericServlet.log</code>
+     * method is outside of the control of this method.
+     *
+     * @param level The log level at which to log the message
+     * @param message The message to log
+     * @param t The <code>Throwable</code> to log with the message
+     */
+    public void log( int level, String message, Throwable t )
+    {
+        if ( logLevel >= level )
+        {
+            log( message, t );
+        }
+    }
+
+
+    /**
      * If the request addresses a resource which may be served by the
      * <code>getResource</code> method of the
      * {@link #getResourceProvider() resource provider}, this method serves it
@@ -546,13 +592,13 @@
                     }
                     else
                     {
-                        map.put( labelMapEntry.getValue(), "<div class='ui-state-active'><span>" + labelMapEntry.getValue() 
+                        map.put( labelMapEntry.getValue(), "<div class='ui-state-active'><span>" + labelMapEntry.getValue()
                             + "</span></div>");
                     }
                 }
                 else
                 {
-                    map.put( labelMapEntry.getValue(), "<div class='ui-state-default'><a href='" + appRoot + "/" + labelMapEntry.getKey() + "'>" 
+                    map.put( labelMapEntry.getValue(), "<div class='ui-state-default'><a href='" + appRoot + "/" + labelMapEntry.getKey() + "'>"
                         + labelMapEntry.getValue() + "</a></div>");
                 }
             }
@@ -622,6 +668,9 @@
     }
 
     /**
+     * Returns the {@link BrandingPlugin} currently used for web console
+     * branding.
+     *
      * @return the brandingPlugin
      */
     public static BrandingPlugin getBrandingPlugin() {
@@ -629,6 +678,12 @@
     }
 
     /**
+     * Sets the {@link BrandingPlugin} to use globally by all extensions of
+     * this class for branding.
+     * <p>
+     * Note: This method is intended to be used internally by the Web Console
+     * to update the branding plugin to use.
+     *
      * @param brandingPlugin the brandingPlugin to set
      */
     public static final void setBrandingPlugin(BrandingPlugin brandingPlugin) {
@@ -640,6 +695,21 @@
     }
 
 
+    /**
+     * Sets the log level to be applied for calls to the {@link #log(int, String)}
+     * and {@link #log(int, String, Throwable)} methods.
+     * <p>
+     * Note: This method is intended to be used internally by the Web Console
+     * to update the log level according to the Web Console configuration.
+     *
+     * @param logLevel
+     */
+    public static final void setLogLevel( int logLevel )
+    {
+        AbstractWebConsolePlugin.logLevel = logLevel;
+    }
+
+
     private final String getHeader()
     {
         // MessageFormat pattern place holder
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/SimpleWebConsolePlugin.java b/webconsole/src/main/java/org/apache/felix/webconsole/SimpleWebConsolePlugin.java
index f41ba98..8bb3a60 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/SimpleWebConsolePlugin.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/SimpleWebConsolePlugin.java
@@ -188,7 +188,7 @@
      * @param serviceName the service name to obtain
      * @return the service or <code>null</code> if missing.
      */
-    protected final Object getService( String serviceName )
+    public final Object getService( String serviceName )
     {
         ServiceTracker serviceTracker = ( ServiceTracker ) services.get( serviceName );
         if ( serviceTracker == null )
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/BaseManagementPlugin.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/BaseManagementPlugin.java
deleted file mode 100644
index d38b03c..0000000
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/BaseManagementPlugin.java
+++ /dev/null
@@ -1,105 +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.webconsole.internal;
-
-
-import org.osgi.framework.BundleContext;
-import org.osgi.service.packageadmin.PackageAdmin;
-import org.osgi.service.startlevel.StartLevel;
-import org.osgi.util.tracker.ServiceTracker;
-
-
-public class BaseManagementPlugin implements OsgiManagerPlugin
-{
-
-    private BundleContext bundleContext;
-    private Logger log;
-
-    private ServiceTracker startLevelService;
-
-    private ServiceTracker packageAdmin;
-
-
-    protected BaseManagementPlugin()
-    {
-    }
-
-
-    public void activate( BundleContext bundleContext )
-    {
-        this.bundleContext = bundleContext;
-        this.log = new Logger( bundleContext );
-    }
-
-
-    public void deactivate()
-    {
-        if ( log != null )
-        {
-            log.dispose();
-        }
-
-        if ( startLevelService != null )
-        {
-            startLevelService.close();
-            startLevelService = null;
-        }
-
-        if ( packageAdmin != null )
-        {
-            packageAdmin.close();
-            packageAdmin = null;
-        }
-    }
-
-
-    protected BundleContext getBundleContext()
-    {
-        return bundleContext;
-    }
-
-
-    protected Logger getLog()
-    {
-        return log;
-    }
-
-
-    protected StartLevel getStartLevel()
-    {
-        if ( startLevelService == null )
-        {
-            startLevelService = new ServiceTracker( getBundleContext(), StartLevel.class.getName(), null );
-            startLevelService.open();
-        }
-        return ( StartLevel ) startLevelService.getService();
-    }
-
-
-    protected PackageAdmin getPackageAdmin()
-    {
-        if ( packageAdmin == null )
-        {
-            packageAdmin = new ServiceTracker( getBundleContext(), PackageAdmin.class.getName(), null );
-            packageAdmin.open();
-        }
-        return ( PackageAdmin ) packageAdmin.getService();
-    }
-
-}
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/Logger.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/Logger.java
deleted file mode 100644
index 8d2f0c5..0000000
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/Logger.java
+++ /dev/null
@@ -1,98 +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.webconsole.internal;
-
-
-import org.osgi.framework.BundleContext;
-import org.osgi.service.log.LogService;
-import org.osgi.util.tracker.ServiceTracker;
-
-
-public class Logger
-{
-
-    private static final String LOGSERVICE_NAME = "org.osgi.service.log.LogService";
-    
-    private ServiceTracker logTracker;
-
-
-    public Logger( BundleContext bundleContext )
-    {
-        logTracker = new ServiceTracker( bundleContext, LOGSERVICE_NAME, null );
-        logTracker.open();
-    }
-
-
-    public void dispose()
-    {
-        if ( logTracker != null )
-        {
-            logTracker.close();
-        }
-    }
-
-
-    public void log( int logLevel, String message )
-    {
-        log( logLevel, message, null );
-    }
-
-
-    public void log( int logLevel, String message, Throwable t )
-    {
-        Object log = logTracker.getService();
-        if ( log != null )
-        {
-            ( ( LogService ) log ).log( logLevel, message, t );
-        }
-        else
-        {
-            String level;
-            switch ( logLevel )
-            {
-                case LogService.LOG_DEBUG:
-                    level = "*DEBUG*";
-                    break;
-                case LogService.LOG_INFO:
-                    level = "*INFO *";
-                    break;
-                case LogService.LOG_WARNING:
-                    level = "*WARN *";
-                    break;
-                case LogService.LOG_ERROR:
-                    level = "*ERROR*";
-                    break;
-                default:
-                    level = "*" + logLevel + "*";
-                    break;
-            }
-
-            if ( message == null && t != null )
-            {
-                message = t.getMessage();
-            }
-
-            System.out.println( level + " " + message );
-            if ( t != null )
-            {
-                t.printStackTrace( System.out );
-            }
-        }
-    }
-}
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BaseUpdateInstallHelper.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BaseUpdateInstallHelper.java
index 1790843..654faf4 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BaseUpdateInstallHelper.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BaseUpdateInstallHelper.java
@@ -21,11 +21,10 @@
 
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.IOException;
 import java.io.InputStream;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.felix.webconsole.internal.Logger;
+import org.apache.felix.webconsole.SimpleWebConsolePlugin;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleException;
 import org.osgi.service.log.LogService;
@@ -35,6 +34,8 @@
 abstract class BaseUpdateInstallHelper implements Runnable
 {
 
+    private final SimpleWebConsolePlugin plugin;
+
     private final File bundleFile;
 
     private final boolean refreshPackages;
@@ -42,8 +43,9 @@
     private Thread updateThread;
 
 
-    BaseUpdateInstallHelper( String name, File bundleFile, boolean refreshPackages )
+    BaseUpdateInstallHelper( SimpleWebConsolePlugin plugin, String name, File bundleFile, boolean refreshPackages )
     {
+        this.plugin = plugin;
         this.bundleFile = bundleFile;
         this.refreshPackages = refreshPackages;
         this.updateThread = new Thread( this, name );
@@ -60,10 +62,16 @@
     protected abstract Bundle doRun( InputStream bundleStream ) throws BundleException;
 
 
-    protected abstract Logger getLog();
+    protected final Object getService( String serviceName )
+    {
+        return plugin.getService( serviceName );
+    }
 
 
-    protected abstract Object getService( String serviceName );
+    protected final SimpleWebConsolePlugin getLog()
+    {
+        return plugin;
+    }
 
 
     /**
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BundlesServlet.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BundlesServlet.java
index 03b405f..438012a 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BundlesServlet.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BundlesServlet.java
@@ -54,7 +54,6 @@
 import org.apache.felix.webconsole.SimpleWebConsolePlugin;
 import org.apache.felix.webconsole.WebConsoleConstants;
 import org.apache.felix.webconsole.WebConsoleUtil;
-import org.apache.felix.webconsole.internal.Logger;
 import org.apache.felix.webconsole.internal.OsgiManagerPlugin;
 import org.apache.felix.webconsole.internal.Util;
 import org.json.JSONArray;
@@ -1307,20 +1306,7 @@
 
     private void update( final Bundle bundle )
     {
-        UpdateHelper t = new UpdateHelper( bundle, false )
-        {
-            protected Logger getLog()
-            {
-                return BundlesServlet.this.getLog();
-            }
-
-
-            protected Object getService( String serviceName )
-            {
-                return BundlesServlet.this.getService( serviceName );
-            }
-        };
-
+        UpdateHelper t = new UpdateHelper( this, bundle, false );
         t.start();
     }
 
@@ -1386,18 +1372,6 @@
         return ( StartLevel ) getService( StartLevel.class.getName() );
     }
 
-    // TODO: may remove later, when BaseWebConsolePlugin is made to extend SimpleWebConsolePlugin
-    private Logger log;
-    Logger getLog()
-    {
-        if ( log == null )
-        {
-            log = new Logger( getBundleContext() );
-        }
-
-        return log;
-    }
-
 
     //---------- Bundle Installation handler (former InstallAction)
 
@@ -1436,8 +1410,8 @@
             }
             catch ( NumberFormatException nfe )
             {
-                getLog().log( LogService.LOG_INFO,
-                    "Cannot parse start level parameter " + startLevelItem + " to a number, not setting start level" );
+                log( LogService.LOG_INFO, "Cannot parse start level parameter " + startLevelItem
+                    + " to a number, not setting start level" );
             }
         }
 
@@ -1454,8 +1428,7 @@
             }
             catch ( Exception e )
             {
-                getLog().log( LogService.LOG_ERROR, "Problem accessing uploaded bundle file: " + bundleItem.getName(),
-                    e );
+                log( LogService.LOG_ERROR, "Problem accessing uploaded bundle file: " + bundleItem.getName(), e );
 
                 // remove the tmporary file
                 if ( tmpFile != null )
@@ -1581,7 +1554,7 @@
         }
         catch ( IOException ioe )
         {
-            getLog().log( LogService.LOG_WARNING, "Cannot extract symbolic name of bundle file " + bundleFile, ioe );
+            log( LogService.LOG_WARNING, "Cannot extract symbolic name of bundle file " + bundleFile, ioe );
         }
         finally
         {
@@ -1607,55 +1580,15 @@
         final boolean doStart, final boolean refreshPackages )
     {
 
-        InstallHelper t = new InstallHelper( getBundleContext(), bundleFile, location, startlevel, doStart,
-            refreshPackages )
-        {
-            protected Logger getLog()
-            {
-                return BundlesServlet.this.getLog();
-            }
-
-
-            protected Object getService( String serviceName )
-            {
-                if ( serviceName.equals( PackageAdmin.class.getName() ) )
-                {
-                    return BundlesServlet.this.getPackageAdmin();
-                }
-                else if ( serviceName.equals( StartLevel.class.getName() ) )
-                {
-                    return BundlesServlet.this.getStartLevel();
-                }
-
-                return null;
-            }
-        };
-
+        InstallHelper t = new InstallHelper( this, getBundleContext(), bundleFile, location, startlevel, doStart,
+            refreshPackages );
         t.start();
     }
 
 
     private void updateBackground( final Bundle bundle, final File bundleFile, final boolean refreshPackages )
     {
-        UpdateHelper t = new UpdateHelper( bundle, bundleFile, refreshPackages )
-        {
-            protected Logger getLog()
-            {
-                return BundlesServlet.this.getLog();
-            }
-
-
-            protected Object getService( String serviceName )
-            {
-                if ( serviceName.equals( PackageAdmin.class.getName() ) )
-                {
-                    return BundlesServlet.this.getPackageAdmin();
-                }
-
-                return null;
-            }
-        };
-
+        UpdateHelper t = new UpdateHelper( this, bundle, bundleFile, refreshPackages );
         t.start();
     }
 }
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/InstallHelper.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/InstallHelper.java
index 2003b47..9b64f93 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/InstallHelper.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/InstallHelper.java
@@ -22,23 +22,25 @@
 import java.io.File;
 import java.io.InputStream;
 
+import org.apache.felix.webconsole.SimpleWebConsolePlugin;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleException;
 import org.osgi.service.startlevel.StartLevel;
 
 
-abstract class InstallHelper extends BaseUpdateInstallHelper
+class InstallHelper extends BaseUpdateInstallHelper
 {
     private final BundleContext bundleContext;
     private final String location;
     private final int startlevel;
     private final boolean doStart;
 
-    InstallHelper( final BundleContext bundleContext, final File bundleFile, final String location, final int startlevel,
-        final boolean doStart, final boolean refreshPackages )
+
+    InstallHelper( final SimpleWebConsolePlugin plugin, final BundleContext bundleContext, final File bundleFile,
+        final String location, final int startlevel, final boolean doStart, final boolean refreshPackages )
     {
-        super( "Background Install " + bundleFile, bundleFile, refreshPackages );
+        super( plugin, "Background Install " + bundleFile, bundleFile, refreshPackages );
 
         this.bundleContext = bundleContext;
         this.location = location;
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/UpdateHelper.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/UpdateHelper.java
index 93ec6b6..1b47bd7 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/UpdateHelper.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/UpdateHelper.java
@@ -20,14 +20,12 @@
 
 
 import java.io.File;
-import java.io.IOException;
 import java.io.InputStream;
-import java.net.URL;
 
-import org.apache.commons.io.IOUtils;
 import org.apache.felix.bundlerepository.RepositoryAdmin;
 import org.apache.felix.bundlerepository.Resolver;
 import org.apache.felix.bundlerepository.Resource;
+import org.apache.felix.webconsole.SimpleWebConsolePlugin;
 import org.apache.felix.webconsole.internal.obr.DeployerThread;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleException;
@@ -36,22 +34,23 @@
 import org.osgi.service.log.LogService;
 
 
-abstract class UpdateHelper extends BaseUpdateInstallHelper
+class UpdateHelper extends BaseUpdateInstallHelper
 {
 
     private final Bundle bundle;
 
 
-    UpdateHelper( final Bundle bundle, boolean refreshPackages )
+    UpdateHelper( final SimpleWebConsolePlugin plugin, final Bundle bundle, boolean refreshPackages )
     {
-        this( bundle, null, refreshPackages );
+        this( plugin, bundle, null, refreshPackages );
     }
 
 
-    UpdateHelper( final Bundle bundle, final File bundleFile, boolean refreshPackages )
+    UpdateHelper( final SimpleWebConsolePlugin plugin, final Bundle bundle, final File bundleFile,
+        boolean refreshPackages )
     {
-        super( "Background Update " + bundle.getSymbolicName() + " (" + bundle.getBundleId() + ")", bundleFile,
-            refreshPackages );
+        super( plugin, "Background Update " + bundle.getSymbolicName() + " (" + bundle.getBundleId() + ")",
+            bundleFile, refreshPackages );
         this.bundle = bundle;
     }
 
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/obr/BundleRepositoryRender.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/obr/BundleRepositoryRender.java
index 500db13..324c90b 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/obr/BundleRepositoryRender.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/obr/BundleRepositoryRender.java
@@ -19,11 +19,7 @@
 package org.apache.felix.webconsole.internal.obr;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Enumeration;
-import java.util.List;
-
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -34,7 +30,6 @@
 import org.apache.felix.webconsole.DefaultVariableResolver;
 import org.apache.felix.webconsole.SimpleWebConsolePlugin;
 import org.apache.felix.webconsole.WebConsoleUtil;
-import org.apache.felix.webconsole.internal.Logger;
 import org.apache.felix.webconsole.internal.OsgiManagerPlugin;
 import org.json.JSONException;
 import org.json.JSONObject;
@@ -324,12 +319,12 @@
                 }
             }
 
-            DeployerThread dt = new DeployerThread(resolver, new Logger(getBundleContext()), start, optional);
+            DeployerThread dt = new DeployerThread( resolver, this, start, optional );
             dt.start();
         }
         catch (InvalidSyntaxException e)
         {
-            throw new IllegalStateException(e); 
+            throw new IllegalStateException(e);
         }
     }
 
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/obr/DeployerThread.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/obr/DeployerThread.java
index 0e193eb..d814bb8 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/obr/DeployerThread.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/obr/DeployerThread.java
@@ -22,7 +22,7 @@
 import org.apache.felix.bundlerepository.Reason;
 import org.apache.felix.bundlerepository.Resolver;
 import org.apache.felix.bundlerepository.Resource;
-import org.apache.felix.webconsole.internal.Logger;
+import org.apache.felix.webconsole.AbstractWebConsolePlugin;
 import org.osgi.service.log.LogService;
 
 
@@ -31,20 +31,22 @@
 
     private final Resolver obrResolver;
 
-    private final Logger logger;
+    private final AbstractWebConsolePlugin logger;
 
     private final boolean startBundles;
 
     private final boolean optionalDependencies;
 
 
-    public DeployerThread( Resolver obrResolver, Logger logger, boolean startBundles, boolean optionalDependencies )
+    public DeployerThread( Resolver obrResolver, AbstractWebConsolePlugin logger, boolean startBundles,
+        boolean optionalDependencies )
     {
         this( obrResolver, logger, startBundles, optionalDependencies, "OBR Bundle Deployer" );
     }
 
 
-    public DeployerThread( Resolver obrResolver, Logger logger, boolean startBundles, boolean optionalDependencies, String name )
+    public DeployerThread( Resolver obrResolver, AbstractWebConsolePlugin logger, boolean startBundles,
+        boolean optionalDependencies, String name )
     {
         super( name );
         this.obrResolver = obrResolver;
@@ -83,7 +85,7 @@
     }
 
 
-    public static void logResource( Logger logger, String message, Resource[] res )
+    public static void logResource( AbstractWebConsolePlugin logger, String message, Resource[] res )
     {
         if ( res != null && res.length > 0 )
         {
@@ -97,7 +99,7 @@
     }
 
 
-    public static void logRequirements( Logger logger, String message, Reason[] reasons )
+    public static void logRequirements( AbstractWebConsolePlugin logger, String message, Reason[] reasons )
     {
         logger.log( LogService.LOG_ERROR, message );
         for ( int i = 0; reasons != null && i < reasons.length; i++ )
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationListener2.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationListener2.java
index 65f9441..14cbfec 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationListener2.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationListener2.java
@@ -90,6 +90,11 @@
             adList.add( new AttributeDefinitionImpl( OsgiManager.PROP_PASSWORD, "Password",
                 "The password for the user allowed to access the OSGi Management Console.",
                 OsgiManager.DEFAULT_PASSWORD ) );
+            adList.add( new AttributeDefinitionImpl( OsgiManager.PROP_LOG_LEVEL, "Log Level", "Logging Level",
+                AttributeDefinition.INTEGER, new String[]
+                    { String.valueOf( OsgiManager.DEFAULT_LOG_LEVEL ) }, 0, new String[]
+                    { "Debug", "Information", "Warn", "Error" }, new String[]
+                    { "4", "3", "2", "1" } ) );
 
             final TreeMap namesByClassName = new TreeMap();
             final ClassLoader loader = getClass().getClassLoader();
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java
index 83d5ac9..7b1c621 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java
@@ -40,7 +40,6 @@
 import org.apache.felix.webconsole.AbstractWebConsolePlugin;
 import org.apache.felix.webconsole.BrandingPlugin;
 import org.apache.felix.webconsole.WebConsoleConstants;
-import org.apache.felix.webconsole.internal.Logger;
 import org.apache.felix.webconsole.internal.OsgiManagerPlugin;
 import org.apache.felix.webconsole.internal.WebConsolePluginAdapter;
 import org.apache.felix.webconsole.internal.core.BundlesServlet;
@@ -104,6 +103,10 @@
 
     static final String PROP_ENABLED_PLUGINS = "plugins";
 
+    static final String PROP_LOG_LEVEL = "loglevel";
+
+    public static final int DEFAULT_LOG_LEVEL = LogService.LOG_WARNING;
+
     static final String DEFAULT_PAGE = BundlesServlet.NAME;
 
     static final String DEFAULT_REALM = "OSGi Management Console";
@@ -138,8 +141,6 @@
 
     private BundleContext bundleContext;
 
-    private Logger log;
-
     private ServiceTracker httpServiceTracker;
 
     private HttpService httpService;
@@ -176,11 +177,11 @@
 
     private ResourceBundleManager resourceBundleManager;
 
+    private int logLevel = DEFAULT_LOG_LEVEL;
+
     public OsgiManager( BundleContext bundleContext )
     {
-
         this.bundleContext = bundleContext;
-        this.log = new Logger( bundleContext );
 
         updateConfiguration( null );
 
@@ -225,11 +226,6 @@
             configurationListener = null;
         }
 
-        if ( log != null )
-        {
-            log.dispose();
-        }
-
         this.defaultPlugin = null;
         this.bundleContext = null;
     }
@@ -256,7 +252,7 @@
                 // check whether enabled by configuration
                 if ( isPluginDisabled( pluginClassName, plugin ) )
                 {
-                    log.log( LogService.LOG_INFO, "Ignoring plugin " + pluginClassName + ": Disabled by configuration" );
+                    log( LogService.LOG_INFO, "Ignoring plugin " + pluginClassName + ": Disabled by configuration" );
                     continue;
                 }
 
@@ -286,11 +282,11 @@
                     // message is just a class name, try to be more descriptive
                     message = "Class " + message + " missing";
                 }
-                log.log( LogService.LOG_INFO, pluginClassName + " not enabled. Reason: " + message );
+                log( LogService.LOG_INFO, pluginClassName + " not enabled. Reason: " + message );
             }
             catch ( Throwable t )
             {
-                log.log( LogService.LOG_INFO, "Failed to instantiate plugin " + pluginClassName + ". Reason: " + t );
+                log( LogService.LOG_INFO, "Failed to instantiate plugin " + pluginClassName + ". Reason: " + t );
             }
         }
 
@@ -404,6 +400,7 @@
         this.labelMap.clear();
     }
 
+
     //---------- internal
 
     BundleContext getBundleContext()
@@ -422,6 +419,50 @@
     }
 
 
+    /**
+     * Calls the <code>GenericServlet.log(String)</code> method if the
+     * configured log level is less than or equal to the given <code>level</code>.
+     * <p>
+     * Note, that the <code>level</code> paramter is only used to decide whether
+     * the <code>GenericServlet.log(String)</code> method is called or not. The
+     * actual implementation of the <code>GenericServlet.log</code> method is
+     * outside of the control of this method.
+     *
+     * @param level The log level at which to log the message
+     * @param message The message to log
+     */
+    private void log( int level, String message )
+    {
+        if ( logLevel >= level )
+        {
+            log( message );
+        }
+    }
+
+
+    /**
+     * Calls the <code>GenericServlet.log(String, Throwable)</code> method if
+     * the configured log level is less than or equal to the given
+     * <code>level</code>.
+     * <p>
+     * Note, that the <code>level</code> paramter is only used to decide whether
+     * the <code>GenericServlet.log(String, Throwable)</code> method is called
+     * or not. The actual implementation of the <code>GenericServlet.log</code>
+     * method is outside of the control of this method.
+     *
+     * @param level The log level at which to log the message
+     * @param message The message to log
+     * @param t The <code>Throwable</code> to log with the message
+     */
+    private void log( int level, String message, Throwable t )
+    {
+        if ( logLevel >= level )
+        {
+            log( message, t );
+        }
+    }
+
+
     private HttpServletResponse wrapResponse( final HttpServletRequest request, final HttpServletResponse response,
         final AbstractWebConsolePlugin plugin )
     {
@@ -584,7 +625,7 @@
         // do not bind service, when we are already bound
         if ( this.httpService != null )
         {
-            log.log( LogService.LOG_DEBUG,
+            log( LogService.LOG_DEBUG,
                 "bindHttpService: Already bound to an HTTP Service, ignoring further services" );
             return;
         }
@@ -614,7 +655,7 @@
         }
         catch ( Exception e )
         {
-            log.log( LogService.LOG_ERROR, "bindHttpService: Problem setting up", e );
+            log( LogService.LOG_ERROR, "bindHttpService: Problem setting up", e );
         }
 
         this.httpService = httpService;
@@ -625,7 +666,7 @@
     {
         if ( this.httpService != httpService )
         {
-            log.log( LogService.LOG_DEBUG,
+            log( LogService.LOG_DEBUG,
                 "unbindHttpService: Ignoring unbind of an HttpService to which we are not registered" );
             return;
         }
@@ -641,7 +682,7 @@
             }
             catch ( Throwable t )
             {
-                log.log( LogService.LOG_WARNING, "unbindHttpService: Failed unregistering Resources", t );
+                log( LogService.LOG_WARNING, "unbindHttpService: Failed unregistering Resources", t );
             }
             httpResourcesRegistered = false;
         }
@@ -654,7 +695,7 @@
             }
             catch ( Throwable t )
             {
-                log.log( LogService.LOG_WARNING, "unbindHttpService: Failed unregistering Servlet", t );
+                log( LogService.LOG_WARNING, "unbindHttpService: Failed unregistering Servlet", t );
             }
             httpServletRegistered = false;
         }
@@ -682,7 +723,7 @@
         }
         catch ( ServletException se )
         {
-            log.log( LogService.LOG_WARNING, "Initialization of plugin '" + title + "' (" + label
+            log( LogService.LOG_WARNING, "Initialization of plugin '" + title + "' (" + label
                 + ") failed; not using this plugin", se );
         }
     }
@@ -727,6 +768,9 @@
 
         configuration = config;
 
+        logLevel = getProperty( config, PROP_LOG_LEVEL, DEFAULT_LOG_LEVEL );
+        AbstractWebConsolePlugin.setLogLevel( logLevel );
+
         defaultRenderName = getProperty( config, PROP_DEFAULT_RENDER, DEFAULT_PAGE );
         if ( defaultRenderName != null && plugins.get( defaultRenderName ) != null )
         {
@@ -810,6 +854,42 @@
 
 
     /**
+     * Returns the named property from the configuration. If the property does
+     * not exist, the default value <code>def</code> is returned.
+     *
+     * @param config The properties from which to returned the named one
+     * @param name The name of the property to return
+     * @param def The default value if the named property does not exist
+     * @return The value of the named property as a string or <code>def</code>
+     *         if the property does not exist
+     */
+    private int getProperty( Dictionary config, String name, int def )
+    {
+        Object value = config.get( name );
+        if ( value instanceof Number )
+        {
+            return ( ( Number ) value ).intValue();
+        }
+
+        // try to convert the value to a number
+        if ( value != null )
+        {
+            try
+            {
+                return Integer.parseInt( value.toString() );
+            }
+            catch ( NumberFormatException nfe )
+            {
+                // don't care
+            }
+        }
+
+        // not a number, not convertible, not set, use default
+        return def;
+    }
+
+
+    /**
      * Returns <code>true</code> if the plugin is an
      * {@link AbstractWebConsolePlugin} and a list of enabled plugins is
      * configured but the plugin is not contained in that list.
