diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java
index ee4644a..199aa68 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java
@@ -514,11 +514,11 @@
         // now is the time to configure the service, meaning all required
         // dependencies will be set and any callbacks called
         configureService(state);
+        // flag that our instance has been created
+        m_isInstantiated = true;
         // then we invoke the init callback so the service can further initialize
         // itself
         invoke(init);
-        // flag that our instance has been created
-        m_isInstantiated = true;
         // see if any of this caused further state changes
         calculateStateChanges();
     }
@@ -563,12 +563,12 @@
         synchronized (this) {
             destroy = m_callbackDestroy;
         }
+        // flag that our instance was destroyed
+        m_isInstantiated = false;
         // invoke the destroy callback
         invoke(destroy);
         // destroy the service instance
         destroyService(state);
-        // flag that our instance was destroyed
-        m_isInstantiated = false;
     }
     
     private void invoke(String name) {
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/State.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/State.java
index 1d41521..1f6a2c1 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/State.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/State.java
@@ -116,12 +116,16 @@
         if (m_stringValue == null) {
             // we only need to determine this once, but we do it lazily
             StringBuffer buf = new StringBuffer();
-            buf.append("State[" + STATES[m_state] + "|");
+            buf.append("State[" + STATES[m_state]);
             List deps = m_deps;
             for (int i = 0; i < deps.size(); i++) {
+                if (i == 0) {
+                    buf.append("|");
+                }
                 Dependency dep = (Dependency) deps.get(i);
-                buf.append("(" + dep + (dep.isRequired() ? " R" : " O") + (dep.isAvailable() ? " +" : " -") + ")");
+                buf.append("(" + (dep.isRequired() ? "Req " : "   ") + (dep.isAvailable() ? "Avl " : "    ") + (dep.isInstanceBound() ? "InB " : "    ") + (dep.isPropagated() ? "Prp " : "    ") + dep + ")");
             }
+            buf.append("]");
             m_stringValue = buf.toString();
         }
         return m_stringValue;
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/AspectTest.java b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/AspectTest.java
index 817861b..306625c 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/AspectTest.java
+++ b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/AspectTest.java
@@ -58,16 +58,17 @@
         Service sa = m.createAspectService(ServiceInterface.class, "(|(!(" + Constants.SERVICE_RANKING + "=*))(" + Constants.SERVICE_RANKING + "<=0))", new ServiceAspect(e), new Properties() {{ put(Constants.SERVICE_RANKING, Integer.valueOf(1)); }} );
         m.add(sc);
         m.add(sp);
-        m.add(sp2);
         e.waitForStep(3, 2000);
         m.add(sa);
         e.waitForStep(4, 2000);
-        e.step(5);
-        e.waitForStep(8, 2000);
+        m.add(sp2);
+        e.waitForStep(5, 2000);
+        e.step(6);
+        e.waitForStep(9, 2000);
         m.remove(sa);
-        e.waitForStep(10, 2000);
-        e.step(11);
-        e.waitForStep(12, 2000);
+        e.waitForStep(11, 2000);
+        e.step(12);
+        e.waitForStep(13, 2000);
         m.remove(sp2);
         m.remove(sp);
         m.remove(sc);
@@ -89,7 +90,7 @@
         }
 
         public void invoke() {
-            m_ensure.step(8);
+            m_ensure.step(9);
         }
     }
 
@@ -115,18 +116,19 @@
         }
         public void init() {
             m_service.add(m_manager.createServiceDependency().setInstanceBound(true).setRequired(true).setService(ServiceInterface2.class));
-        }
-        public void start() {
             m_ensure.step(4);
         }
+        public void start() {
+            m_ensure.step(5);
+        }
         public void invoke(Runnable run) {
-            m_ensure.step(6);
+            m_ensure.step(7);
             m_originalService.invoke(run);
             m_injectedService.invoke();
         }
         
         public void stop() {
-            m_ensure.step(10);
+            m_ensure.step(11);
         }
     }
 
@@ -147,11 +149,11 @@
             m_ensure.step(1);
             m_service.invoke(Ensure.createRunnableStep(m_ensure, 2));
             m_ensure.step(3);
-            m_ensure.waitForStep(5, 2000);
-            m_service.invoke(Ensure.createRunnableStep(m_ensure, 7));
-            m_ensure.step(9);
-            m_ensure.waitForStep(11, 2000);
-            m_service.invoke(Ensure.createRunnableStep(m_ensure, 12));
+            m_ensure.waitForStep(6, 2000);
+            m_service.invoke(Ensure.createRunnableStep(m_ensure, 8));
+            m_ensure.step(10);
+            m_ensure.waitForStep(12, 2000);
+            m_service.invoke(Ensure.createRunnableStep(m_ensure, 13));
         }
     }
 }
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/Ensure.java b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/Ensure.java
index a6b89cb..deb2398 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/Ensure.java
+++ b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/Ensure.java
@@ -18,6 +18,8 @@
  */
 package org.apache.felix.dm.test;
 
+import java.io.PrintStream;
+
 import junit.framework.Assert;
 
 /**
@@ -29,6 +31,7 @@
     private static final boolean DEBUG = true;
     private static long INSTANCE = 0;
     private static final int RESOLUTION = 100;
+    private static PrintStream STREAM = System.out;
     int step = 0;
     
     public Ensure() {
@@ -37,6 +40,10 @@
         }
     }
 
+    public void setStream(PrintStream output) {
+        STREAM = output;
+    }
+    
     /**
      * Mark this point as step <code>nr</code>.
      * 
@@ -46,7 +53,7 @@
         step++;
         Assert.assertEquals(nr, step);
         if (DEBUG) {
-            System.out.println("[Ensure " + INSTANCE + "] step " + step);
+            STREAM.println("[Ensure " + INSTANCE + "] step " + step);
         }
         notifyAll();
     }
@@ -63,7 +70,7 @@
     public synchronized void waitForStep(int nr, int timeout) {
         final int initialTimeout = timeout;
         if (DEBUG) {
-            System.out.println("[Ensure " + INSTANCE + "] waiting for step " + nr);
+            STREAM.println("[Ensure " + INSTANCE + "] waiting for step " + nr);
         }
         while (step < nr && timeout > 0) {
             try {
@@ -76,7 +83,7 @@
             throw new IllegalStateException("Timed out waiting for " + initialTimeout + " ms for step " + nr + ", we are still at step " + step);
         }
         if (DEBUG) {
-            System.out.println("[Ensure " + INSTANCE + "] arrived at step " + nr);
+            STREAM.println("[Ensure " + INSTANCE + "] arrived at step " + nr);
         }
     }
     
