diff --git a/ipojo/tests/tests.composite.service.providing/pom.xml b/ipojo/tests/tests.composite.service.providing/pom.xml
new file mode 100644
index 0000000..1fbb2af
--- /dev/null
+++ b/ipojo/tests/tests.composite.service.providing/pom.xml
@@ -0,0 +1,101 @@
+<!--
+	Licensed to the Apache Software Foundation (ASF) under one
+	or more contributor license agreements.  See the NOTICE file
+	distributed with this work for additional information
+	regarding copyright ownership.  The ASF licenses this file
+	to you under the Apache License, Version 2.0 (the
+	"License"); you may not use this file except in compliance
+	with the License.  You may obtain a copy of the License at
+	
+	http://www.apache.org/licenses/LICENSE-2.0
+	
+	Unless required by applicable law or agreed to in writing,
+	software distributed under the License is distributed on an
+	"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+	KIND, either express or implied.  See the License for the
+	specific language governing permissions and limitations
+	under the License.
+-->
+<project>
+	<modelVersion>4.0.0</modelVersion>
+	<packaging>bundle</packaging>
+	<name>iPOJO Composite (Service Providing) Test Suite</name>
+	<artifactId>tests.composite.service.providing</artifactId>
+	<groupId>ipojo.tests</groupId>
+	<version>0.8.0-SNAPSHOT</version>
+	<dependencies>
+		<dependency>
+			<groupId>org.apache.felix</groupId>
+			<artifactId>org.apache.felix.ipojo</artifactId>
+			<version>0.8.0-SNAPSHOT</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.felix</groupId>
+			<artifactId>org.apache.felix.ipojo.composite</artifactId>
+			<version>0.8.0-SNAPSHOT</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.felix</groupId>
+			<artifactId>org.apache.felix.ipojo.metadata</artifactId>
+			<version>0.8.0-SNAPSHOT</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.felix</groupId>
+			<artifactId>org.osgi.core</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>3.8.1</version>
+		</dependency>
+		<dependency>
+			<groupId>ipojo.examples</groupId>
+			<artifactId>org.apache.felix.ipojo.junit4osgi</artifactId>
+			<version>0.8.0-SNAPSHOT</version>
+		</dependency>
+		<dependency>
+			<groupId>ipojo.tests</groupId>
+			<artifactId>tests.composite</artifactId>
+			<version>0.8.0-SNAPSHOT</version>
+		</dependency>
+	</dependencies>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.felix</groupId>
+				<artifactId>maven-bundle-plugin</artifactId>
+				<version>1.4.0</version>
+				<extensions>true</extensions>
+				<configuration>
+					<instructions>
+						<Bundle-SymbolicName>
+							${pom.artifactId}
+						</Bundle-SymbolicName>
+						<Private-Package>
+							org.apache.felix.ipojo.test.composite.provides, org.apache.felix.ipojo.test.composite.test
+						</Private-Package>
+						<Test-Suite>
+							org.apache.felix.ipojo.test.composite.test.CompositeTest, org.apache.felix.ipojo.test.composite.provides.ProvidesTestSuite 
+						</Test-Suite>
+					</instructions>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.felix</groupId>
+				<artifactId>maven-ipojo-plugin</artifactId>
+				<version>0.8.0-SNAPSHOT</version>
+				<executions>
+					<execution>
+						<goals>
+							<goal>ipojo-bundle</goal>
+						</goals>
+						<configuration>
+							<ignoreAnnotations>true</ignoreAnnotations>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+</project>
diff --git a/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/ProvidesTestSuite.java b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/ProvidesTestSuite.java
new file mode 100644
index 0000000..413ff58
--- /dev/null
+++ b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/ProvidesTestSuite.java
@@ -0,0 +1,43 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.test.composite.provides;
+
+import junit.framework.Test;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.osgi.framework.BundleContext;
+
+public class ProvidesTestSuite {
+
+    public static Test suite(BundleContext bc) {
+        OSGiTestSuite ots = new OSGiTestSuite("Composite Service Providing Test Suite", bc);
+        ots.addTestSuite(TestComp0.class);
+        ots.addTestSuite(TestComp1.class);
+        ots.addTestSuite(TestComp2.class);
+        ots.addTestSuite(TestComp3.class);
+        ots.addTestSuite(TestComp4.class);
+        ots.addTestSuite(TestComp5.class);
+        ots.addTestSuite(TestComp6.class);
+        ots.addTestSuite(TestComp7.class);
+        ots.addTestSuite(TestComp8.class);
+        
+        return ots;
+    }
+
+}
diff --git a/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp0.java b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp0.java
new file mode 100644
index 0000000..d3e26a8
--- /dev/null
+++ b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp0.java
@@ -0,0 +1,339 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.test.composite.provides;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.component.TotoProvider;
+import org.apache.felix.ipojo.test.composite.service.Tota;
+import org.apache.felix.ipojo.test.composite.service.Toto;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestComp0 extends OSGiTestCase {
+
+    private ComponentFactory tataFactory;
+    private ComponentFactory totoFactory;
+    private ComponentFactory tataFactory2;
+    
+    private ComponentInstance totoProv, totoProv2;
+    private ComponentInstance under;
+    
+    public void setUp() {
+        tataFactory = (ComponentFactory) Utils.getFactoryByName(context, "tata");
+        totoFactory = (ComponentFactory) Utils.getFactoryByName(context, "toto");
+        tataFactory2 = (ComponentFactory) Utils.getFactoryByName(context, "comp-6");
+        tataFactory2.stop();
+        tataFactory.stop();
+        
+        Properties props = new Properties();
+        props.put("name", "toto provider");
+        try {
+            totoProv = totoFactory.createComponentInstance(props);
+        } catch(Exception e) {
+           fail("Cannot create an instance : " + e.getMessage());
+        }
+        
+        Properties props3 = new Properties();
+        props3.put("name", "toto provider 2");
+        try {
+            totoProv2 = totoFactory.createComponentInstance(props3);
+        } catch(Exception e) {
+            fail("Cannot create an instance : " + e.getMessage());
+        }
+        
+        totoProv.stop();
+        totoProv2.stop();
+        
+        Factory factory = Utils.getFactoryByName(context, "comp-0");
+        Properties props2 = new Properties();
+        props2.put("name", "ff");
+        try {
+            under = factory.createComponentInstance(props2);
+        } catch(Exception e) {
+            e.printStackTrace();
+            fail("Cannot create an instance : " + e.getMessage());
+        }
+    }
+    
+    public void tearDown() {
+        tataFactory.start();
+        totoProv.dispose();
+        totoProv = null;
+        totoProv2.dispose();
+        totoProv2 = null;
+        tataFactory2.start();
+
+        // Reset counters
+        TotoProvider.toto = 0;
+        TotoProvider.toto_2 = 0;
+        TotoProvider.toto_3 = 0;
+        TotoProvider.toto_4 = 0;
+        TotoProvider.toto1 = 0;
+    }
+    
+    public void testSimple() {
+        // Neither factory nor instance
+        assertTrue("Assert under state - 1", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 1", context.getServiceReference(Tota.class.getName()));
+        
+        // Start the importer
+        totoProv.start();
+        assertNotNull("Assert toto service - 1", context.getServiceReference(Toto.class.getName()));
+        assertTrue("Assert under state - 2", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 2", context.getServiceReference(Tota.class.getName()));
+        
+        // Start the factory
+        tataFactory.start();
+        assertTrue("Assert under state - 3", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 3", context.getServiceReference(Tota.class.getName()));
+        ServiceReference ref = context.getServiceReference(Tota.class.getName());
+        Tota tota = (Tota) context.getService(ref);
+        invokeAll(tota);
+        // Check toto
+        Properties props = tota.getProps();
+        Integer toto = (Integer) props.get("toto");
+        Integer toto_2 = (Integer) props.get("toto_2");
+        Integer toto_3 = (Integer) props.get("toto_3");
+        Integer toto_4 = (Integer) props.get("toto_4");
+        assertEquals("Assert toto - 3", toto.intValue(), 1);
+        assertEquals("Assert toto_2 - 3", toto_2.intValue(), 1);
+        assertEquals("Assert toto_3 - 3", toto_3.intValue(), 1);
+        assertEquals("Assert toto_4 - 3", toto_4.intValue(), 0);
+        //Check tata
+        props = tota.getPropsTata();
+        Integer tata = (Integer) props.get("tata");
+        Integer tataStr = (Integer) props.get("tataStr");
+        Integer tataStrs = (Integer) props.get("tataStrs");
+        Integer tata_2 = (Integer) props.get("tata_2");
+        Integer tata_3 = (Integer) props.get("tata_3");
+        Integer tata1 = (Integer) props.get("tata1");
+        Integer tata1_1 = (Integer) props.get("tata1_1");
+        Integer tata5 = (Integer) props.get("tata5");
+        Integer tata5_1 = (Integer) props.get("tata5_1");
+        Integer tata5_2 = (Integer) props.get("tata5_2");
+        assertEquals("Assert tata - 3", tata.intValue(), 1);
+        assertEquals("Assert tataStr - 3", tataStr.intValue(), 1);
+        assertEquals("Assert tataStrs - 3", tataStrs.intValue(), 0);
+        assertEquals("Assert tata_2 - 3", tata_2.intValue(), 1);
+        assertEquals("Assert tata_3 - 3", tata_3.intValue(), 1);
+        assertEquals("Assert tata1 - 3", tata1.intValue(), 1);
+        assertEquals("Assert tata1_1 - 3", tata1_1.intValue(), 1);
+        assertEquals("Assert tata5 - 3", tata5.intValue(), 1);
+        assertEquals("Assert tata5_1 - 3", tata5_1.intValue(), 1);
+        assertEquals("Assert tata5_2 - 3", tata5_2.intValue(), 1);
+        
+        context.ungetService(ref);
+        tota = null;
+        
+        // Start a second import
+        totoProv2.start();
+        assertTrue("Assert under state - 4", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 4", context.getServiceReference(Tota.class.getName()));
+        ref = context.getServiceReference(Tota.class.getName());
+        tota = (Tota) context.getService(ref);
+        invokeAll(tota);
+        // Check toto
+        props = tota.getProps();
+        toto = (Integer) props.get("toto");
+        toto_2 = (Integer) props.get("toto_2");
+        toto_3 = (Integer) props.get("toto_3");
+        toto_4 = (Integer) props.get("toto_4");
+        assertEquals("Assert toto - 4", toto.intValue(), 2);
+        assertEquals("Assert toto_2 - 4", toto_2.intValue(), 2);
+        assertEquals("Assert toto_3 - 4", toto_3.intValue(), 2);
+        assertEquals("Assert toto_4 - 4", toto_4.intValue(), 0);
+        //Check tata
+        props = tota.getPropsTata();
+        tata = (Integer) props.get("tata");
+        tataStr = (Integer) props.get("tataStr");
+        tataStrs = (Integer) props.get("tataStrs");
+        tata_2 = (Integer) props.get("tata_2");
+        tata_3 = (Integer) props.get("tata_3");
+        tata1 = (Integer) props.get("tata1");
+        tata1_1 = (Integer) props.get("tata1_1");
+        tata5 = (Integer) props.get("tata5");
+        tata5_1 = (Integer) props.get("tata5_1");
+        tata5_2 = (Integer) props.get("tata5_2");
+        assertEquals("Assert tata - 4", tata.intValue(), 2);
+        assertEquals("Assert tataStr - 4", tataStr.intValue(), 2);
+        assertEquals("Assert tataStrs - 4", tataStrs.intValue(), 0);
+        assertEquals("Assert tata_2 - 4", tata_2.intValue(), 2);
+        assertEquals("Assert tata_3 - 4", tata_3.intValue(), 2);
+        assertEquals("Assert tata1 - 4", tata1.intValue(), 2);
+        assertEquals("Assert tata1_1 - 4", tata1_1.intValue(), 2);
+        assertEquals("Assert tata5 - 4", tata5.intValue(), 2);
+        assertEquals("Assert tata5_1 - 4", tata5_1.intValue(), 2);
+        assertEquals("Assert tata5_2 - 4", tata5_2.intValue(), 2);
+        
+        context.ungetService(ref);
+        tota = null;
+        
+        tataFactory.stop();
+        assertTrue("Assert under state - 5", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 5", context.getServiceReference(Tota.class.getName()));
+        
+        totoProv2.stop();
+        tataFactory.start();
+        assertTrue("Assert under state - 6", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 6", context.getServiceReference(Tota.class.getName()));
+        ref = context.getServiceReference(Tota.class.getName());
+        tota = (Tota) context.getService(ref);
+        invokeAll(tota);
+        // Check toto
+        props = tota.getProps();
+        toto = (Integer) props.get("toto");
+        toto_2 = (Integer) props.get("toto_2");
+        toto_3 = (Integer) props.get("toto_3");
+        toto_4 = (Integer) props.get("toto_4");
+        assertEquals("Assert toto - 6", toto.intValue(), 3);
+        assertEquals("Assert toto_2 - 6", toto_2.intValue(), 3);
+        assertEquals("Assert toto_3 - 6", toto_3.intValue(), 3);
+        assertEquals("Assert toto_4 - 6", toto_4.intValue(), 0);
+        //Check tata
+        props = tota.getPropsTata();
+        tata = (Integer) props.get("tata");
+        tataStr = (Integer) props.get("tataStr");
+        tataStrs = (Integer) props.get("tataStrs");
+        tata_2 = (Integer) props.get("tata_2");
+        tata_3 = (Integer) props.get("tata_3");
+        tata1 = (Integer) props.get("tata1");
+        tata1_1 = (Integer) props.get("tata1_1");
+        tata5 = (Integer) props.get("tata5");
+        tata5_1 = (Integer) props.get("tata5_1");
+        tata5_2 = (Integer) props.get("tata5_2");
+        assertEquals("Assert tata - 6", tata.intValue(), 1);
+        assertEquals("Assert tataStr - 6", tataStr.intValue(), 1);
+        assertEquals("Assert tataStrs - 6", tataStrs.intValue(), 0);
+        assertEquals("Assert tata_2 - 6", tata_2.intValue(), 1);
+        assertEquals("Assert tata_3 - 6", tata_3.intValue(), 1);
+        assertEquals("Assert tata1 - 6", tata1.intValue(), 1);
+        assertEquals("Assert tata1_1 - 6", tata1_1.intValue(), 1);
+        assertEquals("Assert tata5 - 6", tata5.intValue(), 1);
+        assertEquals("Assert tata5_1 - 6", tata5_1.intValue(), 1);
+        assertEquals("Assert tata5_2 - 6", tata5_2.intValue(), 1);
+        
+        context.ungetService(ref);
+        tota = null;
+        
+        // Is arch exposed
+        assertNotNull("Test arch", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+        
+        totoProv.stop();
+        
+        assertTrue("Assert under state - 7", under.getState() == ComponentInstance.INVALID);
+        assertNotNull("Test arch-2", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+        assertNull("Assert no tota service - 7", context.getServiceReference(Tota.class.getName()));
+        
+        under.dispose();
+        under = null;
+    }
+
+
+
+    private void invoke(Tota tota) {
+        tota.tata();
+        
+        assertEquals("Assert invoke tataint", tota.tataInt(2), 2);
+        assertEquals("Assert invoke tataLong", tota.tataLong(2), 2);
+        assertEquals("Assert invoke tataDouble", tota.tataDouble(2), 2);
+        assertEquals("Assert invoke tataChar", tota.tataChar('a'), 'a');
+        assertTrue("Assert invoke tataBoolean", tota.tataBoolean(true));
+        assertEquals("Assert invoke tataByte", tota.tataByte((byte)2), 2);
+        assertEquals("Assert invoke tataShort", tota.tataShort((short)5), 5);
+        assertEquals("Assert invoke tataFloat", tota.tataFloat(5), 5);
+        
+    }
+    
+    private void invokeArrays(Tota tota) {
+        
+        int[] a = new int[] {1,2,3};
+        assertEquals("Assert invoke tataint[]", tota.tataInts(a), a);
+        
+        long[] b = new long[] {1,2,3};
+        assertEquals("Assert invoke tataLong[]", tota.tataLongs(b), b);
+        
+        double[] c = new double[] {1,2,3};
+        assertEquals("Assert invoke tataDouble[]", tota.tataDoubles(c), c);
+        
+        char[] d = new char[] {'a','b', 'c'};
+        assertEquals("Assert invoke tataChar[]", tota.tataChars(d), d);
+        
+        boolean[] e = new boolean[] {true, false};
+        assertEquals("Assert invoke tataBoolean[]", tota.tataBooleans(e), e);
+        
+        byte[] f = new byte[] {(byte) 1};
+        assertEquals("Assert invoke tataByte[]", tota.tataBytes(f), f);
+        
+        short[] g = new short[] {(short) 1};
+        assertEquals("Assert invoke tataShort[]", tota.tataShorts(g), g);
+        
+        float[] h = new float[] {5,6,7};
+        assertEquals("Assert invoke tataFloat[]", tota.tataFloats(h), h);
+        
+    }
+    
+    private void invokeStr(Tota tota) {
+        tota.tataStr();
+    }
+    
+    private void invokeTata(Tota tota) {
+        tota.tata(1,2);
+        tota.tata("tototototo");
+    }
+    
+    private void invokeTata1(Tota tota) {
+        assertEquals("Assert tata1", tota.tata1("foo"), "foo");
+        assertEquals("Assert tata1 - 2", tota.tata1(new char[] {'a','b','c'}), "abc");
+    }
+    
+    private void invokeTata5(Tota tota) {
+        assertEquals("Assert tata5 -1", tota.tata5("foo",1), "foo"+1);
+        assertEquals("Assert tata5 - 2", tota.tata5(new String[] {"a","b","c"}, 1), "31");
+        assertEquals("Assert tata5 - 3", tota.tata5("foo", new int[] {1,2,3}), "foo3");
+    }
+    
+    private void invokeAdd(Tota tota) {
+        assertEquals("Assert add", tota.add(1,1,1), 3);
+    }
+    
+    private void invokeToto(Tota tota) {
+        tota.toto();
+        assertEquals("Assert toto", tota.toto("foo"), "foo");
+        tota.toto(1,2);
+    }
+    
+    private void invokeAll(Tota tota) {
+        invoke(tota);
+        invokeArrays(tota);
+        invokeStr(tota);
+        invokeTata(tota);
+        invokeTata1(tota);
+        invokeTata5(tota);
+        invokeAdd(tota);
+        invokeToto(tota);
+    }
+    
+
+}
diff --git a/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp1.java b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp1.java
new file mode 100644
index 0000000..95d64be
--- /dev/null
+++ b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp1.java
@@ -0,0 +1,337 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.test.composite.provides;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.component.TotoProvider;
+import org.apache.felix.ipojo.test.composite.service.Tota;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestComp1 extends OSGiTestCase {
+
+    private ComponentFactory tataFactory;
+    private ComponentFactory totoFactory;
+    
+    private ComponentInstance totoProv, totoProv2;
+    private ComponentInstance under;
+	private ComponentFactory tataFactory2;
+    
+    public void setUp() {
+        tataFactory = (ComponentFactory) Utils.getFactoryByName(context, "tata");
+        totoFactory = (ComponentFactory) Utils.getFactoryByName(context, "toto");
+        tataFactory2 = (ComponentFactory) Utils.getFactoryByName(context, "comp-6");
+        tataFactory2.stop();
+        
+        tataFactory.stop();
+        
+        Properties props = new Properties();
+        props.put("name", "toto provider");
+        try {
+            totoProv = totoFactory.createComponentInstance(props);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        
+        Properties props3 = new Properties();
+        props3.put("name", "toto provider 2");
+        try {
+            totoProv2 = totoFactory.createComponentInstance(props3);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        
+        totoProv.stop();
+        totoProv2.stop();
+        
+        Factory factory = Utils.getFactoryByName(context, "comp-1");
+        Properties props2 = new Properties();
+        try {
+            under = factory.createComponentInstance(props2);
+        } catch(Exception e) {
+            fail("Cannot create the instance : " + e.getMessage());
+        }
+         
+    }
+    
+    public void tearDown() {  
+        tataFactory.start();
+        totoProv.dispose();
+        totoProv = null;
+        totoProv2.dispose();
+        totoProv2 = null;
+        tataFactory2.start();
+        
+        // Reset counters
+        TotoProvider.toto = 0;
+        TotoProvider.toto_2 = 0;
+        TotoProvider.toto_3 = 0;
+        TotoProvider.toto_4 = 0;
+        TotoProvider.toto1 = 0;
+    }
+    
+    public void testSimple() {
+        // Neither factory nor instance
+        assertTrue("Assert under state - 1", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 1", context.getServiceReference(Tota.class.getName()));
+        
+        // Start the importer
+        totoProv.start();
+        assertTrue("Assert under state - 2 ("+under.getState()+")", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 2", context.getServiceReference(Tota.class.getName()));
+        
+        // Start the factory
+        tataFactory.start();
+        assertTrue("Assert under state - 3", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 3", context.getServiceReference(Tota.class.getName()));
+        ServiceReference ref = context.getServiceReference(Tota.class.getName());
+        Tota tota = (Tota) context.getService(ref);
+        invokeAll(tota);
+        // Check toto
+        Properties props = tota.getProps();
+        Integer toto = (Integer) props.get("toto");
+        Integer toto_2 = (Integer) props.get("toto_2");
+        Integer toto_3 = (Integer) props.get("toto_3");
+        Integer toto_4 = (Integer) props.get("toto_4");
+        assertEquals("Assert toto - 3 ("+toto.intValue()+")", toto.intValue(), 1);
+        assertEquals("Assert toto_2 - 3", toto_2.intValue(), 1);
+        assertEquals("Assert toto_3 - 3", toto_3.intValue(), 1);
+        assertEquals("Assert toto_4 - 3", toto_4.intValue(), 0);
+        //Check tata
+        props = tota.getPropsTata();
+        Integer tata = (Integer) props.get("tata");
+        Integer tataStr = (Integer) props.get("tataStr");
+        Integer tataStrs = (Integer) props.get("tataStrs");
+        Integer tata_2 = (Integer) props.get("tata_2");
+        Integer tata_3 = (Integer) props.get("tata_3");
+        Integer tata1 = (Integer) props.get("tata1");
+        Integer tata1_1 = (Integer) props.get("tata1_1");
+        Integer tata5 = (Integer) props.get("tata5");
+        Integer tata5_1 = (Integer) props.get("tata5_1");
+        Integer tata5_2 = (Integer) props.get("tata5_2");
+        assertEquals("Assert tata - 3", tata.intValue(), 1);
+        assertEquals("Assert tataStr - 3", tataStr.intValue(), 1);
+        assertEquals("Assert tataStrs - 3", tataStrs.intValue(), 0);
+        assertEquals("Assert tata_2 - 3", tata_2.intValue(), 1);
+        assertEquals("Assert tata_3 - 3", tata_3.intValue(), 1);
+        assertEquals("Assert tata1 - 3", tata1.intValue(), 1);
+        assertEquals("Assert tata1_1 - 3", tata1_1.intValue(), 1);
+        assertEquals("Assert tata5 - 3", tata5.intValue(), 1);
+        assertEquals("Assert tata5_1 - 3", tata5_1.intValue(), 1);
+        assertEquals("Assert tata5_2 - 3", tata5_2.intValue(), 1);
+        
+        context.ungetService(ref);
+        tota = null;
+        
+        // Start a second import
+        totoProv2.start();
+        assertTrue("Assert under state - 4", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 4", context.getServiceReference(Tota.class.getName()));
+        ref = context.getServiceReference(Tota.class.getName());
+        tota = (Tota) context.getService(ref);
+        invokeAll(tota);
+        // Check toto
+        props = tota.getProps();
+        toto = (Integer) props.get("toto");
+        toto_2 = (Integer) props.get("toto_2");
+        toto_3 = (Integer) props.get("toto_3");
+        toto_4 = (Integer) props.get("toto_4");
+        assertEquals("Assert toto - 4", toto.intValue(), 2);
+        assertEquals("Assert toto_2 - 4", toto_2.intValue(), 2);
+        assertEquals("Assert toto_3 - 4", toto_3.intValue(), 2);
+        assertEquals("Assert toto_4 - 4", toto_4.intValue(), 0);
+        //Check tata
+        props = tota.getPropsTata();
+        tata = (Integer) props.get("tata");
+        tataStr = (Integer) props.get("tataStr");
+        tataStrs = (Integer) props.get("tataStrs");
+        tata_2 = (Integer) props.get("tata_2");
+        tata_3 = (Integer) props.get("tata_3");
+        tata1 = (Integer) props.get("tata1");
+        tata1_1 = (Integer) props.get("tata1_1");
+        tata5 = (Integer) props.get("tata5");
+        tata5_1 = (Integer) props.get("tata5_1");
+        tata5_2 = (Integer) props.get("tata5_2");
+        assertEquals("Assert tata - 4", tata.intValue(), 2);
+        assertEquals("Assert tataStr - 4", tataStr.intValue(), 2);
+        assertEquals("Assert tataStrs - 4", tataStrs.intValue(), 0);
+        assertEquals("Assert tata_2 - 4", tata_2.intValue(), 2);
+        assertEquals("Assert tata_3 - 4", tata_3.intValue(), 2);
+        assertEquals("Assert tata1 - 4", tata1.intValue(), 2);
+        assertEquals("Assert tata1_1 - 4", tata1_1.intValue(), 2);
+        assertEquals("Assert tata5 - 4", tata5.intValue(), 2);
+        assertEquals("Assert tata5_1 - 4", tata5_1.intValue(), 2);
+        assertEquals("Assert tata5_2 - 4", tata5_2.intValue(), 2);
+        
+        context.ungetService(ref);
+        tota = null;
+        
+        tataFactory.stop();
+        assertTrue("Assert under state - 5", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 5", context.getServiceReference(Tota.class.getName()));
+        
+        totoProv2.stop();
+        tataFactory.start();
+        assertTrue("Assert under state - 6", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 6", context.getServiceReference(Tota.class.getName()));
+        ref = context.getServiceReference(Tota.class.getName());
+        tota = (Tota) context.getService(ref);
+        invokeAll(tota);
+        // Check toto
+        props = tota.getProps();
+        toto = (Integer) props.get("toto");
+        toto_2 = (Integer) props.get("toto_2");
+        toto_3 = (Integer) props.get("toto_3");
+        toto_4 = (Integer) props.get("toto_4");
+        assertEquals("Assert toto - 6", toto.intValue(), 3);
+        assertEquals("Assert toto_2 - 6", toto_2.intValue(), 3);
+        assertEquals("Assert toto_3 - 6", toto_3.intValue(), 3);
+        assertEquals("Assert toto_4 - 6", toto_4.intValue(), 0);
+        //Check tata
+        props = tota.getPropsTata();
+        tata = (Integer) props.get("tata");
+        tataStr = (Integer) props.get("tataStr");
+        tataStrs = (Integer) props.get("tataStrs");
+        tata_2 = (Integer) props.get("tata_2");
+        tata_3 = (Integer) props.get("tata_3");
+        tata1 = (Integer) props.get("tata1");
+        tata1_1 = (Integer) props.get("tata1_1");
+        tata5 = (Integer) props.get("tata5");
+        tata5_1 = (Integer) props.get("tata5_1");
+        tata5_2 = (Integer) props.get("tata5_2");
+        assertEquals("Assert tata - 6", tata.intValue(), 1);
+        assertEquals("Assert tataStr - 6", tataStr.intValue(), 1);
+        assertEquals("Assert tataStrs - 6", tataStrs.intValue(), 0);
+        assertEquals("Assert tata_2 - 6", tata_2.intValue(), 1);
+        assertEquals("Assert tata_3 - 6", tata_3.intValue(), 1);
+        assertEquals("Assert tata1 - 6", tata1.intValue(), 1);
+        assertEquals("Assert tata1_1 - 6", tata1_1.intValue(), 1);
+        assertEquals("Assert tata5 - 6", tata5.intValue(), 1);
+        assertEquals("Assert tata5_1 - 6", tata5_1.intValue(), 1);
+        assertEquals("Assert tata5_2 - 6", tata5_2.intValue(), 1);
+        
+        context.ungetService(ref);
+        tota = null;
+        
+        // Is arch exposed
+        assertNotNull("Test arch", Utils.getServiceReferenceByName(context, Architecture.class.getName(), under.getInstanceName()));
+        
+        totoProv.stop();
+        
+        assertTrue("Assert under state - 7", under.getState() == ComponentInstance.INVALID);
+        assertNotNull("Test arch-2", Utils.getServiceReferenceByName(context, Architecture.class.getName(), under.getInstanceName()));
+        assertNull("Assert no tota service - 7", context.getServiceReference(Tota.class.getName()));
+        
+        under.dispose();
+        under = null;
+    }
+
+
+
+    private void invoke(Tota tota) {
+        tota.tata();
+        
+        assertEquals("Assert invoke tataint", tota.tataInt(2), 2);
+        assertEquals("Assert invoke tataLong", tota.tataLong(2), 2);
+        assertEquals("Assert invoke tataDouble", tota.tataDouble(2), 2);
+        assertEquals("Assert invoke tataChar", tota.tataChar('a'), 'a');
+        assertTrue("Assert invoke tataBoolean", tota.tataBoolean(true));
+        assertEquals("Assert invoke tataByte", tota.tataByte((byte)2), 2);
+        assertEquals("Assert invoke tataShort", tota.tataShort((short)5), 5);
+        assertEquals("Assert invoke tataFloat", tota.tataFloat(5), 5);
+        
+    }
+    
+    private void invokeArrays(Tota tota) {
+        
+        int[] a = new int[] {1,2,3};
+        assertEquals("Assert invoke tataint[]", tota.tataInts(a), a);
+        
+        long[] b = new long[] {1,2,3};
+        assertEquals("Assert invoke tataLong[]", tota.tataLongs(b), b);
+        
+        double[] c = new double[] {1,2,3};
+        assertEquals("Assert invoke tataDouble[]", tota.tataDoubles(c), c);
+        
+        char[] d = new char[] {'a','b', 'c'};
+        assertEquals("Assert invoke tataChar[]", tota.tataChars(d), d);
+        
+        boolean[] e = new boolean[] {true, false};
+        assertEquals("Assert invoke tataBoolean[]", tota.tataBooleans(e), e);
+        
+        byte[] f = new byte[] {(byte) 1};
+        assertEquals("Assert invoke tataByte[]", tota.tataBytes(f), f);
+        
+        short[] g = new short[] {(short) 1};
+        assertEquals("Assert invoke tataShort[]", tota.tataShorts(g), g);
+        
+        float[] h = new float[] {5,6,7};
+        assertEquals("Assert invoke tataFloat[]", tota.tataFloats(h), h);
+        
+    }
+    
+    private void invokeStr(Tota tota) {
+        tota.tataStr();
+    }
+    
+    private void invokeTata(Tota tota) {
+        tota.tata(1,2);
+        tota.tata("tototototo");
+    }
+    
+    private void invokeTata1(Tota tota) {
+        assertEquals("Assert tata1", tota.tata1("foo"), "foo");
+        assertEquals("Assert tata1 - 2", tota.tata1(new char[] {'a','b','c'}), "abc");
+    }
+    
+    private void invokeTata5(Tota tota) {
+        assertEquals("Assert tata5 -1", tota.tata5("foo",1), "foo"+1);
+        assertEquals("Assert tata5 - 2", tota.tata5(new String[] {"a","b","c"}, 1), "31");
+        assertEquals("Assert tata5 - 3", tota.tata5("foo", new int[] {1,2,3}), "foo3");
+    }
+    
+    private void invokeAdd(Tota tota) {
+        assertEquals("Assert add", tota.add(1,1,1), 3);
+    }
+    
+    private void invokeToto(Tota tota) {
+        tota.toto();
+        assertEquals("Assert toto", tota.toto("foo"), "foo");
+        tota.toto(1,2);
+    }
+    
+    private void invokeAll(Tota tota) {
+        invoke(tota);
+        invokeArrays(tota);
+        invokeStr(tota);
+        invokeTata(tota);
+        invokeTata1(tota);
+        invokeTata5(tota);
+        invokeAdd(tota);
+        invokeToto(tota);
+    }
+    
+
+}
diff --git a/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp2.java b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp2.java
new file mode 100644
index 0000000..763080f
--- /dev/null
+++ b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp2.java
@@ -0,0 +1,232 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.test.composite.provides;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.component.TotoProvider;
+import org.apache.felix.ipojo.test.composite.service.Tota;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestComp2 extends OSGiTestCase {
+
+    private ComponentFactory tataFactory;
+    private ComponentFactory totoFactory;
+    
+    private ComponentInstance totoProv, totoProv2;
+    private ComponentInstance under;
+	private ComponentFactory tataFactory2;
+
+    public void setUp() {
+        tataFactory = (ComponentFactory) Utils.getFactoryByName(context, "tata");
+        totoFactory = (ComponentFactory) Utils.getFactoryByName(context, "toto");
+        tataFactory2 = (ComponentFactory) Utils.getFactoryByName(context, "comp-6");
+        tataFactory2.stop();
+        tataFactory.stop();
+        
+        Properties props = new Properties();
+        props.put("name", "toto provider");
+        try {
+            totoProv = totoFactory.createComponentInstance(props);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        
+        Properties props3 = new Properties();
+        props3.put("name", "toto provider 2");
+        try {
+            totoProv2 = totoFactory.createComponentInstance(props3);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        
+        totoProv.stop();
+        totoProv2.stop();
+        
+        Factory factory = Utils.getFactoryByName(context, "comp-2");
+        Properties props2 = new Properties();
+        props2.put("name", "ff");
+        try {
+            under = factory.createComponentInstance(props2);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+         
+    }
+    
+    public void tearDown() { 
+        tataFactory.start();
+        totoProv.dispose();
+        totoProv = null;
+        totoProv2.dispose();
+        totoProv2 = null;
+        tataFactory2.start();
+        
+        // Reset counters
+        TotoProvider.toto = 0;
+        TotoProvider.toto_2 = 0;
+        TotoProvider.toto_3 = 0;
+        TotoProvider.toto_4 = 0;
+        TotoProvider.toto1 = 0;
+    }
+    
+    public void testSimple() {
+        // Neither factory nor instance
+        assertTrue("Assert under state - 1", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 1", context.getServiceReference(Tota.class.getName()));
+        
+        // Start the importer
+        totoProv.start();
+        assertTrue("Assert under state - 2 ("+under.getState()+")", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 2", context.getServiceReference(Tota.class.getName()));
+        
+        // Start the factory
+        tataFactory.start();
+        assertTrue("Assert under state - 3", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 3", context.getServiceReference(Tota.class.getName()));
+        ServiceReference ref = context.getServiceReference(Tota.class.getName());
+        Tota tota = (Tota) context.getService(ref);
+        
+        invokeAll(tota);
+        
+        // Check toto
+        Properties props = tota.getProps();
+        Integer toto = (Integer) props.get("toto");
+        Integer toto_2 = (Integer) props.get("toto_2");
+        Integer toto_3 = (Integer) props.get("toto_3");
+        Integer toto_4 = (Integer) props.get("toto_4");
+        Integer toto_1 = (Integer) props.get("toto1");
+        assertEquals("Assert toto - 3 ("+toto.intValue()+")", toto.intValue(), 1);
+        assertEquals("Assert toto_2 - 3", toto_2.intValue(), 1);
+        assertEquals("Assert toto_3 - 3", toto_3.intValue(), 1);
+        assertEquals("Assert toto_4 - 3", toto_4.intValue(), 0);
+        assertEquals("Assert toto1 - 3 (" + toto_1.intValue() + ")", toto_1.intValue(), 1);
+        //Check tata
+        props = tota.getPropsTata();
+        Integer tata = (Integer) props.get("tata");
+        assertEquals("Assert tata - 3", tata.intValue(), 1);
+        
+        context.ungetService(ref);
+        tota = null;
+        
+        // Start a second import
+        totoProv2.start();
+        assertTrue("Assert under state - 4", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 4", context.getServiceReference(Tota.class.getName()));
+        ref = context.getServiceReference(Tota.class.getName());
+        tota = (Tota) context.getService(ref);
+        invokeAll(tota);
+        // Check toto
+        props = tota.getProps();
+        toto = (Integer) props.get("toto");
+        toto_2 = (Integer) props.get("toto_2");
+        toto_3 = (Integer) props.get("toto_3");
+        toto_4 = (Integer) props.get("toto_4");
+        toto_1 = (Integer) props.get("toto1");
+        assertEquals("Assert toto - 4 ("+toto.intValue()+")", toto.intValue(), 2);
+        assertEquals("Assert toto_2 - 4 ("+toto_2.intValue()+")", toto_2.intValue(), 2);
+        assertEquals("Assert toto_3 - 4", toto_3.intValue(), 2);
+        assertEquals("Assert toto_4 - 4", toto_4.intValue(), 0);
+        assertEquals("Assert toto1 - 4", toto_1.intValue(), 3);
+        //Check tata
+        props = tota.getPropsTata();
+        tata = (Integer) props.get("tata");
+        assertEquals("Assert tata - 4", tata.intValue(), 2);
+        
+        context.ungetService(ref);
+        tota = null;
+        
+        tataFactory.stop();
+        assertTrue("Assert under state - 5", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 5", context.getServiceReference(Tota.class.getName()));
+        
+        totoProv2.stop();
+        tataFactory.start();
+        assertTrue("Assert under state - 6", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 6", context.getServiceReference(Tota.class.getName()));
+        ref = context.getServiceReference(Tota.class.getName());
+        tota = (Tota) context.getService(ref);
+        invokeAll(tota);
+        // Check toto
+        props = tota.getProps();
+        toto = (Integer) props.get("toto");
+        toto_2 = (Integer) props.get("toto_2");
+        toto_3 = (Integer) props.get("toto_3");
+        toto_4 = (Integer) props.get("toto_4");
+        toto_1 = (Integer) props.get("toto1");
+        assertEquals("Assert toto - 6 ("+toto.intValue()+")", toto.intValue(), 3);
+        assertEquals("Assert toto_2 - 6 ("+toto_2.intValue()+")", toto_2.intValue(), 3);
+        assertEquals("Assert toto_3 - 6", toto_3.intValue(), 3);
+        assertEquals("Assert toto_4 - 6", toto_4.intValue(), 0);
+        assertEquals("Assert toto1 - 6", toto_1.intValue(), 4);
+        //Check tata
+        props = tota.getPropsTata();
+        tata = (Integer) props.get("tata");
+        assertEquals("Assert tata - 6", tata.intValue(), 1);
+        
+        context.ungetService(ref);
+        tota = null;
+        
+        // Is arch exposed
+        assertNotNull("Test arch", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+        
+        totoProv.stop();
+        
+        assertTrue("Assert under state - 7", under.getState() == ComponentInstance.INVALID);
+        assertNotNull("Test arch-2", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+        assertNull("Assert no tota service - 7", context.getServiceReference(Tota.class.getName()));
+        
+        under.dispose();
+        under = null;
+    }
+
+    private void invoke(Tota tota) {
+        tota.tata();
+        
+        assertEquals("Assert invoke tataint", tota.tataInt(2), 2);
+        assertEquals("Assert invoke tataLong", tota.tataLong(2), 2);
+        assertEquals("Assert invoke tataDouble", tota.tataDouble(2), 2);
+        assertEquals("Assert invoke tataChar", tota.tataChar('a'), 'a');
+        assertTrue("Assert invoke tataBoolean", tota.tataBoolean(true));
+        assertEquals("Assert invoke tataByte", tota.tataByte((byte)2), 2);
+        assertEquals("Assert invoke tataShort", tota.tataShort((short)5), 5);
+        assertEquals("Assert invoke tataFloat", tota.tataFloat(5), 5);
+        
+    }
+    
+    private void invokeToto(Tota tota) {
+        tota.toto();
+        assertEquals("Assert toto", tota.toto("foo"), "foo");
+        tota.toto(1,2);
+        tota.toto1("foo2");
+    }
+    
+    private void invokeAll(Tota tota) {
+        invoke(tota);
+        invokeToto(tota);
+    }
+    
+
+}
diff --git a/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp3.java b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp3.java
new file mode 100644
index 0000000..07ac5d3
--- /dev/null
+++ b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp3.java
@@ -0,0 +1,262 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.test.composite.provides;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.component.TotoProvider;
+import org.apache.felix.ipojo.test.composite.service.Tota;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestComp3 extends OSGiTestCase {
+
+    private ComponentFactory tataFactory;
+    private ComponentFactory totoFactory;
+    
+    private ComponentInstance totoProv, totoProv2;
+    private ComponentInstance under;
+	private ComponentFactory tataFactory2;  
+    
+    public void setUp() {
+        tataFactory = (ComponentFactory) Utils.getFactoryByName(context, "tata");
+        totoFactory = (ComponentFactory) Utils.getFactoryByName(context, "toto");
+        tataFactory2 = (ComponentFactory) Utils.getFactoryByName(context, "comp-6");
+        tataFactory2.stop();
+        tataFactory.stop();
+        
+        Properties props = new Properties();
+        props.put("name", "toto provider");
+        try {
+            totoProv = totoFactory.createComponentInstance(props);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        
+        Properties props3 = new Properties();
+        props3.put("name", "toto provider 2");
+        try {
+            totoProv2 = totoFactory.createComponentInstance(props3);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        
+        totoProv.stop();
+        totoProv2.stop();
+        
+        Factory factory = Utils.getFactoryByName(context, "comp-3");
+        Properties props2 = new Properties();
+        props2.put("name", "ff");
+        try {
+            under = factory.createComponentInstance(props2);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+         
+    }
+    
+    public void tearDown() {  
+        tataFactory.start();
+        totoProv.dispose();
+        totoProv = null;
+        totoProv2.dispose();
+        totoProv2 = null;
+        tataFactory2.start();
+        
+        // Reset counters
+        TotoProvider.toto = 0;
+        TotoProvider.toto_2 = 0;
+        TotoProvider.toto_3 = 0;
+        TotoProvider.toto_4 = 0;
+        TotoProvider.toto1 = 0;
+    }
+    
+    public void testSimple() {
+        // Neither factory nor instance
+        assertTrue("Assert under state - 1", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 1", context.getServiceReference(Tota.class.getName()));
+        
+        // Start the importer
+        totoProv.start();
+        assertTrue("Assert under state - 2 ("+under.getState()+")", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 2", context.getServiceReference(Tota.class.getName()));
+        
+        // Start the factory
+        tataFactory.start();
+        assertTrue("Assert under state - 3", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 3", context.getServiceReference(Tota.class.getName()));
+        ServiceReference ref = context.getServiceReference(Tota.class.getName());
+        Tota tota = (Tota) context.getService(ref);
+        invokeAll(tota);
+        // Check toto
+        Properties props = tota.getProps();
+        Integer toto = (Integer) props.get("toto");
+        Integer toto_2 = (Integer) props.get("toto_2");
+        Integer toto_3 = (Integer) props.get("toto_3");
+        Integer toto_4 = (Integer) props.get("toto_4");
+        Integer toto_1 = (Integer) props.get("toto1");
+        assertEquals("Assert toto - 3 ("+toto.intValue()+")", toto.intValue(), 1);
+        assertEquals("Assert toto_2 - 3", toto_2.intValue(), 1);
+        assertEquals("Assert toto_3 - 3", toto_3.intValue(), 1);
+        assertEquals("Assert toto_4 - 3", toto_4.intValue(), 0);
+        assertEquals("Assert toto1 - 3 (" + toto_1.intValue() + ")", toto_1.intValue(), 1);
+        //Check tata
+        props = tota.getPropsTata();
+        Integer tata = (Integer) props.get("tata");
+        assertEquals("Assert tata - 3", tata.intValue(), 1);
+        
+        context.ungetService(ref);
+        tota = null;
+        
+        // Start a second import
+        totoProv2.start();
+        assertTrue("Assert under state - 4", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 4", context.getServiceReference(Tota.class.getName()));
+        ref = context.getServiceReference(Tota.class.getName());
+        tota = (Tota) context.getService(ref);
+        invokeAll(tota);
+        props = tota.getProps();
+        toto = (Integer) props.get("toto");
+        toto_2 = (Integer) props.get("toto_2");
+        toto_3 = (Integer) props.get("toto_3");
+        toto_4 = (Integer) props.get("toto_4");
+        toto_1 = (Integer) props.get("toto1");
+        assertEquals("Assert toto - 4 ("+toto.intValue()+")", toto.intValue(), 2);
+        assertEquals("Assert toto_2 - 4 ("+toto_2.intValue()+")", toto_2.intValue(), 2);
+        assertEquals("Assert toto_3 - 4", toto_3.intValue(), 2);
+        assertEquals("Assert toto_4 - 4", toto_4.intValue(), 0);
+        assertEquals("Assert toto1 - 4", toto_1.intValue(), 2);
+        //Check tata
+        props = tota.getPropsTata();
+        tata = (Integer) props.get("tata");
+        assertEquals("Assert tata - 4", tata.intValue(), 2);
+        context.ungetService(ref);
+        tota = null;
+        
+        // Stop the factory
+        tataFactory.stop();
+        assertTrue("Assert under state - 5", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 5", context.getServiceReference(Tota.class.getName()));
+        
+        totoProv2.stop();
+        totoProv.stop();
+        tataFactory.start();
+        assertTrue("Assert under state - 6", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 6", context.getServiceReference(Tota.class.getName()));
+        ref = context.getServiceReference(Tota.class.getName());
+        tota = (Tota) context.getService(ref);
+        invokeAllOpt(tota);
+        //Check tata
+        props = tota.getPropsTata();
+        tata = (Integer) props.get("tata");
+        assertEquals("Assert tata - 4", tata.intValue(), 1);
+        context.ungetService(ref);
+        tota = null;
+        
+        // Is arch exposed
+        assertNotNull("Test arch", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+        
+        tataFactory.stop();
+        
+        assertTrue("Assert under state - 7", under.getState() == ComponentInstance.INVALID);
+        assertNotNull("Test arch-2", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+        assertNull("Assert no tota service - 7", context.getServiceReference(Tota.class.getName()));
+        
+        under.dispose();
+        under = null;
+    }
+
+    private void invoke(Tota tota) {
+        tota.tata();
+        
+        assertEquals("Assert invoke tataint", tota.tataInt(2), 2);
+        assertEquals("Assert invoke tataLong", tota.tataLong(2), 2);
+        assertEquals("Assert invoke tataDouble", tota.tataDouble(2), 2);
+        assertEquals("Assert invoke tataChar", tota.tataChar('a'), 'a');
+        assertTrue("Assert invoke tataBoolean", tota.tataBoolean(true));
+        assertEquals("Assert invoke tataByte", tota.tataByte((byte)2), 2);
+        assertEquals("Assert invoke tataShort", tota.tataShort((short)5), 5);
+        assertEquals("Assert invoke tataFloat", tota.tataFloat(5), 5);
+        
+    }
+    
+    
+    private void invokeStr(Tota tota) {
+        tota.tataStr();
+    }
+    
+    private void invokeToto(Tota tota) {
+        tota.toto();
+        assertEquals("Assert toto", tota.toto("foo"), "foo");
+        tota.toto(1,2);
+        tota.toto1("foo");
+    }
+    
+    private void invokeAll(Tota tota) {
+        invoke(tota);
+        //invokeArrays(tota);
+        invokeStr(tota);
+        //invokeTata(tota);
+        //invokeTata1(tota);
+        //invokeTata5(tota);
+        //invokeAdd(tota);
+        invokeToto(tota);
+    }
+    
+    private void invokeAllOpt(Tota tota) {
+        invoke(tota);
+        //invokeArrays(tota);
+        invokeStr(tota);
+        //invokeTata(tota);
+        //invokeTata1(tota);
+        //invokeTata5(tota);
+        //invokeAdd(tota);
+        invokeTotoOpt(tota);
+    }
+    
+    private void invokeTotoOpt(Tota tota) {
+        try {
+            tota.toto();
+            fail("UnsupportedOperationException expected");
+        } catch(UnsupportedOperationException e) { }
+        
+        try {
+            assertEquals("Assert toto", tota.toto("foo"), "foo");
+            fail("UnsupportedOperationException expected");
+        } catch(UnsupportedOperationException e) { }
+        
+        
+        try {
+            tota.toto(1,2);
+            fail("UnsupportedOperationException expected");
+        } catch(UnsupportedOperationException e) { }
+        
+        try {
+            tota.toto1("foo");
+            fail("UnsupportedOperationException expected");
+        } catch(UnsupportedOperationException e) { }
+    }
+    
+
+}
diff --git a/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp4.java b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp4.java
new file mode 100644
index 0000000..0d0f36c
--- /dev/null
+++ b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp4.java
@@ -0,0 +1,261 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.test.composite.provides;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.component.TotoProvider;
+import org.apache.felix.ipojo.test.composite.service.Tota;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestComp4 extends OSGiTestCase {
+
+    private ComponentFactory tataFactory;
+    private ComponentFactory totoFactory;
+    
+    private ComponentInstance totoProv, totoProv2;
+    private ComponentInstance under;
+	private ComponentFactory tataFactory2;
+
+    public void setUp() {
+        tataFactory = (ComponentFactory) Utils.getFactoryByName(context, "tata");
+        totoFactory = (ComponentFactory) Utils.getFactoryByName(context, "toto");
+        tataFactory2 = (ComponentFactory) Utils.getFactoryByName(context, "comp-6");
+        tataFactory2.stop();
+        tataFactory.stop();
+        
+        Properties props = new Properties();
+        props.put("name", "toto provider");
+        try {
+            totoProv = totoFactory.createComponentInstance(props);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        
+        Properties props3 = new Properties();
+        props3.put("name", "toto provider 2");
+        try {
+            totoProv2 = totoFactory.createComponentInstance(props3);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        
+        totoProv.stop();
+        totoProv2.stop();
+        
+        Factory factory = Utils.getFactoryByName(context, "comp-4");
+        Properties props2 = new Properties();
+        props2.put("name", "ff");
+        try {
+            under = factory.createComponentInstance(props2);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+         
+    }
+    
+    public void tearDown() {  
+    	tataFactory2.start();
+        tataFactory.start();
+        totoProv.dispose();
+        totoProv = null;
+        totoProv2.dispose();
+        totoProv2 = null;
+        
+        // Reset counters
+        TotoProvider.toto = 0;
+        TotoProvider.toto_2 = 0;
+        TotoProvider.toto_3 = 0;
+        TotoProvider.toto_4 = 0;
+        TotoProvider.toto1 = 0;
+    }
+    
+    public void testSimple() {
+        // Neither factory nor instance
+        assertTrue("Assert under state - 1", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 1", context.getServiceReference(Tota.class.getName()));
+        
+        // Start the importer
+        totoProv.start();
+        assertTrue("Assert under state - 2 ("+under.getState()+")", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 2", context.getServiceReference(Tota.class.getName()));
+        
+        // Start the factory
+        tataFactory.start();
+        assertTrue("Assert under state - 3", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 3", context.getServiceReference(Tota.class.getName()));
+        ServiceReference ref = context.getServiceReference(Tota.class.getName());
+        Tota tota = (Tota) context.getService(ref);
+        invokeAll(tota);
+        // Check toto
+        Properties props = tota.getProps();
+        Integer toto = (Integer) props.get("toto");
+        Integer toto_2 = (Integer) props.get("toto_2");
+        Integer toto_3 = (Integer) props.get("toto_3");
+        Integer toto_4 = (Integer) props.get("toto_4");
+        Integer toto_1 = (Integer) props.get("toto1");
+        assertEquals("Assert toto - 3 ("+toto.intValue()+")", toto.intValue(), 1);
+        assertEquals("Assert toto_2 - 3", toto_2.intValue(), 1);
+        assertEquals("Assert toto_3 - 3", toto_3.intValue(), 1);
+        assertEquals("Assert toto_4 - 3", toto_4.intValue(), 0);
+        assertEquals("Assert toto1 - 3 (" + toto_1.intValue() + ")", toto_1.intValue(), 1);
+        //Check tata
+        props = tota.getPropsTata();
+        Integer tata = (Integer) props.get("tata");
+        assertEquals("Assert tata - 3", tata.intValue(), 1);
+        context.ungetService(ref);
+        tota = null;
+        
+        // Start a second import
+        totoProv2.start();
+        assertTrue("Assert under state - 4", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 4", context.getServiceReference(Tota.class.getName()));
+        ref = context.getServiceReference(Tota.class.getName());
+        tota = (Tota) context.getService(ref);
+        invokeAll(tota);
+        props = tota.getProps();
+        toto = (Integer) props.get("toto");
+        toto_2 = (Integer) props.get("toto_2");
+        toto_3 = (Integer) props.get("toto_3");
+        toto_4 = (Integer) props.get("toto_4");
+        toto_1 = (Integer) props.get("toto1");
+        assertEquals("Assert toto - 4 ("+toto.intValue()+")", toto.intValue(), 2);
+        assertEquals("Assert toto_2 - 4 ("+toto_2.intValue()+")", toto_2.intValue(), 2);
+        assertEquals("Assert toto_3 - 4", toto_3.intValue(), 2);
+        assertEquals("Assert toto_4 - 4", toto_4.intValue(), 0);
+        assertEquals("Assert toto1 - 4", toto_1.intValue(), 2);
+        //Check tata
+        props = tota.getPropsTata();
+        tata = (Integer) props.get("tata");
+        assertEquals("Assert tata - 4", tata.intValue(), 2);
+        context.ungetService(ref);
+        tota = null;
+        
+        // Stop the factory
+        tataFactory.stop();
+        assertTrue("Assert under state - 5", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 5", context.getServiceReference(Tota.class.getName()));
+        
+        totoProv2.stop();
+        totoProv.stop();
+        tataFactory.start();
+        assertTrue("Assert under state - 6", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 6", context.getServiceReference(Tota.class.getName()));
+        ref = context.getServiceReference(Tota.class.getName());
+        tota = (Tota) context.getService(ref);
+        invokeAllOpt(tota);
+        // Check tata
+        props = tota.getPropsTata();
+        tata = (Integer) props.get("tata");
+        assertEquals("Assert tata - 6", tata.intValue(), 1);
+        context.ungetService(ref);
+        tota = null;
+        
+        // Is arch exposed
+        assertNotNull("Test arch", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+        
+        tataFactory.stop();
+        
+        assertTrue("Assert under state - 7", under.getState() == ComponentInstance.INVALID);
+        assertNotNull("Test arch-2", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+        assertNull("Assert no tota service - 7", context.getServiceReference(Tota.class.getName()));
+        
+        under.dispose();
+        under = null;
+    }
+
+    private void invoke(Tota tota) {
+        tota.tata();
+        
+        assertEquals("Assert invoke tataint", tota.tataInt(2), 2);
+        assertEquals("Assert invoke tataLong", tota.tataLong(2), 2);
+        assertEquals("Assert invoke tataDouble", tota.tataDouble(2), 2);
+        assertEquals("Assert invoke tataChar", tota.tataChar('a'), 'a');
+        assertTrue("Assert invoke tataBoolean", tota.tataBoolean(true));
+        assertEquals("Assert invoke tataByte", tota.tataByte((byte)2), 2);
+        assertEquals("Assert invoke tataShort", tota.tataShort((short)5), 5);
+        assertEquals("Assert invoke tataFloat", tota.tataFloat(5), 5);
+        
+    }
+    
+    
+    private void invokeStr(Tota tota) {
+        tota.tataStr();
+    }
+    
+    private void invokeToto(Tota tota) {
+        tota.toto();
+        assertEquals("Assert toto", tota.toto("foo"), "foo");
+        tota.toto(1,2);
+        tota.toto1("foo");
+    }
+    
+    private void invokeAll(Tota tota) {
+        invoke(tota);
+        //invokeArrays(tota);
+        invokeStr(tota);
+        //invokeTata(tota);
+        //invokeTata1(tota);
+        //invokeTata5(tota);
+        //invokeAdd(tota);
+        invokeToto(tota);
+    }
+    
+    private void invokeAllOpt(Tota tota) {
+        invoke(tota);
+        //invokeArrays(tota);
+        invokeStr(tota);
+        //invokeTata(tota);
+        //invokeTata1(tota);
+        //invokeTata5(tota);
+        //invokeAdd(tota);
+        invokeTotoOpt(tota);
+    }
+    
+    private void invokeTotoOpt(Tota tota) {
+        try {
+            tota.toto();
+            fail("UnsupportedOperationException expected");
+        } catch(UnsupportedOperationException e) { }
+        
+        try {
+            assertEquals("Assert toto", tota.toto("foo"), "foo");
+            fail("UnsupportedOperationException expected");
+        } catch(UnsupportedOperationException e) { }
+        
+        
+        try {
+            tota.toto(1,2);
+            fail("UnsupportedOperationException expected");
+        } catch(UnsupportedOperationException e) { }
+        
+        try {
+            tota.toto1("foo");
+            fail("UnsupportedOperationException expected");
+        } catch(UnsupportedOperationException e) { }
+    }
+    
+
+}
diff --git a/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp5.java b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp5.java
new file mode 100644
index 0000000..7dd11f7
--- /dev/null
+++ b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp5.java
@@ -0,0 +1,265 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.test.composite.provides;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.component.TotoProvider;
+import org.apache.felix.ipojo.test.composite.service.Tota;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestComp5 extends OSGiTestCase {
+
+    private ComponentFactory tataFactory;
+    private ComponentFactory totoFactory;
+    
+    private ComponentInstance totoProv, totoProv2;
+    private ComponentInstance under;
+	private ComponentFactory tataFactory2;
+
+    public void setUp() {
+        tataFactory = (ComponentFactory) Utils.getFactoryByName(context, "tata");
+        totoFactory = (ComponentFactory) Utils.getFactoryByName(context, "toto");
+        tataFactory2 = (ComponentFactory) Utils.getFactoryByName(context, "comp-6");
+        tataFactory2.stop();
+        tataFactory.stop();
+        
+        Properties props = new Properties();
+        props.put("name", "toto provider");
+        try {
+            totoProv = totoFactory.createComponentInstance(props);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        
+        Properties props3 = new Properties();
+        props3.put("name", "toto provider 2");
+        try {
+            totoProv2 = totoFactory.createComponentInstance(props3);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        
+        totoProv.stop();
+        totoProv2.stop();
+        
+        Factory factory = Utils.getFactoryByName(context, "comp-5");
+        Properties props2 = new Properties();
+        props2.put("name", "ff");
+        try {
+            under = factory.createComponentInstance(props2);
+        } catch(Exception e) {
+            e.printStackTrace();
+            fail("Cannot create an instance from comp-5 : " + e.getMessage());
+        }
+         
+    }
+    
+    public void tearDown() {    
+    	tataFactory2.start();
+        tataFactory.start();
+        totoProv.dispose();
+        totoProv = null;
+        totoProv2.dispose();
+        totoProv2 = null;
+        
+        // Reset counters
+        TotoProvider.toto = 0;
+        TotoProvider.toto_2 = 0;
+        TotoProvider.toto_3 = 0;
+        TotoProvider.toto_4 = 0;
+        TotoProvider.toto1 = 0;
+    }
+    
+    public void testSimple() {
+        // Neither factory nor instance
+        assertTrue("Assert under state - 1", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 1", context.getServiceReference(Tota.class.getName()));
+        
+        // Start the importer
+        totoProv.start();
+        assertTrue("Assert under state - 2 ("+under.getState()+")", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 2", context.getServiceReference(Tota.class.getName()));
+        
+        // Start the factory
+        tataFactory.start();
+        assertTrue("Assert under state - 3", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 3", context.getServiceReference(Tota.class.getName()));
+        ServiceReference ref = context.getServiceReference(Tota.class.getName());
+        Tota tota = (Tota) context.getService(ref);
+        invokeAll(tota);
+        // Check toto
+        Properties props = tota.getProps();
+        Integer toto = (Integer) props.get("toto");
+        Integer toto_2 = (Integer) props.get("toto_2");
+        Integer toto_3 = (Integer) props.get("toto_3");
+        Integer toto_4 = (Integer) props.get("toto_4");
+        Integer toto_1 = (Integer) props.get("toto1");
+        assertEquals("Assert toto - 3 ("+toto.intValue()+")", toto.intValue(), 1);
+        assertEquals("Assert toto_2 - 3", toto_2.intValue(), 1);
+        assertEquals("Assert toto_3 - 3", toto_3.intValue(), 1);
+        assertEquals("Assert toto_4 - 3", toto_4.intValue(), 0);
+        assertEquals("Assert toto1 - 3 (" + toto_1.intValue() + ")", toto_1.intValue(), 1);
+        //Check tata
+        props = tota.getPropsTata();
+        Integer tata = (Integer) props.get("tata");
+        assertEquals("Assert tata - 3", tata.intValue(), 1);
+        context.ungetService(ref);
+        tota = null;
+        
+        // Start a second import
+        totoProv2.start();
+        assertTrue("Assert under state - 4", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 4", context.getServiceReference(Tota.class.getName()));
+        ref = context.getServiceReference(Tota.class.getName());
+        tota = (Tota) context.getService(ref);
+        invokeAll(tota);
+        // Check toto
+        props = tota.getProps();
+        toto = (Integer) props.get("toto");
+        toto_2 = (Integer) props.get("toto_2");
+        toto_3 = (Integer) props.get("toto_3");
+        toto_4 = (Integer) props.get("toto_4");
+        toto_1 = (Integer) props.get("toto1");
+        assertEquals("Assert toto - 4 ("+toto.intValue()+")", toto.intValue(), 2);
+        assertEquals("Assert toto_2 - 4 ("+toto_2.intValue()+")", toto_2.intValue(), 2);
+        assertEquals("Assert toto_3 - 4", toto_3.intValue(), 2);
+        assertEquals("Assert toto_4 - 4", toto_4.intValue(), 0);
+        assertEquals("Assert toto1 - 4", toto_1.intValue(), 3);
+        //Check tata
+        props = tota.getPropsTata();
+        tata = (Integer) props.get("tata");
+        assertEquals("Assert tata - 4", tata.intValue(), 2);
+        context.ungetService(ref);
+        tota = null;
+        
+        // Stop the factory
+        tataFactory.stop();
+        assertTrue("Assert under state - 5", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 5", context.getServiceReference(Tota.class.getName()));
+        
+        totoProv2.stop();
+        totoProv.stop();
+        tataFactory.start();
+        assertTrue("Assert under state - 6", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 6", context.getServiceReference(Tota.class.getName()));
+        ref = context.getServiceReference(Tota.class.getName());
+        tota = (Tota) context.getService(ref);
+        invokeAllOpt(tota);
+        //Check tata
+        props = tota.getPropsTata();
+        tata = (Integer) props.get("tata");
+        assertEquals("Assert tata - 6", tata.intValue(), 1);
+        context.ungetService(ref);
+        tota = null;
+        
+        // Is arch exposed
+        assertNotNull("Test arch", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+        
+        tataFactory.stop();
+        
+        assertTrue("Assert under state - 7", under.getState() == ComponentInstance.INVALID);
+        assertNotNull("Test arch-2", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+        assertNull("Assert no tota service - 7", context.getServiceReference(Tota.class.getName()));
+        
+        under.dispose();
+        under = null;
+    }
+
+
+
+    private void invoke(Tota tota) {
+        tota.tata();
+        
+        assertEquals("Assert invoke tataint", tota.tataInt(2), 2);
+        assertEquals("Assert invoke tataLong", tota.tataLong(2), 2);
+        assertEquals("Assert invoke tataDouble", tota.tataDouble(2), 2);
+        assertEquals("Assert invoke tataChar", tota.tataChar('a'), 'a');
+        assertTrue("Assert invoke tataBoolean", tota.tataBoolean(true));
+        assertEquals("Assert invoke tataByte", tota.tataByte((byte)2), 2);
+        assertEquals("Assert invoke tataShort", tota.tataShort((short)5), 5);
+        assertEquals("Assert invoke tataFloat", tota.tataFloat(5), 5);
+        
+    }
+    
+    
+    private void invokeStr(Tota tota) {
+        tota.tataStr();
+    }
+    
+    private void invokeToto(Tota tota) {
+        tota.toto();
+        assertEquals("Assert toto", tota.toto("foo"), "foo");
+        tota.toto(1,2);
+        tota.toto1("foo");
+    }
+    
+    private void invokeAll(Tota tota) {
+        invoke(tota);
+        //invokeArrays(tota);
+        invokeStr(tota);
+        //invokeTata(tota);
+        //invokeTata1(tota);
+        //invokeTata5(tota);
+        //invokeAdd(tota);
+        invokeToto(tota);
+    }
+    
+    private void invokeAllOpt(Tota tota) {
+        invoke(tota);
+        //invokeArrays(tota);
+        invokeStr(tota);
+        //invokeTata(tota);
+        //invokeTata1(tota);
+        //invokeTata5(tota);
+        //invokeAdd(tota);
+        invokeTotoOpt(tota);
+    }
+    
+    private void invokeTotoOpt(Tota tota) {
+        try {
+            tota.toto();
+            fail("UnsupportedOperationException expected");
+        } catch(UnsupportedOperationException e) { }
+        
+        try {
+            assertEquals("Assert toto", tota.toto("foo"), "foo");
+            fail("UnsupportedOperationException expected");
+        } catch(UnsupportedOperationException e) { }
+        
+        
+        try {
+            tota.toto(1,2);
+            fail("UnsupportedOperationException expected");
+        } catch(UnsupportedOperationException e) { }
+        
+        try {
+        	tota.toto1("foo");
+        	fail("UnsupportedOperationException expected");
+        } catch(UnsupportedOperationException e) { }
+    }
+    
+
+}
diff --git a/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp6.java b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp6.java
new file mode 100644
index 0000000..609c23c
--- /dev/null
+++ b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp6.java
@@ -0,0 +1,284 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.test.composite.provides;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.component.TotoProvider;
+import org.apache.felix.ipojo.test.composite.service.Tata;
+import org.apache.felix.ipojo.test.composite.service.Toto;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestComp6 extends OSGiTestCase {
+
+    private ComponentFactory tataFactory;
+    private ComponentFactory totoFactory;
+    
+    private ComponentInstance totoProv, totoProv2;
+    private ComponentInstance under;
+    
+    public void setUp() {
+        tataFactory = (ComponentFactory) Utils.getFactoryByName(context, "tata");
+        totoFactory = (ComponentFactory) Utils.getFactoryByName(context, "toto");
+        
+        tataFactory.stop();
+        
+        Properties props = new Properties();
+        props.put("name", "toto provider");
+        try {
+            totoProv = totoFactory.createComponentInstance(props);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        
+        Properties props3 = new Properties();
+        props3.put("name", "toto provider 2");
+        try {
+            totoProv2 = totoFactory.createComponentInstance(props3);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        
+        totoProv.stop();
+        totoProv2.stop();
+        
+        Factory factory = Utils.getFactoryByName(context, "comp-6");
+        Properties props2 = new Properties();
+        props2.put("name", "ff");
+        try {
+            under = factory.createComponentInstance(props2);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+         
+    }
+    
+    public void tearDown() {       
+        tataFactory.start();
+        totoProv.dispose();
+        totoProv = null;
+        totoProv2.dispose();
+        totoProv2 = null;
+        
+        // Reset counters
+        TotoProvider.toto = 0;
+        TotoProvider.toto_2 = 0;
+        TotoProvider.toto_3 = 0;
+        TotoProvider.toto_4 = 0;
+        TotoProvider.toto1 = 0;
+    }
+    
+    public void testSimple() {
+        // Neither factory nor instance
+        assertTrue("Assert under state - 1", under.getState() == ComponentInstance.INVALID);
+        ServiceReference refToto = Utils.getServiceReferenceByName(context, Toto.class.getName(), "ff");
+        ServiceReference refTata = Utils.getServiceReferenceByName(context, Tata.class.getName(), "ff");
+        assertNull("Assert no toto service - 1", refToto);
+        assertNull("Assert no tata service - 1", refTata);
+
+        // Start the importer
+        totoProv.start();
+        assertTrue("Assert under state - 2 ("+under.getState()+")", under.getState() == ComponentInstance.INVALID);
+        refToto = Utils.getServiceReferenceByName(context, Toto.class.getName(), "ff");
+        refTata = Utils.getServiceReferenceByName(context, Tata.class.getName(), "ff");
+        assertNull("Assert no toto service - 2", refToto);
+        assertNull("Assert no tata service - 2", refTata);
+
+        // Start the factory
+        tataFactory.start();
+        assertTrue("Assert under state - 3", under.getState() == ComponentInstance.VALID);
+        refToto = Utils.getServiceReferenceByName(context, Toto.class.getName(), "ff");
+        refTata = Utils.getServiceReferenceByName(context, Tata.class.getName(), "ff");
+        assertNotNull("Assert toto service - 3", refToto);
+        assertNotNull("Assert tata service - 3", refTata);
+        Toto toto = (Toto) context.getService(refToto);
+        Tata tata = (Tata) context.getService(refTata);
+ 
+        invokeAll(tata);
+        invokeToto(toto);
+ 
+        // Check toto
+        Properties props = toto.getProps();
+        Integer toto_0 = (Integer) props.get("toto");
+        Integer toto_2 = (Integer) props.get("toto_2");
+        Integer toto_3 = (Integer) props.get("toto_3");
+        Integer toto_4 = (Integer) props.get("toto_4");
+        Integer toto_1 = (Integer) props.get("toto1");
+        assertEquals("Assert toto - 3 ("+toto_0.intValue()+")", toto_0.intValue(), 1);
+        assertEquals("Assert toto_2 - 3", toto_2.intValue(), 1);
+        assertEquals("Assert toto_3 - 3", toto_3.intValue(), 1);
+        assertEquals("Assert toto_4 - 3", toto_4.intValue(), 0);
+        assertEquals("Assert toto1 - 3 (" + toto_1.intValue() + ")", toto_1.intValue(), 1);
+        //Check tata
+        props = tata.getPropsTata();
+        Integer tata_0 = (Integer) props.get("tata");
+        assertEquals("Assert tata - 3", tata_0.intValue(), 1);
+
+        context.ungetService(refToto);
+        context.ungetService(refTata);
+        toto = null;
+        tata = null;
+        
+        // Start a second import
+        totoProv2.start();
+        assertTrue("Assert under state - 4", under.getState() == ComponentInstance.VALID);
+        refToto = Utils.getServiceReferenceByName(context, Toto.class.getName(), "ff");
+        refTata = Utils.getServiceReferenceByName(context, Tata.class.getName(), "ff");
+        assertNotNull("Assert toto service - 4", refToto);
+        assertNotNull("Assert tata service - 4", refTata);
+        
+        toto = (Toto) context.getService(refToto);
+        tata = (Tata) context.getService(refTata);
+        invokeAll(tata);
+        invokeToto(toto);
+
+        // Check toto
+        props = toto.getProps();
+        toto_0 = (Integer) props.get("toto");
+        toto_2 = (Integer) props.get("toto_2");
+        toto_3 = (Integer) props.get("toto_3");
+        toto_4 = (Integer) props.get("toto_4");
+        toto_1 = (Integer) props.get("toto1");
+        assertEquals("Assert toto - 4 ("+toto_0.intValue()+")", toto_0.intValue(), 2);
+        assertEquals("Assert toto_2 - 4 ("+toto_2.intValue()+")", toto_2.intValue(), 2);
+        assertEquals("Assert toto_3 - 4", toto_3.intValue(), 2);
+        assertEquals("Assert toto_4 - 4", toto_4.intValue(), 0);
+        assertEquals("Assert toto1 - 4", toto_1.intValue(), 3);
+        //Check tata
+        props = tata.getPropsTata();
+        tata_0 = (Integer) props.get("tata");
+        assertEquals("Assert tata - 4", tata_0.intValue(), 2);
+        context.ungetService(refToto);
+        context.ungetService(refTata);
+        toto = null;
+        tata = null;
+
+        // Stop the factory
+        tataFactory.stop();
+        assertTrue("Assert under state - 5", under.getState() == ComponentInstance.INVALID);
+        refToto = Utils.getServiceReferenceByName(context, Toto.class.getName(), "ff");
+        refTata = Utils.getServiceReferenceByName(context, Tata.class.getName(), "ff");
+        assertNull("Assert no toto service - 5", refToto);
+        assertNull("Assert no tata service - 5", refTata);
+ 
+        totoProv2.stop();
+        totoProv.stop();
+        tataFactory.start();
+        assertTrue("Assert under state - 6", under.getState() == ComponentInstance.VALID);
+        refToto = Utils.getServiceReferenceByName(context, Toto.class.getName(), "ff");
+        refTata = Utils.getServiceReferenceByName(context, Tata.class.getName(), "ff");
+        assertNotNull("Assert toto service - 6", refToto);
+        assertNotNull("Assert tata service - 6", refTata);
+        toto = (Toto) context.getService(refToto);
+        tata = (Tata) context.getService(refTata);
+ 
+        invokeAll(tata);
+        invokeTotoOpt(toto);
+        //  Check tata
+        props = tata.getPropsTata();
+        tata_0 = (Integer) props.get("tata");
+        assertEquals("Assert tata - 6", tata_0.intValue(), 1);
+        context.ungetService(refToto);
+        context.ungetService(refTata);
+        toto = null;
+        tata = null;
+ 
+        // Is arch exposed
+        assertNotNull("Test arch", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+        
+        tataFactory.stop();
+        
+        assertTrue("Assert under state - 7", under.getState() == ComponentInstance.INVALID);
+        assertNotNull("Test arch-2", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+        refToto = Utils.getServiceReferenceByName(context, Toto.class.getName(), "ff");
+        refTata = Utils.getServiceReferenceByName(context, Tata.class.getName(), "ff");
+        assertNull("Assert no toto service - 7", refToto);
+        assertNull("Assert no tata service - 7", refTata);
+        
+        under.dispose();
+        under = null;
+    }
+
+    private void invoke(Tata tota) {
+        tota.tata();
+        
+        assertEquals("Assert invoke tataint", tota.tataInt(2), 2);
+        assertEquals("Assert invoke tataLong", tota.tataLong(2), 2);
+        assertEquals("Assert invoke tataDouble", tota.tataDouble(2), 2);
+        assertEquals("Assert invoke tataChar", tota.tataChar('a'), 'a');
+        assertTrue("Assert invoke tataBoolean", tota.tataBoolean(true));
+        assertEquals("Assert invoke tataByte", tota.tataByte((byte)2), 2);
+        assertEquals("Assert invoke tataShort", tota.tataShort((short)5), 5);
+        assertEquals("Assert invoke tataFloat", tota.tataFloat(5), 5);
+        
+    }
+    
+    
+    private void invokeStr(Tata tota) {
+        tota.tataStr();
+    }
+    
+    private void invokeToto(Toto tota) {
+        tota.toto();
+        assertEquals("Assert toto", tota.toto("foo"), "foo");
+        tota.toto(1,2);
+        tota.toto1("foo");
+    }
+    
+    private void invokeAll(Tata tota) {
+        invoke(tota);
+        //invokeArrays(tota);
+        invokeStr(tota);
+        //invokeTata(tota);
+        //invokeTata1(tota);
+        //invokeTata5(tota);
+        //invokeAdd(tota);
+    }
+    
+    private void invokeTotoOpt(Toto tota) {
+        try {
+            tota.toto();
+            fail("UnsupportedOperationException expected");
+        } catch(UnsupportedOperationException e) { }
+        
+        try {
+            assertEquals("Assert toto", tota.toto("foo"), "foo");
+            fail("UnsupportedOperationException expected");
+        } catch(UnsupportedOperationException e) { }
+        
+        
+        try {
+            tota.toto(1,2);
+            fail("UnsupportedOperationException expected");
+        } catch(UnsupportedOperationException e) { }
+        
+        try {
+        	tota.toto1("foo");
+        	fail("UnsupportedOperationException expected");
+        } catch(UnsupportedOperationException e) { }
+    }
+    
+
+}
diff --git a/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp7.java b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp7.java
new file mode 100644
index 0000000..67a6c19
--- /dev/null
+++ b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp7.java
@@ -0,0 +1,333 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.test.composite.provides;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.component.TotoProvider;
+import org.apache.felix.ipojo.test.composite.service.Tota;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestComp7 extends OSGiTestCase {
+
+    private ComponentFactory tataFactory;
+    private ComponentFactory totoFactory;
+    private ComponentFactory tataFactory2;
+    
+    private ComponentInstance totoProv, totoProv2;
+    private ComponentInstance under;
+    
+    public void setUp() {
+        tataFactory = (ComponentFactory) Utils.getFactoryByName(context, "tata");
+        totoFactory = (ComponentFactory) Utils.getFactoryByName(context, "toto");
+        tataFactory2 = (ComponentFactory) Utils.getFactoryByName(context, "comp-6");
+        tataFactory2.stop();
+        
+        Properties props = new Properties();
+        props.put("name", "toto provider");
+        try {
+            totoProv = totoFactory.createComponentInstance(props);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        
+        Properties props3 = new Properties();
+        props3.put("name", "toto provider 2");
+        try {
+            totoProv2 = totoFactory.createComponentInstance(props3);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        
+        totoProv.stop();
+        totoProv2.stop();
+        
+        Factory factory = Utils.getFactoryByName(context, "comp-7");
+        Properties props2 = new Properties();
+        props2.put("name", "ff");
+        try {
+            under = factory.createComponentInstance(props2);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        tataFactory.stop();
+         
+    }
+    
+    public void tearDown() {
+        tataFactory.start();
+        totoProv.dispose();
+        totoProv = null;
+        totoProv2.dispose();
+        totoProv2 = null;
+        tataFactory2.start();
+        
+        // Reset counters
+        TotoProvider.toto = 0;
+        TotoProvider.toto_2 = 0;
+        TotoProvider.toto_3 = 0;
+        TotoProvider.toto_4 = 0;
+        TotoProvider.toto1 = 0;
+    }
+    
+    public void testSimple() {
+        // Neither factory nor instance
+        assertTrue("Assert under state - 1", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 1", context.getServiceReference(Tota.class.getName()));
+        
+        // Start the importer
+        totoProv.start();
+        assertTrue("Assert under state - 2", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 2", context.getServiceReference(Tota.class.getName()));
+        
+        // Start the factory
+        tataFactory.start();
+        assertTrue("Assert under state - 3", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 3", context.getServiceReference(Tota.class.getName()));
+        ServiceReference ref = context.getServiceReference(Tota.class.getName());
+        Tota tota = (Tota) context.getService(ref);
+        invokeAll(tota);
+        // Check toto
+        Properties props = tota.getProps();
+        Integer toto = (Integer) props.get("toto");
+        Integer toto_2 = (Integer) props.get("toto_2");
+        Integer toto_3 = (Integer) props.get("toto_3");
+        Integer toto_4 = (Integer) props.get("toto_4");
+        assertEquals("Assert toto - 3 ("+toto.intValue()+")", toto.intValue(), 1);
+        assertEquals("Assert toto_2 - 3", toto_2.intValue(), 1);
+        assertEquals("Assert toto_3 - 3", toto_3.intValue(), 1);
+        assertEquals("Assert toto_4 - 3", toto_4.intValue(), 0);
+        //Check tata
+        props = tota.getPropsTata();
+        Integer tata = (Integer) props.get("tata");
+        Integer tataStr = (Integer) props.get("tataStr");
+        Integer tataStrs = (Integer) props.get("tataStrs");
+        Integer tata_2 = (Integer) props.get("tata_2");
+        Integer tata_3 = (Integer) props.get("tata_3");
+        Integer tata1 = (Integer) props.get("tata1");
+        Integer tata1_1 = (Integer) props.get("tata1_1");
+        Integer tata5 = (Integer) props.get("tata5");
+        Integer tata5_1 = (Integer) props.get("tata5_1");
+        Integer tata5_2 = (Integer) props.get("tata5_2");
+        assertEquals("Assert tata - 3", tata.intValue(), 1);
+        assertEquals("Assert tataStr - 3", tataStr.intValue(), 1);
+        assertEquals("Assert tataStrs - 3", tataStrs.intValue(), 0);
+        assertEquals("Assert tata_2 - 3", tata_2.intValue(), 1);
+        assertEquals("Assert tata_3 - 3", tata_3.intValue(), 1);
+        assertEquals("Assert tata1 - 3", tata1.intValue(), 1);
+        assertEquals("Assert tata1_1 - 3", tata1_1.intValue(), 1);
+        assertEquals("Assert tata5 - 3", tata5.intValue(), 1);
+        assertEquals("Assert tata5_1 - 3", tata5_1.intValue(), 1);
+        assertEquals("Assert tata5_2 - 3", tata5_2.intValue(), 1);
+        context.ungetService(ref);
+        tota = null;
+        
+        // Start a second import
+        totoProv2.start();
+        assertTrue("Assert under state - 4", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 4", context.getServiceReference(Tota.class.getName()));
+        ref = context.getServiceReference(Tota.class.getName());
+        tota = (Tota) context.getService(ref);
+        invokeAll(tota);
+        // Check toto
+        props = tota.getProps();
+        toto = (Integer) props.get("toto");
+        toto_2 = (Integer) props.get("toto_2");
+        toto_3 = (Integer) props.get("toto_3");
+        toto_4 = (Integer) props.get("toto_4");
+        assertEquals("Assert toto - 4", toto.intValue(), 2);
+        assertEquals("Assert toto_2 - 4", toto_2.intValue(), 2);
+        assertEquals("Assert toto_3 - 4", toto_3.intValue(), 2);
+        assertEquals("Assert toto_4 - 4", toto_4.intValue(), 0);
+        //Check tata
+        props = tota.getPropsTata();
+        tata = (Integer) props.get("tata");
+        tataStr = (Integer) props.get("tataStr");
+        tataStrs = (Integer) props.get("tataStrs");
+        tata_2 = (Integer) props.get("tata_2");
+        tata_3 = (Integer) props.get("tata_3");
+        tata1 = (Integer) props.get("tata1");
+        tata1_1 = (Integer) props.get("tata1_1");
+        tata5 = (Integer) props.get("tata5");
+        tata5_1 = (Integer) props.get("tata5_1");
+        tata5_2 = (Integer) props.get("tata5_2");
+        assertEquals("Assert tata - 4", tata.intValue(), 2);
+        assertEquals("Assert tataStr - 4", tataStr.intValue(), 2);
+        assertEquals("Assert tataStrs - 4", tataStrs.intValue(), 0);
+        assertEquals("Assert tata_2 - 4", tata_2.intValue(), 2);
+        assertEquals("Assert tata_3 - 4", tata_3.intValue(), 2);
+        assertEquals("Assert tata1 - 4", tata1.intValue(), 2);
+        assertEquals("Assert tata1_1 - 4", tata1_1.intValue(), 2);
+        assertEquals("Assert tata5 - 4", tata5.intValue(), 2);
+        assertEquals("Assert tata5_1 - 4", tata5_1.intValue(), 2);
+        assertEquals("Assert tata5_2 - 4", tata5_2.intValue(), 2);
+
+        context.ungetService(ref);
+        tota = null;
+        
+        tataFactory.stop();
+        assertTrue("Assert under state - 5", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 5", context.getServiceReference(Tota.class.getName()));
+        
+        totoProv2.stop();
+        tataFactory.start();
+        assertTrue("Assert under state - 6", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 6", context.getServiceReference(Tota.class.getName()));
+        ref = context.getServiceReference(Tota.class.getName());
+        tota = (Tota) context.getService(ref);
+        invokeAll(tota);
+        // Check toto
+        props = tota.getProps();
+        toto = (Integer) props.get("toto");
+        toto_2 = (Integer) props.get("toto_2");
+        toto_3 = (Integer) props.get("toto_3");
+        toto_4 = (Integer) props.get("toto_4");
+        assertEquals("Assert toto - 6", toto.intValue(), 3);
+        assertEquals("Assert toto_2 - 6", toto_2.intValue(), 3);
+        assertEquals("Assert toto_3 - 6", toto_3.intValue(), 3);
+        assertEquals("Assert toto_4 - 6", toto_4.intValue(), 0);
+        //Check tata
+        props = tota.getPropsTata();
+        tata = (Integer) props.get("tata");
+        tataStr = (Integer) props.get("tataStr");
+        tataStrs = (Integer) props.get("tataStrs");
+        tata_2 = (Integer) props.get("tata_2");
+        tata_3 = (Integer) props.get("tata_3");
+        tata1 = (Integer) props.get("tata1");
+        tata1_1 = (Integer) props.get("tata1_1");
+        tata5 = (Integer) props.get("tata5");
+        tata5_1 = (Integer) props.get("tata5_1");
+        tata5_2 = (Integer) props.get("tata5_2");
+        assertEquals("Assert tata - 6", 1, tata.intValue());
+        assertEquals("Assert tataStr - 6", tataStr.intValue(), 1);
+        assertEquals("Assert tataStrs - 6", tataStrs.intValue(), 0);
+        assertEquals("Assert tata_2 - 6", tata_2.intValue(), 1);
+        assertEquals("Assert tata_3 - 6", tata_3.intValue(), 1);
+        assertEquals("Assert tata1 - 6", tata1.intValue(), 1);
+        assertEquals("Assert tata1_1 - 6", tata1_1.intValue(), 1);
+        assertEquals("Assert tata5 - 6", tata5.intValue(), 1);
+        assertEquals("Assert tata5_1 - 6", tata5_1.intValue(), 1);
+        assertEquals("Assert tata5_2 - 6", tata5_2.intValue(), 1);
+        context.ungetService(ref);
+        tota = null;
+        
+        // Is arch exposed
+        assertNotNull("Test arch", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+        
+        totoProv.stop();
+        
+        assertTrue("Assert under state - 7", under.getState() == ComponentInstance.INVALID);
+        assertNotNull("Test arch-2", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+        assertNull("Assert no tota service - 7", context.getServiceReference(Tota.class.getName()));
+        
+        under.dispose();
+        under = null;
+    }
+
+    private void invoke(Tota tota) {
+        tota.tata();
+        
+        assertEquals("Assert invoke tataint", tota.tataInt(2), 2);
+        assertEquals("Assert invoke tataLong", tota.tataLong(2), 2);
+        assertEquals("Assert invoke tataDouble", tota.tataDouble(2), 2);
+        assertEquals("Assert invoke tataChar", tota.tataChar('a'), 'a');
+        assertTrue("Assert invoke tataBoolean", tota.tataBoolean(true));
+        assertEquals("Assert invoke tataByte", tota.tataByte((byte)2), 2);
+        assertEquals("Assert invoke tataShort", tota.tataShort((short)5), 5);
+        assertEquals("Assert invoke tataFloat", tota.tataFloat(5), 5);
+        
+    }
+    
+    private void invokeArrays(Tota tota) {
+        
+        int[] a = new int[] {1,2,3};
+        assertEquals("Assert invoke tataint[]", tota.tataInts(a), a);
+        
+        long[] b = new long[] {1,2,3};
+        assertEquals("Assert invoke tataLong[]", tota.tataLongs(b), b);
+        
+        double[] c = new double[] {1,2,3};
+        assertEquals("Assert invoke tataDouble[]", tota.tataDoubles(c), c);
+        
+        char[] d = new char[] {'a','b', 'c'};
+        assertEquals("Assert invoke tataChar[]", tota.tataChars(d), d);
+        
+        boolean[] e = new boolean[] {true, false};
+        assertEquals("Assert invoke tataBoolean[]", tota.tataBooleans(e), e);
+        
+        byte[] f = new byte[] {(byte) 1};
+        assertEquals("Assert invoke tataByte[]", tota.tataBytes(f), f);
+        
+        short[] g = new short[] {(short) 1};
+        assertEquals("Assert invoke tataShort[]", tota.tataShorts(g), g);
+        
+        float[] h = new float[] {5,6,7};
+        assertEquals("Assert invoke tataFloat[]", tota.tataFloats(h), h);
+        
+    }
+    
+    private void invokeStr(Tota tota) {
+        tota.tataStr();
+    }
+    
+    private void invokeTata(Tota tota) {
+        tota.tata(1,2);
+        tota.tata("tototototo");
+    }
+    
+    private void invokeTata1(Tota tota) {
+        assertEquals("Assert tata1", tota.tata1("foo"), "foo");
+        assertEquals("Assert tata1 - 2", tota.tata1(new char[] {'a','b','c'}), "abc");
+    }
+    
+    private void invokeTata5(Tota tota) {
+        assertEquals("Assert tata5 -1", tota.tata5("foo",1), "foo"+1);
+        assertEquals("Assert tata5 - 2", tota.tata5(new String[] {"a","b","c"}, 1), "31");
+        assertEquals("Assert tata5 - 3", tota.tata5("foo", new int[] {1,2,3}), "foo3");
+    }
+    
+    private void invokeAdd(Tota tota) {
+        assertEquals("Assert add", tota.add(1,1,1), 3);
+    }
+    
+    private void invokeToto(Tota tota) {
+        tota.toto();
+        assertEquals("Assert toto", tota.toto("foo"), "foo");
+        tota.toto(1,2);
+    }
+    
+    private void invokeAll(Tota tota) {
+        invoke(tota);
+        invokeArrays(tota);
+        invokeStr(tota);
+        invokeTata(tota);
+        invokeTata1(tota);
+        invokeTata5(tota);
+        invokeAdd(tota);
+        invokeToto(tota);
+    }
+    
+
+}
diff --git a/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp8.java b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp8.java
new file mode 100644
index 0000000..f9ceb09
--- /dev/null
+++ b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp8.java
@@ -0,0 +1,365 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.test.composite.provides;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.component.TotoProvider;
+import org.apache.felix.ipojo.test.composite.component.TotoProviderGlue;
+import org.apache.felix.ipojo.test.composite.service.Tota;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestComp8 extends OSGiTestCase {
+
+    private ComponentFactory tataFactory;
+    private ComponentFactory totoFactory;
+    private ComponentFactory tataFactory2;
+    
+    private ComponentInstance totoProv, totoProv2;
+    private ComponentInstance under;
+    
+    public void setUp() {
+        tataFactory = (ComponentFactory) Utils.getFactoryByName(context, "tata");
+        totoFactory = (ComponentFactory) Utils.getFactoryByName(context, "toto");
+        tataFactory2 = (ComponentFactory) Utils.getFactoryByName(context, "comp-6");
+        tataFactory2.stop();
+        
+        Properties props = new Properties();
+        props.put("name", "toto provider");
+        try {
+            totoProv = totoFactory.createComponentInstance(props);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        
+        Properties props3 = new Properties();
+        props3.put("name", "toto provider 2");
+        try {
+            totoProv2 = totoFactory.createComponentInstance(props3);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        
+        totoProv.stop();
+        totoProv2.stop();
+        
+        Factory factory = Utils.getFactoryByName(context, "comp-8");
+        Properties props2 = new Properties();
+        props2.put("name", "ff");
+        try {
+            under = factory.createComponentInstance(props2);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        tataFactory.stop();
+         
+    }
+    
+    public void tearDown() {
+        tataFactory.start();
+        totoProv.dispose();
+        totoProv = null;
+        totoProv2.dispose();
+        totoProv2 = null;
+        tataFactory2.start();
+        
+        // Reset counters
+        TotoProvider.toto = 0;
+        TotoProvider.toto_2 = 0;
+        TotoProvider.toto_3 = 0;
+        TotoProvider.toto_4 = 0;
+        TotoProvider.toto1 = 0;
+        TotoProviderGlue.toto = 0;
+        TotoProviderGlue.toto_2 = 0;
+        TotoProviderGlue.toto_3 = 0;
+        TotoProviderGlue.toto_4 = 0;
+        TotoProviderGlue.toto1 = 0;
+    }
+    
+    public void testSimple() {        
+        // Neither factory nor instance
+        assertTrue("Assert under state - 1", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 1", context.getServiceReference(Tota.class.getName()));
+        
+        // Start the importer
+        totoProv.start();
+        assertTrue("Assert under state - 2", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 2", context.getServiceReference(Tota.class.getName()));
+        
+        // Start the factory
+        tataFactory.start();
+        assertTrue("Assert under state - 3", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 3", context.getServiceReference(Tota.class.getName()));
+        ServiceReference ref = context.getServiceReference(Tota.class.getName());
+        Tota tota = (Tota) context.getService(ref);
+        invokeAll(tota);
+        // Check toto
+        Properties props = tota.getProps();
+        Integer toto = (Integer) props.get("toto");
+        Integer toto_2 = (Integer) props.get("toto_2");
+        Integer toto_3 = (Integer) props.get("toto_3");
+        Integer toto_4 = (Integer) props.get("toto_4");
+        Integer gtoto = (Integer) props.get("gtoto");
+        Integer gtoto_2 = (Integer) props.get("gtoto_2");
+        Integer gtoto_3 = (Integer) props.get("gtoto_3");
+        Integer gtoto_4 = (Integer) props.get("gtoto_4");
+        assertEquals("Assert toto - 3 ("+toto.intValue()+")", toto.intValue(), 1);
+        assertEquals("Assert toto_2 - 3", toto_2.intValue(), 1);
+        assertEquals("Assert toto_3 - 3", toto_3.intValue(), 0);
+        assertEquals("Assert toto_4 - 3", toto_4.intValue(), 0);
+        assertEquals("Assert gtoto - 3 ("+gtoto.intValue()+")", gtoto.intValue(), 1);
+        assertEquals("Assert gtoto_2 - 3", gtoto_2.intValue(), 1);
+        assertEquals("Assert gtoto_3 - 3", gtoto_3.intValue(), 1);
+        assertEquals("Assert gtoto_4 - 3", gtoto_4.intValue(), 0);
+        //Check tata
+        props = tota.getPropsTata();
+        Integer tata = (Integer) props.get("tata");
+        Integer tataStr = (Integer) props.get("tataStr");
+        Integer tataStrs = (Integer) props.get("tataStrs");
+        Integer tata_2 = (Integer) props.get("tata_2");
+        Integer tata_3 = (Integer) props.get("tata_3");
+        Integer tata1 = (Integer) props.get("tata1");
+        Integer tata1_1 = (Integer) props.get("tata1_1");
+        Integer tata5 = (Integer) props.get("tata5");
+        Integer tata5_1 = (Integer) props.get("tata5_1");
+        Integer tata5_2 = (Integer) props.get("tata5_2");
+        assertEquals("Assert tata - 3", tata.intValue(), 1);
+        assertEquals("Assert tataStr - 3", tataStr.intValue(), 1);
+        assertEquals("Assert tataStrs - 3", tataStrs.intValue(), 0);
+        assertEquals("Assert tata_2 - 3", tata_2.intValue(), 1);
+        assertEquals("Assert tata_3 - 3", tata_3.intValue(), 1);
+        assertEquals("Assert tata1 - 3", tata1.intValue(), 1);
+        assertEquals("Assert tata1_1 - 3", tata1_1.intValue(), 1);
+        assertEquals("Assert tata5 - 3", tata5.intValue(), 1);
+        assertEquals("Assert tata5_1 - 3", tata5_1.intValue(), 1);
+        assertEquals("Assert tata5_2 - 3", tata5_2.intValue(), 1);
+        context.ungetService(ref);
+        tota = null;
+        
+        // Start a second import
+        totoProv2.start();
+        assertTrue("Assert under state - 4", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 4", context.getServiceReference(Tota.class.getName()));
+        ref = context.getServiceReference(Tota.class.getName());
+        tota = (Tota) context.getService(ref);
+        invokeAll(tota);
+        // Check toto
+        props = tota.getProps();
+        toto = (Integer) props.get("toto");
+        toto_2 = (Integer) props.get("toto_2");
+        toto_3 = (Integer) props.get("toto_3");
+        toto_4 = (Integer) props.get("toto_4");
+        gtoto = (Integer) props.get("gtoto");
+        gtoto_2 = (Integer) props.get("gtoto_2");
+        gtoto_3 = (Integer) props.get("gtoto_3");
+        gtoto_4 = (Integer) props.get("gtoto_4");
+        assertEquals("Assert toto - 4", toto.intValue(), 2);
+        assertEquals("Assert toto_2 - 4", toto_2.intValue(), 2);
+        assertEquals("Assert toto_3 - 4", toto_3.intValue(), 0);
+        assertEquals("Assert toto_4 - 4", toto_4.intValue(), 0);
+        assertEquals("Assert gtoto - 4 ("+gtoto.intValue()+")", gtoto.intValue(), 2);
+        assertEquals("Assert gtoto_2 - 4", gtoto_2.intValue(), 2);
+        assertEquals("Assert gtoto_3 - 4", gtoto_3.intValue(), 2);
+        assertEquals("Assert gtoto_4 - 4", gtoto_4.intValue(), 0);
+        //Check tata
+        props = tota.getPropsTata();
+        tata = (Integer) props.get("tata");
+        tataStr = (Integer) props.get("tataStr");
+        tataStrs = (Integer) props.get("tataStrs");
+        tata_2 = (Integer) props.get("tata_2");
+        tata_3 = (Integer) props.get("tata_3");
+        tata1 = (Integer) props.get("tata1");
+        tata1_1 = (Integer) props.get("tata1_1");
+        tata5 = (Integer) props.get("tata5");
+        tata5_1 = (Integer) props.get("tata5_1");
+        tata5_2 = (Integer) props.get("tata5_2");
+        assertEquals("Assert tata - 4", tata.intValue(), 2);
+        assertEquals("Assert tataStr - 4", tataStr.intValue(), 2);
+        assertEquals("Assert tataStrs - 4", tataStrs.intValue(), 0);
+        assertEquals("Assert tata_2 - 4", tata_2.intValue(), 2);
+        assertEquals("Assert tata_3 - 4", tata_3.intValue(), 2);
+        assertEquals("Assert tata1 - 4", tata1.intValue(), 2);
+        assertEquals("Assert tata1_1 - 4", tata1_1.intValue(), 2);
+        assertEquals("Assert tata5 - 4", tata5.intValue(), 2);
+        assertEquals("Assert tata5_1 - 4", tata5_1.intValue(), 2);
+        assertEquals("Assert tata5_2 - 4", tata5_2.intValue(), 2);
+
+        context.ungetService(ref);
+        tota = null;
+        
+        tataFactory.stop();
+        assertTrue("Assert under state - 5", under.getState() == ComponentInstance.INVALID);
+        assertNull("Assert no tota service - 5", context.getServiceReference(Tota.class.getName()));
+        
+        totoProv2.stop();
+        tataFactory.start();
+        assertTrue("Assert under state - 6", under.getState() == ComponentInstance.VALID);
+        assertNotNull("Assert tota service - 6", context.getServiceReference(Tota.class.getName()));
+        ref = context.getServiceReference(Tota.class.getName());
+        tota = (Tota) context.getService(ref);
+        invokeAll(tota);
+        // Check toto
+        props = tota.getProps();
+        toto = (Integer) props.get("toto");
+        toto_2 = (Integer) props.get("toto_2");
+        toto_3 = (Integer) props.get("toto_3");
+        toto_4 = (Integer) props.get("toto_4");
+        gtoto = (Integer) props.get("gtoto");
+        gtoto_2 = (Integer) props.get("gtoto_2");
+        gtoto_3 = (Integer) props.get("gtoto_3");
+        gtoto_4 = (Integer) props.get("gtoto_4");
+        assertEquals("Assert toto - 6", toto.intValue(), 3);
+        assertEquals("Assert toto_2 - 6", toto_2.intValue(), 3);
+        assertEquals("Assert toto_3 - 6", toto_3.intValue(), 0);
+        assertEquals("Assert toto_4 - 6", toto_4.intValue(), 0);
+        assertEquals("Assert gtoto - 6 ("+gtoto.intValue()+")", gtoto.intValue(), 3);
+        assertEquals("Assert gtoto_2 - 6", gtoto_2.intValue(), 3);
+        assertEquals("Assert gtoto_3 - 6", gtoto_3.intValue(), 3);
+        assertEquals("Assert gtoto_4 - 6", gtoto_4.intValue(), 0);
+        //Check tata
+        props = tota.getPropsTata();
+        tata = (Integer) props.get("tata");
+        tataStr = (Integer) props.get("tataStr");
+        tataStrs = (Integer) props.get("tataStrs");
+        tata_2 = (Integer) props.get("tata_2");
+        tata_3 = (Integer) props.get("tata_3");
+        tata1 = (Integer) props.get("tata1");
+        tata1_1 = (Integer) props.get("tata1_1");
+        tata5 = (Integer) props.get("tata5");
+        tata5_1 = (Integer) props.get("tata5_1");
+        tata5_2 = (Integer) props.get("tata5_2");
+        assertEquals("Assert tata - 6", tata.intValue(), 1);
+        assertEquals("Assert tataStr - 6", tataStr.intValue(), 1);
+        assertEquals("Assert tataStrs - 6", tataStrs.intValue(), 0);
+        assertEquals("Assert tata_2 - 6", tata_2.intValue(), 1);
+        assertEquals("Assert tata_3 - 6", tata_3.intValue(), 1);
+        assertEquals("Assert tata1 - 6", tata1.intValue(), 1);
+        assertEquals("Assert tata1_1 - 6", tata1_1.intValue(), 1);
+        assertEquals("Assert tata5 - 6", tata5.intValue(), 1);
+        assertEquals("Assert tata5_1 - 6", tata5_1.intValue(), 1);
+        assertEquals("Assert tata5_2 - 6", tata5_2.intValue(), 1);
+        context.ungetService(ref);
+        tota = null;
+        
+        // Is arch exposed
+        assertNotNull("Test arch", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+        
+        totoProv.stop();
+        
+        assertTrue("Assert under state - 7", under.getState() == ComponentInstance.INVALID);
+        assertNotNull("Test arch-2", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+        assertNull("Assert no tota service - 7", context.getServiceReference(Tota.class.getName()));
+        
+        under.dispose();
+        under = null;
+    }
+
+
+
+    private void invoke(Tota tota) {
+        tota.tata();
+        
+        assertEquals("Assert invoke tataint", tota.tataInt(2), 2);
+        assertEquals("Assert invoke tataLong", tota.tataLong(2), 2);
+        assertEquals("Assert invoke tataDouble", tota.tataDouble(2), 2);
+        assertEquals("Assert invoke tataChar", tota.tataChar('a'), 'a');
+        assertTrue("Assert invoke tataBoolean", tota.tataBoolean(true));
+        assertEquals("Assert invoke tataByte", tota.tataByte((byte)2), 2);
+        assertEquals("Assert invoke tataShort", tota.tataShort((short)5), 5);
+        assertEquals("Assert invoke tataFloat", tota.tataFloat(5), 5);
+        
+    }
+    
+    private void invokeArrays(Tota tota) {
+        
+        int[] a = new int[] {1,2,3};
+        assertEquals("Assert invoke tataint[]", tota.tataInts(a), a);
+        
+        long[] b = new long[] {1,2,3};
+        assertEquals("Assert invoke tataLong[]", tota.tataLongs(b), b);
+        
+        double[] c = new double[] {1,2,3};
+        assertEquals("Assert invoke tataDouble[]", tota.tataDoubles(c), c);
+        
+        char[] d = new char[] {'a','b', 'c'};
+        assertEquals("Assert invoke tataChar[]", tota.tataChars(d), d);
+        
+        boolean[] e = new boolean[] {true, false};
+        assertEquals("Assert invoke tataBoolean[]", tota.tataBooleans(e), e);
+        
+        byte[] f = new byte[] {(byte) 1};
+        assertEquals("Assert invoke tataByte[]", tota.tataBytes(f), f);
+        
+        short[] g = new short[] {(short) 1};
+        assertEquals("Assert invoke tataShort[]", tota.tataShorts(g), g);
+        
+        float[] h = new float[] {5,6,7};
+        assertEquals("Assert invoke tataFloat[]", tota.tataFloats(h), h);
+        
+    }
+    
+    private void invokeStr(Tota tota) {
+        tota.tataStr();
+    }
+    
+    private void invokeTata(Tota tota) {
+        tota.tata(1,2);
+        tota.tata("tototototo");
+    }
+    
+    private void invokeTata1(Tota tota) {
+        assertEquals("Assert tata1", tota.tata1("foo"), "foo");
+        assertEquals("Assert tata1 - 2", tota.tata1(new char[] {'a','b','c'}), "abc");
+    }
+    
+    private void invokeTata5(Tota tota) {
+        assertEquals("Assert tata5 -1", tota.tata5("foo",1), "foo"+1);
+        assertEquals("Assert tata5 - 2", tota.tata5(new String[] {"a","b","c"}, 1), "31");
+        assertEquals("Assert tata5 - 3", tota.tata5("foo", new int[] {1,2,3}), "foo3");
+    }
+    
+    private void invokeAdd(Tota tota) {
+        assertEquals("Assert add", tota.add(1,1,1), 3);
+    }
+    
+    private void invokeToto(Tota tota) {
+        tota.toto();
+        assertEquals("Assert toto", tota.toto("foo"), "foo");
+        tota.toto(1,2);
+    }
+    
+    private void invokeAll(Tota tota) {
+        invoke(tota);
+        invokeArrays(tota);
+        invokeStr(tota);
+        invokeTata(tota);
+        invokeTata1(tota);
+        invokeTata5(tota);
+        invokeAdd(tota);
+        invokeToto(tota);
+    }
+    
+
+}
diff --git a/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/test/CompositeTest.java b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/test/CompositeTest.java
new file mode 100644
index 0000000..e7f73bb
--- /dev/null
+++ b/ipojo/tests/tests.composite.service.providing/src/main/java/org/apache/felix/ipojo/test/composite/test/CompositeTest.java
@@ -0,0 +1,180 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.test.composite.test;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.service.BazService;
+import org.apache.felix.ipojo.test.composite.service.CheckService;
+import org.apache.felix.ipojo.test.composite.service.FooService;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+public class CompositeTest extends OSGiTestCase {
+	
+	public void testAPI() {
+		Factory fact1 = Utils.getFactoryByName(context, "composite.empty");
+		Properties p = new Properties();
+		p.put("name", "empty-1");
+		ComponentInstance empty = null;
+		try {
+			empty = fact1.createComponentInstance(p);
+		} catch(Exception e) {
+			e.printStackTrace();
+			fail(e.getMessage());
+		}
+		
+		ServiceContext sc = Utils.getServiceContext(empty);
+		
+		Factory fact2 = Utils.getFactoryByName(context, "composite.test.2");
+		Properties props2 = new Properties();
+		props2.put("name", "2"); // 2
+		Factory fact3 = Utils.getFactoryByName(context, "composite.test.3");
+		Properties props3 = new Properties();
+		props3.put("name", "3");
+		ComponentInstance comp2 = null;
+		ComponentInstance comp3 = null;
+		try {
+			comp2 = fact2.createComponentInstance(props2, sc);
+			comp3 = fact3.createComponentInstance(props3, sc);
+		} catch(Throwable e) {
+		    e.printStackTrace();
+		    fail(e.getMessage());
+		}
+		
+		assertTrue("Test comp3", comp3.getState() == ComponentInstance.VALID);
+		assertTrue("Test comp2", comp2.getState() == ComponentInstance.VALID);
+		
+		ServiceReference ref = null;
+
+		ref = Utils.getServiceReferenceByName(sc, CheckService.class.getName(), "2"); // 2
+
+		assertNotNull("Check ref", ref);
+		CheckService cs = (CheckService) sc.getService(ref);
+		assertTrue("Check invoke", cs.check());
+		
+		comp3.dispose();
+		comp2.dispose();
+		empty.dispose();
+	}
+	
+	public void testInstantiator() {
+		String type = "composite.instantiator";
+		Factory fact = Utils.getFactoryByName(context, type);
+		ComponentInstance ci = null;
+		Properties p = new Properties();
+		p.put("name", "mon_coeur");
+		try {
+			ci = fact.createComponentInstance(p);
+		} catch(Exception e) {
+			e.printStackTrace();
+		}
+				
+		assertTrue("Check ci", ci.getState() == ComponentInstance.VALID);
+		ServiceReference ref = Utils.getServiceReferenceByName(context, BazService.class.getName(), "mon_coeur");
+		assertNotNull("Check ref",ref);
+		BazService bs = (BazService) context.getService(ref);
+		assertTrue("Check invocation", bs.foo());
+		context.ungetService(ref);
+		ref = Utils.getServiceReferenceByName(context, FooService.class.getName(), "mon_coeur");
+		assertNotNull("Check ref 2 ",ref);
+		FooService fs = (FooService) context.getService(ref);
+		assertTrue("Check invocation", fs.foo());
+		context.ungetService(ref);
+		ci.dispose();
+	}
+	
+	public void testAPI2() {
+		Factory fact1 = Utils.getFactoryByName(context, "composite.empty");
+		Properties p = new Properties();
+		p.put("name", "empty-2");
+		ComponentInstance empty = null;
+		try {
+			empty = fact1.createComponentInstance(p);
+		} catch(Exception e) {
+			e.printStackTrace();
+		}
+		
+		ServiceContext sc = Utils.getServiceContext(empty);
+		
+		Factory fact2 = Utils.getFactoryByName(sc, "composite.test.2");
+		Properties props2 = new Properties();
+		props2.put("name", "4");
+		Factory fact3 = Utils.getFactoryByName(sc, "composite.test.3");
+		Properties props3 = new Properties();
+		props3.put("name", "5");
+		ComponentInstance comp2 = null;
+		ComponentInstance comp3 = null;
+		try {
+			comp2 = fact2.createComponentInstance(props2, sc);
+			comp3 = fact3.createComponentInstance(props3, sc);
+		} catch(Exception e) {
+			e.printStackTrace();
+		}
+		
+		assertTrue("Test comp3", comp3.getState() == ComponentInstance.VALID);
+		assertTrue("Test comp2", comp2.getState() == ComponentInstance.VALID);
+		
+		ServiceReference ref = null;
+
+		ref = Utils.getServiceReferenceByName(sc, CheckService.class.getName(), "4");
+
+		assertNotNull("Check ref", ref);
+		CheckService cs = (CheckService) sc.getService(ref);
+		assertTrue("Check invoke", cs.check());
+		
+		comp3.dispose();
+		comp2.dispose();
+		empty.dispose();
+	}
+
+	
+	public void testApplication() {
+		Factory factory = Utils.getFactoryByName(context, "composite.test.1");
+		ComponentInstance ci = null;
+		Properties props = new Properties();
+		props.put("name", "Test");
+		try {
+			ci = factory.createComponentInstance(props);
+		} catch(Exception e) {
+			fail("Cannot instantiate Test " + e.getMessage());
+		}
+		
+		assertTrue("Check ci state", ci.getState() == ComponentInstance.VALID );
+		
+		ServiceReference[] refs = null;
+		try {
+			refs = context.getServiceReferences(CheckService.class.getName(), "(instance.name=Test)");
+		} catch (InvalidSyntaxException e) {
+			fail("Invalid filter : " + e.getMessage());
+		}
+		assertNotNull("Check refs not null", refs);
+		CheckService cs = (CheckService) context.getService(refs[0]);
+		
+		assertTrue("Check invocation", cs.check());
+		ci.dispose();
+		
+	}
+
+}
diff --git a/ipojo/tests/tests.composite.service.providing/src/main/resources/metadata.xml b/ipojo/tests/tests.composite.service.providing/src/main/resources/metadata.xml
new file mode 100644
index 0000000..e544b1c
--- /dev/null
+++ b/ipojo/tests/tests.composite.service.providing/src/main/resources/metadata.xml
@@ -0,0 +1,150 @@
+<ipojo>
+	<composite name="composite.test.3" architecture="true">
+		<subservice action="instantiate"
+			specification="org.apache.felix.ipojo.test.composite.service.BazService"
+			aggregate="true" filter="(factory.name=BazProviderType)" />
+		<provides action="export"
+			specification="org.apache.felix.ipojo.test.composite.service.BazService" />
+	</composite>
+
+	<composite name="composite.test.2" architecture="true">
+		<subservice action="instantiate"
+			specification="org.apache.felix.ipojo.test.composite.service.CheckService"
+			filter="(factory.name=Baz2CheckProvider)" />
+		<provides action="export"
+			specification="org.apache.felix.ipojo.test.composite.service.CheckService" />
+		<subservice action="import"
+			specification="org.apache.felix.ipojo.test.composite.service.BazService"
+			scope="composite" />
+	</composite>
+
+	<composite name="composite.test.1" architecture="true">
+		<subservice action="instantiate"
+			specification="org.apache.felix.ipojo.test.composite.service.BazService"
+			filter="(factory.name=composite.test.3)" />
+		<subservice action="instantiate"
+			specification="org.apache.felix.ipojo.test.composite.service.CheckService"
+			filter="(factory.name=composite.test.2)" />
+		<provides action="export"
+			specification="org.apache.felix.ipojo.test.composite.service.CheckService" />
+	</composite>
+
+	<composite name="composite.instantiator" architecture="true">
+		<subservice action="instantiate"
+			specification="org.apache.felix.ipojo.test.composite.service.BazService"
+			filter="(factory.name=composite.test.3)" />
+		<subservice action="instantiate"
+			specification="org.apache.felix.ipojo.test.composite.service.FooService" />
+		<provides action="export"
+			specification="org.apache.felix.ipojo.test.composite.service.BazService" />
+		<provides action="export"
+			specification="org.apache.felix.ipojo.test.composite.service.FooService" />
+	</composite>
+
+	<!-- Test composition provides -->
+
+	<composite name="comp-0" architecture="true">
+		<subservice action="instantiate"
+			specification="org.apache.felix.ipojo.test.composite.service.Tata" />
+		<subservice action="import"
+			specification="org.apache.felix.ipojo.test.composite.service.Toto" />
+		<provides action="implement"
+			specification="org.apache.felix.ipojo.test.composite.service.Tota" />
+	</composite>
+
+	<composite name="comp-1" architecture="true">
+		<subservice action="instantiate"
+			specification="org.apache.felix.ipojo.test.composite.service.Tata" />
+		<subservice action="import"
+			specification="org.apache.felix.ipojo.test.composite.service.Toto" />
+		<provides action="implement"
+			specification="org.apache.felix.ipojo.test.composite.service.Tota">
+			<delegation method="tataInt" policy="One" />
+			<delegation method="toto1" policy="All" />
+		</provides>
+	</composite>
+
+	<composite name="comp-2" architecture="true">
+		<subservice action="instantiate"
+			specification="org.apache.felix.ipojo.test.composite.service.Tata"
+			aggregate="true" />
+		<subservice action="import"
+			specification="org.apache.felix.ipojo.test.composite.service.Toto"
+			aggregate="true" />
+		<provides action="implement"
+			specification="org.apache.felix.ipojo.test.composite.service.Tota">
+			<delegation method="tataInt" policy="One" />
+			<delegation method="toto1" policy="All" />
+		</provides>
+	</composite>
+
+	<composite name="comp-3" architecture="true">
+		<subservice action="instantiate"
+			specification="org.apache.felix.ipojo.test.composite.service.Tata" />
+		<subservice action="import"
+			specification="org.apache.felix.ipojo.test.composite.service.Toto"
+			optional="true" />
+		<provides action="implement"
+			specification="org.apache.felix.ipojo.test.composite.service.Tota">
+		</provides>
+	</composite>
+
+	<composite name="comp-4" architecture="true">
+		<subservice action="instantiate"
+			specification="org.apache.felix.ipojo.test.composite.service.Tata" />
+		<subservice action="import"
+			specification="org.apache.felix.ipojo.test.composite.service.Toto"
+			optional="true" />
+		<provides action="implement"
+			specification="org.apache.felix.ipojo.test.composite.service.Tota">
+			<delegation method="tataInt" policy="One" />
+			<delegation method="toto1" policy="All" />
+		</provides>
+	</composite>
+
+	<composite name="comp-5" architecture="true">
+		<subservice action="instantiate"
+			specification="org.apache.felix.ipojo.test.composite.service.Tata"
+			aggregate="true" />
+		<!-- <subservice action="import" specification="org.apache.felix.ipojo.test.composite.service.Toto" aggregate ="true" optional="true"/> -->
+		<provides action="implement"
+			specification="org.apache.felix.ipojo.test.composite.service.Tota">
+			<delegation method="tataInt" policy="One" />
+			<delegation method="toto1" policy="All" />
+		</provides>
+	</composite>
+
+	<composite name="comp-6" architecture="true">
+		<subservice action="instantiate"
+			specification="org.apache.felix.ipojo.test.composite.service.Tata"
+			aggregate="true" />
+		<subservice action="import"
+			specification="org.apache.felix.ipojo.test.composite.service.Toto"
+			aggregate="true" optional="true" />
+		<provides action="implement"
+			specification="org.apache.felix.ipojo.test.composite.service.Toto">
+			<delegation method="toto1" policy="All" />
+		</provides>
+		<provides action="implement"
+			specification="org.apache.felix.ipojo.test.composite.service.Tata">
+			<delegation method="tataInt" policy="One" />
+		</provides>
+	</composite>
+
+	<composite name="comp-7" architecture="true">
+		<instance component="tata" />
+		<subservice action="import"
+			specification="org.apache.felix.ipojo.test.composite.service.Toto" />
+		<provides action="implement"
+			specification="org.apache.felix.ipojo.test.composite.service.Tota" />
+	</composite>
+
+	<composite name="comp-8" architecture="true">
+		<instance component="tata" />
+		<instance component="totoglue" />
+		<subservice action="import"
+			specification="org.apache.felix.ipojo.test.composite.service.Toto" />
+		<provides action="implement"
+			specification="org.apache.felix.ipojo.test.composite.service.Tota" />
+	</composite>
+</ipojo>
