Fix issue FELIX-1906
Provide a 'modified' callback when an injected service is modified.
This commit:
modify the dependency model to support such callback
update the handlers
extends the api
provides the annotation
modify the XSD schema
Add tests

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@885210 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/Modified.java b/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/Modified.java
new file mode 100644
index 0000000..95e5d02
--- /dev/null
+++ b/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/Modified.java
@@ -0,0 +1,81 @@
+/* 

+ * 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.annotations;

+

+import java.lang.annotation.ElementType;

+import java.lang.annotation.Target;

+import java.util.Comparator;

+

+/**

+ * This annotation declares an modify method.

+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>

+ */

+@Target(ElementType.METHOD)

+public @interface Modified {

+    

+    /**

+     * Set the dependency filter.

+     * Default : no filter

+     */

+    String filter() default "";

+    

+    /**

+     * Set if the dependency is an aggregate dependency.

+     * Default : false

+     */

+    boolean aggregate() default false;

+    

+    

+    /**

+     * Set if the dependency is optional.

+     * Default : false

+     */

+    boolean optional() default false;

+    

+    /**

+     * Set the required specification.

+     * Default : empty (try to discover).

+     */

+    String specification() default "";

+    

+    /**

+     * Set the dependency id.

+     * Default : empty.

+     */

+    String id() default "";

+    

+    /**

+     * Set the binding policy.

+     * Acceptable policy are dynamic, static and dynamic-priority.

+     * Default: dynamic.

+     */

+    String policy() default "dynamic";

+    

+    /**

+     * Set the comparator.

+     * The indicated class must implement {@link Comparator}

+     */

+    Class comparator() default Comparator.class;

+    

+    /**

+     * Set the from attribute.

+     */

+    String from() default "";

+

+}

diff --git a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/Dependency.java b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/Dependency.java
index ba04f09..cac71d4 100644
--- a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/Dependency.java
+++ b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/Dependency.java
@@ -82,6 +82,11 @@
     private String m_unbind;
     
     /**
+     * Modified method attached to the dependency. 
+     */
+    private String m_modified;
+    
+    /**
      * The dependency binding policy. 
      */
     private int m_policy;
@@ -142,6 +147,12 @@
             cb.addAttribute(new Attribute("method", m_unbind));
             dep.addElement(cb);
         }
+        if (m_modified != null) {
+            Element cb = new Element("callback", "");
+            cb.addAttribute(new Attribute("type", "modified"));
+            cb.addAttribute(new Attribute("method", m_modified));
+            dep.addElement(cb);
+        }
         if (m_comparator != null) {
             dep.addAttribute(new Attribute("comparator", m_comparator));
         }
@@ -260,6 +271,16 @@
     }
     
     /**
+     * Sets the dependency modified method.
+     * @param modified the modified method
+     * @return the current dependency object.
+     */
+    public Dependency setModifiedMethod(String modified) {
+        m_modified = modified;
+        return this;
+    }
+    
+    /**
      * Sets the dependency binding policy.
      * @param policy the binding policy
      * @return the current dependency object
diff --git a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/SvcInstance.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/SvcInstance.java
index 9457edf..d61d347 100644
--- a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/SvcInstance.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/SvcInstance.java
@@ -283,4 +283,13 @@
         }

     }

 

+    /**

+     * A factory is modified. This should not happen.

+     * @param arg0 the service reference

+     * @see org.apache.felix.ipojo.util.DependencyModel#onServiceModification(org.osgi.framework.ServiceReference)

+     */

+    public void onServiceModification(ServiceReference arg0) {

+        // Nothing to do.

+    }

+

 }

diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/Dependency.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/Dependency.java
index 9cfddf5..3b3e4ae 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/Dependency.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/Dependency.java
@@ -290,6 +290,21 @@
      * Call bind method with the service reference in parameter (if accepted).
      * @param ref : the service reference of the new service
      */
+    private void callModifyMethod(ServiceReference ref) {
+        if (m_handler.getInstanceManager().getState() > InstanceManager.STOPPED && m_handler.getInstanceManager().getPojoObjects() != null) {
+            for (int i = 0; m_callbacks != null && i < m_callbacks.length; i++) {
+                if (m_callbacks[i].getMethodType() == DependencyCallback.MODIFIED) {
+                    invokeCallback(m_callbacks[i], ref, null); // Call on each created pojo objects.
+                }
+            }
+        }
+    }
+    
+
+    /**
+     * Call 'modify' method with the service reference in parameter (if accepted).
+     * @param ref : the service reference of the modified service
+     */
     private void callBindMethod(ServiceReference ref) {
         // call bind method :
         // if (m_handler.getInstanceManager().getState() == InstanceManager.VALID) {
@@ -387,6 +402,15 @@
         callBindMethod(reference);
         //The method is only called when a new service arrives, or when the used one is replaced.
     }
+    
+    /**
+     * An already injected service is modified.
+     * @param reference : the modified service reference.
+     * @see org.apache.felix.ipojo.util.DependencyModel#onServiceModification(org.osgi.framework.ServiceReference)
+     */
+    public void onServiceModification(ServiceReference reference) {
+        callModifyMethod(reference);
+    }
 
     /**
      * A used (already injected) service disappears.
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyCallback.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyCallback.java
index a27fd69..571a92c 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyCallback.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyCallback.java
@@ -45,6 +45,11 @@
      * Unbind method (called when a service disappears).
      */
     public static final int UNBIND = 1;
+    
+    /**
+     * Updated method (called when a service is modified).
+     */
+    public static final int MODIFIED = 2;
 
     /**
      * Is the method a bind method or an unbind method ?
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java
index 89ff46d..e5862b3 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java
@@ -414,6 +414,8 @@
                 int methodType = 0;
                 if ("bind".equalsIgnoreCase(type)) {
                     methodType = DependencyCallback.BIND;
+                } else if ("modified".equalsIgnoreCase(type)) {
+                    methodType = DependencyCallback.MODIFIED;
                 } else {
                     methodType = DependencyCallback.UNBIND;
                 }
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/util/DependencyModel.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/util/DependencyModel.java
index f97857b..180ac02 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/util/DependencyModel.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/util/DependencyModel.java
@@ -494,7 +494,7 @@
                 // The service does not match anymore. Call removedService.

                 manageDeparture(ref, arg1);

             } else {

-                onServiceModification(ref);

+                manageModification(ref);

             }

         } else {

             // The service was not used. Check if it matches.

@@ -585,6 +585,13 @@
      * @param ref the leaving service reference.

      */

     public abstract void onServiceDeparture(ServiceReference ref);

+    

+    /**

+     * Concrete dependency callback. 

+     * This method is called when a used service (already injected) is modified.

+     * @param ref the modified service reference.

+     */

+    public abstract void onServiceModification(ServiceReference ref);

 

     /**

      * This method can be override by the concrete dependency to be notified

@@ -592,7 +599,7 @@
      * This modification is not an arrival or a departure.

      * @param ref the modified service reference.

      */

-    public void onServiceModification(ServiceReference ref) {

+    public void manageModification(ServiceReference ref) {

         if (m_policy == DYNAMIC_PRIORITY_BINDING_POLICY) {

             // Check that the order has changed or not.

             int indexBefore = m_matchingRefs.indexOf(ref);

@@ -603,6 +610,9 @@
                 onServiceArrival(ref);

             }

             

+        } else {

+            // It's a modification...

+            onServiceModification(ref);

         }

     }

 

diff --git a/ipojo/core/src/main/resources/core.xsd b/ipojo/core/src/main/resources/core.xsd
index e29f8a3..2f3491f 100644
--- a/ipojo/core/src/main/resources/core.xsd
+++ b/ipojo/core/src/main/resources/core.xsd
@@ -1,483 +1,487 @@
 <!--
-	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
+  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
+  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.
+  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.
 -->
 <xs:schema elementFormDefault="qualified" targetNamespace="org.apache.felix.ipojo"
-	xmlns="org.apache.felix.ipojo" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  xmlns="org.apache.felix.ipojo" xmlns:xs="http://www.w3.org/2001/XMLSchema">
     <xs:annotation>
-    	<xs:documentation>iPOJO Core XML-Schema. This grammars models iPOJO descriptor using core features. It provides several extensibility mechanism in order to compose this schema with external handlers and other component implementation type such as compositions.</xs:documentation></xs:annotation>
+      <xs:documentation>iPOJO Core XML-Schema. This grammars models iPOJO descriptor using core features. It provides several extensibility mechanism in order to compose this schema with external handlers and other component implementation type such as compositions.</xs:documentation></xs:annotation>
     <xs:element name="ipojo">
-		<xs:complexType>
+    <xs:complexType>
             <xs:annotation>
-            	<xs:documentation>iPOJO top level element.</xs:documentation>
+              <xs:documentation>iPOJO top level element.</xs:documentation>
             </xs:annotation>
             <xs:choice minOccurs="0" maxOccurs="unbounded">
-				<xs:element ref="handler" minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="handler" minOccurs="0" maxOccurs="unbounded">
                     <xs:annotation>
-                    	<xs:documentation>The handler declarations.</xs:documentation>
+                      <xs:documentation>The handler declarations.</xs:documentation>
                     </xs:annotation>
-				</xs:element>
-				<xs:element ref="instance" minOccurs="0" maxOccurs="unbounded">
+        </xs:element>
+        <xs:element ref="instance" minOccurs="0" maxOccurs="unbounded">
                     <xs:annotation>
-                    	<xs:documentation>The instance declarations.</xs:documentation>
+                      <xs:documentation>The instance declarations.</xs:documentation>
                     </xs:annotation>
-				</xs:element>
-				<xs:element ref="component" minOccurs="0" maxOccurs="unbounded">
+        </xs:element>
+        <xs:element ref="component" minOccurs="0" maxOccurs="unbounded">
                     <xs:annotation>
-                    	<xs:documentation>The component type declarations.</xs:documentation>
+                      <xs:documentation>The component type declarations.</xs:documentation>
                     </xs:annotation>
-				</xs:element>
-				<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
-				</xs:any>
-			</xs:choice>
-		</xs:complexType>
-	</xs:element>
-	<xs:complexType name="HandlerType">
+        </xs:element>
+        <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+        </xs:any>
+      </xs:choice>
+    </xs:complexType>
+  </xs:element>
+  <xs:complexType name="HandlerType">
         <xs:annotation>
-        	<xs:documentation>Description of the handler.</xs:documentation>
+          <xs:documentation>Description of the handler.</xs:documentation>
         </xs:annotation>
         <xs:complexContent>
-			<xs:extension base="RootElementType">
-				<xs:sequence maxOccurs="unbounded" minOccurs="0">
-					<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##any"
-						processContents="skip">
-					</xs:any>
-				</xs:sequence>
-				<xs:attribute name="classname" type="xs:string" use="required">
+      <xs:extension base="RootElementType">
+        <xs:sequence maxOccurs="unbounded" minOccurs="0">
+          <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##any"
+            processContents="skip">
+          </xs:any>
+        </xs:sequence>
+        <xs:attribute name="classname" type="xs:string" use="required">
                     <xs:annotation>
-                    	<xs:documentation>The implementation class of the handler. The specified class must implement (direcly or not) the "org.apache.felix.ipojo.Handler" interface.</xs:documentation>
+                      <xs:documentation>The implementation class of the handler. The specified class must implement (direcly or not) the "org.apache.felix.ipojo.Handler" interface.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
-				<xs:attribute name="name" type="xs:string" use="required">
+        </xs:attribute>
+        <xs:attribute name="name" type="xs:string" use="required">
                     <xs:annotation>
-                    	<xs:documentation>The name of the handler.</xs:documentation>
+                      <xs:documentation>The name of the handler.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
-				<xs:attribute name="namespace" type="xs:string" use="optional">
+        </xs:attribute>
+        <xs:attribute name="namespace" type="xs:string" use="optional">
                     <xs:annotation>
-                    	<xs:documentation>The XML namespace of the handler.</xs:documentation>
+                      <xs:documentation>The XML namespace of the handler.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
-				<xs:attribute name="architecture" type="xs:boolean"
-					use="optional" fixed="false">
+        </xs:attribute>
+        <xs:attribute name="architecture" type="xs:boolean"
+          use="optional" fixed="false">
                     <xs:annotation>
-                    	<xs:documentation>Enables or disables the architecture exposition. By default, the architecture is not exposed. This allows handler introspection.</xs:documentation>
+                      <xs:documentation>Enables or disables the architecture exposition. By default, the architecture is not exposed. This allows handler introspection.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
-				<xs:attribute name="level" type="xs:int" use="optional">
+        </xs:attribute>
+        <xs:attribute name="level" type="xs:int" use="optional">
                     <xs:annotation>
-                    	<xs:documentation>The start level of the handler.</xs:documentation>
+                      <xs:documentation>The start level of the handler.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
-			</xs:extension>
-		</xs:complexContent>
-	</xs:complexType>
-	<xs:complexType name="InstanceType">
+        </xs:attribute>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="InstanceType">
         <xs:annotation>
-        	<xs:documentation>Describes an instance of a component.</xs:documentation>
+          <xs:documentation>Describes an instance of a component.</xs:documentation>
         </xs:annotation>
         <xs:complexContent>
-			<xs:extension base="RootElementType">
-				<xs:sequence minOccurs="0" maxOccurs="unbounded">
-					<xs:element name="property" type="InstancePropertyType">
-						<xs:annotation>
-							<xs:documentation>The instance properties.</xs:documentation>
-						</xs:annotation></xs:element>
-				</xs:sequence>
-				<xs:attribute name="component" type="xs:string">
-					<xs:annotation>
-						<xs:documentation>The name of the instance component type.</xs:documentation>
-					</xs:annotation></xs:attribute>
-				<xs:attribute name="name" type="xs:string" use="optional">
+      <xs:extension base="RootElementType">
+        <xs:sequence minOccurs="0" maxOccurs="unbounded">
+          <xs:element name="property" type="InstancePropertyType">
+            <xs:annotation>
+              <xs:documentation>The instance properties.</xs:documentation>
+            </xs:annotation></xs:element>
+        </xs:sequence>
+        <xs:attribute name="component" type="xs:string">
+          <xs:annotation>
+            <xs:documentation>The name of the instance component type.</xs:documentation>
+          </xs:annotation></xs:attribute>
+        <xs:attribute name="name" type="xs:string" use="optional">
                     <xs:annotation>
-                    	<xs:documentation>The (unique) name of the instance.</xs:documentation>
+                      <xs:documentation>The (unique) name of the instance.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
-				<xs:attribute name="version" type="xs:string" use="optional">
+        </xs:attribute>
+        <xs:attribute name="version" type="xs:string" use="optional">
                     <xs:annotation>
-                    	<xs:documentation>The version of the factory to use.</xs:documentation>
+                      <xs:documentation>The version of the factory to use.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
-			</xs:extension>
-		</xs:complexContent>
-	</xs:complexType>
-	<xs:complexType name="InstancePropertyType">
+        </xs:attribute>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="InstancePropertyType">
         <xs:annotation>
-        	<xs:documentation>Defines a property of an instance configuration.</xs:documentation>
+          <xs:documentation>Defines a property of an instance configuration.</xs:documentation>
         </xs:annotation>
         <xs:sequence>
-			<xs:element name="property" type="InstancePropertyType" minOccurs="0" maxOccurs="unbounded"></xs:element>
-		</xs:sequence>
-		<xs:attribute name="name" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>Name of the property. Can be optional if a property is inside a structure.
+      <xs:element name="property" type="InstancePropertyType" minOccurs="0" maxOccurs="unbounded"></xs:element>
+    </xs:sequence>
+    <xs:attribute name="name" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>Name of the property. Can be optional if a property is inside a structure.
 The 'instance.name' property has a special semantic as it will be used as the instance name.</xs:documentation>
-			</xs:annotation></xs:attribute>
-		<xs:attribute name="value" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>Value of the property. Can be null for property containing other properties.</xs:documentation>
-			</xs:annotation></xs:attribute>
-		<xs:attribute name="type" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>Type of the property, used to create the adequate object. Supported values are list, array, dictionary and map.</xs:documentation>
-			</xs:annotation></xs:attribute>
-	</xs:complexType>
-	<xs:complexType name="RootElementType"></xs:complexType>
-	<xs:complexType name="ComponentType">
-		<xs:annotation>
-			<xs:documentation>Declares an atomic (i.e. primitive) component type.</xs:documentation>
-		</xs:annotation>
-		<xs:choice minOccurs="0" maxOccurs="unbounded">
-			<xs:element ref="callback" minOccurs="0"
-				maxOccurs="unbounded">
+      </xs:annotation></xs:attribute>
+    <xs:attribute name="value" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>Value of the property. Can be null for property containing other properties.</xs:documentation>
+      </xs:annotation></xs:attribute>
+    <xs:attribute name="type" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>Type of the property, used to create the adequate object. Supported values are list, array, dictionary and map.</xs:documentation>
+      </xs:annotation></xs:attribute>
+  </xs:complexType>
+  <xs:complexType name="RootElementType"></xs:complexType>
+  <xs:complexType name="ComponentType">
+    <xs:annotation>
+      <xs:documentation>Declares an atomic (i.e. primitive) component type.</xs:documentation>
+    </xs:annotation>
+    <xs:choice minOccurs="0" maxOccurs="unbounded">
+      <xs:element ref="callback" minOccurs="0"
+        maxOccurs="unbounded">
                 <xs:annotation>
-                	<xs:documentation>Describes the method(s) to invoke when the component's state changes.</xs:documentation>
+                  <xs:documentation>Describes the method(s) to invoke when the component's state changes.</xs:documentation>
                 </xs:annotation>
-			</xs:element>
-			<xs:element ref="provides" minOccurs="0"
-				maxOccurs="unbounded">
+      </xs:element>
+      <xs:element ref="provides" minOccurs="0"
+        maxOccurs="unbounded">
                 <xs:annotation>
-                	<xs:documentation>Indicates the component provided service(s). By default, all implemented interfaces are published.</xs:documentation>
+                  <xs:documentation>Indicates the component provided service(s). By default, all implemented interfaces are published.</xs:documentation>
                 </xs:annotation>
-			</xs:element>
-			<xs:element ref="requires" minOccurs="0"
-				maxOccurs="unbounded">
+      </xs:element>
+      <xs:element ref="requires" minOccurs="0"
+        maxOccurs="unbounded">
                 <xs:annotation>
-                	<xs:documentation>Indicates the service requirements of the component.</xs:documentation>
+                  <xs:documentation>Indicates the service requirements of the component.</xs:documentation>
                 </xs:annotation>
-			</xs:element>
-			<xs:element ref="properties" minOccurs="0"
-				maxOccurs="unbounded">
+      </xs:element>
+      <xs:element ref="properties" minOccurs="0"
+        maxOccurs="unbounded">
                 <xs:annotation>
-                	<xs:documentation>Describes the properties of the component.</xs:documentation>
+                  <xs:documentation>Describes the properties of the component.</xs:documentation>
                 </xs:annotation>
-			</xs:element>
-			<xs:element ref="controller" minOccurs="0" maxOccurs="1">
-				<xs:annotation>
-					<xs:documentation>Lifecycle controller for this component.</xs:documentation>
-				</xs:annotation></xs:element>
-			<xs:any namespace="##other" processContents="lax"
-				minOccurs="0" maxOccurs="unbounded">
-			</xs:any>
-		</xs:choice>
-		<xs:attribute name="name" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>Specifies the name of the component type. This name is used to identify the factory attached to this 	type. If not specified, the factory name is the implementation class name.</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="public" type="xs:boolean" use="optional">
-			<xs:annotation>
-				<xs:documentation>Determines if the component type is public or private. A public factory (default) can be used from any bundles.</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="classname" type="xs:string"
-			use="required">
-			<xs:annotation>
-				<xs:documentation>Specifies the implementation class of the component type.</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="architecture" type="xs:boolean"
-			use="optional">
-			<xs:annotation>
-				<xs:documentation>Enables or disables the architecture exposition. By default, the architecture is exposed. This allows instance introspection.</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="immediate" type="xs:boolean"
-			use="optional">
-            <xs:annotation>
-            	<xs:documentation>Creates the object of the component implementation type as soon as the component instance becomes valid. The default value is "true" if the component doesn't provide any service, "false" otherwise.</xs:documentation>
-            </xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="factory-method" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>Factory method called to create POJO objects instead of the constructor. The specified method must be a static method of the implementation class returning an instance of this implementation class. The factory method can receive the bundle context in argument.</xs:documentation>
-			</xs:annotation></xs:attribute>
-		<xs:attribute name="version" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>Set the version of this component type</xs:documentation>
-			</xs:annotation></xs:attribute>
-	</xs:complexType>
-	<xs:complexType name="RequiresType">
+      </xs:element>
+      <xs:element ref="controller" minOccurs="0" maxOccurs="1">
         <xs:annotation>
-        	<xs:documentation>Description of component services requirements.</xs:documentation>
+          <xs:documentation>Lifecycle controller for this component.</xs:documentation>
+        </xs:annotation></xs:element>
+      <xs:any namespace="##other" processContents="lax"
+        minOccurs="0" maxOccurs="unbounded">
+      </xs:any>
+    </xs:choice>
+    <xs:attribute name="name" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>Specifies the name of the component type. This name is used to identify the factory attached to this 	type. If not specified, the factory name is the implementation class name.</xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="public" type="xs:boolean" use="optional">
+      <xs:annotation>
+        <xs:documentation>Determines if the component type is public or private. A public factory (default) can be used from any bundles.</xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="classname" type="xs:string"
+      use="required">
+      <xs:annotation>
+        <xs:documentation>Specifies the implementation class of the component type.</xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="architecture" type="xs:boolean"
+      use="optional">
+      <xs:annotation>
+        <xs:documentation>Enables or disables the architecture exposition. By default, the architecture is exposed. This allows instance introspection.</xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="immediate" type="xs:boolean"
+      use="optional">
+            <xs:annotation>
+              <xs:documentation>Creates the object of the component implementation type as soon as the component instance becomes valid. The default value is "true" if the component doesn't provide any service, "false" otherwise.</xs:documentation>
+            </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="factory-method" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>Factory method called to create POJO objects instead of the constructor. The specified method must be a static method of the implementation class returning an instance of this implementation class. The factory method can receive the bundle context in argument.</xs:documentation>
+      </xs:annotation></xs:attribute>
+    <xs:attribute name="version" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>Set the version of this component type</xs:documentation>
+      </xs:annotation></xs:attribute>
+  </xs:complexType>
+  <xs:complexType name="RequiresType">
+        <xs:annotation>
+          <xs:documentation>Description of component services requirements.</xs:documentation>
         </xs:annotation>
         <xs:complexContent>
-			<xs:extension base="ServiceDependencyType">
-				<xs:sequence minOccurs="0" maxOccurs="unbounded">
-					<xs:element name="callback"
-						type="DependencyCallbackType">
+      <xs:extension base="ServiceDependencyType">
+        <xs:sequence minOccurs="0" maxOccurs="unbounded">
+          <xs:element name="callback"
+            type="DependencyCallbackType">
                         <xs:annotation>
-                        	<xs:documentation>Service requirement method invocation description. Here can be specified a bind method called when a service appears and an unbind method called when a service disappears.</xs:documentation>
+                          <xs:documentation>Service requirement method invocation description. Here can be specified a bind method called when a service appears and an unbind method called when a service disappears.</xs:documentation>
                         </xs:annotation>
-					</xs:element>
-				</xs:sequence>
+          </xs:element>
+        </xs:sequence>
 
-				<xs:attribute name="interface" type="xs:string"
-				    use="prohibited">
+        <xs:attribute name="interface" type="xs:string"
+            use="prohibited">
                     <xs:annotation>
-                    	<xs:documentation>The interface describing the required service type. This attribute is needed only when using aggregate dependencies with field injection and when the type of this field is a list, vector, collection and set. This attribute is deprecated, use 'specification'.</xs:documentation>
+                      <xs:documentation>The interface describing the required service type. This attribute is needed only when using aggregate dependencies with field injection and when the type of this field is a list, vector, collection and set. This attribute is deprecated, use 'specification'.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
+        </xs:attribute>
 
-				<xs:attribute name="field" type="xs:string"
-					use="optional">
+        <xs:attribute name="field" type="xs:string"
+          use="optional">
                     <xs:annotation>
-                    	<xs:documentation>The name of the field representing the service dependency in the implementation class.</xs:documentation>
+                      <xs:documentation>The name of the field representing the service dependency in the implementation class.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
+        </xs:attribute>
 
-				<xs:attribute name="nullable" type="xs:boolean"
-					use="optional">
+        <xs:attribute name="nullable" type="xs:boolean"
+          use="optional">
                     <xs:annotation>
-                    	<xs:documentation>Enable or disable the Nullable pattern on optional service dependencies. By default, Nullable pattern is enabled. If disabled, iPOJO will inject null instead of a Nullable object.</xs:documentation>
+                      <xs:documentation>Enable or disable the Nullable pattern on optional service dependencies. By default, Nullable pattern is enabled. If disabled, iPOJO will inject null instead of a Nullable object.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
+        </xs:attribute>
 
-				<xs:attribute name="default-implementation"
-					type="xs:string" use="optional">
+        <xs:attribute name="default-implementation"
+          type="xs:string" use="optional">
                     <xs:annotation>
-                    	<xs:documentation>Specifies the default implementation class for an optional service dependency. If no providers are found, iPOJO creates an instance of the default-implementation (nullary constructor) and injects it. The given class must implement the required service interface.</xs:documentation>
+                      <xs:documentation>Specifies the default implementation class for an optional service dependency. If no providers are found, iPOJO creates an instance of the default-implementation (nullary constructor) and injects it. The given class must implement the required service interface.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
+        </xs:attribute>
 
-				<xs:attribute name="from" type="xs:string"
-					use="optional">
+        <xs:attribute name="from" type="xs:string"
+          use="optional">
                     <xs:annotation>
-                    	<xs:documentation>Specific service provider. The dependency can only be fulfilled by the component with the matching name, or by the service with a matching PID.</xs:documentation>
+                      <xs:documentation>Specific service provider. The dependency can only be fulfilled by the component with the matching name, or by the service with a matching PID.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
+        </xs:attribute>
 
-				<xs:attribute name="scope" use="optional">
-					<xs:simpleType>
-						<xs:restriction base="xs:string">
-							<xs:enumeration value="global"></xs:enumeration>
-							<xs:enumeration value="composite"></xs:enumeration>
-							<xs:enumeration value="composite+global"></xs:enumeration>
-						</xs:restriction>
-					</xs:simpleType>
-				</xs:attribute>
+        <xs:attribute name="scope" use="optional">
+          <xs:simpleType>
+            <xs:restriction base="xs:string">
+              <xs:enumeration value="global"></xs:enumeration>
+              <xs:enumeration value="composite"></xs:enumeration>
+              <xs:enumeration value="composite+global"></xs:enumeration>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:attribute>
 
-			</xs:extension>
-		</xs:complexContent>
-	</xs:complexType>
-	<xs:complexType name="DependencyCallbackType">
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="DependencyCallbackType">
         <xs:annotation>
-        	<xs:documentation>Dependency callbacks are used to receive notification when service providers arrive and leave.</xs:documentation>
+          <xs:documentation>Dependency callbacks are used to receive notification when service providers arrive and leave.</xs:documentation>
         </xs:annotation>
         <xs:attribute name="method" type="xs:string" use="required">
-        	<xs:annotation>
-        		<xs:documentation>Method to call</xs:documentation>
-        	</xs:annotation></xs:attribute>
-		<xs:attribute name="type" use="required">
+          <xs:annotation>
+            <xs:documentation>Method to call</xs:documentation>
+          </xs:annotation></xs:attribute>
+    <xs:attribute name="type" use="required">
             <xs:annotation>
-            	<xs:documentation>Type of callback (bind or unbind). Bind means that the method will be called when a provider arrives. Unbind means that the method will be called when a provider leaves.</xs:documentation>
+              <xs:documentation>
+                Type of callback (bind, unbind, or updated). Bind means that the method will be called when a provider arrives. Unbind means that the method will be called when a provider leaves.
+                Updated means that a service was modified but is still valid for the service dependency.
+              </xs:documentation>
             </xs:annotation>
             <xs:simpleType>
-				<xs:restriction base="xs:string">
-					<xs:enumeration value="bind"></xs:enumeration>
-					<xs:enumeration value="unbind"></xs:enumeration>
-				</xs:restriction>
-			</xs:simpleType>
-		</xs:attribute>
-	</xs:complexType>
-	<xs:complexType name="CallbackType">
+        <xs:restriction base="xs:string">
+          <xs:enumeration value="bind"></xs:enumeration>
+          <xs:enumeration value="unbind"></xs:enumeration>
+          <xs:enumeration value="modified"></xs:enumeration>
+        </xs:restriction>
+      </xs:simpleType>
+    </xs:attribute>
+  </xs:complexType>
+  <xs:complexType name="CallbackType">
         <xs:annotation>
-        	<xs:documentation>Lifecycle Callback. Allows a POJO to be notified when the instance becomes valid or invalid.</xs:documentation>
+          <xs:documentation>Lifecycle Callback. Allows a POJO to be notified when the instance becomes valid or invalid.</xs:documentation>
         </xs:annotation>
         <xs:attribute name="method" type="xs:string" use="required">
-        	<xs:annotation>
-        		<xs:documentation>Specifies the method to call on the transition.</xs:documentation>
-        	</xs:annotation></xs:attribute>
-		<xs:attribute name="transition" use="required">
+          <xs:annotation>
+            <xs:documentation>Specifies the method to call on the transition.</xs:documentation>
+          </xs:annotation></xs:attribute>
+    <xs:attribute name="transition" use="required">
             <xs:annotation>
-            	<xs:documentation>Specifies the transition when the callback needs to be invoked.</xs:documentation>
+              <xs:documentation>Specifies the transition when the callback needs to be invoked.</xs:documentation>
             </xs:annotation>
             <xs:simpleType>
                 <xs:annotation>
-                	<xs:documentation>Lifecycle transition state. "validate" means that the component's instance was invalid and becomes valid, "invalidate" means that the component's intance was valid and becomes invalid.</xs:documentation>
+                  <xs:documentation>Lifecycle transition state. "validate" means that the component's instance was invalid and becomes valid, "invalidate" means that the component's intance was valid and becomes invalid.</xs:documentation>
                 </xs:annotation>
                 <xs:restriction base="xs:string">
-					<xs:enumeration value="validate"></xs:enumeration>
-					<xs:enumeration value="invalidate"></xs:enumeration>
-				</xs:restriction>
-			</xs:simpleType>
-		</xs:attribute>
-	</xs:complexType>
-	<xs:element name="provides" type="ProvidesType" id="provides"></xs:element>
-		<xs:complexType name="ProvidesType">
+          <xs:enumeration value="validate"></xs:enumeration>
+          <xs:enumeration value="invalidate"></xs:enumeration>
+        </xs:restriction>
+      </xs:simpleType>
+    </xs:attribute>
+  </xs:complexType>
+  <xs:element name="provides" type="ProvidesType" id="provides"></xs:element>
+    <xs:complexType name="ProvidesType">
         <xs:annotation>
-        	<xs:documentation>Provided service(s) description.</xs:documentation>
+          <xs:documentation>Provided service(s) description.</xs:documentation>
         </xs:annotation>
         <xs:sequence minOccurs="0" maxOccurs="unbounded">
-			<xs:element name="property" type="PropertyType">
-				<xs:annotation>
-					<xs:documentation>List of service specific properties.</xs:documentation>
-				</xs:annotation></xs:element>
-		</xs:sequence>
-		<xs:attribute name="interface" type="xs:string" use="prohibited">
-			<xs:annotation>
-				<xs:documentation>Deprecated attribute, use 'specifications' instead of 'interface'</xs:documentation>
-			</xs:annotation></xs:attribute>
-		<xs:attribute name="specifications" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>The list of service specifications (i.e. interfaces) to expose. By default, all interfaces implemented by the component implementation class are published.</xs:documentation>
-			</xs:annotation></xs:attribute>
-		<xs:attribute name="factory" type="xs:string" use="prohibited">
-			<xs:annotation>
-				<xs:documentation>Use 'strategy' instead of 'factory'</xs:documentation>
-			</xs:annotation></xs:attribute>
-		<xs:attribute name="strategy" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>POJO creation strategy. By default, the POJO object is created once (singleton). If the factory is set to "SERVICE", the creation policy follows the OSGi service factory policy (one object object per asking bundle).
-				INSTANCE allows creating one different POJO object per asking instance. Finally, a custom strategy can be used by specifying the qualified name of the class extending CreationPolicy</xs:documentation>
-			</xs:annotation></xs:attribute>
-	</xs:complexType>
-	<xs:complexType name="PropertyType">
-		<xs:annotation>
-			<xs:documentation>
-				Defines a component property.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:attribute name="field" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>
-					Field of the property
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="method" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>
-					Setter method of the property. This method is called
-					to inject property value.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="name" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>
-					Name of the property.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="value" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>
-					Default value of the property.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="type" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>
-					Type of the property.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
+      <xs:element name="property" type="PropertyType">
+        <xs:annotation>
+          <xs:documentation>List of service specific properties.</xs:documentation>
+        </xs:annotation></xs:element>
+    </xs:sequence>
+    <xs:attribute name="interface" type="xs:string" use="prohibited">
+      <xs:annotation>
+        <xs:documentation>Deprecated attribute, use 'specifications' instead of 'interface'</xs:documentation>
+      </xs:annotation></xs:attribute>
+    <xs:attribute name="specifications" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>The list of service specifications (i.e. interfaces) to expose. By default, all interfaces implemented by the component implementation class are published.</xs:documentation>
+      </xs:annotation></xs:attribute>
+    <xs:attribute name="factory" type="xs:string" use="prohibited">
+      <xs:annotation>
+        <xs:documentation>Use 'strategy' instead of 'factory'</xs:documentation>
+      </xs:annotation></xs:attribute>
+    <xs:attribute name="strategy" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>POJO creation strategy. By default, the POJO object is created once (singleton). If the factory is set to "SERVICE", the creation policy follows the OSGi service factory policy (one object object per asking bundle).
+        INSTANCE allows creating one different POJO object per asking instance. Finally, a custom strategy can be used by specifying the qualified name of the class extending CreationPolicy</xs:documentation>
+      </xs:annotation></xs:attribute>
+  </xs:complexType>
+  <xs:complexType name="PropertyType">
+    <xs:annotation>
+      <xs:documentation>
+        Defines a component property.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:attribute name="field" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Field of the property
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="method" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Setter method of the property. This method is called
+          to inject property value.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="name" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Name of the property.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="value" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Default value of the property.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="type" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Type of the property.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
         <xs:attribute name="mandatory" type="xs:boolean" use="optional" default="false">
-        	<xs:annotation>
-        		<xs:documentation>Set the property as mandatory. A mandatory property MUST receive a value either in the component type description or in the instance configuration. Properties are optional by default.</xs:documentation>
-        	</xs:annotation></xs:attribute>
+          <xs:annotation>
+            <xs:documentation>Set the property as mandatory. A mandatory property MUST receive a value either in the component type description or in the instance configuration. Properties are optional by default.</xs:documentation>
+          </xs:annotation></xs:attribute>
     </xs:complexType>
-	<xs:element name="callback" type="CallbackType" id="callback"></xs:element>
-	<xs:element name="controller" type="ControllerType" id="controller">
-		<xs:annotation>
-			<xs:documentation></xs:documentation>
-		</xs:annotation></xs:element>
-	<xs:element name="requires" type="RequiresType" id="requires"></xs:element>
-	<xs:element name="component" type="ComponentType" id="component"></xs:element>
-	<xs:element name="handler" type="HandlerType" id="handler"></xs:element>
-	<xs:element name="instance" type="InstanceType" id="instance"></xs:element>
+  <xs:element name="callback" type="CallbackType" id="callback"></xs:element>
+  <xs:element name="controller" type="ControllerType" id="controller">
+    <xs:annotation>
+      <xs:documentation></xs:documentation>
+    </xs:annotation></xs:element>
+  <xs:element name="requires" type="RequiresType" id="requires"></xs:element>
+  <xs:element name="component" type="ComponentType" id="component"></xs:element>
+  <xs:element name="handler" type="HandlerType" id="handler"></xs:element>
+  <xs:element name="instance" type="InstanceType" id="instance"></xs:element>
 
     <xs:element name="properties" type="PropertiesType" id="properties"></xs:element>
-	<xs:complexType name="PropertiesType">
+  <xs:complexType name="PropertiesType">
         <xs:annotation>
-        	<xs:documentation>List of component, instance or service properties. This field will receive the property value.</xs:documentation>
+          <xs:documentation>List of component, instance or service properties. This field will receive the property value.</xs:documentation>
         </xs:annotation>
         <xs:sequence minOccurs="0" maxOccurs="unbounded">
-			<xs:element name="property" type="PropertyType">
-				<xs:annotation>
-					<xs:documentation>The list of properties.</xs:documentation>
-				</xs:annotation></xs:element>
-		</xs:sequence>
-		<xs:attribute name="propagation" type="xs:boolean" use="optional">
-			<xs:annotation>
-				<xs:documentation>Propagation of the component properties to the provided services. If this parameter is set to "true", each time properties are reconfigured, they are propagated to each service published by the component.</xs:documentation>
-			</xs:annotation></xs:attribute>
-		<xs:attribute name="pid" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>Unique identifier used to reconfigure components properties (via  Managed Services) with the Configuration Admin.</xs:documentation>
-			</xs:annotation></xs:attribute>
-		<xs:attribute name="updated" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>Method called when a reconfiguration is done</xs:documentation>
-			</xs:annotation></xs:attribute>
-	</xs:complexType>
+      <xs:element name="property" type="PropertyType">
+        <xs:annotation>
+          <xs:documentation>The list of properties.</xs:documentation>
+        </xs:annotation></xs:element>
+    </xs:sequence>
+    <xs:attribute name="propagation" type="xs:boolean" use="optional">
+      <xs:annotation>
+        <xs:documentation>Propagation of the component properties to the provided services. If this parameter is set to "true", each time properties are reconfigured, they are propagated to each service published by the component.</xs:documentation>
+      </xs:annotation></xs:attribute>
+    <xs:attribute name="pid" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>Unique identifier used to reconfigure components properties (via  Managed Services) with the Configuration Admin.</xs:documentation>
+      </xs:annotation></xs:attribute>
+    <xs:attribute name="updated" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>Method called when a reconfiguration is done</xs:documentation>
+      </xs:annotation></xs:attribute>
+  </xs:complexType>
 
-	<xs:complexType name="ServiceDependencyType">
-	    <xs:attribute name="specification" type="xs:string" use="optional">
-	    	<xs:annotation>
-	    		<xs:documentation>The specification describing the required service type. This attribute is needed only when using aggregate dependencies with field injection and when the type of this field is a list, vector, collection and set.</xs:documentation>
-	    	</xs:annotation></xs:attribute>
-		<xs:attribute name="optional" type="xs:boolean" use="optional">
+  <xs:complexType name="ServiceDependencyType">
+      <xs:attribute name="specification" type="xs:string" use="optional">
+        <xs:annotation>
+          <xs:documentation>The specification describing the required service type. This attribute is needed only when using aggregate dependencies with field injection and when the type of this field is a list, vector, collection and set.</xs:documentation>
+        </xs:annotation></xs:attribute>
+    <xs:attribute name="optional" type="xs:boolean" use="optional">
             <xs:annotation>
-            	<xs:documentation>Sets the service dependency optionality</xs:documentation>
+              <xs:documentation>Sets the service dependency optionality</xs:documentation>
             </xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="aggregate" type="xs:boolean" use="optional">
+    </xs:attribute>
+    <xs:attribute name="aggregate" type="xs:boolean" use="optional">
             <xs:annotation>
-            	<xs:documentation>Sets the service dependency cardinality.</xs:documentation>
+              <xs:documentation>Sets the service dependency cardinality.</xs:documentation>
             </xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="policy" use="optional">
+    </xs:attribute>
+    <xs:attribute name="policy" use="optional">
             <xs:annotation>
-            	<xs:documentation>Sets the binding policy of the dependency. Three policies are supported. The dynamic policy supports service providers dynamism. The static policy freezes the provider set as soon as the dependency is used. The dynamic-priority policy is an extension of the dynamic policy, but providers are ranked.</xs:documentation>
+              <xs:documentation>Sets the binding policy of the dependency. Three policies are supported. The dynamic policy supports service providers dynamism. The static policy freezes the provider set as soon as the dependency is used. The dynamic-priority policy is an extension of the dynamic policy, but providers are ranked.</xs:documentation>
             </xs:annotation>
             <xs:simpleType>
-				<xs:restriction base="xs:string">
-					<xs:enumeration value="dynamic"></xs:enumeration>
-					<xs:enumeration value="static"></xs:enumeration>
-					<xs:enumeration value="dynamic-priority"></xs:enumeration>
-				</xs:restriction>
-			</xs:simpleType>
-		</xs:attribute>
-		<xs:attribute name="comparator" type="xs:string" use="optional">
+        <xs:restriction base="xs:string">
+          <xs:enumeration value="dynamic"></xs:enumeration>
+          <xs:enumeration value="static"></xs:enumeration>
+          <xs:enumeration value="dynamic-priority"></xs:enumeration>
+        </xs:restriction>
+      </xs:simpleType>
+    </xs:attribute>
+    <xs:attribute name="comparator" type="xs:string" use="optional">
             <xs:annotation>
-            	<xs:documentation>The comparator attribute allows specifying the class used to compare providers. This class must implemented the java.util.Comparator class and must support the comparison of service references.</xs:documentation>
+              <xs:documentation>The comparator attribute allows specifying the class used to compare providers. This class must implemented the java.util.Comparator class and must support the comparison of service references.</xs:documentation>
             </xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="filter" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>LDAP filter used to filter providers</xs:documentation>
-			</xs:annotation></xs:attribute>
-		<xs:attribute name="id" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>id of the service dependency. The id allows to indentify and to refert to this dependency.</xs:documentation>
-			</xs:annotation></xs:attribute>
-	</xs:complexType>
+    </xs:attribute>
+    <xs:attribute name="filter" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>LDAP filter used to filter providers</xs:documentation>
+      </xs:annotation></xs:attribute>
+    <xs:attribute name="id" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>id of the service dependency. The id allows to indentify and to refert to this dependency.</xs:documentation>
+      </xs:annotation></xs:attribute>
+  </xs:complexType>
 
     <xs:complexType name="ControllerType">
         <xs:annotation>
-        	<xs:documentation>Specifies the lifecycle controller of a component, which allows to validate or invalidate component instances.</xs:documentation>
+          <xs:documentation>Specifies the lifecycle controller of a component, which allows to validate or invalidate component instances.</xs:documentation>
         </xs:annotation>
         <xs:attribute name="field" type="xs:string" use="required">
             <xs:annotation>
-            	<xs:documentation>The name of the component lifecycle controller field. The type of the specified field must be boolean. Setting the value of the specified field to "true" means the validation of the component instance while setting it to "false" means the invalidation of the component instance.</xs:documentation>
+              <xs:documentation>The name of the component lifecycle controller field. The type of the specified field must be boolean. Setting the value of the specified field to "true" means the validation of the component instance while setting it to "false" means the invalidation of the component instance.</xs:documentation>
             </xs:annotation>
         </xs:attribute>
     </xs:complexType>
-</xs:schema>
\ No newline at end of file
+</xs:schema>
diff --git a/ipojo/handler/temporal/src/main/java/org/apache/felix/ipojo/handler/temporal/TemporalDependency.java b/ipojo/handler/temporal/src/main/java/org/apache/felix/ipojo/handler/temporal/TemporalDependency.java
index 0689505..d821ed1 100644
--- a/ipojo/handler/temporal/src/main/java/org/apache/felix/ipojo/handler/temporal/TemporalDependency.java
+++ b/ipojo/handler/temporal/src/main/java/org/apache/felix/ipojo/handler/temporal/TemporalDependency.java
@@ -159,6 +159,13 @@
      * @see org.apache.felix.ipojo.util.DependencyModel#onServiceDeparture(org.osgi.framework.ServiceReference)
      */
     public void onServiceDeparture(ServiceReference arg0) {  }
+    
+    /**
+     * A provider is modified.
+     * @param arg0 leaving service references.
+     * @see org.apache.felix.ipojo.util.DependencyModel#onServiceDeparture(org.osgi.framework.ServiceReference)
+     */
+    public void onServiceModification(ServiceReference arg0) {  }
 
     /**
      * The code require a value of the monitored field. If providers are
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MethodCollector.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MethodCollector.java
index a9f5827..856218e 100644
--- a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MethodCollector.java
+++ b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MethodCollector.java
@@ -73,6 +73,9 @@
         if (arg0.equals("Lorg/apache/felix/ipojo/annotations/Bind;")) {
             return processBind("bind");
         }
+        if (arg0.equals("Lorg/apache/felix/ipojo/annotations/Modified;")) {
+            return processBind("modified");
+        }
         if (arg0.equals("Lorg/apache/felix/ipojo/annotations/Unbind;")) {
             return processBind("unbind");
         }
@@ -106,7 +109,7 @@
     }
 
     /**
-     * Process @bind & @unbind.
+     * Process @bind, @modified, @unbind.
      * @param type : bind or unbind
      * @return the visitor parsing @bind & @unbind annotations.
      */
@@ -190,7 +193,7 @@
         private String m_id;
 
         /**
-         * Bind or Unbind method?
+         * Bind, Modify or Unbind method?
          */
         private String m_type;
         
diff --git a/ipojo/manipulator/src/main/resources/core.xsd b/ipojo/manipulator/src/main/resources/core.xsd
index e29f8a3..2f3491f 100644
--- a/ipojo/manipulator/src/main/resources/core.xsd
+++ b/ipojo/manipulator/src/main/resources/core.xsd
@@ -1,483 +1,487 @@
 <!--
-	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
+  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
+  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.
+  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.
 -->
 <xs:schema elementFormDefault="qualified" targetNamespace="org.apache.felix.ipojo"
-	xmlns="org.apache.felix.ipojo" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  xmlns="org.apache.felix.ipojo" xmlns:xs="http://www.w3.org/2001/XMLSchema">
     <xs:annotation>
-    	<xs:documentation>iPOJO Core XML-Schema. This grammars models iPOJO descriptor using core features. It provides several extensibility mechanism in order to compose this schema with external handlers and other component implementation type such as compositions.</xs:documentation></xs:annotation>
+      <xs:documentation>iPOJO Core XML-Schema. This grammars models iPOJO descriptor using core features. It provides several extensibility mechanism in order to compose this schema with external handlers and other component implementation type such as compositions.</xs:documentation></xs:annotation>
     <xs:element name="ipojo">
-		<xs:complexType>
+    <xs:complexType>
             <xs:annotation>
-            	<xs:documentation>iPOJO top level element.</xs:documentation>
+              <xs:documentation>iPOJO top level element.</xs:documentation>
             </xs:annotation>
             <xs:choice minOccurs="0" maxOccurs="unbounded">
-				<xs:element ref="handler" minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="handler" minOccurs="0" maxOccurs="unbounded">
                     <xs:annotation>
-                    	<xs:documentation>The handler declarations.</xs:documentation>
+                      <xs:documentation>The handler declarations.</xs:documentation>
                     </xs:annotation>
-				</xs:element>
-				<xs:element ref="instance" minOccurs="0" maxOccurs="unbounded">
+        </xs:element>
+        <xs:element ref="instance" minOccurs="0" maxOccurs="unbounded">
                     <xs:annotation>
-                    	<xs:documentation>The instance declarations.</xs:documentation>
+                      <xs:documentation>The instance declarations.</xs:documentation>
                     </xs:annotation>
-				</xs:element>
-				<xs:element ref="component" minOccurs="0" maxOccurs="unbounded">
+        </xs:element>
+        <xs:element ref="component" minOccurs="0" maxOccurs="unbounded">
                     <xs:annotation>
-                    	<xs:documentation>The component type declarations.</xs:documentation>
+                      <xs:documentation>The component type declarations.</xs:documentation>
                     </xs:annotation>
-				</xs:element>
-				<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
-				</xs:any>
-			</xs:choice>
-		</xs:complexType>
-	</xs:element>
-	<xs:complexType name="HandlerType">
+        </xs:element>
+        <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+        </xs:any>
+      </xs:choice>
+    </xs:complexType>
+  </xs:element>
+  <xs:complexType name="HandlerType">
         <xs:annotation>
-        	<xs:documentation>Description of the handler.</xs:documentation>
+          <xs:documentation>Description of the handler.</xs:documentation>
         </xs:annotation>
         <xs:complexContent>
-			<xs:extension base="RootElementType">
-				<xs:sequence maxOccurs="unbounded" minOccurs="0">
-					<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##any"
-						processContents="skip">
-					</xs:any>
-				</xs:sequence>
-				<xs:attribute name="classname" type="xs:string" use="required">
+      <xs:extension base="RootElementType">
+        <xs:sequence maxOccurs="unbounded" minOccurs="0">
+          <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##any"
+            processContents="skip">
+          </xs:any>
+        </xs:sequence>
+        <xs:attribute name="classname" type="xs:string" use="required">
                     <xs:annotation>
-                    	<xs:documentation>The implementation class of the handler. The specified class must implement (direcly or not) the "org.apache.felix.ipojo.Handler" interface.</xs:documentation>
+                      <xs:documentation>The implementation class of the handler. The specified class must implement (direcly or not) the "org.apache.felix.ipojo.Handler" interface.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
-				<xs:attribute name="name" type="xs:string" use="required">
+        </xs:attribute>
+        <xs:attribute name="name" type="xs:string" use="required">
                     <xs:annotation>
-                    	<xs:documentation>The name of the handler.</xs:documentation>
+                      <xs:documentation>The name of the handler.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
-				<xs:attribute name="namespace" type="xs:string" use="optional">
+        </xs:attribute>
+        <xs:attribute name="namespace" type="xs:string" use="optional">
                     <xs:annotation>
-                    	<xs:documentation>The XML namespace of the handler.</xs:documentation>
+                      <xs:documentation>The XML namespace of the handler.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
-				<xs:attribute name="architecture" type="xs:boolean"
-					use="optional" fixed="false">
+        </xs:attribute>
+        <xs:attribute name="architecture" type="xs:boolean"
+          use="optional" fixed="false">
                     <xs:annotation>
-                    	<xs:documentation>Enables or disables the architecture exposition. By default, the architecture is not exposed. This allows handler introspection.</xs:documentation>
+                      <xs:documentation>Enables or disables the architecture exposition. By default, the architecture is not exposed. This allows handler introspection.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
-				<xs:attribute name="level" type="xs:int" use="optional">
+        </xs:attribute>
+        <xs:attribute name="level" type="xs:int" use="optional">
                     <xs:annotation>
-                    	<xs:documentation>The start level of the handler.</xs:documentation>
+                      <xs:documentation>The start level of the handler.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
-			</xs:extension>
-		</xs:complexContent>
-	</xs:complexType>
-	<xs:complexType name="InstanceType">
+        </xs:attribute>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="InstanceType">
         <xs:annotation>
-        	<xs:documentation>Describes an instance of a component.</xs:documentation>
+          <xs:documentation>Describes an instance of a component.</xs:documentation>
         </xs:annotation>
         <xs:complexContent>
-			<xs:extension base="RootElementType">
-				<xs:sequence minOccurs="0" maxOccurs="unbounded">
-					<xs:element name="property" type="InstancePropertyType">
-						<xs:annotation>
-							<xs:documentation>The instance properties.</xs:documentation>
-						</xs:annotation></xs:element>
-				</xs:sequence>
-				<xs:attribute name="component" type="xs:string">
-					<xs:annotation>
-						<xs:documentation>The name of the instance component type.</xs:documentation>
-					</xs:annotation></xs:attribute>
-				<xs:attribute name="name" type="xs:string" use="optional">
+      <xs:extension base="RootElementType">
+        <xs:sequence minOccurs="0" maxOccurs="unbounded">
+          <xs:element name="property" type="InstancePropertyType">
+            <xs:annotation>
+              <xs:documentation>The instance properties.</xs:documentation>
+            </xs:annotation></xs:element>
+        </xs:sequence>
+        <xs:attribute name="component" type="xs:string">
+          <xs:annotation>
+            <xs:documentation>The name of the instance component type.</xs:documentation>
+          </xs:annotation></xs:attribute>
+        <xs:attribute name="name" type="xs:string" use="optional">
                     <xs:annotation>
-                    	<xs:documentation>The (unique) name of the instance.</xs:documentation>
+                      <xs:documentation>The (unique) name of the instance.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
-				<xs:attribute name="version" type="xs:string" use="optional">
+        </xs:attribute>
+        <xs:attribute name="version" type="xs:string" use="optional">
                     <xs:annotation>
-                    	<xs:documentation>The version of the factory to use.</xs:documentation>
+                      <xs:documentation>The version of the factory to use.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
-			</xs:extension>
-		</xs:complexContent>
-	</xs:complexType>
-	<xs:complexType name="InstancePropertyType">
+        </xs:attribute>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="InstancePropertyType">
         <xs:annotation>
-        	<xs:documentation>Defines a property of an instance configuration.</xs:documentation>
+          <xs:documentation>Defines a property of an instance configuration.</xs:documentation>
         </xs:annotation>
         <xs:sequence>
-			<xs:element name="property" type="InstancePropertyType" minOccurs="0" maxOccurs="unbounded"></xs:element>
-		</xs:sequence>
-		<xs:attribute name="name" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>Name of the property. Can be optional if a property is inside a structure.
+      <xs:element name="property" type="InstancePropertyType" minOccurs="0" maxOccurs="unbounded"></xs:element>
+    </xs:sequence>
+    <xs:attribute name="name" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>Name of the property. Can be optional if a property is inside a structure.
 The 'instance.name' property has a special semantic as it will be used as the instance name.</xs:documentation>
-			</xs:annotation></xs:attribute>
-		<xs:attribute name="value" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>Value of the property. Can be null for property containing other properties.</xs:documentation>
-			</xs:annotation></xs:attribute>
-		<xs:attribute name="type" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>Type of the property, used to create the adequate object. Supported values are list, array, dictionary and map.</xs:documentation>
-			</xs:annotation></xs:attribute>
-	</xs:complexType>
-	<xs:complexType name="RootElementType"></xs:complexType>
-	<xs:complexType name="ComponentType">
-		<xs:annotation>
-			<xs:documentation>Declares an atomic (i.e. primitive) component type.</xs:documentation>
-		</xs:annotation>
-		<xs:choice minOccurs="0" maxOccurs="unbounded">
-			<xs:element ref="callback" minOccurs="0"
-				maxOccurs="unbounded">
+      </xs:annotation></xs:attribute>
+    <xs:attribute name="value" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>Value of the property. Can be null for property containing other properties.</xs:documentation>
+      </xs:annotation></xs:attribute>
+    <xs:attribute name="type" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>Type of the property, used to create the adequate object. Supported values are list, array, dictionary and map.</xs:documentation>
+      </xs:annotation></xs:attribute>
+  </xs:complexType>
+  <xs:complexType name="RootElementType"></xs:complexType>
+  <xs:complexType name="ComponentType">
+    <xs:annotation>
+      <xs:documentation>Declares an atomic (i.e. primitive) component type.</xs:documentation>
+    </xs:annotation>
+    <xs:choice minOccurs="0" maxOccurs="unbounded">
+      <xs:element ref="callback" minOccurs="0"
+        maxOccurs="unbounded">
                 <xs:annotation>
-                	<xs:documentation>Describes the method(s) to invoke when the component's state changes.</xs:documentation>
+                  <xs:documentation>Describes the method(s) to invoke when the component's state changes.</xs:documentation>
                 </xs:annotation>
-			</xs:element>
-			<xs:element ref="provides" minOccurs="0"
-				maxOccurs="unbounded">
+      </xs:element>
+      <xs:element ref="provides" minOccurs="0"
+        maxOccurs="unbounded">
                 <xs:annotation>
-                	<xs:documentation>Indicates the component provided service(s). By default, all implemented interfaces are published.</xs:documentation>
+                  <xs:documentation>Indicates the component provided service(s). By default, all implemented interfaces are published.</xs:documentation>
                 </xs:annotation>
-			</xs:element>
-			<xs:element ref="requires" minOccurs="0"
-				maxOccurs="unbounded">
+      </xs:element>
+      <xs:element ref="requires" minOccurs="0"
+        maxOccurs="unbounded">
                 <xs:annotation>
-                	<xs:documentation>Indicates the service requirements of the component.</xs:documentation>
+                  <xs:documentation>Indicates the service requirements of the component.</xs:documentation>
                 </xs:annotation>
-			</xs:element>
-			<xs:element ref="properties" minOccurs="0"
-				maxOccurs="unbounded">
+      </xs:element>
+      <xs:element ref="properties" minOccurs="0"
+        maxOccurs="unbounded">
                 <xs:annotation>
-                	<xs:documentation>Describes the properties of the component.</xs:documentation>
+                  <xs:documentation>Describes the properties of the component.</xs:documentation>
                 </xs:annotation>
-			</xs:element>
-			<xs:element ref="controller" minOccurs="0" maxOccurs="1">
-				<xs:annotation>
-					<xs:documentation>Lifecycle controller for this component.</xs:documentation>
-				</xs:annotation></xs:element>
-			<xs:any namespace="##other" processContents="lax"
-				minOccurs="0" maxOccurs="unbounded">
-			</xs:any>
-		</xs:choice>
-		<xs:attribute name="name" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>Specifies the name of the component type. This name is used to identify the factory attached to this 	type. If not specified, the factory name is the implementation class name.</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="public" type="xs:boolean" use="optional">
-			<xs:annotation>
-				<xs:documentation>Determines if the component type is public or private. A public factory (default) can be used from any bundles.</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="classname" type="xs:string"
-			use="required">
-			<xs:annotation>
-				<xs:documentation>Specifies the implementation class of the component type.</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="architecture" type="xs:boolean"
-			use="optional">
-			<xs:annotation>
-				<xs:documentation>Enables or disables the architecture exposition. By default, the architecture is exposed. This allows instance introspection.</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="immediate" type="xs:boolean"
-			use="optional">
-            <xs:annotation>
-            	<xs:documentation>Creates the object of the component implementation type as soon as the component instance becomes valid. The default value is "true" if the component doesn't provide any service, "false" otherwise.</xs:documentation>
-            </xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="factory-method" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>Factory method called to create POJO objects instead of the constructor. The specified method must be a static method of the implementation class returning an instance of this implementation class. The factory method can receive the bundle context in argument.</xs:documentation>
-			</xs:annotation></xs:attribute>
-		<xs:attribute name="version" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>Set the version of this component type</xs:documentation>
-			</xs:annotation></xs:attribute>
-	</xs:complexType>
-	<xs:complexType name="RequiresType">
+      </xs:element>
+      <xs:element ref="controller" minOccurs="0" maxOccurs="1">
         <xs:annotation>
-        	<xs:documentation>Description of component services requirements.</xs:documentation>
+          <xs:documentation>Lifecycle controller for this component.</xs:documentation>
+        </xs:annotation></xs:element>
+      <xs:any namespace="##other" processContents="lax"
+        minOccurs="0" maxOccurs="unbounded">
+      </xs:any>
+    </xs:choice>
+    <xs:attribute name="name" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>Specifies the name of the component type. This name is used to identify the factory attached to this 	type. If not specified, the factory name is the implementation class name.</xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="public" type="xs:boolean" use="optional">
+      <xs:annotation>
+        <xs:documentation>Determines if the component type is public or private. A public factory (default) can be used from any bundles.</xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="classname" type="xs:string"
+      use="required">
+      <xs:annotation>
+        <xs:documentation>Specifies the implementation class of the component type.</xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="architecture" type="xs:boolean"
+      use="optional">
+      <xs:annotation>
+        <xs:documentation>Enables or disables the architecture exposition. By default, the architecture is exposed. This allows instance introspection.</xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="immediate" type="xs:boolean"
+      use="optional">
+            <xs:annotation>
+              <xs:documentation>Creates the object of the component implementation type as soon as the component instance becomes valid. The default value is "true" if the component doesn't provide any service, "false" otherwise.</xs:documentation>
+            </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="factory-method" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>Factory method called to create POJO objects instead of the constructor. The specified method must be a static method of the implementation class returning an instance of this implementation class. The factory method can receive the bundle context in argument.</xs:documentation>
+      </xs:annotation></xs:attribute>
+    <xs:attribute name="version" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>Set the version of this component type</xs:documentation>
+      </xs:annotation></xs:attribute>
+  </xs:complexType>
+  <xs:complexType name="RequiresType">
+        <xs:annotation>
+          <xs:documentation>Description of component services requirements.</xs:documentation>
         </xs:annotation>
         <xs:complexContent>
-			<xs:extension base="ServiceDependencyType">
-				<xs:sequence minOccurs="0" maxOccurs="unbounded">
-					<xs:element name="callback"
-						type="DependencyCallbackType">
+      <xs:extension base="ServiceDependencyType">
+        <xs:sequence minOccurs="0" maxOccurs="unbounded">
+          <xs:element name="callback"
+            type="DependencyCallbackType">
                         <xs:annotation>
-                        	<xs:documentation>Service requirement method invocation description. Here can be specified a bind method called when a service appears and an unbind method called when a service disappears.</xs:documentation>
+                          <xs:documentation>Service requirement method invocation description. Here can be specified a bind method called when a service appears and an unbind method called when a service disappears.</xs:documentation>
                         </xs:annotation>
-					</xs:element>
-				</xs:sequence>
+          </xs:element>
+        </xs:sequence>
 
-				<xs:attribute name="interface" type="xs:string"
-				    use="prohibited">
+        <xs:attribute name="interface" type="xs:string"
+            use="prohibited">
                     <xs:annotation>
-                    	<xs:documentation>The interface describing the required service type. This attribute is needed only when using aggregate dependencies with field injection and when the type of this field is a list, vector, collection and set. This attribute is deprecated, use 'specification'.</xs:documentation>
+                      <xs:documentation>The interface describing the required service type. This attribute is needed only when using aggregate dependencies with field injection and when the type of this field is a list, vector, collection and set. This attribute is deprecated, use 'specification'.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
+        </xs:attribute>
 
-				<xs:attribute name="field" type="xs:string"
-					use="optional">
+        <xs:attribute name="field" type="xs:string"
+          use="optional">
                     <xs:annotation>
-                    	<xs:documentation>The name of the field representing the service dependency in the implementation class.</xs:documentation>
+                      <xs:documentation>The name of the field representing the service dependency in the implementation class.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
+        </xs:attribute>
 
-				<xs:attribute name="nullable" type="xs:boolean"
-					use="optional">
+        <xs:attribute name="nullable" type="xs:boolean"
+          use="optional">
                     <xs:annotation>
-                    	<xs:documentation>Enable or disable the Nullable pattern on optional service dependencies. By default, Nullable pattern is enabled. If disabled, iPOJO will inject null instead of a Nullable object.</xs:documentation>
+                      <xs:documentation>Enable or disable the Nullable pattern on optional service dependencies. By default, Nullable pattern is enabled. If disabled, iPOJO will inject null instead of a Nullable object.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
+        </xs:attribute>
 
-				<xs:attribute name="default-implementation"
-					type="xs:string" use="optional">
+        <xs:attribute name="default-implementation"
+          type="xs:string" use="optional">
                     <xs:annotation>
-                    	<xs:documentation>Specifies the default implementation class for an optional service dependency. If no providers are found, iPOJO creates an instance of the default-implementation (nullary constructor) and injects it. The given class must implement the required service interface.</xs:documentation>
+                      <xs:documentation>Specifies the default implementation class for an optional service dependency. If no providers are found, iPOJO creates an instance of the default-implementation (nullary constructor) and injects it. The given class must implement the required service interface.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
+        </xs:attribute>
 
-				<xs:attribute name="from" type="xs:string"
-					use="optional">
+        <xs:attribute name="from" type="xs:string"
+          use="optional">
                     <xs:annotation>
-                    	<xs:documentation>Specific service provider. The dependency can only be fulfilled by the component with the matching name, or by the service with a matching PID.</xs:documentation>
+                      <xs:documentation>Specific service provider. The dependency can only be fulfilled by the component with the matching name, or by the service with a matching PID.</xs:documentation>
                     </xs:annotation>
-				</xs:attribute>
+        </xs:attribute>
 
-				<xs:attribute name="scope" use="optional">
-					<xs:simpleType>
-						<xs:restriction base="xs:string">
-							<xs:enumeration value="global"></xs:enumeration>
-							<xs:enumeration value="composite"></xs:enumeration>
-							<xs:enumeration value="composite+global"></xs:enumeration>
-						</xs:restriction>
-					</xs:simpleType>
-				</xs:attribute>
+        <xs:attribute name="scope" use="optional">
+          <xs:simpleType>
+            <xs:restriction base="xs:string">
+              <xs:enumeration value="global"></xs:enumeration>
+              <xs:enumeration value="composite"></xs:enumeration>
+              <xs:enumeration value="composite+global"></xs:enumeration>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:attribute>
 
-			</xs:extension>
-		</xs:complexContent>
-	</xs:complexType>
-	<xs:complexType name="DependencyCallbackType">
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="DependencyCallbackType">
         <xs:annotation>
-        	<xs:documentation>Dependency callbacks are used to receive notification when service providers arrive and leave.</xs:documentation>
+          <xs:documentation>Dependency callbacks are used to receive notification when service providers arrive and leave.</xs:documentation>
         </xs:annotation>
         <xs:attribute name="method" type="xs:string" use="required">
-        	<xs:annotation>
-        		<xs:documentation>Method to call</xs:documentation>
-        	</xs:annotation></xs:attribute>
-		<xs:attribute name="type" use="required">
+          <xs:annotation>
+            <xs:documentation>Method to call</xs:documentation>
+          </xs:annotation></xs:attribute>
+    <xs:attribute name="type" use="required">
             <xs:annotation>
-            	<xs:documentation>Type of callback (bind or unbind). Bind means that the method will be called when a provider arrives. Unbind means that the method will be called when a provider leaves.</xs:documentation>
+              <xs:documentation>
+                Type of callback (bind, unbind, or updated). Bind means that the method will be called when a provider arrives. Unbind means that the method will be called when a provider leaves.
+                Updated means that a service was modified but is still valid for the service dependency.
+              </xs:documentation>
             </xs:annotation>
             <xs:simpleType>
-				<xs:restriction base="xs:string">
-					<xs:enumeration value="bind"></xs:enumeration>
-					<xs:enumeration value="unbind"></xs:enumeration>
-				</xs:restriction>
-			</xs:simpleType>
-		</xs:attribute>
-	</xs:complexType>
-	<xs:complexType name="CallbackType">
+        <xs:restriction base="xs:string">
+          <xs:enumeration value="bind"></xs:enumeration>
+          <xs:enumeration value="unbind"></xs:enumeration>
+          <xs:enumeration value="modified"></xs:enumeration>
+        </xs:restriction>
+      </xs:simpleType>
+    </xs:attribute>
+  </xs:complexType>
+  <xs:complexType name="CallbackType">
         <xs:annotation>
-        	<xs:documentation>Lifecycle Callback. Allows a POJO to be notified when the instance becomes valid or invalid.</xs:documentation>
+          <xs:documentation>Lifecycle Callback. Allows a POJO to be notified when the instance becomes valid or invalid.</xs:documentation>
         </xs:annotation>
         <xs:attribute name="method" type="xs:string" use="required">
-        	<xs:annotation>
-        		<xs:documentation>Specifies the method to call on the transition.</xs:documentation>
-        	</xs:annotation></xs:attribute>
-		<xs:attribute name="transition" use="required">
+          <xs:annotation>
+            <xs:documentation>Specifies the method to call on the transition.</xs:documentation>
+          </xs:annotation></xs:attribute>
+    <xs:attribute name="transition" use="required">
             <xs:annotation>
-            	<xs:documentation>Specifies the transition when the callback needs to be invoked.</xs:documentation>
+              <xs:documentation>Specifies the transition when the callback needs to be invoked.</xs:documentation>
             </xs:annotation>
             <xs:simpleType>
                 <xs:annotation>
-                	<xs:documentation>Lifecycle transition state. "validate" means that the component's instance was invalid and becomes valid, "invalidate" means that the component's intance was valid and becomes invalid.</xs:documentation>
+                  <xs:documentation>Lifecycle transition state. "validate" means that the component's instance was invalid and becomes valid, "invalidate" means that the component's intance was valid and becomes invalid.</xs:documentation>
                 </xs:annotation>
                 <xs:restriction base="xs:string">
-					<xs:enumeration value="validate"></xs:enumeration>
-					<xs:enumeration value="invalidate"></xs:enumeration>
-				</xs:restriction>
-			</xs:simpleType>
-		</xs:attribute>
-	</xs:complexType>
-	<xs:element name="provides" type="ProvidesType" id="provides"></xs:element>
-		<xs:complexType name="ProvidesType">
+          <xs:enumeration value="validate"></xs:enumeration>
+          <xs:enumeration value="invalidate"></xs:enumeration>
+        </xs:restriction>
+      </xs:simpleType>
+    </xs:attribute>
+  </xs:complexType>
+  <xs:element name="provides" type="ProvidesType" id="provides"></xs:element>
+    <xs:complexType name="ProvidesType">
         <xs:annotation>
-        	<xs:documentation>Provided service(s) description.</xs:documentation>
+          <xs:documentation>Provided service(s) description.</xs:documentation>
         </xs:annotation>
         <xs:sequence minOccurs="0" maxOccurs="unbounded">
-			<xs:element name="property" type="PropertyType">
-				<xs:annotation>
-					<xs:documentation>List of service specific properties.</xs:documentation>
-				</xs:annotation></xs:element>
-		</xs:sequence>
-		<xs:attribute name="interface" type="xs:string" use="prohibited">
-			<xs:annotation>
-				<xs:documentation>Deprecated attribute, use 'specifications' instead of 'interface'</xs:documentation>
-			</xs:annotation></xs:attribute>
-		<xs:attribute name="specifications" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>The list of service specifications (i.e. interfaces) to expose. By default, all interfaces implemented by the component implementation class are published.</xs:documentation>
-			</xs:annotation></xs:attribute>
-		<xs:attribute name="factory" type="xs:string" use="prohibited">
-			<xs:annotation>
-				<xs:documentation>Use 'strategy' instead of 'factory'</xs:documentation>
-			</xs:annotation></xs:attribute>
-		<xs:attribute name="strategy" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>POJO creation strategy. By default, the POJO object is created once (singleton). If the factory is set to "SERVICE", the creation policy follows the OSGi service factory policy (one object object per asking bundle).
-				INSTANCE allows creating one different POJO object per asking instance. Finally, a custom strategy can be used by specifying the qualified name of the class extending CreationPolicy</xs:documentation>
-			</xs:annotation></xs:attribute>
-	</xs:complexType>
-	<xs:complexType name="PropertyType">
-		<xs:annotation>
-			<xs:documentation>
-				Defines a component property.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:attribute name="field" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>
-					Field of the property
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="method" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>
-					Setter method of the property. This method is called
-					to inject property value.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="name" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>
-					Name of the property.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="value" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>
-					Default value of the property.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="type" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>
-					Type of the property.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
+      <xs:element name="property" type="PropertyType">
+        <xs:annotation>
+          <xs:documentation>List of service specific properties.</xs:documentation>
+        </xs:annotation></xs:element>
+    </xs:sequence>
+    <xs:attribute name="interface" type="xs:string" use="prohibited">
+      <xs:annotation>
+        <xs:documentation>Deprecated attribute, use 'specifications' instead of 'interface'</xs:documentation>
+      </xs:annotation></xs:attribute>
+    <xs:attribute name="specifications" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>The list of service specifications (i.e. interfaces) to expose. By default, all interfaces implemented by the component implementation class are published.</xs:documentation>
+      </xs:annotation></xs:attribute>
+    <xs:attribute name="factory" type="xs:string" use="prohibited">
+      <xs:annotation>
+        <xs:documentation>Use 'strategy' instead of 'factory'</xs:documentation>
+      </xs:annotation></xs:attribute>
+    <xs:attribute name="strategy" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>POJO creation strategy. By default, the POJO object is created once (singleton). If the factory is set to "SERVICE", the creation policy follows the OSGi service factory policy (one object object per asking bundle).
+        INSTANCE allows creating one different POJO object per asking instance. Finally, a custom strategy can be used by specifying the qualified name of the class extending CreationPolicy</xs:documentation>
+      </xs:annotation></xs:attribute>
+  </xs:complexType>
+  <xs:complexType name="PropertyType">
+    <xs:annotation>
+      <xs:documentation>
+        Defines a component property.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:attribute name="field" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Field of the property
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="method" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Setter method of the property. This method is called
+          to inject property value.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="name" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Name of the property.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="value" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Default value of the property.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="type" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Type of the property.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
         <xs:attribute name="mandatory" type="xs:boolean" use="optional" default="false">
-        	<xs:annotation>
-        		<xs:documentation>Set the property as mandatory. A mandatory property MUST receive a value either in the component type description or in the instance configuration. Properties are optional by default.</xs:documentation>
-        	</xs:annotation></xs:attribute>
+          <xs:annotation>
+            <xs:documentation>Set the property as mandatory. A mandatory property MUST receive a value either in the component type description or in the instance configuration. Properties are optional by default.</xs:documentation>
+          </xs:annotation></xs:attribute>
     </xs:complexType>
-	<xs:element name="callback" type="CallbackType" id="callback"></xs:element>
-	<xs:element name="controller" type="ControllerType" id="controller">
-		<xs:annotation>
-			<xs:documentation></xs:documentation>
-		</xs:annotation></xs:element>
-	<xs:element name="requires" type="RequiresType" id="requires"></xs:element>
-	<xs:element name="component" type="ComponentType" id="component"></xs:element>
-	<xs:element name="handler" type="HandlerType" id="handler"></xs:element>
-	<xs:element name="instance" type="InstanceType" id="instance"></xs:element>
+  <xs:element name="callback" type="CallbackType" id="callback"></xs:element>
+  <xs:element name="controller" type="ControllerType" id="controller">
+    <xs:annotation>
+      <xs:documentation></xs:documentation>
+    </xs:annotation></xs:element>
+  <xs:element name="requires" type="RequiresType" id="requires"></xs:element>
+  <xs:element name="component" type="ComponentType" id="component"></xs:element>
+  <xs:element name="handler" type="HandlerType" id="handler"></xs:element>
+  <xs:element name="instance" type="InstanceType" id="instance"></xs:element>
 
     <xs:element name="properties" type="PropertiesType" id="properties"></xs:element>
-	<xs:complexType name="PropertiesType">
+  <xs:complexType name="PropertiesType">
         <xs:annotation>
-        	<xs:documentation>List of component, instance or service properties. This field will receive the property value.</xs:documentation>
+          <xs:documentation>List of component, instance or service properties. This field will receive the property value.</xs:documentation>
         </xs:annotation>
         <xs:sequence minOccurs="0" maxOccurs="unbounded">
-			<xs:element name="property" type="PropertyType">
-				<xs:annotation>
-					<xs:documentation>The list of properties.</xs:documentation>
-				</xs:annotation></xs:element>
-		</xs:sequence>
-		<xs:attribute name="propagation" type="xs:boolean" use="optional">
-			<xs:annotation>
-				<xs:documentation>Propagation of the component properties to the provided services. If this parameter is set to "true", each time properties are reconfigured, they are propagated to each service published by the component.</xs:documentation>
-			</xs:annotation></xs:attribute>
-		<xs:attribute name="pid" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>Unique identifier used to reconfigure components properties (via  Managed Services) with the Configuration Admin.</xs:documentation>
-			</xs:annotation></xs:attribute>
-		<xs:attribute name="updated" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>Method called when a reconfiguration is done</xs:documentation>
-			</xs:annotation></xs:attribute>
-	</xs:complexType>
+      <xs:element name="property" type="PropertyType">
+        <xs:annotation>
+          <xs:documentation>The list of properties.</xs:documentation>
+        </xs:annotation></xs:element>
+    </xs:sequence>
+    <xs:attribute name="propagation" type="xs:boolean" use="optional">
+      <xs:annotation>
+        <xs:documentation>Propagation of the component properties to the provided services. If this parameter is set to "true", each time properties are reconfigured, they are propagated to each service published by the component.</xs:documentation>
+      </xs:annotation></xs:attribute>
+    <xs:attribute name="pid" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>Unique identifier used to reconfigure components properties (via  Managed Services) with the Configuration Admin.</xs:documentation>
+      </xs:annotation></xs:attribute>
+    <xs:attribute name="updated" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>Method called when a reconfiguration is done</xs:documentation>
+      </xs:annotation></xs:attribute>
+  </xs:complexType>
 
-	<xs:complexType name="ServiceDependencyType">
-	    <xs:attribute name="specification" type="xs:string" use="optional">
-	    	<xs:annotation>
-	    		<xs:documentation>The specification describing the required service type. This attribute is needed only when using aggregate dependencies with field injection and when the type of this field is a list, vector, collection and set.</xs:documentation>
-	    	</xs:annotation></xs:attribute>
-		<xs:attribute name="optional" type="xs:boolean" use="optional">
+  <xs:complexType name="ServiceDependencyType">
+      <xs:attribute name="specification" type="xs:string" use="optional">
+        <xs:annotation>
+          <xs:documentation>The specification describing the required service type. This attribute is needed only when using aggregate dependencies with field injection and when the type of this field is a list, vector, collection and set.</xs:documentation>
+        </xs:annotation></xs:attribute>
+    <xs:attribute name="optional" type="xs:boolean" use="optional">
             <xs:annotation>
-            	<xs:documentation>Sets the service dependency optionality</xs:documentation>
+              <xs:documentation>Sets the service dependency optionality</xs:documentation>
             </xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="aggregate" type="xs:boolean" use="optional">
+    </xs:attribute>
+    <xs:attribute name="aggregate" type="xs:boolean" use="optional">
             <xs:annotation>
-            	<xs:documentation>Sets the service dependency cardinality.</xs:documentation>
+              <xs:documentation>Sets the service dependency cardinality.</xs:documentation>
             </xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="policy" use="optional">
+    </xs:attribute>
+    <xs:attribute name="policy" use="optional">
             <xs:annotation>
-            	<xs:documentation>Sets the binding policy of the dependency. Three policies are supported. The dynamic policy supports service providers dynamism. The static policy freezes the provider set as soon as the dependency is used. The dynamic-priority policy is an extension of the dynamic policy, but providers are ranked.</xs:documentation>
+              <xs:documentation>Sets the binding policy of the dependency. Three policies are supported. The dynamic policy supports service providers dynamism. The static policy freezes the provider set as soon as the dependency is used. The dynamic-priority policy is an extension of the dynamic policy, but providers are ranked.</xs:documentation>
             </xs:annotation>
             <xs:simpleType>
-				<xs:restriction base="xs:string">
-					<xs:enumeration value="dynamic"></xs:enumeration>
-					<xs:enumeration value="static"></xs:enumeration>
-					<xs:enumeration value="dynamic-priority"></xs:enumeration>
-				</xs:restriction>
-			</xs:simpleType>
-		</xs:attribute>
-		<xs:attribute name="comparator" type="xs:string" use="optional">
+        <xs:restriction base="xs:string">
+          <xs:enumeration value="dynamic"></xs:enumeration>
+          <xs:enumeration value="static"></xs:enumeration>
+          <xs:enumeration value="dynamic-priority"></xs:enumeration>
+        </xs:restriction>
+      </xs:simpleType>
+    </xs:attribute>
+    <xs:attribute name="comparator" type="xs:string" use="optional">
             <xs:annotation>
-            	<xs:documentation>The comparator attribute allows specifying the class used to compare providers. This class must implemented the java.util.Comparator class and must support the comparison of service references.</xs:documentation>
+              <xs:documentation>The comparator attribute allows specifying the class used to compare providers. This class must implemented the java.util.Comparator class and must support the comparison of service references.</xs:documentation>
             </xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="filter" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>LDAP filter used to filter providers</xs:documentation>
-			</xs:annotation></xs:attribute>
-		<xs:attribute name="id" type="xs:string" use="optional">
-			<xs:annotation>
-				<xs:documentation>id of the service dependency. The id allows to indentify and to refert to this dependency.</xs:documentation>
-			</xs:annotation></xs:attribute>
-	</xs:complexType>
+    </xs:attribute>
+    <xs:attribute name="filter" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>LDAP filter used to filter providers</xs:documentation>
+      </xs:annotation></xs:attribute>
+    <xs:attribute name="id" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>id of the service dependency. The id allows to indentify and to refert to this dependency.</xs:documentation>
+      </xs:annotation></xs:attribute>
+  </xs:complexType>
 
     <xs:complexType name="ControllerType">
         <xs:annotation>
-        	<xs:documentation>Specifies the lifecycle controller of a component, which allows to validate or invalidate component instances.</xs:documentation>
+          <xs:documentation>Specifies the lifecycle controller of a component, which allows to validate or invalidate component instances.</xs:documentation>
         </xs:annotation>
         <xs:attribute name="field" type="xs:string" use="required">
             <xs:annotation>
-            	<xs:documentation>The name of the component lifecycle controller field. The type of the specified field must be boolean. Setting the value of the specified field to "true" means the validation of the component instance while setting it to "false" means the invalidation of the component instance.</xs:documentation>
+              <xs:documentation>The name of the component lifecycle controller field. The type of the specified field must be boolean. Setting the value of the specified field to "true" means the validation of the component instance while setting it to "false" means the invalidation of the component instance.</xs:documentation>
             </xs:annotation>
         </xs:attribute>
     </xs:complexType>
-</xs:schema>
\ No newline at end of file
+</xs:schema>
diff --git a/ipojo/tests/core/annotations/pom.xml b/ipojo/tests/core/annotations/pom.xml
index d1a05d4..1a1b0e1 100644
--- a/ipojo/tests/core/annotations/pom.xml
+++ b/ipojo/tests/core/annotations/pom.xml
@@ -1,111 +1,111 @@
 <!--

-	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

+  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

+  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.

+  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 Annotations Test Suite</name>

-	<artifactId>tests.core.annotations</artifactId>

-	<groupId>ipojo.tests</groupId>

-	<version>1.5.0-SNAPSHOT</version>

-	<dependencies>

-		<dependency>

-			<groupId>org.apache.felix</groupId>

-			<artifactId>org.apache.felix.ipojo</artifactId>

-			<version>${pom.version}</version>

-		</dependency>

-		<dependency>

-			<groupId>org.apache.felix</groupId>

-			<artifactId>org.apache.felix.ipojo.metadata

-			</artifactId>

-			<version>${pom.version}</version>

-		</dependency>

-		<dependency>

-			<groupId>org.apache.felix</groupId>

-			<artifactId>org.osgi.core</artifactId>

-			<version>1.0.1</version>

-		</dependency>

-		<dependency>

-			<groupId>junit</groupId>

-			<artifactId>junit</artifactId>

-			<version>3.8.1</version>

-		</dependency>

-		<dependency>

-			<groupId>org.apache.felix</groupId>

-			<artifactId>org.apache.felix.ipojo.junit4osgi</artifactId>

-			<version>1.1.0-SNAPSHOT</version>

-		</dependency>

-		<dependency>

-			<groupId>org.apache.felix</groupId>

-			<artifactId>org.apache.felix.ipojo.annotations</artifactId>

-			<version>${pom.version}</version>

-		</dependency>

-		<dependency>

-			<groupId>org.apache.felix</groupId>

-			<artifactId>org.apache.felix.ipojo.handler.eventadmin</artifactId>

-			<version>${pom.version}</version>

-		</dependency>

-	</dependencies>

+  <modelVersion>4.0.0</modelVersion>

+  <packaging>bundle</packaging>

+  <name>iPOJO Annotations Test Suite</name>

+  <artifactId>tests.core.annotations</artifactId>

+  <groupId>ipojo.tests</groupId>

+  <version>1.5.0-SNAPSHOT</version>

+  <dependencies>

+    <dependency>

+      <groupId>org.apache.felix</groupId>

+      <artifactId>org.apache.felix.ipojo</artifactId>

+      <version>${pom.version}</version>

+    </dependency>

+    <dependency>

+      <groupId>org.apache.felix</groupId>

+      <artifactId>org.apache.felix.ipojo.metadata

+      </artifactId>

+      <version>${pom.version}</version>

+    </dependency>

+    <dependency>

+      <groupId>org.apache.felix</groupId>

+      <artifactId>org.osgi.core</artifactId>

+      <version>1.0.1</version>

+    </dependency>

+    <dependency>

+      <groupId>junit</groupId>

+      <artifactId>junit</artifactId>

+      <version>3.8.1</version>

+    </dependency>

+    <dependency>

+      <groupId>org.apache.felix</groupId>

+      <artifactId>org.apache.felix.ipojo.junit4osgi</artifactId>

+      <version>1.1.0-SNAPSHOT</version>

+    </dependency>

+    <dependency>

+      <groupId>org.apache.felix</groupId>

+      <artifactId>org.apache.felix.ipojo.annotations</artifactId>

+      <version>${pom.version}</version>

+    </dependency>

+    <dependency>

+      <groupId>org.apache.felix</groupId>

+      <artifactId>org.apache.felix.ipojo.handler.eventadmin</artifactId>

+      <version>${pom.version}</version>

+    </dependency>

+  </dependencies>

 

-	<build>

-		<plugins>

-			<plugin>

-				<groupId>org.apache.maven.plugins</groupId>

-				<artifactId>maven-compiler-plugin</artifactId>

-				<configuration>

-					<source>1.5</source>

-					<target>1.5</target>

-				</configuration>

-			</plugin>

-			<plugin>

-				<groupId>org.apache.felix</groupId>

-				<artifactId>maven-bundle-plugin</artifactId>

-				<version>1.4.3</version>

-				<extensions>true</extensions>

-				<configuration>

-					<instructions>

-						<Export-Package>

-							org.apache.felix.ipojo.test.scenarios.annotations.service

-						</Export-Package>

-						<Bundle-SymbolicName>

-							${pom.artifactId}

-						</Bundle-SymbolicName>

-						<Private-Package>

-							org.apache.felix.ipojo.test*

-						</Private-Package>

-						<Test-Suite>

-							org.apache.felix.ipojo.test.scenarios.annotations.AnnotationsTestSuite

-						</Test-Suite>

-					</instructions>

-				</configuration>

-			</plugin>

-			<plugin>

-				<groupId>org.apache.felix</groupId>

-				<artifactId>maven-ipojo-plugin</artifactId>

-				<version>${pom.version}</version>

-				<executions>

-					<execution>

-						<goals>

-							<goal>ipojo-bundle</goal>

-						</goals>

-					</execution>

-				</executions>

-			</plugin>

-		</plugins>

-	</build>

+  <build>

+    <plugins>

+      <plugin>

+        <groupId>org.apache.maven.plugins</groupId>

+        <artifactId>maven-compiler-plugin</artifactId>

+        <configuration>

+          <source>1.5</source>

+          <target>1.5</target>

+        </configuration>

+      </plugin>

+      <plugin>

+        <groupId>org.apache.felix</groupId>

+        <artifactId>maven-bundle-plugin</artifactId>

+        <version>1.4.3</version>

+        <extensions>true</extensions>

+        <configuration>

+          <instructions>

+            <Export-Package>

+              org.apache.felix.ipojo.test.scenarios.annotations.service

+            </Export-Package>

+            <Bundle-SymbolicName>

+              ${pom.artifactId}

+            </Bundle-SymbolicName>

+            <Private-Package>

+              org.apache.felix.ipojo.test*

+            </Private-Package>

+            <Test-Suite>

+              org.apache.felix.ipojo.test.scenarios.annotations.AnnotationsTestSuite

+            </Test-Suite>

+          </instructions>

+        </configuration>

+      </plugin>

+      <plugin>

+        <groupId>org.apache.felix</groupId>

+        <artifactId>maven-ipojo-plugin</artifactId>

+        <version>${pom.version}</version>

+        <executions>

+          <execution>

+            <goals>

+              <goal>ipojo-bundle</goal>

+            </goals>

+          </execution>

+        </executions>

+      </plugin>

+    </plugins>

+  </build>

 </project>

diff --git a/ipojo/tests/core/annotations/src/main/java/org/apache/felix/ipojo/test/scenarios/annotations/Dependency.java b/ipojo/tests/core/annotations/src/main/java/org/apache/felix/ipojo/test/scenarios/annotations/Dependency.java
index ddeea7d..f69e76d 100644
--- a/ipojo/tests/core/annotations/src/main/java/org/apache/felix/ipojo/test/scenarios/annotations/Dependency.java
+++ b/ipojo/tests/core/annotations/src/main/java/org/apache/felix/ipojo/test/scenarios/annotations/Dependency.java
@@ -72,6 +72,17 @@
         assertEquals("Check fs2 bind", "bindFS2Inv", bind);

         assertEquals("Check fs2 unbind", "unbindFS2Inv", unbind);

         assertEquals("Check fs2 id", "inv", id);

+        

+        // Check mod

+        dep = getDependencyById(deps, "mod");

+        id = dep.getAttribute("id");

+        bind = getBind(dep);

+        unbind = getUnbind(dep);

+        String mod = getModified(dep);

+        assertEquals("Check mod bind", "bindMod", bind);

+        assertEquals("Check mod unbind", "unbindMod", unbind);

+        assertEquals("Check mod modified", "modifiedMod", mod);

+        assertEquals("Check mod id", "mod", id);

     }

     

     private Element getDependencyById(Element[] deps, String name) {

@@ -108,5 +119,15 @@
         }

         return null;

     }

+    

+    private String getModified(Element dep) {

+        Element[] elem = dep.getElements("callback");

+        for (int i = 0; elem != null && i < elem.length; i++) {

+            if (elem[i].getAttribute("type").equalsIgnoreCase("modified")) {

+                return elem[i].getAttribute("method");

+            }

+        }

+        return null;

+    }

 

 }

diff --git a/ipojo/tests/core/annotations/src/main/java/org/apache/felix/ipojo/test/scenarios/component/Dependency.java b/ipojo/tests/core/annotations/src/main/java/org/apache/felix/ipojo/test/scenarios/component/Dependency.java
index 97b053f..906fa4f 100644
--- a/ipojo/tests/core/annotations/src/main/java/org/apache/felix/ipojo/test/scenarios/component/Dependency.java
+++ b/ipojo/tests/core/annotations/src/main/java/org/apache/felix/ipojo/test/scenarios/component/Dependency.java
@@ -2,6 +2,7 @@
 

 import org.apache.felix.ipojo.annotations.Bind;

 import org.apache.felix.ipojo.annotations.Component;

+import org.apache.felix.ipojo.annotations.Modified;

 import org.apache.felix.ipojo.annotations.Requires;

 import org.apache.felix.ipojo.annotations.Unbind;

 import org.apache.felix.ipojo.test.scenarios.annotations.service.FooService;

@@ -59,6 +60,21 @@
         

     }

     

+    @Bind(id="mod")

+    public void bindMod() {

+        

+    }

+    

+    @Unbind(id="mod")

+    public void unbindMod() {

+        

+    }

+    

+    @Modified(id="mod")

+    public void modifiedMod() {

+        

+    }

+    

     

     

 }

diff --git a/ipojo/tests/core/service-dependency/pom.xml b/ipojo/tests/core/service-dependency/pom.xml
index ba4df5c..3b112f9 100644
--- a/ipojo/tests/core/service-dependency/pom.xml
+++ b/ipojo/tests/core/service-dependency/pom.xml
@@ -1,102 +1,122 @@
 <!--

-	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

+  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

+  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.

+  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 Service Dependency Test Suite</name>

-	<artifactId>tests.core.service.dependency</artifactId>

-	<groupId>ipojo.tests</groupId>

-	<version>1.5.0-SNAPSHOT</version>

-	<dependencies>

-		<dependency>

-			<groupId>org.apache.felix</groupId>

-			<artifactId>org.apache.felix.ipojo</artifactId>

-			<version>${pom.version}</version>

-		</dependency>

-		<dependency>

-			<groupId>org.apache.felix</groupId>

-			<artifactId>org.apache.felix.ipojo.metadata</artifactId>

-			<version>${pom.version}</version>

-		</dependency>

-		<dependency>

-			<groupId>org.apache.felix</groupId>

-			<artifactId>org.osgi.core</artifactId>

-			<version>1.0.1</version>

-		</dependency>

-		<dependency>

-			<groupId>junit</groupId>

-			<artifactId>junit</artifactId>

-			<version>3.8.1</version>

-		</dependency>

-		<dependency>

-			<groupId>org.apache.felix</groupId>

-			<artifactId>org.apache.felix.ipojo.junit4osgi</artifactId>

-			<version>1.1.0-SNAPSHOT</version>

-		</dependency>

-	</dependencies>

-	<build>

-		<plugins>

-			<plugin>

-				<groupId>org.apache.felix</groupId>

-				<artifactId>maven-bundle-plugin</artifactId>

-				<version>1.4.3</version>

-				<extensions>true</extensions>

-				<configuration>

-					<instructions>

-						<Export-Package>

-							org.apache.felix.ipojo.test.scenarios.service.dependency.service

-						</Export-Package>

-						<Bundle-SymbolicName>

-							${pom.artifactId}

-						</Bundle-SymbolicName>

-						<Private-Package>

-							org.apache.felix.ipojo.test*

-						</Private-Package>

-						<Test-Suite>

-							org.apache.felix.ipojo.test.scenarios.service.dependency.DependencyTestSuite

-						</Test-Suite>

-					</instructions>

-				</configuration>

-			</plugin>

-			<plugin>

-				<groupId>org.apache.felix</groupId>

-				<artifactId>maven-ipojo-plugin</artifactId>

-				<version>${pom.version}</version>

-				<executions>

-					<execution>

-						<goals>

-							<goal>ipojo-bundle</goal>

-						</goals>

-						<configuration>

-							<ignoreAnnotations>true</ignoreAnnotations>

-						</configuration>

-					</execution>

-				</executions>

-			</plugin>

-			<plugin>

-				<groupId>org.apache.maven.plugins</groupId>

-				<artifactId>maven-compiler-plugin</artifactId>

-				<configuration>

-					<source>1.4</source>

-					<target>1.4</target>

-				</configuration>

-			</plugin>

-		</plugins>

-	</build>

+  <modelVersion>4.0.0</modelVersion>

+  <packaging>bundle</packaging>

+  <name>iPOJO Service Dependency Test Suite</name>

+  <artifactId>tests.core.service.dependency</artifactId>

+  <groupId>ipojo.tests</groupId>

+  <version>1.5.0-SNAPSHOT</version>

+  <dependencies>

+    <dependency>

+      <groupId>org.apache.felix</groupId>

+      <artifactId>org.apache.felix.ipojo</artifactId>

+      <version>${pom.version}</version>

+    </dependency>

+    <dependency>

+      <groupId>org.apache.felix</groupId>

+      <artifactId>org.apache.felix.ipojo.metadata</artifactId>

+      <version>${pom.version}</version>

+    </dependency>

+    <dependency>

+      <groupId>org.apache.felix</groupId>

+      <artifactId>org.osgi.core</artifactId>

+      <version>1.0.1</version>

+    </dependency>

+    <dependency>

+      <groupId>junit</groupId>

+      <artifactId>junit</artifactId>

+      <version>3.8.1</version>

+    </dependency>

+    <dependency>

+      <groupId>org.apache.felix</groupId>

+      <artifactId>org.apache.felix.ipojo.junit4osgi</artifactId>

+      <version>1.1.0-SNAPSHOT</version>

+    </dependency>

+  </dependencies>

+  <build>

+    <plugins>

+      <plugin>

+        <groupId>org.apache.felix</groupId>

+        <artifactId>maven-bundle-plugin</artifactId>

+        <version>1.4.3</version>

+        <extensions>true</extensions>

+        <configuration>

+          <instructions>

+            <Export-Package>

+              org.apache.felix.ipojo.test.scenarios.service.dependency.service

+            </Export-Package>

+            <Bundle-SymbolicName>

+              ${pom.artifactId}

+            </Bundle-SymbolicName>

+            <Private-Package>

+              org.apache.felix.ipojo.test*

+            </Private-Package>

+            <Test-Suite>

+              org.apache.felix.ipojo.test.scenarios.service.dependency.DependencyTestSuite

+            </Test-Suite>

+          </instructions>

+        </configuration>

+      </plugin>

+      <plugin>

+        <groupId>org.apache.felix</groupId>

+        <artifactId>maven-ipojo-plugin</artifactId>

+        <version>${pom.version}</version>

+        <executions>

+          <execution>

+            <goals>

+              <goal>ipojo-bundle</goal>

+            </goals>

+            <configuration>

+              <ignoreAnnotations>true</ignoreAnnotations>

+            </configuration>

+          </execution>

+        </executions>

+      </plugin>

+      <plugin>

+        <groupId>org.apache.maven.plugins</groupId>

+        <artifactId>maven-compiler-plugin</artifactId>

+        <configuration>

+          <source>1.4</source>

+          <target>1.4</target>

+        </configuration>

+      </plugin>

+      

+      <!--

+      <plugin>

+        <groupId>org.apache.felix</groupId>

+        <artifactId>maven-junit4osgi-plugin</artifactId>

+        <version>1.1.0-SNAPSHOT</version>

+        <executions>

+          <execution>

+            <goals>

+              <goal>test</goal>

+            </goals>

+            <configuration>

+              <configuration>

+              <org.osgi.http.port>8083</org.osgi.http.port>

+              </configuration>

+            </configuration>

+          </execution>

+        </executions>

+      </plugin>

+      -->

+      </plugins>

+  </build>

 </project>

diff --git a/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CheckServiceProvider.java b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CheckServiceProvider.java
index 54af644..0cbcafb 100644
--- a/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CheckServiceProvider.java
+++ b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CheckServiceProvider.java
@@ -28,74 +28,111 @@
 

 public class CheckServiceProvider extends CheckProviderParentClass implements CheckService {

     

-	FooService fs;

-	

-	int simpleB = 0;

-	int objectB = 0;

-	int refB = 0;

-	int bothB = 0;

-	int mapB = 0;

-	int dictB = 0;

+    FooService fs;

+    

+    int simpleB = 0;

+    int objectB = 0;

+    int refB = 0;

+    int bothB = 0;

+    int mapB = 0;

+    int dictB = 0;

+    

+    int modified = 0;

 

-	public boolean check() {

-		return fs.foo();

-	}

+    public boolean check() {

+        return fs.foo();

+    }

 

-	public Properties getProps() {

-		Properties props = new Properties();

-		props.put("voidB", new Integer(simpleB));

-		props.put("objectB", new Integer(objectB));

-		props.put("refB", new Integer(refB));

-		props.put("bothB", new Integer(bothB));

-		props.put("voidU", new Integer(simpleU));

-		props.put("objectU", new Integer(objectU));

-		props.put("refU", new Integer(refU));

-		props.put("bothU", new Integer(bothU));

-		props.put("mapB", new Integer(mapB));

-		props.put("dictB", new Integer(dictB));

-		props.put("mapU", new Integer(mapU));

-		props.put("dictU", new Integer(dictU));

-		if (fs != null) {

-		    props.put("result", new Boolean(fs.foo()));

-		    props.put("boolean", new Boolean(fs.getBoolean()));

-		    props.put("int", new Integer(fs.getInt()));

-		    props.put("long", new Long(fs.getLong()));

-		    props.put("double", new Double(fs.getDouble()));

-		    if(fs.getObject() != null) { props.put("object", fs.getObject()); }

-		}

+    public Properties getProps() {

+        Properties props = new Properties();

+        props.put("voidB", new Integer(simpleB));

+        props.put("objectB", new Integer(objectB));

+        props.put("refB", new Integer(refB));

+        props.put("bothB", new Integer(bothB));

+        props.put("voidU", new Integer(simpleU));

+        props.put("objectU", new Integer(objectU));

+        props.put("refU", new Integer(refU));

+        props.put("bothU", new Integer(bothU));

+        props.put("mapB", new Integer(mapB));

+        props.put("dictB", new Integer(dictB));

+        props.put("mapU", new Integer(mapU));

+        props.put("dictU", new Integer(dictU));

+        if (fs != null) {

+            props.put("result", new Boolean(fs.foo()));

+            props.put("boolean", new Boolean(fs.getBoolean()));

+            props.put("int", new Integer(fs.getInt()));

+            props.put("long", new Long(fs.getLong()));

+            props.put("double", new Double(fs.getDouble()));

+            if(fs.getObject() != null) { props.put("object", fs.getObject()); }

+        }

         props.put("static", CheckService.foo);

         props.put("class", CheckService.class.getName());

-		return props;

-	}

-	

-	private void voidBind() {

-		simpleB++;

-	}

-	

-	protected void objectBind(FooService o) {

-	    if (o == null) {

-	        System.err.println("Bind receive null !!! ");

-	        return;

-	    }

-		if(o != null && o instanceof FooService) { objectB++; }

-	}

-	

-	public void refBind(ServiceReference sr) {

-		if(sr != null) { refB++; }

-	}

-	

+        

+        

+        // Add modified

+        props.put("modified", new Integer(modified));

+        

+        return props;

+    }

+    

+    private void voidBind() {

+        simpleB++;

+    }

+    

+    public void voidModify() {

+        modified ++;

+    }

+    

+    protected void objectBind(FooService o) {

+        if (o == null) {

+            System.err.println("Bind receive null !!! ");

+            return;

+        }

+        if(o != null && o instanceof FooService) { objectB++; }

+    }

+    

+    protected void objectModify(FooService o) {

+        if (o == null) {

+            System.err.println("Bind receive null !!! [" + modified + "]");

+            return;

+        }

+        if(o != null && o instanceof FooService) { modified++; }

+    }

+    

+    public void refBind(ServiceReference sr) {

+        if(sr != null) { refB++; }

+    }

+    

+    public void refModify(ServiceReference sr) {

+        if(sr != null) { modified++; }

+    }

+    

     public void bothBind(FooService o, ServiceReference sr) {

-	    if(sr != null && o != null && o instanceof FooService) { bothB++; }

-	}

+        if(sr != null && o != null && o instanceof FooService) { bothB++; }

+    }

+    

+    public void bothModify(FooService o, ServiceReference sr) {

+        if(sr != null && o != null && o instanceof FooService) { modified++; }

+    }

     

     protected void propertiesDictionaryBind(FooService o, Dictionary props) {

         if(props != null && o != null && o instanceof FooService && props.size() > 0) { dictB++; }

         fs = o;

     }   

     

+    protected void propertiesDictionaryModify(FooService o, Dictionary props) {

+        if(props != null && o != null && o instanceof FooService && props.size() > 0) { modified++; }

+        fs = o;

+    }   

+    

     protected void propertiesMapBind(FooService o, Map props) {

         if(props != null && o != null && o instanceof FooService && props.size() > 0) { mapB++; }

         fs = o;

-    }   

+    } 

+    

+    protected void propertiesMapModify(FooService o, Map props) {

+        if(props != null && o != null && o instanceof FooService && props.size() > 0) { modified++; }

+        fs = o;

+    } 

 

 }

diff --git a/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooProviderType2.java b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooProviderType2.java
new file mode 100644
index 0000000..d57a532
--- /dev/null
+++ b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooProviderType2.java
@@ -0,0 +1,68 @@
+/* 

+ * 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.scenarios.component;

+

+import java.util.Properties;

+

+import org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService;

+import org.osgi.framework.BundleContext;

+

+public class FooProviderType2 implements FooService {

+    

+    private int m_bar;  // Service property.

+    private String m_foo;

+    

+    private BundleContext m_context;

+    

+    private static int count = 0;

+    

+  

+    public boolean foo() {

+        // Update

+        if (m_foo.equals("foo")) {

+            m_foo = "bar";

+        } else {

+            m_foo = "foo";

+        }

+        return true;

+    }

+

+    public Properties fooProps() {

+        Properties p = new Properties();

+        p.put("bar", new Integer(m_bar));

+        if(m_foo != null) {

+            p.put("foo", m_foo);

+        }

+        p.put("context", m_context);

+        

+        p.put("count", new Integer(count));

+        return p;

+    }

+    

+    public boolean getBoolean() { return true; }

+

+    public double getDouble() { return 1.0; }

+

+    public int getInt() { return 1; }

+

+    public long getLong() { return 1; }

+

+    public Boolean getObject() { return new Boolean(true); }

+    

+}

diff --git a/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/DependencyTestSuite.java b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/DependencyTestSuite.java
index 668530a..fb6eb1c 100644
--- a/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/DependencyTestSuite.java
+++ b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/DependencyTestSuite.java
@@ -26,17 +26,17 @@
 

 public class DependencyTestSuite {

 

-	public static Test suite(BundleContext bc) {

-		OSGiTestSuite ots = new OSGiTestSuite("Service Dependencies Test Suite", bc);

-		ots.addTestSuite(SimpleDependencies.class);

-		ots.addTestSuite(OptionalDependencies.class);

-		ots.addTestSuite(OptionalNoNullableDependencies.class);

-		ots.addTestSuite(MultipleDependencies.class);

-		ots.addTestSuite(OptionalMultipleDependencies.class);

-		ots.addTestSuite(DelayedSimpleDependencies.class);

-		ots.addTestSuite(DelayedOptionalDependencies.class);

-		ots.addTestSuite(DelayedMultipleDependencies.class);

-		ots.addTestSuite(DelayedOptionalMultipleDependencies.class);

+    public static Test suite(BundleContext bc) {

+        OSGiTestSuite ots = new OSGiTestSuite("Service Dependencies Test Suite", bc);

+        ots.addTestSuite(SimpleDependencies.class);

+        ots.addTestSuite(OptionalDependencies.class);

+        ots.addTestSuite(OptionalNoNullableDependencies.class);

+        ots.addTestSuite(MultipleDependencies.class);

+        ots.addTestSuite(OptionalMultipleDependencies.class);

+        ots.addTestSuite(DelayedSimpleDependencies.class);

+        ots.addTestSuite(DelayedOptionalDependencies.class);

+        ots.addTestSuite(DelayedMultipleDependencies.class);

+        ots.addTestSuite(DelayedOptionalMultipleDependencies.class);

         ots.addTestSuite(MethodSimpleDependencies.class);

         ots.addTestSuite(MethodOptionalDependencies.class);

         ots.addTestSuite(MethodMultipleDependencies.class);

@@ -51,7 +51,8 @@
         ots.addTestSuite(VectorMultipleDependencies.class);

         ots.addTestSuite(SetMultipleDependencies.class);

         ots.addTestSuite(CollectionMultipleDependencies.class);

-		return ots;

-	}

+        ots.addTestSuite(ModifyDependencies.class);

+        return ots;

+    }

 

 }

diff --git a/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/ModifyDependencies.java b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/ModifyDependencies.java
new file mode 100644
index 0000000..c99951f
--- /dev/null
+++ b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/ModifyDependencies.java
@@ -0,0 +1,406 @@
+/* 

+ * 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.scenarios.service.dependency;

+

+import java.util.Properties;

+

+import org.apache.felix.ipojo.ComponentInstance;

+import org.apache.felix.ipojo.architecture.Architecture;

+import org.apache.felix.ipojo.architecture.InstanceDescription;

+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;

+import org.apache.felix.ipojo.test.scenarios.util.Utils;

+import org.osgi.framework.ServiceReference;

+

+import org.apache.felix.ipojo.test.scenarios.service.dependency.service.CheckService;

+import org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService;

+

+public class ModifyDependencies extends OSGiTestCase {

+    

+    ComponentInstance instance2, instance3, instance4, instance5, instance7, instance8;

+    ComponentInstance fooProvider;

+    

+    public void setUp() {

+        try {

+            Properties prov = new Properties();

+            prov.put("instance.name","FooProvider");

+            fooProvider = Utils.getFactoryByName(getContext(), "FooProviderType-Updatable").createComponentInstance(prov);

+            fooProvider.stop();

+        

+            Properties i2 = new Properties();

+            i2.put("instance.name","Void");

+            instance2 = Utils.getFactoryByName(getContext(), "VoidModifyCheckServiceProvider").createComponentInstance(i2);

+        

+            Properties i3 = new Properties();

+            i3.put("instance.name","Object");

+            instance3 = Utils.getFactoryByName(getContext(), "ObjectModifyCheckServiceProvider").createComponentInstance(i3);

+        

+            Properties i4 = new Properties();

+            i4.put("instance.name","Ref");

+            instance4 = Utils.getFactoryByName(getContext(), "RefModifyCheckServiceProvider").createComponentInstance(i4);

+            

+            Properties i5 = new Properties();

+            i5.put("instance.name","Both");

+            instance5 = Utils.getFactoryByName(getContext(), "BothModifyCheckServiceProvider").createComponentInstance(i5);

+                        

+            Properties i7 = new Properties();

+            i7.put("instance.name","Map");

+            instance7 = Utils.getFactoryByName(getContext(), "MapModifyCheckServiceProvider").createComponentInstance(i7);

+            

+            Properties i8 = new Properties();

+            i8.put("instance.name","Dictionary");

+            instance8 = Utils.getFactoryByName(getContext(), "DictModifyCheckServiceProvider").createComponentInstance(i8);

+        } catch(Exception e) { 

+            e.printStackTrace();

+            fail(e.getMessage()); }

+        

+    }

+    

+    public void tearDown() {

+        instance2.dispose();

+        instance3.dispose();

+        instance4.dispose();

+        instance5.dispose();

+        instance7.dispose();

+        instance8.dispose();

+        fooProvider.dispose();

+        instance2 = null;

+        instance3 = null;

+        instance4 = null;

+        instance5 = null;

+        instance7 = null;

+        instance8 = null;

+        fooProvider = null;

+    }

+    

+   public void testVoid() {

+        ServiceReference arch_ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), instance2.getInstanceName());

+        assertNotNull("Check architecture availability", arch_ref);

+        InstanceDescription id = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();

+        assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);

+        

+        fooProvider.start();

+        

+        id = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();

+        assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);

+        

+        ServiceReference cs_ref = Utils.getServiceReferenceByName(getContext(), CheckService.class.getName(), instance2.getInstanceName());

+        assertNotNull("Check CheckService availability", cs_ref);

+        Object o = getContext().getService(cs_ref);

+        CheckService cs = (CheckService) o;

+        Properties props = cs.getProps();

+        //Check properties

+        assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());

+        assertEquals("check void bind invocation -1 ("+((Integer)props.get("voidB")).intValue()+")", ((Integer)props.get("voidB")).intValue(), 1);

+        assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);

+        assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);

+        assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);

+        assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);

+        assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);

+        assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);

+        assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);

+        assertEquals("check modify -1", ((Integer)props.get("modified")).intValue(), 1); // Already called inside the method

+        

+        

+        ServiceReference ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), fooProvider.getInstanceName());

+        FooService fs = (FooService) getContext().getService(ref);

+        

+        fs.foo(); // Update

+        

+        props = cs.getProps();

+        //Check properties

+        assertTrue("check CheckService invocation -1.1", ((Boolean)props.get("result")).booleanValue());

+        assertEquals("check void bind invocation -1.1 ("+((Integer)props.get("voidB")).intValue()+")", ((Integer)props.get("voidB")).intValue(), 1);

+        assertEquals("check void unbind callback invocation -1.1", ((Integer)props.get("voidU")).intValue(), 0);

+        assertEquals("check object bind callback invocation -1.1", ((Integer)props.get("objectB")).intValue(), 0);

+        assertEquals("check object unbind callback invocation -1.1", ((Integer)props.get("objectU")).intValue(), 0);

+        assertEquals("check ref bind callback invocation -1.1", ((Integer)props.get("refB")).intValue(), 0);

+        assertEquals("check ref unbind callback invocation -1.1", ((Integer)props.get("refU")).intValue(), 0);

+        assertEquals("check both bind callback invocation -1.1", ((Integer)props.get("bothB")).intValue(), 0);

+        assertEquals("check both unbind callback invocation -1.1", ((Integer)props.get("bothU")).intValue(), 0);

+        assertEquals("check modify -1.1", ((Integer)props.get("modified")).intValue(), 3); // 1 (first foo) + 1 (our foo) + 1 (check foo)        

+        fooProvider.stop();

+        

+        id = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();

+        assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);

+        

+        id = null;

+        cs = null;

+        fs = null;

+        getContext().ungetService(arch_ref);

+        getContext().ungetService(cs_ref);

+        getContext().ungetService(ref);

+

+    }

+    

+    public void testObject() {

+        ServiceReference arch_ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), instance3.getInstanceName());

+        assertNotNull("Check architecture availability", arch_ref);

+        InstanceDescription id = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();

+        assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);

+        

+        fooProvider.start();

+        

+        id = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();

+        assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);

+        

+        ServiceReference cs_ref = Utils.getServiceReferenceByName(getContext(), CheckService.class.getName(), instance3.getInstanceName());

+        assertNotNull("Check CheckService availability", cs_ref);

+        CheckService cs = (CheckService) getContext().getService(cs_ref);

+        Properties props = cs.getProps();

+        //Check properties

+        assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());

+        assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);

+        assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);

+        assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 1);

+        assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);

+        assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);

+        assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);

+        assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);

+        assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);

+        assertEquals("check modify -1 (" + ((Integer)props.get("modified")).intValue() + ")", ((Integer)props.get("modified")).intValue(), 1);

+

+        ServiceReference ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), fooProvider.getInstanceName());

+        FooService fs = (FooService) getContext().getService(ref);

+        

+        fs.foo(); // Update

+        

+        props = cs.getProps();

+        //Check properties

+        assertEquals("check modify -1.1", ((Integer)props.get("modified")).intValue(), 3);

+        

+        

+        fooProvider.stop();

+        

+        id = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();

+        assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);

+        

+        id = null;

+        cs = null;

+        fs = null;

+        getContext().ungetService(arch_ref);

+        getContext().ungetService(cs_ref);

+        getContext().ungetService(ref);	

+    }

+    

+    public void testRef() {

+        ServiceReference arch_ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), instance4.getInstanceName());

+        assertNotNull("Check architecture availability", arch_ref);

+        InstanceDescription id = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();

+        assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);

+        

+        fooProvider.start();

+        

+        id = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();

+        assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);

+        

+        ServiceReference cs_ref = Utils.getServiceReferenceByName(getContext(), CheckService.class.getName(), instance4.getInstanceName());

+        assertNotNull("Check CheckService availability", cs_ref);

+        CheckService cs = (CheckService) getContext().getService(cs_ref);

+        Properties props = cs.getProps();

+        //Check properties

+        assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());

+        assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);

+        assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);

+        assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);

+        assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);

+        assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 1);

+        assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);

+        assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);

+        assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);

+        assertEquals("check modify -1 (" + ((Integer)props.get("modified")).intValue() + ")", ((Integer)props.get("modified")).intValue(), 1);

+

+        ServiceReference ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), fooProvider.getInstanceName());

+        FooService fs = (FooService) getContext().getService(ref);

+        

+        fs.foo(); // Update

+        

+        props = cs.getProps();

+        //Check properties

+        assertEquals("check modify -1.1", ((Integer)props.get("modified")).intValue(), 3);

+        

+        fooProvider.stop();

+        

+        id = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();

+        assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);

+        

+        id = null;

+        cs = null;

+        fs = null;

+        getContext().ungetService(arch_ref);

+        getContext().ungetService(cs_ref);

+        getContext().ungetService(ref); 

+    }

+    

+    public void testBoth() {

+        ServiceReference arch_ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), instance5.getInstanceName());

+        assertNotNull("Check architecture availability", arch_ref);

+        InstanceDescription id = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();

+        assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);

+        

+        fooProvider.start();

+        

+        id = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();

+        assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);

+        

+        ServiceReference cs_ref = Utils.getServiceReferenceByName(getContext(), CheckService.class.getName(), instance5.getInstanceName());

+        assertNotNull("Check CheckService availability", cs_ref);

+        CheckService cs = (CheckService) getContext().getService(cs_ref);

+        Properties props = cs.getProps();

+        //Check properties

+        assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());

+        assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);

+        assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);

+        assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);

+        assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);

+        assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);

+        assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);

+        assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 1);

+        assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);

+        assertEquals("check modify -1 (" + ((Integer)props.get("modified")).intValue() + ")", ((Integer)props.get("modified")).intValue(), 1);

+

+        ServiceReference ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), fooProvider.getInstanceName());

+        FooService fs = (FooService) getContext().getService(ref);

+        

+        fs.foo(); // Update

+        

+        props = cs.getProps();

+        //Check properties

+        assertEquals("check modify -1.1", ((Integer)props.get("modified")).intValue(), 3);

+        

+        fooProvider.stop();

+        

+        id = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();

+        assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);

+        

+        id = null;

+        cs = null;

+        fs = null;

+        getContext().ungetService(arch_ref);

+        getContext().ungetService(cs_ref);

+        getContext().ungetService(ref); 

+    }

+

+    

+    public void testMap() {

+        ServiceReference arch_ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), instance7.getInstanceName());

+        assertNotNull("Check architecture availability", arch_ref);

+        InstanceDescription id = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();

+        assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);

+        

+        fooProvider.start();

+        

+        id = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();

+        assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);

+        

+        ServiceReference cs_ref = Utils.getServiceReferenceByName(getContext(), CheckService.class.getName(), instance7.getInstanceName());

+        assertNotNull("Check CheckService availability", cs_ref);

+        CheckService cs = (CheckService) getContext().getService(cs_ref);

+        Properties props = cs.getProps();

+        //Check properties

+        assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());

+        assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);

+        assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);

+        assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);

+        assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);

+        assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);

+        assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);

+        assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);

+        assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);

+        assertEquals("check map bind callback invocation -1", ((Integer)props.get("mapB")).intValue(), 1);

+        assertEquals("check map unbind callback invocation -1", ((Integer)props.get("mapU")).intValue(), 0);

+        assertEquals("check dict bind callback invocation -1", ((Integer)props.get("dictB")).intValue(), 0);

+        assertEquals("check dict unbind callback invocation -1", ((Integer)props.get("dictU")).intValue(), 0);

+        assertEquals("check modify -1 (" + ((Integer)props.get("modified")).intValue() + ")", ((Integer)props.get("modified")).intValue(), 1);

+

+        ServiceReference ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), fooProvider.getInstanceName());

+        FooService fs = (FooService) getContext().getService(ref);

+        

+        fs.foo(); // Update

+        

+        props = cs.getProps();

+        //Check properties

+        assertEquals("check modify -1.1", ((Integer)props.get("modified")).intValue(), 3);

+        

+        fooProvider.stop();

+        

+        id = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();

+        assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);

+        

+        id = null;

+        cs = null;

+        fs = null;

+        getContext().ungetService(arch_ref);

+        getContext().ungetService(cs_ref);

+        getContext().ungetService(ref); 

+    }

+    

+       public void testDict() {

+            ServiceReference arch_ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), instance8.getInstanceName());

+            assertNotNull("Check architecture availability", arch_ref);

+            InstanceDescription id = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();

+            assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);

+            

+            fooProvider.start();

+            

+            id = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();

+            assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);

+            

+            ServiceReference cs_ref = Utils.getServiceReferenceByName(getContext(), CheckService.class.getName(), instance8.getInstanceName());

+            assertNotNull("Check CheckService availability", cs_ref);

+            CheckService cs = (CheckService) getContext().getService(cs_ref);

+            Properties props = cs.getProps();

+            //Check properties

+            assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());

+            assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);

+            assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);

+            assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);

+            assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);

+            assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);

+            assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);

+            assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);

+            assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);

+            assertEquals("check map bind callback invocation -1", ((Integer)props.get("mapB")).intValue(), 0);

+            assertEquals("check map unbind callback invocation -1", ((Integer)props.get("mapU")).intValue(), 0);

+            assertEquals("check dict bind callback invocation -1", ((Integer)props.get("dictB")).intValue(), 1);

+            assertEquals("check dict unbind callback invocation -1", ((Integer)props.get("dictU")).intValue(), 0);

+            assertEquals("check modify -1 (" + ((Integer)props.get("modified")).intValue() + ")", ((Integer)props.get("modified")).intValue(), 1);

+

+            ServiceReference ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), fooProvider.getInstanceName());

+            FooService fs = (FooService) getContext().getService(ref);

+            

+            fs.foo(); // Update

+            

+            props = cs.getProps();

+            //Check properties

+            assertEquals("check modify -1.1", ((Integer)props.get("modified")).intValue(), 3);

+            

+            fooProvider.stop();

+            

+            id = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();

+            assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);

+            

+            id = null;

+            cs = null;

+            fs = null;

+            getContext().ungetService(arch_ref);

+            getContext().ungetService(cs_ref);

+            getContext().ungetService(ref); 

+        }

+

+}

diff --git a/ipojo/tests/core/service-dependency/src/main/resources/metadata.xml b/ipojo/tests/core/service-dependency/src/main/resources/metadata.xml
index bb49773..d490139 100644
--- a/ipojo/tests/core/service-dependency/src/main/resources/metadata.xml
+++ b/ipojo/tests/core/service-dependency/src/main/resources/metadata.xml
@@ -1,670 +1,744 @@
 <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"

-	xmlns="org.apache.felix.ipojo">

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.FooProviderType1"

-		name="FooProviderType-1" architecture="true">

-		<provides />

-	</component>

-	

-	<!--  Simple Dependencies -->

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="SimpleCheckServiceProvider" architecture="true">

-		<requires field="fs" />

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="VoidCheckServiceProvider" architecture="true">

-		<requires field="fs">

-			<callback type="bind" method="voidBind" />

-			<callback type="unbind" method="voidUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="ObjectCheckServiceProvider" architecture="true">

-		<requires field="fs">

-			<callback type="bind" method="objectBind" />

-			<callback type="unbind" method="objectUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="RefCheckServiceProvider" architecture="true">

-		<requires field="fs">

-			<callback type="bind" method="refBind" />

-			<callback type="unbind" method="refUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="BothCheckServiceProvider" architecture="true">

-		<requires field="fs">

-			<callback type="bind" method="bothBind" />

-			<callback type="unbind" method="bothUnbind" />

-		</requires>

-		<provides />

-	</component>

-		<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="MapCheckServiceProvider" architecture="true">

-		<requires field="fs">

-			<callback type="bind" method="propertiesMapBind" />

-			<callback type="unbind" method="propertiesMapUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="DictCheckServiceProvider" architecture="true">

-		<requires field="fs">

-			<callback type="bind" method="propertiesDictionaryBind" />

-			<callback type="unbind" method="propertiesDictionaryUnbind" />

-		</requires>

-		<provides />

-	</component>

+  xsi:schemaLocation="org.apache.felix.ipojo http://felix.apache.org/ipojo/schemas/SNAPSHOT/core.xsd"

+  xmlns="org.apache.felix.ipojo">

+<!-- 

 

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="DoubleCheckServiceProvider" architecture="true">

-		<requires>

-			<callback type="bind" method="objectBind" />

-			<callback type="unbind" method="objectUnbind" />

-		</requires>

-		<requires field="fs" />

-		<provides />

-	</component>

+ -->

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.FooProviderType1"

+    name="FooProviderType-1" architecture="true">

+    <provides />

+  </component>

+  

+  <!--  Simple Dependencies -->

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="SimpleCheckServiceProvider" architecture="true">

+    <requires field="fs" />

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="VoidCheckServiceProvider" architecture="true">

+    <requires field="fs">

+      <callback type="bind" method="voidBind" />

+      <callback type="unbind" method="voidUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="ObjectCheckServiceProvider" architecture="true">

+    <requires field="fs">

+      <callback type="bind" method="objectBind" />

+      <callback type="unbind" method="objectUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="RefCheckServiceProvider" architecture="true">

+    <requires field="fs">

+      <callback type="bind" method="refBind" />

+      <callback type="unbind" method="refUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="BothCheckServiceProvider" architecture="true">

+    <requires field="fs">

+      <callback type="bind" method="bothBind" />

+      <callback type="unbind" method="bothUnbind" />

+    </requires>

+    <provides />

+  </component>

+    <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="MapCheckServiceProvider" architecture="true">

+    <requires field="fs">

+      <callback type="bind" method="propertiesMapBind" />

+      <callback type="unbind" method="propertiesMapUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="DictCheckServiceProvider" architecture="true">

+    <requires field="fs">

+      <callback type="bind" method="propertiesDictionaryBind" />

+      <callback type="unbind" method="propertiesDictionaryUnbind" />

+    </requires>

+    <provides />

+  </component>

 

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

-		name="MObjectCheckServiceProvider" architecture="true">

-		<requires>

-			<callback type="bind" method="objectBind" />

-			<callback type="unbind" method="objectUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

-		name="MRefCheckServiceProvider" architecture="true">

-		<requires

-			specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService">

-			<callback type="bind" method="refBind" />

-			<callback type="unbind" method="refUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

-		name="MBothCheckServiceProvider" architecture="true">

-		<requires>

-			<callback type="bind" method="bothBind" />

-			<callback type="unbind" method="bothUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

-		name="MMapCheckServiceProvider" architecture="true">

-		<requires>

-			<callback type="bind" method="propertiesMapBind" />

-			<callback type="unbind" method="propertiesMapUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

-		name="MDictCheckServiceProvider" architecture="true">

-		<requires>

-			<callback type="bind" method="propertiesDictionaryBind" />

-			<callback type="unbind" method="propertiesDictionaryUnbind" />

-		</requires>

-		<provides />

-	</component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="DoubleCheckServiceProvider" architecture="true">

+    <requires>

+      <callback type="bind" method="objectBind" />

+      <callback type="unbind" method="objectUnbind" />

+    </requires>

+    <requires field="fs" />

+    <provides />

+  </component>

 

-	<!-- Simple & Optional Dependencies -->

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="SimpleOptionalCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true" id="FooService"/>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="SimpleOptionalNoNullableCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true" nullable="false" />

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="VoidOptionalCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true">

-			<callback type="bind" method="voidBind" />

-			<callback type="unbind" method="voidUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="VoidOptionalNoNullableCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true" nullable="false">

-			<callback type="bind" method="voidBind" />

-			<callback type="unbind" method="voidUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="ObjectOptionalCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true">

-			<callback type="bind" method="objectBind" />

-			<callback type="unbind" method="objectUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="ObjectOptionalNoNullableCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true" nullable="false">

-			<callback type="bind" method="objectBind" />

-			<callback type="unbind" method="objectUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="RefOptionalCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true">

-			<callback type="bind" method="refBind" />

-			<callback type="unbind" method="refUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="RefOptionalNoNullableCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true" nullable="false">

-			<callback type="bind" method="refBind" />

-			<callback type="unbind" method="refUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="BothOptionalCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true">

-			<callback type="bind" method="bothBind" />

-			<callback type="unbind" method="bothUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="MapOptionalCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true">

-			<callback type="bind" method="propertiesMapBind" />

-			<callback type="unbind" method="propertiesMapUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="DictOptionalCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true">

-			<callback type="bind" method="propertiesDictionaryBind" />

-			<callback type="unbind" method="propertiesDictionaryUnbind" />

-		</requires>

-		<provides />

-	</component>	

-	

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="BothOptionalNoNullableCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true" nullable="false">

-			<callback type="bind" method="bothBind" />

-			<callback type="unbind" method="bothUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="MapOptionalNoNullableCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true" nullable="false">

-			<callback type="bind" method="propertiesMapBind" />

-			<callback type="unbind" method="propertiesMapUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="DictOptionalNoNullableCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true" nullable="false">

-			<callback type="bind" method="propertiesDictionaryBind" />

-			<callback type="unbind" method="propertiesDictionaryUnbind" />

-		</requires>

-		<provides />

-	</component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

+    name="MObjectCheckServiceProvider" architecture="true">

+    <requires>

+      <callback type="bind" method="objectBind" />

+      <callback type="unbind" method="objectUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

+    name="MRefCheckServiceProvider" architecture="true">

+    <requires

+      specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService">

+      <callback type="bind" method="refBind" />

+      <callback type="unbind" method="refUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

+    name="MBothCheckServiceProvider" architecture="true">

+    <requires>

+      <callback type="bind" method="bothBind" />

+      <callback type="unbind" method="bothUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

+    name="MMapCheckServiceProvider" architecture="true">

+    <requires>

+      <callback type="bind" method="propertiesMapBind" />

+      <callback type="unbind" method="propertiesMapUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

+    name="MDictCheckServiceProvider" architecture="true">

+    <requires>

+      <callback type="bind" method="propertiesDictionaryBind" />

+      <callback type="unbind" method="propertiesDictionaryUnbind" />

+    </requires>

+    <provides />

+  </component>

 

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

-		name="MObjectOptionalCheckServiceProvider" architecture="true">

-		<requires optional="true">

-			<callback type="bind" method="objectBind" />

-			<callback type="unbind" method="objectUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

-		name="MRefOptionalCheckServiceProvider" architecture="true">

-		<requires

-			specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"

-			optional="true">

-			<callback type="bind" method="refBind" />

-			<callback type="unbind" method="refUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

-		name="MBothOptionalCheckServiceProvider" architecture="true">

-		<requires

-			specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"

-			optional="true">

-			<callback type="bind" method="bothBind" />

-			<callback type="unbind" method="bothUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

-		name="MMapOptionalCheckServiceProvider" architecture="true">

-		<requires

-			specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"

-			optional="true">

-			<callback type="bind" method="propertiesMapBind" />

-			<callback type="unbind" method="propertiesMapUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

-		name="MDictOptionalCheckServiceProvider" architecture="true">

-		<requires

-			specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"

-			optional="true">

-			<callback type="bind" method="propertiesDictionaryBind" />

-			<callback type="unbind" method="propertiesDictionaryUnbind" />

-		</requires>

-		<provides />

-	</component>

+  <!-- Simple & Optional Dependencies -->

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="SimpleOptionalCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true" id="FooService"/>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="SimpleOptionalNoNullableCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true" nullable="false" />

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="VoidOptionalCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true">

+      <callback type="bind" method="voidBind" />

+      <callback type="unbind" method="voidUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="VoidOptionalNoNullableCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true" nullable="false">

+      <callback type="bind" method="voidBind" />

+      <callback type="unbind" method="voidUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="ObjectOptionalCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true">

+      <callback type="bind" method="objectBind" />

+      <callback type="unbind" method="objectUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="ObjectOptionalNoNullableCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true" nullable="false">

+      <callback type="bind" method="objectBind" />

+      <callback type="unbind" method="objectUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="RefOptionalCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true">

+      <callback type="bind" method="refBind" />

+      <callback type="unbind" method="refUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="RefOptionalNoNullableCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true" nullable="false">

+      <callback type="bind" method="refBind" />

+      <callback type="unbind" method="refUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="BothOptionalCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true">

+      <callback type="bind" method="bothBind" />

+      <callback type="unbind" method="bothUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="MapOptionalCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true">

+      <callback type="bind" method="propertiesMapBind" />

+      <callback type="unbind" method="propertiesMapUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="DictOptionalCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true">

+      <callback type="bind" method="propertiesDictionaryBind" />

+      <callback type="unbind" method="propertiesDictionaryUnbind" />

+    </requires>

+    <provides />

+  </component>	

+  

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="BothOptionalNoNullableCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true" nullable="false">

+      <callback type="bind" method="bothBind" />

+      <callback type="unbind" method="bothUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="MapOptionalNoNullableCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true" nullable="false">

+      <callback type="bind" method="propertiesMapBind" />

+      <callback type="unbind" method="propertiesMapUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="DictOptionalNoNullableCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true" nullable="false">

+      <callback type="bind" method="propertiesDictionaryBind" />

+      <callback type="unbind" method="propertiesDictionaryUnbind" />

+    </requires>

+    <provides />

+  </component>

+

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

+    name="MObjectOptionalCheckServiceProvider" architecture="true">

+    <requires optional="true">

+      <callback type="bind" method="objectBind" />

+      <callback type="unbind" method="objectUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

+    name="MRefOptionalCheckServiceProvider" architecture="true">

+    <requires

+      specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"

+      optional="true">

+      <callback type="bind" method="refBind" />

+      <callback type="unbind" method="refUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

+    name="MBothOptionalCheckServiceProvider" architecture="true">

+    <requires

+      specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"

+      optional="true">

+      <callback type="bind" method="bothBind" />

+      <callback type="unbind" method="bothUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

+    name="MMapOptionalCheckServiceProvider" architecture="true">

+    <requires

+      specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"

+      optional="true">

+      <callback type="bind" method="propertiesMapBind" />

+      <callback type="unbind" method="propertiesMapUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

+    name="MDictOptionalCheckServiceProvider" architecture="true">

+    <requires

+      specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"

+      optional="true">

+      <callback type="bind" method="propertiesDictionaryBind" />

+      <callback type="unbind" method="propertiesDictionaryUnbind" />

+    </requires>

+    <provides />

+  </component>

 

 

-	<!-- Simple & Optional Dependencies with default-implementation -->

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="DISimpleOptionalCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true"

-			default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl" />

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="DIVoidOptionalCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true"

-			default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

-			<callback type="bind" method="voidBind" />

-			<callback type="unbind" method="voidUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="DIObjectOptionalCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true"

-			default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

-			<callback type="bind" method="objectBind" />

-			<callback type="unbind" method="objectUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="DIRefOptionalCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true"

-			default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

-			<callback type="bind" method="refBind" />

-			<callback type="unbind" method="refUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="DIBothOptionalCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true"

-			default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

-			<callback type="bind" method="bothBind" />

-			<callback type="unbind" method="bothUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="DIMapOptionalCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true"

-			default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

-			<callback type="bind" method="propertiesMapBind" />

-			<callback type="unbind" method="propertiesMapUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

-		name="DIDictOptionalCheckServiceProvider" architecture="true">

-		<requires field="fs" optional="true"

-			default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

-			<callback type="bind" method="propertiesDictionaryBind" />

-			<callback type="unbind" method="propertiesDictionaryUnbind" />

-		</requires>

-		<provides />

-	</component>

+  <!-- Simple & Optional Dependencies with default-implementation -->

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="DISimpleOptionalCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true"

+      default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl" />

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="DIVoidOptionalCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true"

+      default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

+      <callback type="bind" method="voidBind" />

+      <callback type="unbind" method="voidUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="DIObjectOptionalCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true"

+      default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

+      <callback type="bind" method="objectBind" />

+      <callback type="unbind" method="objectUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="DIRefOptionalCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true"

+      default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

+      <callback type="bind" method="refBind" />

+      <callback type="unbind" method="refUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="DIBothOptionalCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true"

+      default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

+      <callback type="bind" method="bothBind" />

+      <callback type="unbind" method="bothUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="DIMapOptionalCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true"

+      default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

+      <callback type="bind" method="propertiesMapBind" />

+      <callback type="unbind" method="propertiesMapUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="DIDictOptionalCheckServiceProvider" architecture="true">

+    <requires field="fs" optional="true"

+      default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

+      <callback type="bind" method="propertiesDictionaryBind" />

+      <callback type="unbind" method="propertiesDictionaryUnbind" />

+    </requires>

+    <provides />

+  </component>

 

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

-		name="DIMObjectOptionalCheckServiceProvider" architecture="true">

-		<requires optional="true"

-			default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

-			<callback type="bind" method="objectBind" />

-			<callback type="unbind" method="objectUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

-		name="DIMRefOptionalCheckServiceProvider" architecture="true">

-		<requires

-			specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"

-			optional="true"

-			default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

-			<callback type="bind" method="refBind" />

-			<callback type="unbind" method="refUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

-		name="DIMBothOptionalCheckServiceProvider" architecture="true">

-		<requires

-			specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"

-			optional="true"

-			default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

-			<callback type="bind" method="bothBind" />

-			<callback type="unbind" method="bothUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

-		name="DIMMapOptionalCheckServiceProvider" architecture="true">

-		<requires

-			specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"

-			optional="true"

-			default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

-			<callback type="bind" method="propertiesMapBind" />

-			<callback type="unbind" method="propertiesMapUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

-		name="DIMDictOptionalCheckServiceProvider" architecture="true">

-		<requires

-			specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"

-			optional="true"

-			default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

-			<callback type="bind" method="propertiesDictionaryBind" />

-			<callback type="unbind" method="propertiesDictionaryUnbind" />

-		</requires>

-		<provides />

-	</component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

+    name="DIMObjectOptionalCheckServiceProvider" architecture="true">

+    <requires optional="true"

+      default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

+      <callback type="bind" method="objectBind" />

+      <callback type="unbind" method="objectUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

+    name="DIMRefOptionalCheckServiceProvider" architecture="true">

+    <requires

+      specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"

+      optional="true"

+      default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

+      <callback type="bind" method="refBind" />

+      <callback type="unbind" method="refUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

+    name="DIMBothOptionalCheckServiceProvider" architecture="true">

+    <requires

+      specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"

+      optional="true"

+      default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

+      <callback type="bind" method="bothBind" />

+      <callback type="unbind" method="bothUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

+    name="DIMMapOptionalCheckServiceProvider" architecture="true">

+    <requires

+      specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"

+      optional="true"

+      default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

+      <callback type="bind" method="propertiesMapBind" />

+      <callback type="unbind" method="propertiesMapUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"

+    name="DIMDictOptionalCheckServiceProvider" architecture="true">

+    <requires

+      specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"

+      optional="true"

+      default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">

+      <callback type="bind" method="propertiesDictionaryBind" />

+      <callback type="unbind" method="propertiesDictionaryUnbind" />

+    </requires>

+    <provides />

+  </component>

 

-	<!--  Multiple Dependencies -->

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

-		name="SimpleMultipleCheckServiceProvider" architecture="true">

-		<requires field="fs" />

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

-		name="VoidMultipleCheckServiceProvider" architecture="true">

-		<requires field="fs">

-			<callback type="bind" method="voidBind" />

-			<callback type="unbind" method="voidUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

-		name="ObjectMultipleCheckServiceProvider" architecture="true">

-		<requires field="fs">

-			<callback type="bind" method="objectBind" />

-			<callback type="unbind" method="objectUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

-		name="RefMultipleCheckServiceProvider" architecture="true">

-		<requires field="fs">

-			<callback type="bind" method="refBind" />

-			<callback type="unbind" method="refUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

-		name="BothMultipleCheckServiceProvider" architecture="true">

-		<requires field="fs">

-			<callback type="bind" method="bothBind" />

-			<callback type="unbind" method="bothUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

-		name="MapMultipleCheckServiceProvider" architecture="true">

-		<requires field="fs">

-			<callback type="bind" method="propertiesMapBind" />

-			<callback type="unbind" method="propertiesMapUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

-		name="DictMultipleCheckServiceProvider" architecture="true">

-		<requires field="fs">

-			<callback type="bind" method="propertiesDictionaryBind" />

-			<callback type="unbind" method="propertiesDictionaryUnbind" />

-		</requires>

-		<provides />

-	</component>

-	

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"

-		name="MObjectMultipleCheckServiceProvider" architecture="true">

-		<requires aggregate="true">

-			<callback type="bind" method="objectBind" />

-			<callback type="unbind" method="objectUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"

-		name="MRefMultipleCheckServiceProvider" architecture="true">

-		<requires

-			specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"

-			aggregate="true">

-			<callback type="bind" method="refBind" />

-			<callback type="unbind" method="refUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"

-		name="MBothMultipleCheckServiceProvider" architecture="true">

-		<requires aggregate="true">

-			<callback type="bind" method="bothBind" />

-			<callback type="unbind" method="bothUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"

-		name="MMapMultipleCheckServiceProvider" architecture="true">

-		<requires aggregate="true">

-			<callback type="bind" method="propertiesMapBind" />

-			<callback type="unbind" method="propertiesMapUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"

-		name="MDictMultipleCheckServiceProvider" architecture="true">

-		<requires aggregate="true">

-			<callback type="bind" method="propertiesDictionaryBind" />

-			<callback type="unbind" method="propertiesDictionaryUnbind" />

-		</requires>

-		<provides />

-	</component>

+  <!--  Multiple Dependencies -->

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

+    name="SimpleMultipleCheckServiceProvider" architecture="true">

+    <requires field="fs" />

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

+    name="VoidMultipleCheckServiceProvider" architecture="true">

+    <requires field="fs">

+      <callback type="bind" method="voidBind" />

+      <callback type="unbind" method="voidUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

+    name="ObjectMultipleCheckServiceProvider" architecture="true">

+    <requires field="fs">

+      <callback type="bind" method="objectBind" />

+      <callback type="unbind" method="objectUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

+    name="RefMultipleCheckServiceProvider" architecture="true">

+    <requires field="fs">

+      <callback type="bind" method="refBind" />

+      <callback type="unbind" method="refUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

+    name="BothMultipleCheckServiceProvider" architecture="true">

+    <requires field="fs">

+      <callback type="bind" method="bothBind" />

+      <callback type="unbind" method="bothUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

+    name="MapMultipleCheckServiceProvider" architecture="true">

+    <requires field="fs">

+      <callback type="bind" method="propertiesMapBind" />

+      <callback type="unbind" method="propertiesMapUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

+    name="DictMultipleCheckServiceProvider" architecture="true">

+    <requires field="fs">

+      <callback type="bind" method="propertiesDictionaryBind" />

+      <callback type="unbind" method="propertiesDictionaryUnbind" />

+    </requires>

+    <provides />

+  </component>

+  

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"

+    name="MObjectMultipleCheckServiceProvider" architecture="true">

+    <requires aggregate="true">

+      <callback type="bind" method="objectBind" />

+      <callback type="unbind" method="objectUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"

+    name="MRefMultipleCheckServiceProvider" architecture="true">

+    <requires

+      specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"

+      aggregate="true">

+      <callback type="bind" method="refBind" />

+      <callback type="unbind" method="refUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"

+    name="MBothMultipleCheckServiceProvider" architecture="true">

+    <requires aggregate="true">

+      <callback type="bind" method="bothBind" />

+      <callback type="unbind" method="bothUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"

+    name="MMapMultipleCheckServiceProvider" architecture="true">

+    <requires aggregate="true">

+      <callback type="bind" method="propertiesMapBind" />

+      <callback type="unbind" method="propertiesMapUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"

+    name="MDictMultipleCheckServiceProvider" architecture="true">

+    <requires aggregate="true">

+      <callback type="bind" method="propertiesDictionaryBind" />

+      <callback type="unbind" method="propertiesDictionaryUnbind" />

+    </requires>

+    <provides />

+  </component>

 

-	<!-- Multiple & Optional Dependencies -->

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

-		name="SimpleOptionalMultipleCheckServiceProvider"

-		architecture="true">

-		<requires field="fs" optional="true" />

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

-		name="VoidOptionalMultipleCheckServiceProvider"

-		architecture="true">

-		<requires field="fs" optional="true">

-			<callback type="bind" method="voidBind" />

-			<callback type="unbind" method="voidUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

-		name="ObjectOptionalMultipleCheckServiceProvider"

-		architecture="true">

-		<requires field="fs" optional="true">

-			<callback type="bind" method="objectBind" />

-			<callback type="unbind" method="objectUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

-		name="RefOptionalMultipleCheckServiceProvider"

-		architecture="true">

-		<requires field="fs" optional="true">

-			<callback type="bind" method="refBind" />

-			<callback type="unbind" method="refUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"

-		name="MObjectOptionalMultipleCheckServiceProvider"

-		architecture="true">

-		<requires aggregate="true" optional="true">

-			<callback type="bind" method="objectBind" />

-			<callback type="unbind" method="objectUnbind" />

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"

-		name="MRefOptionalMultipleCheckServiceProvider"

-		architecture="true">

-		<requires

-			specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"

-			aggregate="true" optional="true">

-			<callback type="bind" method="refBind" />

-			<callback type="unbind" method="refUnbind" />

-		</requires>

-		<provides />

-	</component>

-	

-	<!-- Aggregate dependency as List -->

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.ListCheckService"

-		name="SimpleListCheckServiceProvider" architecture="true">

-		<requires field="fs" specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"/>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.ListCheckService"

-		name="OptionalListCheckServiceProvider"

-		architecture="true">

-		<requires specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService" field="fs" optional="true" />

-		<provides />

-	</component>

-	

-	<!-- Aggregate dependency as Vector -->

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.VectorCheckService"

-		name="SimpleVectorCheckServiceProvider" architecture="true">

-		<requires field="fs">

-			<callback type="bind" method="objectBind"/>

-			<callback type="unbind" method="objectUnbind"/>

-		</requires>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.VectorCheckService"

-		name="OptionalVectorCheckServiceProvider"

-		architecture="true">

-		<requires specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService" field="fs" optional="true" />

-		<provides />

-	</component>

-	

-	<!-- Aggregate dependency as Set -->

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.SetCheckService"

-		name="SimpleSetCheckServiceProvider" architecture="true">

-		<requires field="fs" specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"/>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.SetCheckService"

-		name="OptionalSetCheckServiceProvider"

-		architecture="true">

-		<requires specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService" field="fs" optional="true" />

-		<provides />

-	</component>

-	

-	<!-- Aggregate dependency as Collection -->

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CollectionCheckService"

-		name="SimpleCollectionCheckServiceProvider" architecture="true">

-		<requires field="fs" specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"/>

-		<provides />

-	</component>

-	<component

-		classname="org.apache.felix.ipojo.test.scenarios.component.CollectionCheckService"

-		name="OptionalCollectionCheckServiceProvider"

-		architecture="true">

-		<requires specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService" field="fs" optional="true" />

-		<provides />

-	</component>

-	

+  <!-- Multiple & Optional Dependencies -->

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

+    name="SimpleOptionalMultipleCheckServiceProvider"

+    architecture="true">

+    <requires field="fs" optional="true" />

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

+    name="VoidOptionalMultipleCheckServiceProvider"

+    architecture="true">

+    <requires field="fs" optional="true">

+      <callback type="bind" method="voidBind" />

+      <callback type="unbind" method="voidUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

+    name="ObjectOptionalMultipleCheckServiceProvider"

+    architecture="true">

+    <requires field="fs" optional="true">

+      <callback type="bind" method="objectBind" />

+      <callback type="unbind" method="objectUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

+    name="RefOptionalMultipleCheckServiceProvider"

+    architecture="true">

+    <requires field="fs" optional="true">

+      <callback type="bind" method="refBind" />

+      <callback type="unbind" method="refUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"

+    name="MObjectOptionalMultipleCheckServiceProvider"

+    architecture="true">

+    <requires aggregate="true" optional="true">

+      <callback type="bind" method="objectBind" />

+      <callback type="unbind" method="objectUnbind" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"

+    name="MRefOptionalMultipleCheckServiceProvider"

+    architecture="true">

+    <requires

+      specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"

+      aggregate="true" optional="true">

+      <callback type="bind" method="refBind" />

+      <callback type="unbind" method="refUnbind" />

+    </requires>

+    <provides />

+  </component>

+  

+  <!-- Aggregate dependency as List -->

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.ListCheckService"

+    name="SimpleListCheckServiceProvider" architecture="true">

+    <requires field="fs" specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"/>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.ListCheckService"

+    name="OptionalListCheckServiceProvider"

+    architecture="true">

+    <requires specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService" field="fs" optional="true" />

+    <provides />

+  </component>

+  

+  <!-- Aggregate dependency as Vector -->

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.VectorCheckService"

+    name="SimpleVectorCheckServiceProvider" architecture="true">

+    <requires field="fs">

+      <callback type="bind" method="objectBind"/>

+      <callback type="unbind" method="objectUnbind"/>

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.VectorCheckService"

+    name="OptionalVectorCheckServiceProvider"

+    architecture="true">

+    <requires specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService" field="fs" optional="true" />

+    <provides />

+  </component>

+  

+  <!-- Aggregate dependency as Set -->

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.SetCheckService"

+    name="SimpleSetCheckServiceProvider" architecture="true">

+    <requires field="fs" specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"/>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.SetCheckService"

+    name="OptionalSetCheckServiceProvider"

+    architecture="true">

+    <requires specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService" field="fs" optional="true" />

+    <provides />

+  </component>

+  

+  <!-- Aggregate dependency as Collection -->

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CollectionCheckService"

+    name="SimpleCollectionCheckServiceProvider" architecture="true">

+    <requires field="fs" specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService"/>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CollectionCheckService"

+    name="OptionalCollectionCheckServiceProvider"

+    architecture="true">

+    <requires specification="org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService" field="fs" optional="true" />

+    <provides />

+  </component>

+  

+  

+  <!-- Modify method test -->

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.FooProviderType2"

+    name="FooProviderType-Updatable" architecture="true">

+    <provides>

+      <property name="foo" field="m_foo" value="foo"/> 

+    </provides>

+  </component>

+  

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="VoidModifyCheckServiceProvider" architecture="true">

+    <requires field="fs">

+      <callback type="bind" method="voidBind" />

+      <callback type="unbind" method="voidUnbind" />

+      <callback type="modified" method="voidModify"/>

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="ObjectModifyCheckServiceProvider" architecture="true">

+    <requires field="fs">

+      <callback type="bind" method="objectBind" />

+      <callback type="unbind" method="objectUnbind" />

+      <callback type="modified" method="objectModify" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="RefModifyCheckServiceProvider" architecture="true">

+    <requires field="fs">

+      <callback type="bind" method="refBind" />

+      <callback type="unbind" method="refUnbind" />

+      <callback type="modified" method="refModify" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="BothModifyCheckServiceProvider" architecture="true">

+    <requires field="fs">

+      <callback type="bind" method="bothBind" />

+      <callback type="unbind" method="bothUnbind" />

+      <callback type="modified" method="bothModify" />

+    </requires>

+    <provides />

+  </component>

+    <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="MapModifyCheckServiceProvider" architecture="true">

+    <requires field="fs">

+      <callback type="bind" method="propertiesMapBind" />

+      <callback type="unbind" method="propertiesMapUnbind" />

+      <callback type="modified" method="propertiesMapModify" />

+    </requires>

+    <provides />

+  </component>

+  <component

+    classname="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"

+    name="DictModifyCheckServiceProvider" architecture="true">

+    <requires field="fs">

+      <callback type="bind" method="propertiesDictionaryBind" />

+      <callback type="unbind" method="propertiesDictionaryUnbind" />

+      <callback type="modified" method="propertiesDictionaryModify" />

+    </requires>

+    <provides />

+  </component>

+  

 </ipojo>