diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/EventAdminServlet.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/EventAdminServlet.java
deleted file mode 100644
index 129cc5e..0000000
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/EventAdminServlet.java
+++ /dev/null
@@ -1,397 +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.misc;
-
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.*;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.felix.webconsole.WebConsoleConstants;
-import org.apache.felix.webconsole.internal.BaseWebConsolePlugin;
-import org.apache.felix.webconsole.internal.Util;
-import org.json.JSONException;
-import org.json.JSONWriter;
-import org.osgi.framework.*;
-import org.osgi.service.event.*;
-
-
-public class EventAdminServlet extends BaseWebConsolePlugin implements EventHandler
-{
-
-    public static final String LABEL = "events";
-
-    public static final String TITLE = "Event Admin";
-
-    /** Number of events to be displayed. */
-    private int maxSize = 50;
-
-    private final List events = new ArrayList();
-
-    /** Custom event renderers hashed by topic. */
-    private final Map eventRenderers = new HashMap();
-
-    // the service registration of this plugin
-    private ServiceRegistration eventReceiver;
-
-
-    public EventAdminServlet()
-    {
-        eventRenderers.put( ServiceEvent.class.getName().replace( '.', '/' ) + "/", new ServiceEventInfoProvider() );
-        eventRenderers.put( BundleEvent.class.getName().replace( '.', '/' ) + "/", new BundleEventInfoProvider() );
-    }
-
-
-    public String getLabel()
-    {
-        return LABEL;
-    }
-
-
-    public String getTitle()
-    {
-        return TITLE;
-    }
-
-
-    /**
-     * Activate this component.
-     */
-    public void activate( BundleContext context )
-    {
-        super.activate( context );
-
-        this.events.clear();
-
-        // register as EventHandler service to receive events
-        Dictionary props = new Hashtable();
-        props.put( Constants.SERVICE_DESCRIPTION, "EventAdmin plugin for the Felix Web Console" );
-        props.put( Constants.SERVICE_VENDOR, "The Apache Software Foundation" );
-        props.put( "event.topics", "*" );
-        eventReceiver = context.registerService( EventHandler.class.getName(), this, props );
-    }
-
-
-    /**
-     * Deactivate this component.
-     */
-    public void deactivate()
-    {
-        if ( eventReceiver != null )
-        {
-            eventReceiver.unregister();
-            eventReceiver = null;
-        }
-
-        this.events.clear();
-
-        super.deactivate();
-    }
-
-
-    /**
-     * @see org.osgi.service.event.EventHandler#handleEvent(org.osgi.service.event.Event)
-     */
-    public void handleEvent( Event event )
-    {
-        // we add everything which is not a log event
-        if ( !event.getTopic().startsWith( "org/osgi/service/log" ) )
-        {
-            synchronized ( this.events )
-            {
-                this.events.add( new EventInfo( event ) );
-                if ( events.size() > this.maxSize )
-                {
-                    events.remove( 0 );
-                }
-            }
-        }
-    }
-
-
-    protected void doPost( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException
-    {
-        final String action = getParameter( req, "action" );
-        // for now we only have the clear action
-        if ( "clear".equals( action ) )
-        {
-            synchronized ( this.events )
-            {
-                this.events.clear();
-            }
-        }
-        // we always send back the json data
-        resp.setContentType( "application/json" );
-        resp.setCharacterEncoding( "utf-8" );
-
-        renderJSON( resp.getWriter() );
-    }
-
-
-    private void renderJSON( final PrintWriter pw ) throws IOException
-    {
-        List copiedEvents;
-        synchronized ( this.events )
-        {
-            copiedEvents = new ArrayList( this.events );
-        }
-        // create status line
-        final EventAdmin admin = ( EventAdmin ) this.getService( EventAdmin.class.getName() );
-        StringBuffer statusLine = new StringBuffer();
-        if ( admin == null )
-        {
-            statusLine.append( "Event Admin is not installed/running." );
-        }
-        else
-        {
-            statusLine.append( "Event Admin is running." );
-        }
-        statusLine.append( " " );
-        statusLine.append( copiedEvents.size() );
-        statusLine.append( " Events received" );
-        if ( !copiedEvents.isEmpty() )
-        {
-            statusLine.append( " since " );
-            Date d = new Date();
-            d.setTime( ( ( EventInfo ) copiedEvents.get( 0 ) ).received );
-            statusLine.append( d );
-        }
-        statusLine.append( "." );
-
-        JSONWriter jw = new JSONWriter( pw );
-        try
-        {
-            jw.object();
-
-            jw.key( "status" );
-            jw.value( statusLine );
-
-            jw.key( "data" );
-
-            jw.array();
-
-            // display list in reverse order
-            for ( int index = copiedEvents.size() - 1; index >= 0; index-- )
-            {
-                eventJson( jw, ( EventInfo ) copiedEvents.get( index ), index );
-            }
-
-            jw.endArray();
-
-            jw.endObject();
-
-        }
-        catch ( JSONException je )
-        {
-            throw new IOException( je.toString() );
-        }
-
-    }
-
-
-    protected void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException,
-        IOException
-    {
-
-        final String info = request.getPathInfo();
-        if ( info.endsWith( ".json" ) )
-        {
-            response.setContentType( "application/json" );
-            response.setCharacterEncoding( "UTF-8" );
-
-            PrintWriter pw = response.getWriter();
-            this.renderJSON( pw );
-
-            // nothing more to do
-            return;
-        }
-
-        super.doGet( request, response );
-    }
-
-
-    protected void renderContent( HttpServletRequest request, HttpServletResponse response ) throws ServletException,
-        IOException
-    {
-        final PrintWriter pw = response.getWriter();
-
-        final String appRoot = ( String ) request.getAttribute( WebConsoleConstants.ATTR_APP_ROOT );
-        Util.script(pw, appRoot, "events.js");
-
-        pw.println( "<div id='plugin_content'/>");
-
-        Util.startScript( pw );
-        pw.println( "renderEvents( );" );
-        Util.endScript( pw );
-    }
-
-
-    private void eventJson( JSONWriter jw, EventInfo info, int index ) throws JSONException
-    {
-        final Event e = info.event;
-
-        // check if we have an info provider
-        final Iterator iter = this.eventRenderers.entrySet().iterator();
-        String infoText = null;
-        while ( infoText == null && iter.hasNext() )
-        {
-            final Map.Entry entry = ( Map.Entry ) iter.next();
-            if ( e.getTopic().startsWith( entry.getKey().toString() ) )
-            {
-                infoText = ( ( EventInfoProvider ) entry.getValue() ).getInfo( e );
-            }
-        }
-
-        jw.object();
-        jw.key( "id" );
-        jw.value( String.valueOf( index ) );
-        jw.key( "received" );
-        jw.value( info.received );
-        jw.key( "topic" );
-        jw.value( e.getTopic() );
-        if ( infoText != null )
-        {
-            jw.key( "info" );
-            jw.value( infoText );
-        }
-        jw.key( "properties" );
-        jw.object();
-        final String[] names = e.getPropertyNames();
-        if ( names != null && names.length > 0 )
-        {
-            for ( int i = 0; i < names.length; i++ )
-            {
-                jw.key( names[i] );
-                jw.value( e.getProperty( names[i] ).toString() );
-            }
-        }
-        jw.endObject();
-
-        jw.endObject();
-    }
-
-    private static final class EventInfo
-    {
-
-        public final Event event;
-        public final long received;
-
-
-        public EventInfo( final Event e )
-        {
-            this.event = e;
-            this.received = System.currentTimeMillis();
-        }
-    }
-
-    private static interface EventInfoProvider
-    {
-        String getInfo( Event event );
-    }
-
-    private static final class ServiceEventInfoProvider implements EventInfoProvider
-    {
-
-        /**
-         * @see org.apache.felix.webconsole.internal.misc.EventAdminServlet.EventInfoProvider#getInfo(org.osgi.service.event.Event)
-         */
-        public String getInfo( Event event )
-        {
-            final ServiceEvent serviceEvent = ( ServiceEvent ) event.getProperty( EventConstants.EVENT );
-            if ( serviceEvent == null )
-            {
-                return null;
-            }
-            final StringBuffer buffer = new StringBuffer( "Service " );
-            buffer.append( serviceEvent.getServiceReference().getProperty( Constants.SERVICE_ID ) );
-            buffer.append( ' ' );
-            switch ( serviceEvent.getType() )
-            {
-                case ServiceEvent.REGISTERED:
-                    buffer.append( "registered" );
-                    break;
-                case ServiceEvent.MODIFIED:
-                    buffer.append( "modified" );
-                    break;
-                case ServiceEvent.UNREGISTERING:
-                    buffer.append( "unregistering" );
-                    break;
-                default:
-                    return null; // IGNOREE
-            }
-
-            return buffer.toString();
-        }
-    }
-
-    private static final class BundleEventInfoProvider implements EventInfoProvider
-    {
-
-        /**
-         * @see org.apache.felix.webconsole.internal.misc.EventAdminServlet.EventInfoProvider#getInfo(org.osgi.service.event.Event)
-         */
-        public String getInfo( Event event )
-        {
-            final BundleEvent bundleEvent = ( BundleEvent ) event.getProperty( EventConstants.EVENT );
-            if ( bundleEvent == null )
-            {
-                return null;
-            }
-            final StringBuffer buffer = new StringBuffer( "Bundle " );
-            buffer.append( bundleEvent.getBundle().getSymbolicName() );
-            buffer.append( ' ' );
-            switch ( bundleEvent.getType() )
-            {
-                case BundleEvent.INSTALLED:
-                    buffer.append( "installed" );
-                    break;
-                case BundleEvent.RESOLVED:
-                    buffer.append( "resolved" );
-                    break;
-                case BundleEvent.STARTED:
-                    buffer.append( "started" );
-                    break;
-                case BundleEvent.STARTING:
-                    buffer.append( "starting" );
-                    break;
-                case BundleEvent.STOPPED:
-                    buffer.append( "stopped" );
-                    break;
-                case BundleEvent.STOPPING:
-                    buffer.append( "stopping" );
-                    break;
-                case BundleEvent.UNINSTALLED:
-                    buffer.append( "uninstalled" );
-                    break;
-                case BundleEvent.UNRESOLVED:
-                    buffer.append( "unresolved" );
-                    break;
-                case BundleEvent.UPDATED:
-                    buffer.append( "updated" );
-                    break;
-                default:
-                    return null; // IGNOREE
-            }
-
-            return buffer.toString();
-        }
-    }
-}
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 616dc09..6590479 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
@@ -18,37 +18,16 @@
 
 
 import java.io.IOException;
-import java.util.Collection;
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
-import javax.servlet.GenericServlet;
-import javax.servlet.Servlet;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import javax.servlet.*;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.felix.webconsole.AbstractWebConsolePlugin;
-import org.apache.felix.webconsole.Action;
-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.Util;
-import org.apache.felix.webconsole.internal.WebConsolePluginAdapter;
+import org.apache.felix.webconsole.*;
+import org.apache.felix.webconsole.internal.*;
 import org.apache.felix.webconsole.internal.core.BundlesServlet;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.ServiceRegistration;
+import org.osgi.framework.*;
 import org.osgi.service.http.HttpContext;
 import org.osgi.service.http.HttpService;
 import org.osgi.service.log.LogService;
@@ -127,7 +106,6 @@
             "org.apache.felix.webconsole.internal.core.InstallAction",
             "org.apache.felix.webconsole.internal.core.SetStartLevelAction",
             "org.apache.felix.webconsole.internal.deppack.DepPackServlet",
-            "org.apache.felix.webconsole.internal.misc.EventAdminServlet",
             "org.apache.felix.webconsole.internal.misc.LicenseServlet",
             "org.apache.felix.webconsole.internal.misc.ConfigurationRender",
             "org.apache.felix.webconsole.internal.misc.ShellServlet",
