diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
index 41b1c24..584399a 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
@@ -510,7 +510,7 @@
     private boolean modify()
     {
         // 0. no live update if there is no instance
-        if ( getInstance() == null )
+        if ( hasInstance() )
         {
             return false;
         }
@@ -546,8 +546,7 @@
         // 4. call method (nothing to do when failed, since it has already been logged)
         //   (call with non-null default result to continue even if the
         //    modify method call failed)
-        final MethodResult result = getComponentMethods().getModifiedMethod().invoke( getInstance(),
-                new ActivatorParameter( m_componentContext, -1 ), MethodResult.VOID );
+        final MethodResult result = invokeModifiedMethod();
         if ( result == null )
         {
             // log an error if the declared method cannot be found
@@ -583,6 +582,17 @@
         return true;
     }
 
+    protected MethodResult invokeModifiedMethod()
+    {
+        return getComponentMethods().getModifiedMethod().invoke( getInstance(),
+                    new ActivatorParameter( m_componentContext, -1 ), MethodResult.VOID );
+    }
+
+    protected boolean hasInstance()
+    {
+        return getInstance() == null;
+    }
+
 
     /**
      * Checks if the given service registration properties matches another set
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
index 0c39e39..708dc09 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
@@ -24,7 +24,10 @@
 
 import org.apache.felix.scr.impl.BundleComponentActivator;
 import org.apache.felix.scr.impl.config.ComponentHolder;
+import org.apache.felix.scr.impl.helper.ActivateMethod;
 import org.apache.felix.scr.impl.helper.ComponentMethods;
+import org.apache.felix.scr.impl.helper.MethodResult;
+import org.apache.felix.scr.impl.helper.ModifiedMethod;
 import org.apache.felix.scr.impl.metadata.ComponentMetadata;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.ServiceReference;
@@ -75,7 +78,17 @@
      */
     protected void deleteComponent( int reason )
     {
-        // nothing to do, this is handled by ungetService
+        if ( !isWriteLocked() )
+        {
+            throw new IllegalStateException( "need write lock (deleteComponent)" );
+        }
+        for (Iterator i = serviceContexts.values().iterator(); i.hasNext(); )
+        {
+            BundleComponentContext componentContext = ( BundleComponentContext ) i.next();
+            i.remove();
+            disposeImplementationObject( componentContext.getInstance(), componentContext, reason );
+            log( LogService.LOG_DEBUG, "Unset implementation object for component {0} in deleteComponent", new Object[] { getName() },  null );
+        }
     }
 
 
@@ -225,6 +238,26 @@
         }
     }
 
+    protected MethodResult invokeModifiedMethod()
+    {
+        ModifiedMethod modifiedMethod = getComponentMethods().getModifiedMethod();
+        MethodResult result = null;
+        for (Iterator i = serviceContexts.values().iterator(); i.hasNext(); )
+        {
+            BundleComponentContext componentContext = ( BundleComponentContext ) i.next();
+            Object instance = componentContext.getInstance();
+            result = modifiedMethod.invoke( instance,
+                    new ActivateMethod.ActivatorParameter( componentContext, -1 ), MethodResult.VOID );
+
+        }
+        return result;
+    }
+
+    protected boolean hasInstance()
+    {
+        return !serviceContexts.isEmpty();
+    }
+
     //---------- Component interface
 
     public ComponentInstance getComponentInstance()
