diff --git a/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instance/InstanceScopeTest.java b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instance/InstanceScopeTest.java
new file mode 100644
index 0000000..7067245
--- /dev/null
+++ b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instance/InstanceScopeTest.java
@@ -0,0 +1,77 @@
+package org.apache.felix.ipojo.test.composite.instance;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.composite.CompositeFactory;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.service.CheckService;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.instance.service.Service;
+import org.osgi.framework.ServiceReference;
+
+public class InstanceScopeTest extends OSGiTestCase {
+    
+    CompositeFactory factory;
+    ComponentInstance instance;
+    
+    public void setUp() {
+        factory = (CompositeFactory) Utils.getFactoryByName(context, "SCOPE-scope");
+        assertNotNull("Factory", factory);
+        try {
+            instance = factory.createComponentInstance(null);
+        } catch (Exception e) {
+            fail("Fail instantiation : " + e.getMessage());
+        }
+       
+
+    }
+    
+    public void tearDown() {
+        instance.dispose();
+        instance = null;
+    }
+    
+    public void testScope() {
+        ServiceReference ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance.getInstanceName());
+        assertNotNull("Check architecture availability", ref);
+        Architecture arch = (Architecture) context.getService(ref);
+        assertTrue("Validity", arch.getInstanceDescription().getState() == ComponentInstance.VALID);
+        
+        // Get internal service
+        ServiceContext sc = Utils.getServiceContext(instance);
+        ServiceReference ref2 = Utils.getServiceReference(sc, CheckService.class.getName(), null);
+        assertNotNull("Check CheckService availability", ref2);
+        CheckService svc = (CheckService) sc.getService(ref2);
+        Properties props = svc.getProps();
+        assertEquals("Check props - 1", 1, ((Integer) props.get("1")).intValue());
+        assertEquals("Check props - 2", 2, ((Integer) props.get("2")).intValue());
+        assertEquals("Check props - 3", 3, ((Integer) props.get("3")).intValue());
+        
+    }
+    
+    public void testGlobalUnavailability() {
+        ServiceReference ref2 = Utils.getServiceReference(context, Service.class.getName(), null);
+        assertNull("Check Service unavailability", ref2);
+    }
+    
+    public void testScopeUnvailability() {
+        CompositeFactory factory2 = (CompositeFactory) Utils.getFactoryByName(context, "SCOPE-badscope");
+        assertNotNull("Factory", factory2);
+        ComponentInstance instance2 = null;
+        try {
+            instance2 = factory2.createComponentInstance(null);
+        } catch (Exception e) {
+            fail("Fail instantiation : " + e.getMessage());
+        }
+        //System.out.println(instance2.getInstanceDescription().getDescription());
+        
+        assertEquals("Check invalidity", ComponentInstance.INVALID, instance2.getState());
+ 
+    }
+    
+    
+
+}
diff --git a/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/InstantiatorTestSuite.java b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/InstantiatorTestSuite.java
index 796bb62..8fa0dce 100644
--- a/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/InstantiatorTestSuite.java
+++ b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/InstantiatorTestSuite.java
@@ -21,6 +21,7 @@
 import junit.framework.Test;
 
 import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.apache.felix.ipojo.test.composite.instance.InstanceScopeTest;
 import org.apache.felix.ipojo.test.composite.instance.SimpleInstance;
 import org.osgi.framework.BundleContext;
 
@@ -34,6 +35,7 @@
 		ots.addTestSuite(OptionalMultipleInstantiation.class);
 		ots.addTestSuite(ConfigurableInstantiation.class);
 		ots.addTestSuite(SimpleInstance.class);
+		ots.addTestSuite(InstanceScopeTest.class);
 		return ots;
 	}
 
diff --git a/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/instance/ServiceConsumer.java b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/instance/ServiceConsumer.java
new file mode 100644
index 0000000..d6abe0a
--- /dev/null
+++ b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/instance/ServiceConsumer.java
@@ -0,0 +1,27 @@
+package org.apache.felix.ipojo.test.instance;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.composite.service.CheckService;
+import org.apache.felix.ipojo.test.instance.service.Service;
+
+public class ServiceConsumer implements CheckService {
+    
+    private Service service;
+    private Properties props = new Properties();
+    
+    public ServiceConsumer() {
+       props.put("1", new Integer(service.count()));
+       props.put("2", new Integer(service.count()));
+       props.put("3", new Integer(service.count()));
+    }
+
+    public boolean check() {
+       return service.count() > 0;
+    }
+
+    public Properties getProps() {
+        return props;
+    }
+
+}
diff --git a/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/instance/ServiceProvider.java b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/instance/ServiceProvider.java
new file mode 100644
index 0000000..7c12a12
--- /dev/null
+++ b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/instance/ServiceProvider.java
@@ -0,0 +1,15 @@
+package org.apache.felix.ipojo.test.instance;
+
+import org.apache.felix.ipojo.test.instance.service.Service;
+
+
+public class ServiceProvider implements Service {
+
+    private int i = 0;
+    
+    public int count() {
+        i++;
+        return i;
+    }
+
+}
diff --git a/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/instance/service/Service.java b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/instance/service/Service.java
new file mode 100644
index 0000000..4c64172
--- /dev/null
+++ b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/instance/service/Service.java
@@ -0,0 +1,7 @@
+package org.apache.felix.ipojo.test.instance.service;
+
+public interface Service {
+    
+    public int count();
+
+}
diff --git a/ipojo/tests/composite/service-instance/src/main/resources/metadata.xml b/ipojo/tests/composite/service-instance/src/main/resources/metadata.xml
index ff00ef1..8a20486 100644
--- a/ipojo/tests/composite/service-instance/src/main/resources/metadata.xml
+++ b/ipojo/tests/composite/service-instance/src/main/resources/metadata.xml
@@ -56,5 +56,20 @@
 			<property name="strAProp" value="{a,b,c}"/>
 		</instance>
 	</comp:composite>
-
+	
+	<!-- Scope test -->
+	<component name="SCOPE-provider" classname="org.apache.felix.ipojo.test.instance.ServiceProvider">
+		<provides/>
+	</component>
+	<component name="SCOPE-cons" classname="org.apache.felix.ipojo.test.instance.ServiceConsumer">
+		<provides/>
+		<requires field="service"/>
+	</component>
+	<comp:composite name="SCOPE-scope">
+		<instance component="SCOPE-provider"/>
+		<instance component="SCOPE-cons"/>
+	</comp:composite>
+	<comp:composite name="SCOPE-badscope">
+		<instance component="SCOPE-cons"/>
+	</comp:composite>
 </ipojo>
