diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/ComponentFactory.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/ComponentFactory.java
index 7504220..6982b32 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/ComponentFactory.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/ComponentFactory.java
@@ -848,6 +848,7 @@
         props.put("component.class", m_componentClassName);
        
         props.put("factory.name", m_factoryName);
+        props.put(Constants.SERVICE_PID, m_factoryName); // Service PID is required for the integration in the configuration admin.
         if (m_typeName != null) {
             props.put("component.type", m_typeName);
         }
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 fe5f033..70540cd 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
@@ -49,9 +49,9 @@
     private int m_methodType;
     
     /**
-     * Argument of the callback.
+     * Arguments of the callback.
      */
-    private String m_argument;
+    private String[] m_argument;
 
     /**
      * Callback method name.
@@ -71,7 +71,7 @@
     /**
      * Constructor.
      * 
-     * @param dep : the dependency attached to this depednency callback
+     * @param dep : the dependency attached to this dependency callback
      * @param method : the method to call
      * @param methodType : is the method to call a bind method or an unbind
      * method
@@ -95,32 +95,16 @@
      * Set the argument type (Empty or the class name).
      * @param arg : the type name or EMPTY
      */
-    public void setArgument(String arg) {
+    public void setArgument(String[] arg) {
         m_argument = arg;
-        if ("EMPTY".equals(arg)) {
-            m_callback = new Callback(m_method, new String[0], false, m_manager);
-        } else {
-            m_callback = new Callback(m_method, new String[] {arg}, false, m_manager);
-        }
-        
+        m_callback = new Callback(m_method, arg, false, m_manager);        
     }
     
-    public String getArgument() {
+    public String[] getArgument() {
         return m_argument;
     }
 
     /**
-     * Call the callback method.
-     * 
-     * @throws NoSuchMethodException : Method is not found in the class
-     * @throws InvocationTargetException : The method is not static
-     * @throws IllegalAccessException : The method can not be invoked
-     */
-    protected void call() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
-        m_callback.call();
-    }
-
-    /**
      * Call the callback method with a service reference.
      * 
      * @param ref : the service reference to send to the method
@@ -130,14 +114,22 @@
      * @throws IllegalAccessException : The method can not be invoked
      */
     protected void call(ServiceReference ref, Object obj) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
-        if ("EMPTY".equals(m_argument)) {
-            m_callback.call(new Object[] {});
-        } else {
-            if (m_argument.equals(ServiceReference.class.getName())) {
-                m_callback.call(new Object[] {ref});
-            } else {
-                m_callback.call(new Object[] {obj});
-            }
+        switch (m_argument.length) {
+            case 0 :
+                m_callback.call(new Object[0]);
+                break;
+            case 1 : 
+                if (m_argument[0].equals(ServiceReference.class.getName())) {
+                    m_callback.call(new Object[] {ref});
+                } else {
+                    m_callback.call(new Object[] {obj});
+                }
+                break;
+            case 2 :
+                m_callback.call(new Object[] {obj, ref});
+                break;
+            default : 
+                break;
         }
     }
 
@@ -153,28 +145,22 @@
      * @throws InvocationTargetException
      */
     protected void callOnInstance(Object instance, ServiceReference ref, Object obj) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
-        if ("EMPTY".equals(m_argument)) {
-            m_callback.call(instance, new Object[] {});
-            return;
+        switch (m_argument.length) {
+            case 0 :
+                m_callback.call(instance, new Object[0]);
+                break;
+            case 1 : 
+                if (m_argument[0].equals(ServiceReference.class.getName())) {
+                    m_callback.call(instance, new Object[] {ref});
+                } else {
+                    m_callback.call(instance, new Object[] {obj});
+                }
+                break;
+            case 2 :
+                m_callback.call(instance, new Object[] {obj, ref});
+                break;
+            default : 
+                break;
         }
-        if (m_argument.equals(ServiceReference.class.getName())) {
-            m_callback.call(instance, new Object[] {ref});
-        } else {
-            m_callback.call(instance, new Object[] {obj});
-        }
-    }
-
-    /**
-     * Call the callback on the given instance with the given argument.
-     * 
-     * @param instance : the instance on which call the callback
-     * @param o : the service object to send to the callback
-     * @throws NoSuchMethodException : the method is not found
-     * @throws IllegalAccessException : the method could not be called
-     * @throws InvocationTargetException : an error happens in the called method
-     * @throws InvocationTargetException
-     */
-    protected void callOnInstance(Object instance, Object o) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
-        m_callback.call(instance, new Object[] {o});
     }
 }
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 206734f..7b7c839 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
@@ -147,17 +147,15 @@
         for (int i = 0; i < callbacks.length; i++) {
             MethodMetadata[] mets = manipulation.getMethods(callbacks[i].getMethodName());
             if (mets.length == 0) {
-                getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "A requirement callback " + callbacks[i].getMethodName() + " does not exist in the implementation");
+                log(Logger.ERROR, "A requirement callback " + callbacks[i].getMethodName() + " does not exist in the implementation");
                 throw new ConfigurationException("Requirement Callback : A requirement callback " + callbacks[i].getMethodName() + " does not exist in the implementation", getInstanceManager().getFactory().getName());
             }
-            if (mets[0].getMethodArguments().length > 1) {
-                getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "A requirement callback " + callbacks[i].getMethodName() + " must have 0 or 1 argument");
-                throw new ConfigurationException("Requirement Callback : A requirement callback " + callbacks[i].getMethodName() + " must have 0 or 1 argument", getInstanceManager().getFactory().getName());
+            if (mets[0].getMethodArguments().length > 2) {
+                log(Logger.ERROR, "A requirement callback " + callbacks[i].getMethodName() + " must have 0 or 1 or 2 arguments");
+                throw new ConfigurationException("Requirement Callback : A requirement callback " + callbacks[i].getMethodName() + " must have 0 or 1 or 2 arguments", getInstanceManager().getFactory().getName());
             }
-            if (mets[0].getMethodArguments().length == 0) {
-                callbacks[i].setArgument("EMPTY");
-            } else {
-                callbacks[i].setArgument(mets[0].getMethodArguments()[0]);
+            callbacks[i].setArgument(mets[0].getMethodArguments());
+            if (mets[0].getMethodArguments().length == 1) {
                 if (!mets[0].getMethodArguments()[0].equals(ServiceReference.class.getName())) {
                     if (dep.getSpecification() == null) {
                         dep.setSpecification(mets[0].getMethodArguments()[0]);
@@ -168,13 +166,31 @@
                         dep.setSpecification(mets[0].getMethodArguments()[0]);
                     }
                 }
+            } else if (mets[0].getMethodArguments().length == 2) {
+                // Check that the second arguments is a service reference
+                if (!mets[0].getMethodArguments()[1].equals(ServiceReference.class.getName())) {
+                    String message = "The requirement callback " + callbacks[i].getMethodName() + " must have a ServiceReference as the second arguments";
+                    log(Logger.ERROR, message);
+                    throw new ConfigurationException(message, getInstanceManager().getFactory().getName());
+                }
+                if (dep.getSpecification() == null) {
+                    dep.setSpecification(mets[0].getMethodArguments()[0]);
+                } else {
+                    if (!dep.getSpecification().equals(mets[0].getMethodArguments()[0])) {
+                        log(Logger.WARNING, "[DependencyHandler on " + getInstanceManager().getInstanceName() + "] The field type [" + mets[0].getMethodArguments()[0] + "] and the needed service interface [" + dep.getSpecification()
+                                + "] are not the same");
+                        dep.setSpecification(mets[0].getMethodArguments()[0]);
+                    }
+                }
+                
             }
+            
         }
 
         if (field != null) {
             FieldMetadata fm = manipulation.getField(field);
             if (fm == null) {
-                getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "A requirement field " + field + " does not exist in the implementation class");
+                log(Logger.ERROR, "A requirement field " + field + " does not exist in the implementation class");
                 throw new ConfigurationException("Requirement Callback : A requirement field " + field + " does not exist in the implementation class", getInstanceManager().getFactory().getName());
             }
             String type = fm.getFieldType();
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Callback.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Callback.java
index b90e6b6..4f84322 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Callback.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Callback.java
@@ -186,7 +186,7 @@
     
     /**
      * Search the method object in the POJO by analyzing present method.
-     * The name of the maethod and the argument type are checked.
+     * The name of the method and the argument type are checked.
      */
     private void searchMethod() {
         Method[] methods = m_manager.getClazz().getDeclaredMethods();
@@ -249,26 +249,7 @@
      * @throws IllegalAccessException : The method can not be invoked
      */
     public Object call() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
-        if (m_methodObj == null) {
-            searchMethod();
-        }
-
-        if (m_isStatic) {
-            return m_methodObj.invoke(null, new Object[] {});
-        } else {
-            // Two cases :
-            // - if instances already exists : call on each instances
-            // - if no instance exists : create an instance
-            if (m_manager.getPojoObjects().length == 0) {
-                return m_methodObj.invoke(m_manager.getPojoObject(), new Object[] {});
-            } else {
-                Object r = null;
-                for (int i = 0; i < m_manager.getPojoObjects().length; i++) {
-                    r = m_methodObj.invoke(m_manager.getPojoObjects()[i], new Object[] {});
-                }
-                return r;
-            }
-        }
+        return call(new Object[0]);
     }
 
     /**
@@ -277,14 +258,11 @@
      * @param instance : instance on which call the callback
      * @return the result of the invocation, null for void method
      * @throws NoSuchMethodException : the method was not found
-     * @throws IllegalAccessException : the method cannont be called
+     * @throws IllegalAccessException : the method cannot be called
      * @throws InvocationTargetException : an error happens in the method
      */
     public Object call(Object instance) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
-        if (m_methodObj == null) {
-            searchMethod();
-        }
-        return m_methodObj.invoke(instance, new Object[] {});
+        return call(instance, new Object[0]);
     }
 
     /**
@@ -328,7 +306,7 @@
      * @param arg : the argument array
      * @return the result of the invocation, null for void method
      * @throws NoSuchMethodException : the callback method is not found
-     * @throws IllegalAccessException : the callbback method cannot be called
+     * @throws IllegalAccessException : the callback method cannot be called
      * @throws InvocationTargetException : an error occurs inside the called
      * method
      */
