diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/Base.java b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/Base.java
index 5615dd3..101e163 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/Base.java
+++ b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/Base.java
@@ -26,72 +26,74 @@
 import org.junit.After;
 import org.junit.Before;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.FrameworkListener;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.log.LogService;
 
 /**
  * Base class for all test cases.
  */
-public class Base implements LogService {
+public class Base implements LogService, FrameworkListener {
     public static final String OSGI_SPEC_VERSION = "4.2.0";
     private final static int LOG_LEVEL = LogService.LOG_WARNING;
-    
+    private volatile boolean m_errorsLogged;
+
     /**
      * Register us as a LogService
+     * 
      * @param context
      */
     @Before
-    public void startup(BundleContext context)
-    {
+    public void startup(BundleContext context) {
         context.registerService(LogService.class.getName(), this, null);
+        context.addFrameworkListener(this);
     }
 
     /**
-     * Always cleanup our bundle location file (because pax seems to forget to cleanup it)
+     * Always cleanup our bundle location file (because pax seems to forget to
+     * cleanup it)
+     * 
      * @param context
      */
-    
+
     @After
-    public void tearDown(BundleContext context)
-    {
-        // The following code forces the temporary bundle files (from /tmp/tb/*) to be deleted when jvm exits
+    public void tearDown(BundleContext context) {
+        // The following code forces the temporary bundle files (from /tmp/tb/*)
+        // to be deleted when jvm exits
         // (this patch seems to be only required with pax examp 2.0.0)
 
-        try
-        {
+        try {
             File f = new File(new URL(context.getBundle().getLocation()).getPath());
             f.deleteOnExit();
-        }
-        catch (Throwable t)
-        {
+        } catch (Throwable t) {
             t.printStackTrace();
         }
+        context.removeFrameworkListener(this);
     }
 
     /**
      * Suspend the current thread for a while.
-     * @param n the number of milliseconds to wait for.
+     * 
+     * @param n
+     *            the number of milliseconds to wait for.
      */
-    protected void sleep(int ms)
-    {
-        try
-        {
+    protected void sleep(int ms) {
+        try {
             Thread.sleep(ms);
-        }
-        catch (InterruptedException e)
-        {
+        } catch (InterruptedException e) {
         }
     }
 
-    public void log(int level, String message)
-    {
+    public void log(int level, String message) {
+        checkError(level, null);
         if (LOG_LEVEL >= level) {
             System.out.println(getLevel(level) + " " + message);
         }
     }
 
-    public void log(int level, String message, Throwable exception)
-    {
+    public void log(int level, String message, Throwable exception) {
+        checkError(level, exception);
         if (LOG_LEVEL >= level) {
             StringBuilder sb = new StringBuilder();
             sb.append(getLevel(level) + " ");
@@ -101,8 +103,8 @@
         }
     }
 
-    public void log(ServiceReference sr, int level, String message)
-    {
+    public void log(ServiceReference sr, int level, String message) {
+        checkError(level, null);
         if (LOG_LEVEL >= level) {
             StringBuilder sb = new StringBuilder();
             sb.append(getLevel(level) + " ");
@@ -111,8 +113,8 @@
         }
     }
 
-    public void log(ServiceReference sr, int level, String message, Throwable exception)
-    {
+    public void log(ServiceReference sr, int level, String message, Throwable exception) {
+        checkError(level, exception);
         if (LOG_LEVEL >= level) {
             StringBuilder sb = new StringBuilder();
             sb.append(getLevel(level) + " ");
@@ -122,26 +124,72 @@
         }
     }
 
-    private void parse(StringBuilder sb, Throwable t)
-    {
-        if (t != null)
-        {
+    protected boolean errorsLogged() {
+        return m_errorsLogged;
+    }
+
+    private void parse(StringBuilder sb, Throwable t) {
+        if (t != null) {
             sb.append(" - ");
             StringWriter buffer = new StringWriter();
             PrintWriter pw = new PrintWriter(buffer);
             t.printStackTrace(pw);
             sb.append(buffer.toString());
+            m_errorsLogged = true;
         }
     }
-    
+
     private String getLevel(int level) {
-        switch(level) 
-        {
-            case LogService.LOG_DEBUG: return "DEBUG";
-            case LogService.LOG_ERROR: return "ERROR";
-            case LogService.LOG_INFO: return "INFO";
-            case LogService.LOG_WARNING: return "WARN";
-            default: return "";
+        switch (level) {
+        case LogService.LOG_DEBUG:
+            return "DEBUG";
+        case LogService.LOG_ERROR:
+            return "ERROR";
+        case LogService.LOG_INFO:
+            return "INFO";
+        case LogService.LOG_WARNING:
+            return "WARN";
+        default:
+            return "";
+        }
+    }
+
+    private void checkError(int level, Throwable exception) {
+        if (level >= LOG_ERROR) {
+            m_errorsLogged = true;
+        }
+        if (exception != null) {
+            m_errorsLogged = true;
+        }
+    }
+
+    public void frameworkEvent(FrameworkEvent event) {
+        int eventType = event.getType();
+        String msg = getFrameworkEventMessage(eventType);
+        int level = (eventType == FrameworkEvent.ERROR) ? LOG_ERROR : LOG_WARNING;
+        if (msg != null) {
+            log(level, msg, event.getThrowable());
+        } else {
+            log(level, "Unknown fwk event: " + event);
+        }
+    }
+
+    private String getFrameworkEventMessage(int event) {
+        switch (event) {
+        case FrameworkEvent.ERROR:
+            return "FrameworkEvent: ERROR";
+        case FrameworkEvent.INFO:
+            return "FrameworkEvent INFO";
+        case FrameworkEvent.PACKAGES_REFRESHED:
+            return "FrameworkEvent: PACKAGE REFRESHED";
+        case FrameworkEvent.STARTED:
+            return "FrameworkEvent: STARTED";
+        case FrameworkEvent.STARTLEVEL_CHANGED:
+            return "FrameworkEvent: STARTLEVEL CHANGED";
+        case FrameworkEvent.WARNING:
+            return "FrameworkEvent: WARNING";
+        default:
+            return null;
         }
     }
 }
