diff --git a/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/Bind.java b/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/Bind.java
index aeef012..9179258 100644
--- a/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/Bind.java
+++ b/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/Bind.java
@@ -20,6 +20,7 @@
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Target;
+import java.util.Comparator;
 
 /**
  * This annotation declares a bind method.
@@ -64,5 +65,11 @@
      * Default: dynamic.
      */
     String policy() default "dynamic";
+    
+    /**
+     * Set the comparator.
+     * The indicated class must implement {@link Comparator}
+     */
+    Class comparator() default Comparator.class;
 
 }
diff --git a/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/Requires.java b/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/Requires.java
index 15794ef..e69836c 100644
--- a/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/Requires.java
+++ b/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/Requires.java
@@ -20,6 +20,7 @@
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Target;
+import java.util.Comparator;
 
 /**
  * This annotation declares a service requirement.
@@ -55,9 +56,10 @@
     /**
      * Set the default-implementation to use if the dependency is optional,
      * and no providers are available.
+     * The class must implement the required service interface.
      * Default : no default-implementation
      */
-    String defaultimplementation() default "";
+    Class defaultimplementation() default Class.class;
     
     /**
      * Set the binding policy.
@@ -65,4 +67,10 @@
      * Default: dynamic.
      */
     String policy() default "dynamic";
+    
+    /**
+     * Set the comparator.
+     * The indicated class must implement {@link Comparator}
+     */
+    Class comparator() default Comparator.class;
 }
diff --git a/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/Unbind.java b/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/Unbind.java
index 711b52f..b178938 100644
--- a/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/Unbind.java
+++ b/ipojo/annotations/src/main/java/org/apache/felix/ipojo/annotations/Unbind.java
@@ -20,6 +20,7 @@
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Target;
+import java.util.Comparator;
 
 /**
  * This annotation declares an unbind method.
@@ -65,5 +66,11 @@
      * Default: dynamic.
      */
     String policy() default "dynamic";
+    
+    /**
+     * Set the comparator.
+     * The indicated class must implement {@link Comparator}
+     */
+    Class comparator() default Comparator.class;
 
 }
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
index fad5a30..bd47ef5 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
@@ -557,7 +557,7 @@
                 // Check type if not already set
                 if (type == null) {
                     if (field == null) {
-                        throw new ConfigurationException("The property " + name + " has neither type neither field.");
+                        throw new ConfigurationException("The property " + name + " has neither type nor field.");
                     }
                     FieldMetadata fieldMeta = manipulation.getField(field);
                     if (fieldMeta == null) {
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 38b9a8b..ee78e6a 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
@@ -32,7 +32,7 @@
 
 /**
  * Abstract dependency model. This class is the parent class of every service dependency. It manages the most part of dependency management. This
- * class creates an insterface between the service tracker and the concrete dependency.
+ * class creates an interface between the service tracker and the concrete dependency.
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public abstract class DependencyModel implements TrackerCustomizer {
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/FieldCollector.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/FieldCollector.java
index 408b40a..6c30f03 100644
--- a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/FieldCollector.java
+++ b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/FieldCollector.java
@@ -22,6 +22,7 @@
 import org.apache.felix.ipojo.metadata.Element;
 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Type;
 import org.objectweb.asm.commons.EmptyVisitor;
 
 /**
@@ -151,6 +152,11 @@
         private String m_nullable;
         
         /**
+         * Comparator.
+         */
+        private String m_comparator;
+        
+        /**
          * Constructor.
          * @param name : field name.
          */
@@ -182,7 +188,8 @@
                 return;
             }
             if (arg0.equals("defaultimplementation")) {
-                m_defaultImplementation = arg1.toString();
+                Type type = Type.getType(arg1.toString());
+                m_defaultImplementation = type.getClassName();
                 return;
             }
             if (arg0.equals("specification")) {
@@ -193,6 +200,11 @@
                 m_id = arg1.toString();
                 return;
             }
+            if (arg0.equals("comparator")) {
+                Type type = Type.getType(arg1.toString());
+                m_comparator = type.getClassName();
+                return;
+            }
         }
 
         /**
@@ -237,6 +249,9 @@
             if (m_id != null) {
                 req.addAttribute(new Attribute("id", m_id));
             }
+            if (m_comparator != null) {
+                req.addAttribute(new Attribute("comparator", m_comparator));
+            }
             
             if (m_id != null) { 
                 m_collector.getIds().put(m_id, req);
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 0b36062..0f751f6 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
@@ -21,6 +21,7 @@
 import org.apache.felix.ipojo.metadata.Attribute;
 import org.apache.felix.ipojo.metadata.Element;
 import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.Type;
 import org.objectweb.asm.commons.EmptyVisitor;
 
 /**
@@ -192,6 +193,11 @@
          * Binding policy.
          */
         private String m_policy;
+        
+        /**
+         * Comparator.
+         */
+        private String m_comparator;
 
         /**
          * Constructor.
@@ -234,6 +240,12 @@
                 m_id = arg1.toString();
                 return;
             }
+            if (arg0.equals("comparator")) {
+                Type type = Type.getType(arg1.toString());
+                m_comparator = type.getClassName();
+                return;
+            }
+            
         }
 
         /**
@@ -275,6 +287,71 @@
                 if (m_id != null) {
                     req.addAttribute(new Attribute("id", m_id));
                 }
+                if (m_comparator != null) {
+                    req.addAttribute(new Attribute("comparator", m_comparator));
+                }
+            } else {
+                String itf = req.getAttribute("interface");
+                String aggregate = req.getAttribute("aggregate");
+                String optional = req.getAttribute("optional");
+                String filter = req.getAttribute("filter");
+                String policy = req.getAttribute("policy");
+                String comparator = req.getAttribute("comparator");
+                
+                if (m_specification != null) {
+                    if (itf == null) {
+                        req.addAttribute(new Attribute("interface", m_specification));
+                    } else if (! m_specification.equals(itf)) {
+                        System.err.println("The required specification is not the same than previouly : " + m_specification + " & " + itf);
+                        return;
+                    }
+                }
+                
+                if (m_optional != null) {
+                    if (optional == null) {
+                        req.addAttribute(new Attribute("optional", m_optional));
+                    } else if (! m_optional.equals(optional)) {
+                        System.err.println("The optional attribute is not always the same");
+                        return;
+                    }
+                }
+                
+                if (m_aggregate != null) {
+                    if (aggregate == null) {
+                        req.addAttribute(new Attribute("aggregate", m_aggregate));
+                    } else if (! m_aggregate.equals(aggregate)) {
+                        System.err.println("The aggregate attribute is not always the same");
+                        return;
+                    }
+                }
+                
+                if (m_filter != null) {
+                    if (filter == null) {
+                        req.addAttribute(new Attribute("filter", m_filter));
+                    } else if (! m_filter.equals(filter)) {
+                        System.err.println("The filter attribute is not always the same");
+                        return;
+                    }
+                }
+                
+                if (m_policy != null) {
+                    if (policy == null) {
+                        req.addAttribute(new Attribute("policy", m_policy));
+                    } else if (! m_policy.equals(policy)) {
+                        System.err.println("The policy attribute is not always the same");
+                        return;
+                    }
+                }
+                
+                if (m_comparator != null) {
+                    if (comparator == null) {
+                        req.addAttribute(new Attribute("comparator", m_comparator));
+                    } else if (! m_comparator.equals(policy)) {
+                        System.err.println("The comparator attribute is not always the same");
+                        return;
+                    }
+                }
+                
             }
             Element method = new Element("callback", "");
             method.addAttribute(new Attribute("method", m_name));
