diff --git a/scr/src/main/java/org/apache/felix/scr/impl/ScrCommand.java b/scr/src/main/java/org/apache/felix/scr/impl/ScrCommand.java
index 17fec75..ca29a8e 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/ScrCommand.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/ScrCommand.java
@@ -40,10 +40,11 @@
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.framework.dto.ServiceReferenceDTO;
 import org.osgi.service.component.runtime.ServiceComponentRuntime;
-import org.osgi.service.component.runtime.dto.BoundReferenceDTO;
 import org.osgi.service.component.runtime.dto.ComponentConfigurationDTO;
 import org.osgi.service.component.runtime.dto.ComponentDescriptionDTO;
 import org.osgi.service.component.runtime.dto.ReferenceDTO;
+import org.osgi.service.component.runtime.dto.SatisfiedReferenceDTO;
+import org.osgi.service.component.runtime.dto.UnsatisfiedReferenceDTO;
 
 /**
  * The <code>ScrCommand</code> class provides the implementations for the
@@ -407,13 +408,13 @@
         out.println( cc.id );
         out.print("    State: ");
         out.println( toStateString(cc.state));
-        for ( BoundReferenceDTO ref: cc.boundReferences) 
+        for ( SatisfiedReferenceDTO ref: cc.satisfiedReferences) 
         {
-            out.print( "    BoundReference: ");
+            out.print( "    SatisfiedReference: ");
             out.println( ref.name );
             out.print( "      Target: " );
             out.println( ref.target );
-          ServiceReferenceDTO[] serviceRefs = ref.serviceReferences;
+          ServiceReferenceDTO[] serviceRefs = ref.boundServices;
           if ( serviceRefs != null )
           {
               out.print( "      Bound to:" );
@@ -429,6 +430,28 @@
           }
 
         }
+        for ( UnsatisfiedReferenceDTO ref: cc.unsatisfiedReferences) 
+        {
+            out.print( "    UnsatisfiedReference: ");
+            out.println( ref.name );
+            out.print( "      Target: " );
+            out.println( ref.target );
+          ServiceReferenceDTO[] serviceRefs = ref.targetServices;
+          if ( serviceRefs != null )
+          {
+              out.print( "      Target services:" );
+              for ( ServiceReferenceDTO sr: serviceRefs )
+              {
+                  out.print( "        " );
+                  out.println( sr.id );
+              }
+          }
+          else
+          {
+              out.println( "      (unbound)" );
+          }
+
+        }
         propertyInfo( cc.properties, out, "    ");
     }
 
@@ -501,8 +524,8 @@
     {
         switch (state) {
 
-        case (ComponentConfigurationDTO.UNSATISFIED):
-            return "unsatisfied ";
+        case (ComponentConfigurationDTO.UNSATISFIED_REFERENCE):
+            return "unsatisfied reference";
         case (ComponentConfigurationDTO.ACTIVE):
             return "active      ";
         case (ComponentConfigurationDTO.SATISFIED):
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/config/ComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/config/ComponentManager.java
index f8c8572..5b65f01 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/config/ComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/config/ComponentManager.java
@@ -26,8 +26,9 @@
 
 public interface ComponentManager<S> {
 	
-	int STATE_SATISFIED = ComponentConfigurationDTO.SATISFIED;
-	int STATE_UNSATISFIED = ComponentConfigurationDTO.UNSATISFIED;
+    int STATE_UNSATISFIED_CONFIGURATION = ComponentConfigurationDTO.UNSATISFIED_CONFIGURATION;
+    int STATE_UNSATISFIED_REFERENCE = ComponentConfigurationDTO.UNSATISFIED_REFERENCE;
+    int STATE_SATISFIED = ComponentConfigurationDTO.SATISFIED;
 	int STATE_ACTIVE = ComponentConfigurationDTO.ACTIVE;
 	int STATE_DISPOSED = 32;
 	int STATE_DISABLED = 64; //TODO????
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/config/ReferenceManager.java b/scr/src/main/java/org/apache/felix/scr/impl/config/ReferenceManager.java
index b3b7b07..4ea4d91 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/config/ReferenceManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/config/ReferenceManager.java
@@ -45,4 +45,6 @@
 	 */
 	String getTarget();
 
+    boolean isSatisfied();
+
 }
\ No newline at end of file
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 61af91b..8eec1d8 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
@@ -614,6 +614,11 @@
     {
         return false;
     }
+    
+    protected boolean isSatisfied()
+    {
+        return m_satisfied;
+    }
 
 
     //-------------- atomic transition methods -------------------------------
@@ -1351,7 +1356,7 @@
         }
         if ( !m_satisfied )
         {
-            return STATE_UNSATISFIED;
+            return STATE_UNSATISFIED_REFERENCE;
         }
         if ( hasInstance() )
         {
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 42ad2e8..3959967 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
@@ -565,8 +565,7 @@
             obtainActivationWriteLock( "reconfigure" );
             try
             {
-                if ( getState() == STATE_UNSATISFIED
-                        && !getComponentMetadata().isConfigurationIgnored() )
+                if ( !isSatisfied() && !getComponentMetadata().isConfigurationIgnored() )
                 {
                     log( LogService.LOG_DEBUG, "Attempting to activate unsatisfied component", null );
                     updateTargets( getProperties() );
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/runtime/ServiceComponentRuntimeImpl.java b/scr/src/main/java/org/apache/felix/scr/impl/runtime/ServiceComponentRuntimeImpl.java
index 1bd73b6..2d375bb 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/runtime/ServiceComponentRuntimeImpl.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/runtime/ServiceComponentRuntimeImpl.java
@@ -36,10 +36,11 @@
 import org.osgi.framework.dto.BundleDTO;
 import org.osgi.framework.dto.ServiceReferenceDTO;
 import org.osgi.service.component.runtime.ServiceComponentRuntime;
-import org.osgi.service.component.runtime.dto.BoundReferenceDTO;
 import org.osgi.service.component.runtime.dto.ComponentConfigurationDTO;
 import org.osgi.service.component.runtime.dto.ComponentDescriptionDTO;
 import org.osgi.service.component.runtime.dto.ReferenceDTO;
+import org.osgi.service.component.runtime.dto.SatisfiedReferenceDTO;
+import org.osgi.service.component.runtime.dto.UnsatisfiedReferenceDTO;
 import org.osgi.util.promise.Promise;
 
 public class ServiceComponentRuntimeImpl implements ServiceComponentRuntime {
@@ -124,7 +125,8 @@
 	private ComponentConfigurationDTO managerToConfiguration(
 			ComponentManager<?> manager, ComponentDescriptionDTO description) {
 		ComponentConfigurationDTO dto = new ComponentConfigurationDTO();
-		dto.boundReferences = refManagersToDTO(manager.getReferenceManagers());
+        dto.satisfiedReferences = satisfiedRefManagersToDTO(manager.getReferenceManagers());
+        dto.unsatisfiedReferences = unsatisfiedRefManagersToDTO(manager.getReferenceManagers());
 		dto.description = description;
 		dto.id = manager.getId();
 		dto.properties = new HashMap<String, Object>(manager.getProperties());//TODO deep copy?
@@ -132,26 +134,51 @@
 		return dto;
 	}
 
-	private BoundReferenceDTO[] refManagersToDTO(List<? extends ReferenceManager<?, ?>> referenceManagers) {
-		BoundReferenceDTO[] dtos = new BoundReferenceDTO[referenceManagers.size()];
-		int i = 0;
-		for (ReferenceManager<?, ?> ref: referenceManagers)
-		{
-			BoundReferenceDTO dto = new BoundReferenceDTO();
-			dto.name = ref.getName();
-			dto.target = ref.getTarget();
-			List<ServiceReference<?>> serviceRefs = ref.getServiceReferences();
-			ServiceReferenceDTO[] srDTOs = new ServiceReferenceDTO[serviceRefs.size()];
-			int j = 0;
-			for (ServiceReference<?> serviceRef: serviceRefs)
-			{
-				srDTOs[j++] = serviceReferenceToDTO(serviceRef);
-			}
-			dto.serviceReferences = srDTOs;
-			dtos[i++] = dto;
-		}
-		return dtos;
-	}
+    private SatisfiedReferenceDTO[] satisfiedRefManagersToDTO(List<? extends ReferenceManager<?, ?>> referenceManagers) {
+        List<SatisfiedReferenceDTO> dtos = new ArrayList<SatisfiedReferenceDTO>();
+        for (ReferenceManager<?, ?> ref: referenceManagers)
+        {
+            if (ref.isSatisfied())
+            {
+                SatisfiedReferenceDTO dto = new SatisfiedReferenceDTO();
+                dto.name = ref.getName();
+                dto.target = ref.getTarget();
+                List<ServiceReference<?>> serviceRefs = ref.getServiceReferences();
+                ServiceReferenceDTO[] srDTOs = new ServiceReferenceDTO[serviceRefs.size()];
+                int j = 0;
+                for (ServiceReference<?> serviceRef : serviceRefs)
+                {
+                    srDTOs[j++] = serviceReferenceToDTO(serviceRef);
+                }
+                dto.boundServices = srDTOs;
+                dtos.add(dto);
+            }
+        }
+        return dtos.toArray( new SatisfiedReferenceDTO[dtos.size()] );
+    }
+
+    private UnsatisfiedReferenceDTO[] unsatisfiedRefManagersToDTO(List<? extends ReferenceManager<?, ?>> referenceManagers) {
+        List<UnsatisfiedReferenceDTO> dtos = new ArrayList<UnsatisfiedReferenceDTO>();
+        for (ReferenceManager<?, ?> ref: referenceManagers)
+        {
+            if (!ref.isSatisfied())
+            {
+                UnsatisfiedReferenceDTO dto = new UnsatisfiedReferenceDTO();
+                dto.name = ref.getName();
+                dto.target = ref.getTarget();
+                List<ServiceReference<?>> serviceRefs = ref.getServiceReferences();
+                ServiceReferenceDTO[] srDTOs = new ServiceReferenceDTO[serviceRefs.size()];
+                int j = 0;
+                for (ServiceReference<?> serviceRef : serviceRefs)
+                {
+                    srDTOs[j++] = serviceReferenceToDTO(serviceRef);
+                }
+                dto.targetServices = srDTOs;
+                dtos.add(dto);
+            }
+        }
+        return dtos.toArray( new UnsatisfiedReferenceDTO[dtos.size()] );
+    }
 
 	private ServiceReferenceDTO serviceReferenceToDTO(
 			ServiceReference<?> serviceRef) {
diff --git a/scr/src/test/java/org/apache/felix/scr/integration/CircularReferenceTest.java b/scr/src/test/java/org/apache/felix/scr/integration/CircularReferenceTest.java
index cc776c8..7a58aab 100644
--- a/scr/src/test/java/org/apache/felix/scr/integration/CircularReferenceTest.java
+++ b/scr/src/test/java/org/apache/felix/scr/integration/CircularReferenceTest.java
@@ -57,10 +57,10 @@
     public void test_A11_B11()
     {
         String componentNameA = "1.A.1.1.dynamic";
-        final ComponentConfigurationDTO componentA = findComponentConfigurationByName( componentNameA, ComponentConfigurationDTO.UNSATISFIED );
+        final ComponentConfigurationDTO componentA = findComponentConfigurationByName( componentNameA, ComponentConfigurationDTO.UNSATISFIED_REFERENCE );
 
         String componentNameB = "1.B.1.1.dynamic";
-        final ComponentConfigurationDTO componentB = findComponentConfigurationByName( componentNameB, ComponentConfigurationDTO.UNSATISFIED );
+        final ComponentConfigurationDTO componentB = findComponentConfigurationByName( componentNameB, ComponentConfigurationDTO.UNSATISFIED_REFERENCE );
     }
 
     /**
diff --git a/scr/src/test/java/org/apache/felix/scr/integration/ComponentActivationTest.java b/scr/src/test/java/org/apache/felix/scr/integration/ComponentActivationTest.java
index 4f296fe..e4512b0 100644
--- a/scr/src/test/java/org/apache/felix/scr/integration/ComponentActivationTest.java
+++ b/scr/src/test/java/org/apache/felix/scr/integration/ComponentActivationTest.java
@@ -199,7 +199,7 @@
 
     private void testRequiredDependency(final String componentname) throws Exception
     {
-        ComponentConfigurationDTO cc = getDisabledConfigurationAndEnable(componentname, ComponentConfigurationDTO.UNSATISFIED);
+        ComponentConfigurationDTO cc = getDisabledConfigurationAndEnable(componentname, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
 
         SimpleServiceImpl ss = SimpleServiceImpl.create( bundleContext, "foo" );
         
@@ -208,7 +208,7 @@
         ServiceReference<ActivatorComponent> ref = bundleContext.getServiceReference( ActivatorComponent.class );
         
         ss.drop();
-        findComponentConfigurationByName(componentname, ComponentConfigurationDTO.UNSATISFIED);
+        findComponentConfigurationByName(componentname, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
 
         
         TestCase.assertNull(bundleContext.getServiceReference( ActivatorComponent.class ));
diff --git a/scr/src/test/java/org/apache/felix/scr/integration/ComponentConfigurationPidTest.java b/scr/src/test/java/org/apache/felix/scr/integration/ComponentConfigurationPidTest.java
index 8a904d3..51d0642 100644
--- a/scr/src/test/java/org/apache/felix/scr/integration/ComponentConfigurationPidTest.java
+++ b/scr/src/test/java/org/apache/felix/scr/integration/ComponentConfigurationPidTest.java
@@ -48,7 +48,7 @@
         delay();
         TestCase.assertNull( SimpleComponent.INSTANCE );
 
-        getConfigurationsDisabledThenEnable(name, 0, ComponentConfigurationDTO.UNSATISFIED);
+        getConfigurationsDisabledThenEnable(name, 0, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
 
         TestCase.assertNull( SimpleComponent.INSTANCE );
 
@@ -77,7 +77,7 @@
         deleteConfig( pid );
         delay();
 
-        getConfigurationsDisabledThenEnable(name, 0, ComponentConfigurationDTO.UNSATISFIED);
+        getConfigurationsDisabledThenEnable(name, 0, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
         TestCase.assertNull( SimpleComponent.INSTANCE );
 
         configure( pid );
diff --git a/scr/src/test/java/org/apache/felix/scr/integration/ComponentConfigurationTest.java b/scr/src/test/java/org/apache/felix/scr/integration/ComponentConfigurationTest.java
index 813267d..951abc2 100644
--- a/scr/src/test/java/org/apache/felix/scr/integration/ComponentConfigurationTest.java
+++ b/scr/src/test/java/org/apache/felix/scr/integration/ComponentConfigurationTest.java
@@ -125,7 +125,7 @@
         
         TestCase.assertNull( SimpleComponent.INSTANCE );
 
-        getConfigurationsDisabledThenEnable(pid, 0, ComponentConfigurationDTO.UNSATISFIED);
+        getConfigurationsDisabledThenEnable(pid, 0, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
         TestCase.assertNull( SimpleComponent.INSTANCE );
 
         configure( pid );
@@ -269,14 +269,14 @@
             delay();
 
             // mandatory ref missing --> component unsatisfied
-            ComponentConfigurationDTO cc = getDisabledConfigurationAndEnable(pid, ComponentConfigurationDTO.UNSATISFIED);
+            ComponentConfigurationDTO cc = getDisabledConfigurationAndEnable(pid, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
 
             // dynamically configure without the correct target
             configure( pid );
             delay();
 
             // mandatory ref missing --> component unsatisfied
-            findComponentConfigurationByName(pid, ComponentConfigurationDTO.UNSATISFIED);
+            findComponentConfigurationByName(pid, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
 
             // dynamically configure with correct target
             theConfig.put( targetProp, "(filterprop=" + filterProp + ")" );
@@ -306,13 +306,13 @@
             delay();
 
             // mandatory ref missing --> component unsatisfied
-            findComponentConfigurationByName(pid, ComponentConfigurationDTO.UNSATISFIED);
+            findComponentConfigurationByName(pid, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
 
             deleteConfig( pid );
             delay();
 
             // mandatory ref missing --> component unsatisfied
-            findComponentConfigurationByName(pid, ComponentConfigurationDTO.UNSATISFIED);
+            findComponentConfigurationByName(pid, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
 
             disableAndCheck(cc);
             TestCase.assertNull( SimpleComponent.INSTANCE );
@@ -346,14 +346,14 @@
             delay();
 
             // mandatory ref missing --> component unsatisfied
-            ComponentConfigurationDTO cc = getDisabledConfigurationAndEnable(pid, ComponentConfigurationDTO.UNSATISFIED);
+            ComponentConfigurationDTO cc = getDisabledConfigurationAndEnable(pid, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
 
             // dynamically configure without the correct target
             configure( pid );
             delay();
 
             // mandatory ref missing --> component unsatisfied
-            findComponentConfigurationByName(pid, ComponentConfigurationDTO.UNSATISFIED);
+            findComponentConfigurationByName(pid, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
 
             // dynamically configure with correct target
             theConfig.put( targetProp, "(|(filterprop=" + filterProp1 + ")(filterprop=" + filterProp2 + "))" );
@@ -398,7 +398,7 @@
             delay();
 
             // mandatory ref missing --> component unsatisfied
-            findComponentConfigurationByName(pid, ComponentConfigurationDTO.UNSATISFIED);
+            findComponentConfigurationByName(pid, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
 
             disableAndCheck(cc);
             TestCase.assertNull( SimpleComponent.INSTANCE );
diff --git a/scr/src/test/java/org/apache/felix/scr/integration/ComponentFactoryTest.java b/scr/src/test/java/org/apache/felix/scr/integration/ComponentFactoryTest.java
index 9f9684b..33a528b 100644
--- a/scr/src/test/java/org/apache/felix/scr/integration/ComponentFactoryTest.java
+++ b/scr/src/test/java/org/apache/felix/scr/integration/ComponentFactoryTest.java
@@ -325,7 +325,7 @@
     {
         //set up the component that refers to the service the factory will create.
         final String referringComponentName = "ComponentReferringToFactoryObject";
-        getConfigurationsDisabledThenEnable(referringComponentName, 1, ComponentConfigurationDTO.UNSATISFIED);
+        getConfigurationsDisabledThenEnable(referringComponentName, 1, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
 
         final String componentname = "factory.component.referred";
         final String componentfactory = "factory.component.factory.referred";
@@ -349,7 +349,7 @@
         TestCase.assertNull( instance.getInstance() ); // SCR 112.12.6.2
 
         //make sure it's unsatisfied (service is no longer available)
-        checkConfigurationCount(referringComponentName, 1, ComponentConfigurationDTO.UNSATISFIED);
+        checkConfigurationCount(referringComponentName, 1, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
     }
 
     @Test
diff --git a/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java b/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java
index 37eb492..7461a7d 100644
--- a/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java
+++ b/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java
@@ -295,7 +295,7 @@
     static final Map<Integer, String> STATES = new HashMap<Integer, String>();
     
     static {
-    	STATES.put(ComponentConfigurationDTO.UNSATISFIED, "Unsatisfied (" + ComponentConfigurationDTO.UNSATISFIED + ")" );
+    	STATES.put(ComponentConfigurationDTO.UNSATISFIED_REFERENCE, "Unsatisfied (" + ComponentConfigurationDTO.UNSATISFIED_REFERENCE + ")" );
     	STATES.put(ComponentConfigurationDTO.SATISFIED, "Satisified (" + ComponentConfigurationDTO.SATISFIED + ")" );
     	STATES.put(ComponentConfigurationDTO.ACTIVE, "Active (" + ComponentConfigurationDTO.ACTIVE + ")" );
     }
diff --git a/scr/src/test/java/org/apache/felix/scr/integration/PersistentComponentFactoryTest.java b/scr/src/test/java/org/apache/felix/scr/integration/PersistentComponentFactoryTest.java
index 96afa51..d924b28 100644
--- a/scr/src/test/java/org/apache/felix/scr/integration/PersistentComponentFactoryTest.java
+++ b/scr/src/test/java/org/apache/felix/scr/integration/PersistentComponentFactoryTest.java
@@ -266,7 +266,7 @@
         propsNonMatch.put( "ref.target", "(filterprop=nomatch)" );
         ComponentFactory factory = getComponentFactory(componentfactory);
         final ComponentInstance instanceNonMatch = factory.newInstance( propsNonMatch );//works even without required reference
-        checkConfigurationCount(componentname, 1, ComponentConfigurationDTO.UNSATISFIED);
+        checkConfigurationCount(componentname, 1, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
 
         final SimpleServiceImpl noMatch = SimpleServiceImpl.create( bundleContext, "nomatch" ).setFilterProperty(
             "nomatch" );
@@ -294,7 +294,7 @@
         delay();
 
         // check registered components (ComponentFactory is still present)
-        checkConfigurationCount(componentname, 1, ComponentConfigurationDTO.UNSATISFIED);
+        checkConfigurationCount(componentname, 1, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
 
         // deactivated due to unsatisfied reference
         TestCase.assertNull( instanceNonMatch.getInstance() );
@@ -311,7 +311,7 @@
     {
         //set up the component that refers to the service the factory will create.
         final String referringComponentName = "ComponentReferringToFactoryObject";
-        getConfigurationsDisabledThenEnable(referringComponentName, 1, ComponentConfigurationDTO.UNSATISFIED);
+        getConfigurationsDisabledThenEnable(referringComponentName, 1, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
 
         final String componentname = "factory.component.referred";
         final String componentfactory = "factory.component.factory.referred";
@@ -335,7 +335,7 @@
         TestCase.assertNull( instance.getInstance() ); // SCR 112.12.6.2
 
         //make sure it's unsatisfied (service is no longer available)
-        checkConfigurationCount(referringComponentName, 1, ComponentConfigurationDTO.UNSATISFIED);
+        checkConfigurationCount(referringComponentName, 1, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
     }
 
     @Test
diff --git a/scr/src/test/java/org/apache/felix/scr/integration/ServiceBindGreedyTest.java b/scr/src/test/java/org/apache/felix/scr/integration/ServiceBindGreedyTest.java
index 61809b5..b18e251 100644
--- a/scr/src/test/java/org/apache/felix/scr/integration/ServiceBindGreedyTest.java
+++ b/scr/src/test/java/org/apache/felix/scr/integration/ServiceBindGreedyTest.java
@@ -182,7 +182,7 @@
         srv1.drop();
         // no delay, should be immediate
 
-        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED);
+        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
         final SimpleComponent comp11 = SimpleComponent.INSTANCE;
         TestCase.assertNull( comp11 );
 
@@ -426,7 +426,7 @@
         srv1.drop();
         // no delay, should be immediate
 
-        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED);
+        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
         final SimpleComponent comp11 = SimpleComponent.INSTANCE;
         TestCase.assertNull( comp11 );
 
@@ -548,7 +548,7 @@
     {
         String name ="test_required_multiple_dynamic_factory"; //also pid
         final String factoryPid = "factory_" + name;
-        getConfigurationsDisabledThenEnable(name, 0, ComponentConfigurationDTO.UNSATISFIED);
+        getConfigurationsDisabledThenEnable(name, 0, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
 //        final String pid = "test_required_multiple_dynamic_factory";
 //
 //        final Component component = findComponentDescriptorByName( pid );
@@ -558,7 +558,7 @@
 //        // async enabling (unsatisfied)
 //        enableAndCheck(cc.description);
 //        delay();
-//        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED);
+//        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
 
         // register service, satisfying
         final SimpleServiceImpl srv1 = SimpleServiceImpl.create( bundleContext, "srv1" );
@@ -832,7 +832,7 @@
         srv1.drop();
         delay(); // async reactivate
 
-        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED);
+        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
         final SimpleComponent comp11 = SimpleComponent.INSTANCE;
         TestCase.assertNull( comp11 );
 
@@ -1104,7 +1104,7 @@
         srv1.drop();
         delay(); // async reactivate
 
-        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED);
+        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
         final SimpleComponent comp11 = SimpleComponent.INSTANCE;
         TestCase.assertNull( comp11 );
 
diff --git a/scr/src/test/java/org/apache/felix/scr/integration/ServiceBindTest.java b/scr/src/test/java/org/apache/felix/scr/integration/ServiceBindTest.java
index b944e64..a19eaaa 100644
--- a/scr/src/test/java/org/apache/felix/scr/integration/ServiceBindTest.java
+++ b/scr/src/test/java/org/apache/felix/scr/integration/ServiceBindTest.java
@@ -182,7 +182,7 @@
         srv1.drop();
         // no delay, should be immediate
 
-        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED);
+        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
         final SimpleComponent comp11 = SimpleComponent.INSTANCE;
         TestCase.assertNull( comp11 );
 
@@ -426,7 +426,7 @@
         srv1.drop();
         // no delay, should be immediate
 
-        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED);
+        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
         final SimpleComponent comp11 = SimpleComponent.INSTANCE;
         TestCase.assertNull( comp11 );
 
@@ -548,7 +548,7 @@
     {
         String name ="test_required_multiple_dynamic_factory"; //also pid
         final String factoryPid = "factory_" + name;
-        getConfigurationsDisabledThenEnable(name, 0, ComponentConfigurationDTO.UNSATISFIED);
+        getConfigurationsDisabledThenEnable(name, 0, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
 //        final String pid = "test_required_multiple_dynamic_factory";
 //
 //        final Component component = findComponentDescriptorByName( pid );
@@ -558,7 +558,7 @@
 //        // async enabling (unsatisfied)
 //        enableAndCheck(cc.description);
 //        delay();
-//        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED);
+//        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
 
         // register service, satisfying
         final SimpleServiceImpl srv1 = SimpleServiceImpl.create( bundleContext, "srv1" );
@@ -833,7 +833,7 @@
         srv1.drop();
         delay(); // async reactivate
 
-        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED);
+        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
         final SimpleComponent comp11 = SimpleComponent.INSTANCE;
         TestCase.assertNull( comp11 );
 
@@ -1105,7 +1105,7 @@
         srv1.drop();
         delay(); // async reactivate
 
-        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED);
+        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
         final SimpleComponent comp11 = SimpleComponent.INSTANCE;
         TestCase.assertNull( comp11 );
 
diff --git a/scr/src/test/java/org/apache/felix/scr/integration/ServiceChangedTest.java b/scr/src/test/java/org/apache/felix/scr/integration/ServiceChangedTest.java
index 08bfc9e..5dc463b 100644
--- a/scr/src/test/java/org/apache/felix/scr/integration/ServiceChangedTest.java
+++ b/scr/src/test/java/org/apache/felix/scr/integration/ServiceChangedTest.java
@@ -127,7 +127,7 @@
 
         // set target to not match any more -> deactivate this component
         srv1.setFilterProperty( "don't match" );
-        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED);
+        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
         TestCase.assertNull( SimpleComponent.INSTANCE );
         TestCase.assertNull( comp10.m_singleRef );
         TestCase.assertTrue( comp10.m_multiRef.isEmpty() );
@@ -249,7 +249,7 @@
         // set target to not match any more
         srv1.setFilterProperty( "don't match" );
 
-        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED);
+        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
         final SimpleComponent comp11 = SimpleComponent.INSTANCE;
         TestCase.assertNull( comp11 );
         TestCase.assertNull( comp10.m_singleRef );
@@ -382,7 +382,7 @@
 
         // set target to not match any more -> deactivate this component
         srv1.setFilterProperty( "don't match" );
-        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED);
+        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
         TestCase.assertNull( SimpleComponent.INSTANCE );
         TestCase.assertNull( comp10.m_singleRef );
         TestCase.assertTrue( comp10.m_multiRef.isEmpty() );
@@ -525,7 +525,7 @@
         // set target to not match any more
         srv1.setFilterProperty( "don't match" );
 
-        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED);
+        findComponentConfigurationByName(name, ComponentConfigurationDTO.UNSATISFIED_REFERENCE);
         final SimpleComponent comp11 = SimpleComponent.INSTANCE;
         TestCase.assertNull( comp11 );
         TestCase.assertNull( comp10.m_singleRef );
