diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
index fa112dd..4b109c9 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
@@ -928,17 +928,14 @@
             obtainStateLock( "AbstractComponentManager.State.doDeactivate.1" );
             try
             {
-                if ( m_activated )
+                m_activated = false;
+                deleteComponent( reason );
+                deactivateDependencyManagers();
+                if ( disable )
                 {
-                    m_activated = false;
-                    deleteComponent( reason );
-                    deactivateDependencyManagers();
-                    if ( disable )
-                    {
-                        disableDependencyManagers();
-                    }
-                    unsetDependenciesCollected();
+                    disableDependencyManagers();
                 }
+                unsetDependenciesCollected();
             }
             finally
             {
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
index 1ba82f6..c502f10 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
@@ -202,6 +202,15 @@
             m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracker opened", new Object[] {getName()}, null );
         }
 
+        protected void deactivateTracker()
+        {
+            ServiceTracker<T, RefPair<T>> tracker = getTracker();
+            if ( tracker != null )
+            {
+                tracker.deactivate();
+            }
+        }
+
         protected Map<ServiceReference<T>, RefPair<T>> getPreviousRefMap()
         {
             return previousRefMap;
@@ -283,7 +292,7 @@
 
         public void close()
         {
-            getTracker().deactivate();
+            deactivateTracker();
         }
 
         public Collection<RefPair<T>> getRefs( AtomicInteger trackingCount )
@@ -315,6 +324,7 @@
             {
                 if (isActive())
                 {
+                    m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} MultipleDynamic already active, binding {2}", new Object[] {getName(), trackingCount, serviceReference}, null );
                     getServiceObject( m_bindMethods.getBind(), refPair );
                     if ( !refPair.isFailed() )
                     {
@@ -326,10 +336,15 @@
                 }
                 else if ( isTrackerOpened() && !isOptional() )
                 {
+                    m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} MultipleDynamic, activating", new Object[] {getName(), trackingCount}, null );
                     tracked( trackingCount );
                     tracked = true;
                     m_componentManager.activateInternal( trackingCount );
                 }
+                else 
+                {
+                    m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} MultipleDynamic, inactive, doing nothing: tracker opened: {2}, optional: {3}", new Object[] {getName(), trackingCount, isTrackerOpened(), isOptional()}, null );                    
+                }
             }
             m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} MultipleDynamic added {2} (exit)", new Object[] {getName(), trackingCount, serviceReference}, null );
             if ( !tracked )
@@ -401,7 +416,7 @@
             {
                 ungetService( ref );
             }
-            getTracker().deactivate();
+            deactivateTracker();
         }
 
 
@@ -519,7 +534,7 @@
             {
                 ungetService( ref );
             }
-            getTracker().deactivate();
+            deactivateTracker();
         }
 
         public Collection<RefPair<T>> getRefs( AtomicInteger trackingCount )
@@ -645,7 +660,7 @@
                     ungetService( ref );
                 }
             }
-            getTracker().deactivate();
+            deactivateTracker();
         }
 
         public Collection<RefPair<T>> getRefs( AtomicInteger trackingCount )
@@ -847,7 +862,7 @@
         public void close()
         {
             closeRefPair();
-            getTracker().deactivate();
+            deactivateTracker();
         }
 
         private void closeRefPair()
@@ -949,10 +964,20 @@
             synchronized (getTracker().tracked())
             {
                 reactivate = ( isActive() && refPair == this.refPair) || ( !isOptional() && getTracker().isEmpty());
+                if (!reactivate && refPair == this.refPair) {
+                    this.refPair = null;
+                }
             }
             if ( reactivate )
             {
                 m_componentManager.deactivateInternal( ComponentConstants.DEACTIVATION_REASON_REFERENCE, false, false );
+                synchronized ( getTracker().tracked() )
+                {
+                    if (refPair == this.refPair)
+                    {
+                        this.refPair = null;
+                    }
+                }
                 m_componentManager.activateInternal( trackingCount );
             }
             m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} SingleStatic removed {2} (exit)", new Object[] {getName(), trackingCount, serviceReference}, null );
@@ -989,17 +1014,21 @@
 
         public void close()
         {
-            RefPair<T> ref;
-            synchronized ( getTracker().tracked() )
+            ServiceTracker<T, RefPair<T>> tracker = getTracker();
+            if ( tracker != null )
             {
-                ref = refPair;
-                refPair = null;
+                RefPair<T> ref;
+                synchronized ( tracker.tracked() )
+                {
+                    ref = refPair;
+                    refPair = null;
+                }
+                if ( ref != null )
+                {
+                    ungetService( ref );
+                }
+                tracker.deactivate();
             }
-            if ( ref != null )
-            {
-                ungetService( ref );
-            }
-            getTracker().deactivate();
         }
 
         public Collection<RefPair<T>> getRefs( AtomicInteger trackingCount )
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java
index 8838314..b92105c 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java
@@ -303,8 +303,10 @@
                 {
                     md.close( implementationObject, componentContext.getEdgeInfo( md ) );
                 }
+                md.deactivate();
             }
             setter.resetImplementationObject( implementationObject );
+            unsetDependenciesCollected();
             return null;
 
         }
@@ -344,21 +346,23 @@
         componentContext.setImplementationAccessible( false );
         S implementationObject = componentContext.getImplementationObject( false );
 
-        // 1. Call the deactivate method, if present
-        // don't care for the result, the error (acccording to 112.5.12 If the deactivate
-        // method throws an exception, SCR must log an error message containing the
-        // exception with the Log Service and continue) has already been logged
-        final MethodResult result = getComponentMethods().getDeactivateMethod().invoke( implementationObject, new ActivatorParameter( componentContext,
-                reason ), null, this );
-        if ( result != null )
+        if ( implementationObject != null )
         {
-            setServiceProperties( result );
-        }
-
-        // 2. Unbind any bound services
-        for ( DependencyManager md: getReversedDependencyManagers() )
-        {
-            md.close( implementationObject, componentContext.getEdgeInfo( md ) );
+            // 1. Call the deactivate method, if present
+            // don't care for the result, the error (acccording to 112.5.12 If the deactivate
+            // method throws an exception, SCR must log an error message containing the
+            // exception with the Log Service and continue) has already been logged
+            final MethodResult result = getComponentMethods().getDeactivateMethod().invoke( implementationObject,
+                    new ActivatorParameter( componentContext, reason ), null, this );
+            if ( result != null )
+            {
+                setServiceProperties( result );
+            }
+            // 2. Unbind any bound services
+            for ( DependencyManager md: getReversedDependencyManagers() )
+            {
+                md.close( implementationObject, componentContext.getEdgeInfo( md ) );
+            }
         }
 
     }
