diff --git a/extender/src/main/java/org/eclipse/gemini/blueprint/extender/internal/activator/ListListenerAdapter.java b/extender/src/main/java/org/eclipse/gemini/blueprint/extender/internal/activator/ListListenerAdapter.java
index 1246757..45048d9 100644
--- a/extender/src/main/java/org/eclipse/gemini/blueprint/extender/internal/activator/ListListenerAdapter.java
+++ b/extender/src/main/java/org/eclipse/gemini/blueprint/extender/internal/activator/ListListenerAdapter.java
@@ -1,5 +1,5 @@
 /******************************************************************************
- * Copyright (c) 2006, 2010 VMware Inc.
+ * Copyright (c) 2006, 2012 VMware Inc.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * and Apache License v2.0 which accompanies this distribution. 
@@ -30,14 +30,14 @@
  * dynamic collections which can be updated during iteration.
  * 
  * @author Costin Leau
- * 
  */
 @SuppressWarnings("unchecked")
 class ListListenerAdapter implements OsgiBundleApplicationContextListener<OsgiBundleApplicationContextEvent>,
 		InitializingBean, DisposableBean {
 
 	private final ServiceTracker tracker;
-	private final Map<Class<? extends OsgiBundleApplicationContextListener>, Class<? extends OsgiBundleApplicationContextEvent>> eventCache =
+	@SuppressWarnings("rawtypes")
+    private final Map<Class<? extends OsgiBundleApplicationContextListener>, Class<? extends OsgiBundleApplicationContextEvent>> eventCache =
 			new WeakHashMap<Class<? extends OsgiBundleApplicationContextListener>, Class<? extends OsgiBundleApplicationContextEvent>>();
 
 	/**
@@ -56,13 +56,14 @@
 		eventCache.clear();
 	}
 
-	public void onOsgiApplicationEvent(OsgiBundleApplicationContextEvent event) {
+	@SuppressWarnings("rawtypes")
+    public void onOsgiApplicationEvent(OsgiBundleApplicationContextEvent event) {
 		Object[] listeners = tracker.getServices();
 
 		if (listeners != null) {
 			synchronized (eventCache) {
 				for (Object listnr : listeners) {
-					OsgiBundleApplicationContextListener listener = (OsgiBundleApplicationContextListener) listnr;
+                    OsgiBundleApplicationContextListener listener = (OsgiBundleApplicationContextListener) listnr;
 					Class<? extends OsgiBundleApplicationContextListener> listenerClass = listener.getClass();
 					Class<? extends OsgiBundleApplicationContextEvent> eventType = eventCache.get(listenerClass);
 					if (eventType == null) {
@@ -72,7 +73,7 @@
 						if (evtType == null) {
 							evtType = OsgiBundleApplicationContextEvent.class;
 						}
-						if (evtType != null && evtType.isAssignableFrom(OsgiBundleApplicationContextEvent.class)) {
+						if (evtType != null && OsgiBundleApplicationContextEvent.class.isAssignableFrom(evtType)) {
 							eventType = (Class<? extends OsgiBundleApplicationContextEvent>) evtType;
 						} else {
 							eventType = OsgiBundleApplicationContextEvent.class;
diff --git a/extender/src/test/java/org/eclipse/gemini/blueprint/extender/internal/activator/ListListenerAdapterTest.java b/extender/src/test/java/org/eclipse/gemini/blueprint/extender/internal/activator/ListListenerAdapterTest.java
index c9735bb..5410ce0 100644
--- a/extender/src/test/java/org/eclipse/gemini/blueprint/extender/internal/activator/ListListenerAdapterTest.java
+++ b/extender/src/test/java/org/eclipse/gemini/blueprint/extender/internal/activator/ListListenerAdapterTest.java
@@ -25,6 +25,7 @@
 import org.eclipse.gemini.blueprint.service.importer.event.OsgiServiceDependencyEvent;
 import org.eclipse.gemini.blueprint.context.event.OsgiBundleApplicationContextEvent;
 import org.eclipse.gemini.blueprint.context.event.OsgiBundleApplicationContextListener;
+import org.eclipse.gemini.blueprint.context.event.OsgiBundleContextClosedEvent;
 import org.eclipse.gemini.blueprint.context.support.OsgiBundleXmlApplicationContext;
 import org.eclipse.gemini.blueprint.extender.event.BootstrappingDependenciesEvent;
 import org.osgi.framework.InvalidSyntaxException;
@@ -38,78 +39,107 @@
 
 public class ListListenerAdapterTest extends TestCase {
 
+    private final class TestBundleContext extends MockBundleContext {
+
+        private TestBundleContext() {
+        }
+
+        public ServiceReference[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
+            return null;
+        }
+
+        public Object getService(ServiceReference reference) {
+            if (reference != null) {
+                Object service = reference.getProperty(SERVICE_PROPERTY);
+                if (service != null) {
+                    return service;
+                }
+            }
+
+            return super.getService(reference);
+        }
+
+        @SuppressWarnings("rawtypes")
+        public ServiceRegistration registerService(String[] clazzes, final Object service, Dictionary properties) {
+            MockServiceRegistration reg = new MockServiceRegistration(properties);
+
+            MockServiceReference ref = new MockServiceReference(getBundle(), properties, reg, clazzes) {
+
+                @Override
+                public Object getProperty(String key) {
+                    if (SERVICE_PROPERTY.equals(key)) {
+                        return service;
+                    } else {
+                        return super.getProperty(key);
+                    }
+                }
+
+            };
+            ServiceEvent event = new ServiceEvent(ServiceEvent.REGISTERED, ref);
+
+            for (Iterator iter = serviceListeners.iterator(); iter.hasNext();) {
+                ServiceListener listener = (ServiceListener) iter.next();
+                listener.serviceChanged(event);
+            }
+
+            return reg;
+        }
+    }
+
     private static final String SERVICE_PROPERTY = "service";
-    
+
     private boolean fired;
 
-    public void testX() throws Exception {
-        
-        fired = false;
+    private MockBundleContext ctx;
 
-        final OsgiBundleApplicationContextListener<OsgiBundleApplicationContextEvent> listener = new OsgiBundleApplicationContextListener<OsgiBundleApplicationContextEvent>() {
+    private ListListenerAdapter adapter;
+    
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        fired = false;
+        ctx = new TestBundleContext();
+        adapter = new ListListenerAdapter(ctx);
+        adapter.afterPropertiesSet();
+    }
+    
+    @Override
+    protected void tearDown() throws Exception {
+        adapter.destroy();
+        super.tearDown();
+    }
+
+    public void testNormal() throws Exception {
+
+        OsgiBundleApplicationContextListener<OsgiBundleApplicationContextEvent> listener = new OsgiBundleApplicationContextListener<OsgiBundleApplicationContextEvent>() {
 
             public void onOsgiApplicationEvent(OsgiBundleApplicationContextEvent event) {
                 fired = true;
             }
         };
 
-        final ServiceReference ref = null;
-
-        MockBundleContext ctx = new MockBundleContext() {
-
-            public ServiceReference getServiceReference(String clazz) {
-                return ref;
-            }
-
-            public ServiceReference[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
-                return new ServiceReference[] { ref };
-            }
-
-            public Object getService(ServiceReference reference) {
-                if (reference != null) {
-                    Object service = reference.getProperty(SERVICE_PROPERTY);
-                    if (service != null) {
-                        return service;
-                    }
-                }
-
-                return (reference == ref ? listener : super.getService(reference));
-            }
-
-            @SuppressWarnings("rawtypes")
-            public ServiceRegistration registerService(String[] clazzes, final Object service, Dictionary properties) {
-                MockServiceRegistration reg = new MockServiceRegistration(properties);
-
-                MockServiceReference ref = new MockServiceReference(getBundle(), properties, reg, clazzes) {
-
-                    @Override
-                    public Object getProperty(String key) {
-                        if (SERVICE_PROPERTY.equals(key)) {
-                            return service;
-                        } else {
-                            return super.getProperty(key);
-                        }
-                    }
-
-                };
-                ServiceEvent event = new ServiceEvent(ServiceEvent.REGISTERED, ref);
-
-                for (Iterator iter = serviceListeners.iterator(); iter.hasNext();) {
-                    ServiceListener listener = (ServiceListener) iter.next();
-                    listener.serviceChanged(event);
-                }
-
-                return reg;
-            }
-
-        };
-
-        ListListenerAdapter adapter = new ListListenerAdapter(ctx);
-        adapter.afterPropertiesSet();
         ctx.registerService(OsgiBundleApplicationContextListener.class.getName(), listener, null);
+        
         adapter.onOsgiApplicationEvent(new BootstrappingDependenciesEvent(new OsgiBundleXmlApplicationContext(), new MockBundle(),
             new ArrayList<OsgiServiceDependencyEvent>(), null, 0));
         Assert.assertTrue(fired);
-        adapter.destroy();
+    }
+
+    public void testEventFiltering() throws Exception {
+
+        OsgiBundleApplicationContextListener<OsgiBundleContextClosedEvent> listener = new OsgiBundleApplicationContextListener<OsgiBundleContextClosedEvent>() {
+
+            public void onOsgiApplicationEvent(OsgiBundleContextClosedEvent event) {
+                fired = true;
+            }
+        };
+
+        ctx.registerService(OsgiBundleApplicationContextListener.class.getName(), listener, null);
+        
+        adapter.onOsgiApplicationEvent(new BootstrappingDependenciesEvent(new OsgiBundleXmlApplicationContext(), new MockBundle(),
+            new ArrayList<OsgiServiceDependencyEvent>(), null, 0));
+        
+        adapter.onOsgiApplicationEvent(new OsgiBundleContextClosedEvent(new OsgiBundleXmlApplicationContext(), new MockBundle()));
+        Assert.assertTrue(fired);
     }
 }
