diff --git a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandler.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandler.java
index 7f686d9..133758e 100644
--- a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandler.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandler.java
@@ -1,4 +1,4 @@
-/* 
+/*
  * 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
@@ -20,6 +20,7 @@
 
 import java.util.ArrayList;
 import java.util.Dictionary;
+import java.util.Enumeration;
 import java.util.List;
 import java.util.Properties;
 
@@ -48,17 +49,17 @@
      * Internal context.
      */
     private ServiceContext m_scope;
-    
+
     /**
      * Available factories.
      */
     private Factory[] m_factories;
-    
+
     /**
      * Handler description.
      */
     private InstanceHandlerDescription m_description;
-    
+
 
     /**
      * This structure aims to manage a configuration. It stores all necessary
@@ -79,7 +80,7 @@
          * Created instance.
          */
         private ComponentInstance m_instance;
-        
+
         /**
          * Desired Factory (can be the classname).
          */
@@ -87,7 +88,7 @@
 
         /**
          * Constructor.
-         * 
+         *
          * @param conf : the configuration to create.
          */
         ManagedConfiguration(Dictionary conf) {
@@ -110,7 +111,7 @@
         protected String getFactory() {
             return m_factoryName;
         }
-        
+
         protected String getNeededFactoryName() {
             return m_desiredFactory;
         }
@@ -125,7 +126,7 @@
 
         /**
          * Set the factory name.
-         * 
+         *
          * @param name : the factory name.
          */
         protected void setFactory(String name) {
@@ -134,7 +135,7 @@
 
         /**
          * Set the instance object.
-         * 
+         *
          * @param instance : the instance
          */
         protected void setInstance(ComponentInstance instance) {
@@ -149,7 +150,7 @@
 
     /**
      * Create an instance using the given factory and the given configuration.
-     * 
+     *
      * @param fact : the factory name to used.
      * @param config : the configuration.
      */
@@ -167,7 +168,7 @@
             error("The instance creation has failed, an error during the configuration has occured", e);
         }
     }
-    
+
     /**
      * A new valid factory appears.
      * @param factory : factory.
@@ -177,7 +178,9 @@
         String factName = factory.getName();
         String className = factory.getComponentDescription().getClassName();
         for (int i = 0; i < m_configurations.length; i++) {
-            if (m_configurations[i].getInstance() == null && (m_configurations[i].getNeededFactoryName().equals(factName) || m_configurations[i].getNeededFactoryName().equals(className))) {
+            if (m_configurations[i].getInstance() == null
+            		&& (m_configurations[i].getNeededFactoryName().equals(factName)
+            				|| m_configurations[i].getNeededFactoryName().equals(className))) {
                 createInstance(factory, m_configurations[i]);
                 implicated = true;
             }
@@ -186,7 +189,7 @@
             checkValidity();
         }
     }
-    
+
     /**
      * An existing factory disappears or becomes invalid.
      * @param factory : factory
@@ -226,24 +229,40 @@
      * Configure method.
      * @param metadata : component type metadata.
      * @param configuration : instance configuration.
-     * @throws ConfigurationException : occurs an instance cannot be parsed correctly. 
+     * @throws ConfigurationException : occurs an instance cannot be parsed correctly.
      * @see org.apache.felix.ipojo.CompositeHandler#configure(org.apache.felix.ipojo.CompositeManager, org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
      */
     public void configure(Element metadata, Dictionary configuration) throws ConfigurationException {
         m_scope = getCompositeManager().getServiceContext();
+
+        // Prepare the configuration to append.
+        Properties toAppend = new Properties();
+        Enumeration keys = configuration.keys();
+        while(keys.hasMoreElements()) {
+        	String key = (String) keys.nextElement();
+        	if (! key.equals("instance.name")
+        			|| key.equals("component")) { // Remove instance.name and component
+        		toAppend.put(key, configuration.get(key));
+        	}
+        }
+
         Element[] instances = metadata.getElements("instance");
         m_configurations = new ManagedConfiguration[instances.length];
         for (int i = 0; i < instances.length; i++) {
-            Dictionary conf = null;
+            Properties conf = null;
             try {
                 conf = parseInstance(instances[i]);
             } catch (ParseException e) {
                 error("An instance cannot be parsed correctly", e);
                 throw new ConfigurationException("An instance cannot be parsed correctly : " + e.getMessage());
             }
-            m_configurations[i] = new ManagedConfiguration(conf);
+
+        	Properties instanceConfiguration = new Properties();
+         	instanceConfiguration.putAll(conf);
+            instanceConfiguration.putAll(toAppend);
+            m_configurations[i] = new ManagedConfiguration(instanceConfiguration);
         }
-        
+
         m_description = new InstanceHandlerDescription(this, m_configurations);
     }
 
@@ -253,16 +272,16 @@
      * @return : the resulting dictionary
      * @throws ParseException : occurs when a configuration cannot be parse correctly.
      */
-    public static Dictionary parseInstance(Element instance) throws ParseException {
-        Dictionary dict = new Properties();
+    public static Properties parseInstance(Element instance) throws ParseException {
+    	Properties dict = new Properties();
         String name = instance.getAttribute("name");
         if (name != null) {
             dict.put("name", name);
         }
-        
+
         String comp = instance.getAttribute("component");
-        if (comp == null) { 
-            throw new ParseException("An instance does not have the 'component' attribute"); 
+        if (comp == null) {
+            throw new ParseException("An instance does not have the 'component' attribute");
         } else {
             dict.put("component", comp);
         }
@@ -306,10 +325,10 @@
      * Start method.
      * @see org.apache.felix.ipojo.CompositeHandler#start()
      */
-    public void start() { 
+    public void start() {
         for (int j = 0; j < m_factories.length; j++) {
             String factName = m_factories[j].getName();
-            String className = m_factories[j].getClassName(); 
+            String className = m_factories[j].getClassName();
             for (int i = 0; i < m_configurations.length; i++) {
                 if (m_configurations[i].getInstance() == null && (m_configurations[i].getNeededFactoryName().equals(factName) || m_configurations[i].getNeededFactoryName().equals(className))) {
                     createInstance(m_factories[j], m_configurations[i]);
diff --git a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceDependencyHandler.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceDependencyHandler.java
index 4cbf2f1..5c1d8e0 100644
--- a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceDependencyHandler.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceDependencyHandler.java
@@ -1,4 +1,4 @@
-/* 
+/*
  * 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
@@ -21,6 +21,7 @@
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.Dictionary;
+import java.util.Enumeration;
 import java.util.List;
 import java.util.Properties;
 
@@ -42,7 +43,7 @@
 /**
  * Service Instantiator Class. This handler allows to instantiate service
  * instance inside the composition.
- * 
+ *
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public class ServiceDependencyHandler extends CompositeHandler implements DependencyStateListener {
@@ -51,17 +52,17 @@
      * List of instances to manage.
      */
     private List/* <SvcInstance> */m_instances = new ArrayList();
-    
+
     /**
      * List of importers.
      */
     private List/* <ServiceImporter> */ m_importers = new ArrayList();
-    
+
     /**
      * Flag indicating if the handler has already finished the start method.
      */
     private boolean m_isStarted;
-    
+
     /**
      * The handler description.
      */
@@ -71,15 +72,27 @@
      * Source Managers.
      */
     private List m_sources;
-    
-    
+
+
     /**
      * Create a Service instance object form the given Element.
      * This method parse the given element and configure the service instance object.
      * @param service : the Element describing the service instance
+     * @param conf : the configuration from the composite instance
      * @throws ConfigurationException : the service instance cannot be created correctly
      */
-    private void createServiceInstance(Element service) throws ConfigurationException {
+    private void createServiceInstance(Element service, Dictionary conf) throws ConfigurationException {
+        // Prepare the configuration to append.
+        Properties toAppend = new Properties();
+        Enumeration keys = conf.keys();
+        while(keys.hasMoreElements()) {
+        	String key = (String) keys.nextElement();
+        	if (! key.equals("instance.name")
+        			|| key.equals("component")) { // Remove instance.name and component
+        		toAppend.put(key, conf.get(key));
+        	}
+        }
+
         String spec = service.getAttribute("specification");
         if (spec == null) {
             throw new ConfigurationException("Malformed service : the specification attribute is mandatory");
@@ -89,14 +102,14 @@
         if (givenFilter != null) {
             filter = "(&" + filter + givenFilter + ")"; //NOPMD
         }
-        
+
         Filter fil;
         try {
             fil = getCompositeManager().getGlobalContext().createFilter(filter);
         } catch (InvalidSyntaxException e) {
             throw new ConfigurationException("Malformed filter " + filter + " : " + e.getMessage());
         }
-        
+
         Properties prop = new Properties();
         Element[] props = service.getElements("property");
         for (int k = 0; props != null && k < props.length; k++) {
@@ -106,20 +119,24 @@
                 throw new ConfigurationException("An instance configuration is invalid : " + e.getMessage());
             }
         }
-        
+
+        Properties instanceConfiguration = new Properties();
+     	instanceConfiguration.putAll(prop);
+        instanceConfiguration.putAll(toAppend);
+
         String aggregate = service.getAttribute("aggregate");
         boolean agg = aggregate != null && aggregate.equalsIgnoreCase("true");
-        
+
         String optional = service.getAttribute("optional");
         boolean opt = optional != null && optional.equalsIgnoreCase("true");
-        
+
         int policy = DependencyModel.getPolicy(service);
-        
+
         Comparator cmp = DependencyModel.getComparator(service, getCompositeManager().getGlobalContext());
-        
-        SvcInstance inst = new SvcInstance(this, spec, prop, agg, opt, fil, cmp, policy);
+
+        SvcInstance inst = new SvcInstance(this, spec, instanceConfiguration, agg, opt, fil, cmp, policy);
         m_instances.add(inst);
-        
+
         String sources = service.getAttribute("context-source");
         if (sources != null) {
             SourceManager source = new SourceManager(sources, filter, inst, getCompositeManager());
@@ -129,7 +146,7 @@
             m_sources.add(source);
         }
     }
-    
+
     /**
      * Create a Service importer object from the given Element.
      * This method parse the given element and configure the service importer object.
@@ -142,7 +159,7 @@
         boolean aggregate = false;
         String specification = imp.getAttribute("specification");
 
-        if (specification == null) { 
+        if (specification == null) {
             // Malformed import
             error("Malformed import: the specification attribute is mandatory");
             throw new ConfigurationException("Malformed import : the specification attribute is mandatory");
@@ -194,7 +211,7 @@
 
             ServiceImporter importer = new ServiceImporter(spec, fil, aggregate, optional, cmp, policy, context, identitity, this);
             m_importers.add(importer);
-            
+
             String sources = imp.getAttribute("context-source");
             if (sources != null) {
                 SourceManager source = new SourceManager(sources, filter, importer, getCompositeManager());
@@ -203,7 +220,7 @@
                 }
                 m_sources.add(source);
             }
-            
+
         }
     }
 
@@ -221,20 +238,20 @@
         if (conf.get("requires.filters") != null) {
             confFilter = (Dictionary) conf.get("requires.filters");
         }
-        
+
         for (int i = 0; i < services.length; i++) {
             String action = services[i].getAttribute("action");
             if (action == null) {
                 throw new ConfigurationException("The action attribute must be set to 'instantiate' or 'import'");
             } else if ("instantiate".equalsIgnoreCase(action)) {
-                createServiceInstance(services[i]);
+                createServiceInstance(services[i], conf);
             } else if ("import".equalsIgnoreCase(action)) {
                 createServiceImport(services[i], confFilter);
             } else {
                 throw new ConfigurationException("Unknown action : " + action);
             }
         }
-        
+
         m_description = new ServiceInstantiatorDescription(this, m_instances, m_importers);
     }
 
@@ -248,12 +265,12 @@
             SourceManager source = (SourceManager) m_sources.get(i);
             source.start();
         }
-        
+
         for (int i = 0; i < m_importers.size(); i++) {
             ServiceImporter imp = (ServiceImporter) m_importers.get(i);
             imp.start();
         }
-        
+
         for (int i = 0; i < m_instances.size(); i++) {
             SvcInstance inst = (SvcInstance) m_instances.get(i);
             inst.start();
@@ -275,7 +292,7 @@
                 return;
             }
         }
-        
+
         for (int i = 0; i < m_instances.size(); i++) {
             SvcInstance inst = (SvcInstance) m_instances.get(i);
             if (inst.getState() != DependencyModel.RESOLVED) {
@@ -283,7 +300,7 @@
                 return;
             }
         }
-        
+
         setValidity(true);
     }
 
@@ -297,12 +314,12 @@
             SourceManager source = (SourceManager) m_sources.get(i);
             source.stop();
         }
-        
+
         for (int i = 0; i < m_instances.size(); i++) {
             SvcInstance inst = (SvcInstance) m_instances.get(i);
             inst.stop();
         }
-        
+
         for (int i = 0; i < m_importers.size(); i++) {
             ServiceImporter imp = (ServiceImporter) m_importers.get(i);
             imp.stop();
@@ -310,7 +327,7 @@
 
         m_isStarted = false;
     }
-    
+
     /**
      * State change callback.
      * This method is used to freeze the set of used provider if the static binding policy is used.
@@ -319,14 +336,14 @@
      */
     public void stateChanged(int newState) {
         // If we are becoming valid and started, check if we need to freeze importers.
-        if (m_isStarted && newState == ComponentInstance.VALID) { 
+        if (m_isStarted && newState == ComponentInstance.VALID) {
             for (int i = 0; i < m_importers.size(); i++) {
                 ServiceImporter imp = (ServiceImporter) m_importers.get(i);
                 if (imp.getBindingPolicy() == DependencyModel.STATIC_BINDING_POLICY) {
                     imp.freeze();
                 }
             }
-            
+
             for (int i = 0; i < m_instances.size(); i++) {
                 SvcInstance imp = (SvcInstance) m_instances.get(i);
                 if (imp.getBindingPolicy() == DependencyModel.STATIC_BINDING_POLICY) {
@@ -364,11 +381,11 @@
     public HandlerDescription getDescription() {
         return m_description;
     }
-    
+
     public List getInstances() {
         return m_instances;
     }
-    
+
     public List getRequirements() {
         return m_importers;
     }
diff --git a/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/ConfigurableInstantiation.java b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/ConfigurableInstantiation.java
index 99ccb8d..510c3a6 100644
--- a/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/ConfigurableInstantiation.java
+++ b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/ConfigurableInstantiation.java
@@ -23,7 +23,6 @@
 import org.apache.felix.ipojo.ComponentFactory;
 import org.apache.felix.ipojo.ComponentInstance;
 import org.apache.felix.ipojo.ServiceContext;
-import org.apache.felix.ipojo.architecture.Architecture;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
 import org.apache.felix.ipojo.test.composite.service.FooService;
 import org.apache.felix.ipojo.test.composite.util.Utils;
diff --git a/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/ConfigurationTest.java b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/ConfigurationTest.java
new file mode 100644
index 0000000..bf6923c
--- /dev/null
+++ b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/ConfigurationTest.java
@@ -0,0 +1,90 @@
+/*
+ * 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.instantiator;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+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 ConfigurationTest extends OSGiTestCase {
+
+	private ComponentFactory compositeFactory;
+
+	public void setUp() {
+		compositeFactory = (ComponentFactory) Utils.getFactoryByName(getContext(), "CONF-MySuperComposite");
+	}
+
+	public void tearDown() {
+
+	}
+
+	public void testDefaultInstantiation() throws InvalidSyntaxException {
+		Properties props = new Properties();
+		props.put("instance.name","under");
+		ComponentInstance under = null;
+		try {
+			under = compositeFactory.createComponentInstance(props);
+		} catch(Exception e) {
+		    e.printStackTrace();
+			fail("Cannot instantiate under : " + e.getMessage());
+		}
+		assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+		ServiceContext sc = Utils.getServiceContext(under);
+		ServiceReference[] refs = sc.getServiceReferences(FooService.class.getName(), null);
+		assertEquals(2, refs.length);
+		for (int i = 0; i < refs.length; i++) {
+			assertEquals(3, ((Integer) refs[i].getProperty("int")).intValue());
+			assertEquals("foo", (String) refs[i].getProperty("string"));
+		}
+		under.dispose();
+	}
+
+	public void testConfiguredInstantiation() throws InvalidSyntaxException {
+		Properties props = new Properties();
+		props.put("instance.name","under");
+		props.put("string", "bar");
+		props.put("int", "25");
+		ComponentInstance under = null;
+		try {
+			under = compositeFactory.createComponentInstance(props);
+		} catch(Exception e) {
+		    e.printStackTrace();
+			fail("Cannot instantiate under : " + e.getMessage());
+		}
+		assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+		ServiceContext sc = Utils.getServiceContext(under);
+		ServiceReference[] refs = sc.getServiceReferences(FooService.class.getName(), null);
+		assertEquals(2, refs.length);
+		for (int i = 0; i < refs.length; i++) {
+			assertEquals(25, ((Integer) refs[i].getProperty("int")).intValue());
+			assertEquals("bar", (String) refs[i].getProperty("string"));
+		}
+		under.dispose();
+	}
+
+
+
+}
diff --git a/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/InstantiatorTestSuite.java b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/InstantiatorTestSuite.java
index 8fa0dce..1ae39b7 100644
--- a/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/InstantiatorTestSuite.java
+++ b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/InstantiatorTestSuite.java
@@ -1,4 +1,4 @@
-/* 
+/*
  * 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
@@ -36,6 +36,7 @@
 		ots.addTestSuite(ConfigurableInstantiation.class);
 		ots.addTestSuite(SimpleInstance.class);
 		ots.addTestSuite(InstanceScopeTest.class);
+		ots.addTestSuite(ConfigurationTest.class);
 		return ots;
 	}
 
diff --git a/ipojo/tests/composite/service-instance/src/main/resources/metadata.xml b/ipojo/tests/composite/service-instance/src/main/resources/metadata.xml
index 3ec92cc..ede6935 100644
--- a/ipojo/tests/composite/service-instance/src/main/resources/metadata.xml
+++ b/ipojo/tests/composite/service-instance/src/main/resources/metadata.xml
@@ -1,26 +1,26 @@
 <ipojo
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="org.apache.felix.ipojo http://felix.apache.org/ipojo/schemas/SNAPSHOT/core.xsd 
+	xsi:schemaLocation="org.apache.felix.ipojo http://felix.apache.org/ipojo/schemas/SNAPSHOT/core.xsd
 	    org.apache.felix.composite http://felix.apache.org/ipojo/schemas/SNAPSHOT/composite.xsd"
 	xmlns="org.apache.felix.ipojo"
 	xmlns:comp="org.apache.felix.ipojo.composite"
-	xmlns:cs="org.apache.felix.ipojo.test.composite.handler.CheckServiceHandler">	
+	xmlns:cs="org.apache.felix.ipojo.test.composite.handler.CheckServiceHandler">
 	<comp:composite name="composite.bar.1" architecture="true">
 		<subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.BarService"/>
 	</comp:composite>
-	
+
 	<comp:composite name="composite.bar.2" architecture="true">
 		<subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.BarService" aggregate="true"/>
 	</comp:composite>
-	
+
 	<comp:composite name="composite.bar.3" architecture="true">
 		<subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.BarService" optional="true"/>
 	</comp:composite>
-	
+
 	<comp:composite name="composite.bar.4" architecture="true">
 		<subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.FooService" aggregate="true" optional="true"/>
 	</comp:composite>
-	
+
 	<comp:composite name="composite.bar.5-accept" architecture="true">
 		<subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.FooService">
 			<property name="boolean" value="true"/>
@@ -29,7 +29,7 @@
 			<property name="int" value="5"/>
 		</subservice>
 	</comp:composite>
-	
+
 	<comp:composite name="composite.bar.5-refuse1" architecture="true">
 		<subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.BarService">
 			<property name="foo" value="bar"/>
@@ -39,7 +39,7 @@
 			<property name="int" value="5"/>
 		</subservice>
 	</comp:composite>
-	
+
 	<comp:composite name="composite.bar.5-refuse2" architecture="true">
 		<subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.BarService">
 			<property name="string" value="foo"/>
@@ -56,7 +56,7 @@
 			<property name="strAProp" value="{a,b,c}"/>
 		</instance>
 	</comp:composite>
-	
+
 	<!-- Scope test -->
 	<component name="SCOPE-provider" classname="org.apache.felix.ipojo.test.instance.ServiceProvider">
 		<provides/>
@@ -72,4 +72,18 @@
 	<comp:composite name="SCOPE-badscope">
 		<instance component="SCOPE-cons"/>
 	</comp:composite>
+
+	<!-- Instance configuration  -->
+	<comp:composite name="CONF-MySuperComposite">
+                <instance component="COMPO-FooProviderType-2">
+                               <property name="int" value="3"/>
+                </instance>
+                <subservice action="instantiate"
+					specification="org.apache.felix.ipojo.test.composite.service.FooService">
+					<property name="boolean" value="true"/>
+					<property name="string" value="foo"/>
+					<property name="strAprop" value="{foo, bar, baz}"/>
+					<property name="int" value="3"/>
+				</subservice>
+	</comp:composite>
 </ipojo>
