diff --git a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/HandlerConfiguration.java b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/HandlerConfiguration.java
index 6e0958c..84f52b7 100644
--- a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/HandlerConfiguration.java
+++ b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/HandlerConfiguration.java
@@ -31,6 +31,6 @@
      * @return the Element-Attribute structure containing the handler
      * configuration.
      */
-    public Element getElement();
+    Element getElement();
 
 }
diff --git a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/PrimitiveComponentType.java b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/PrimitiveComponentType.java
index 93bdb54..e93c222 100644
--- a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/PrimitiveComponentType.java
+++ b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/PrimitiveComponentType.java
@@ -126,7 +126,7 @@
     
     /**
      * List of Handler representing external
-     * handler configuration
+     * handler configuration.
      */
     private List m_handlers = new ArrayList();
     
diff --git a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/SingletonComponentType.java b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/SingletonComponentType.java
index 8db255e..39f510d 100644
--- a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/SingletonComponentType.java
+++ b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/SingletonComponentType.java
@@ -33,6 +33,10 @@
  */
 public class SingletonComponentType extends PrimitiveComponentType {
     
+    /**
+     * The POJO object to inject through the
+     * instance configuration.
+     */
     private Object m_pojo;
     
     /**
@@ -44,10 +48,11 @@
     }
     
     /**
-     * Set the pojo object used by the instance.
+     * Sets the pojo object used by the instance.
      * The object must be compatible with the 
      * implementation class. 
      * @param obj the object.
+     * @return the current singleton component type.
      */
     public SingletonComponentType setObject(Object obj) {
         m_pojo = obj;
@@ -59,6 +64,7 @@
      * instance. This method has to be called in place of the
      * {@link PrimitiveComponentType#start()} and the
      * {@link PrimitiveComponentType#createInstance()}  methods.
+     * @return the created component instance.
      * @throws ConfigurationException occurs if the type description is
      * incorrect
      * @throws MissingHandlerException occurs if a handler is not available 
@@ -84,6 +90,7 @@
      * {@link PrimitiveComponentType#start()} and the
      * {@link PrimitiveComponentType#createInstance()}  methods.
      * @param conf the instance configuration
+     * @return the created component instance
      * @throws ConfigurationException occurs if the type description is
      * incorrect
      * @throws MissingHandlerException occurs if a handler is not available 
@@ -105,6 +112,9 @@
      * instance. This method has to be called in place of the
      * {@link PrimitiveComponentType#start()} and the
      * {@link PrimitiveComponentType#createInstance()}  methods.
+     * @param name  the name of the instance to create. This parameter will
+     * be used as the <code>instance.name</code> property.
+     * @return the created component instance.
      * @throws ConfigurationException occurs if the type description is
      * incorrect
      * @throws MissingHandlerException occurs if a handler is not available 
diff --git a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/CompositeComponentType.java b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/CompositeComponentType.java
index 3da590e..9d33c28 100644
--- a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/CompositeComponentType.java
+++ b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/CompositeComponentType.java
@@ -74,7 +74,7 @@
     private List m_instantiated = new ArrayList();
     
     /**
-     * List of contained instance:
+     * List of contained instance.
      */
     private List m_contained = new ArrayList(); 
     
@@ -89,7 +89,7 @@
     private String m_name;
     
     /**
-     * List of Handler representing external
+     * List of Handler representing external.
      * handler configuration
      */
     private List m_handlers = new ArrayList();
@@ -183,26 +183,51 @@
         return this;
     }
     
+    /**
+     * Adds a contained instance.
+     * @param inst the instance to add
+     * @return the current composite component type
+     */
     public CompositeComponentType addInstance(Instance inst) {
         m_contained.add(inst);
         return this;
     }
     
+    /**
+     * Adds an imported (sub-)service.
+     * @param is the imported service to add
+     * @return the current composite component type
+     */
     public CompositeComponentType addSubService(ImportedService is) {
         m_imported.add(is);
         return this;
     }
     
+    /**
+     * Adds an instantiated sub-service.
+     * @param is the instantiated service to add
+     * @return the current composite component type
+     */
     public CompositeComponentType addSubService(InstantiatedService is) {
         m_instantiated.add(is);
         return this;
     }
     
+    /**
+     * Adds an exported service.
+     * @param es the exported service to add
+     * @return the current composite component type
+     */
     public CompositeComponentType addService(ExportedService es) {
         m_exported.add(es);
         return this;
     }
     
+    /**
+     * Adds a provided service.
+     * @param es the provided service to add
+     * @return the current composite component type
+     */
     public CompositeComponentType addService(ProvidedService es) {
         m_provided.add(es);
         return this;
@@ -215,8 +240,9 @@
      * @param handler the handler configuration to add
      * @return the current component type.
      */
-    public void CompositeComponentType(HandlerConfiguration handler) {
+    public CompositeComponentType addHandler(HandlerConfiguration handler) {
         m_handlers.add(handler);
+        return this;
     }
     
     /**
@@ -269,7 +295,7 @@
         ensureValidity();
         m_metadata = generateComponentMetadata();
         try {
-           m_factory = new CompositeFactory(m_context, m_metadata);
+            m_factory = new CompositeFactory(m_context, m_metadata);
             m_factory.start();
         } catch (ConfigurationException e) {
             throw new IllegalStateException("An exception occurs during factory initialization : " + e.getMessage());
diff --git a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/ExportedService.java b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/ExportedService.java
index c7cb423..86fd25c 100644
--- a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/ExportedService.java
+++ b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/ExportedService.java
@@ -23,15 +23,24 @@
 import org.apache.felix.ipojo.metadata.Element;
 import org.apache.felix.ipojo.util.DependencyModel;
 
+/**
+ * Allows defining an exported service. A service export is the 
+ * publication of service from the composite to the parent composite
+ * or global registry. The service export relies on a service dependency
+ * inside the composite. Matching services will be exported. 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public class ExportedService implements HandlerConfiguration {
     
     /**
-     * The required specification.
+     * The exported specification.
      */
     private String m_specification;
     
     /**
-     * The LDAP filter of the dependency. 
+     * The LDAP filter of the service dependency
+     * used to select the adequate service provider from
+     * the composite. 
      */
     private String m_filter;
     
@@ -56,12 +65,10 @@
      * (used to compare service providers) 
      */
     private String m_comparator;
-
-    
    
     /**
-     * Gets the dependency metadata.
-     * @return the 'requires' element describing
+     * Gets the exported service metadata.
+     * @return the 'provides' element describing
      * the current dependency.
      */
     public Element getElement() {
diff --git a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/ImportedService.java b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/ImportedService.java
index d7aff45..fbb994f 100644
--- a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/ImportedService.java
+++ b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/ImportedService.java
@@ -23,12 +23,27 @@
 import org.apache.felix.ipojo.metadata.Element;
 import org.apache.felix.ipojo.util.DependencyModel;
 
+/**
+ * Allows defining an imported service. A service import is the 
+ * publication of service from the parent composite
+ * or global registry inside the composite. 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public class ImportedService implements HandlerConfiguration {
     
+    /**
+     * Scoping policy: composite.
+     */
     public static final String COMPOSITE_SCOPE = "composite";
     
+    /**
+     * Scoping policy: global.
+     */
     public static final String GLOBAL_SCOPE = "global";
     
+    /**
+     * Scoping policy: composite+global.
+     */
     public static final String COMPOSITE_AND_GLOBAL_SCOPE = "composite+global";
     
     
@@ -70,7 +85,7 @@
     private String m_id;
     
     /**
-     * Dependency scope
+     * Dependency scope.
      */
     private String m_scope = COMPOSITE_SCOPE;
    
diff --git a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/Instance.java b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/Instance.java
index ae66997..0d652b4 100644
--- a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/Instance.java
+++ b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/Instance.java
@@ -24,22 +24,45 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 import java.util.Vector;
-import java.util.Map.Entry;
 
 import org.apache.felix.ipojo.api.HandlerConfiguration;
 import org.apache.felix.ipojo.metadata.Attribute;
 import org.apache.felix.ipojo.metadata.Element;
 
+/**
+ * Allows defining a contained instance. A contained instance is like
+ * an instance declaration but the instance is created in the composite.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public class Instance implements HandlerConfiguration {
-    private String m_type;
-    private List m_conf = new ArrayList();
     
+    /**
+     * Targeted component type.
+     */
+    private String m_type;
+    
+    /**
+     * Configuration.
+     */
+    private List m_conf = new ArrayList();
+
+    /**
+     * Creates a Instance.
+     * @param type the targeted type.
+     */
     public Instance(String type) {
         m_type = type;
     }
-    
+
+    /**
+     * Adds the string property.
+     * @param name property name
+     * @param value property value
+     * @return the current instance
+     */
     public Instance addProperty(String name, String value) {
         Element elem = new Element("property", "");
         m_conf.add(elem);
@@ -47,14 +70,20 @@
         elem.addAttribute(new Attribute("value", value));
         return this;
     }
-    
+
+    /**
+     * Adds a list property.
+     * @param name property name
+     * @param values the list
+     * @return the current instance
+     */
     public Instance addProperty(String name, List values) {
         Element elem = new Element("property", "");
         elem.addAttribute(new Attribute("name", name));
         elem.addAttribute(new Attribute("type", "list"));
 
         m_conf.add(elem);
-        
+
         for (int i = 0; i < values.size(); i++) {
             Object obj = values.get(i);
             Element e = new Element("property", "");
@@ -62,31 +91,44 @@
             if (obj instanceof String) {
                 e.addAttribute(new Attribute("value", obj.toString()));
             } else {
-                // TODO 
-               throw new UnsupportedOperationException("Complex properties are not supported yet");
+                // TODO
+                throw new UnsupportedOperationException(
+                        "Complex properties are not supported yet");
             }
         }
-        
+
         return this;
-   }
-    
+    }
+
+    /**
+     * Adds an array property.
+     * @param name the property name
+     * @param values the array
+     * @return the current instance
+     */
     public Instance addProperty(String name, String[] values) {
         Element elem = new Element("property", "");
         elem.addAttribute(new Attribute("name", name));
         elem.addAttribute(new Attribute("type", "array"));
 
         m_conf.add(elem);
-        
+
         for (int i = 0; i < values.length; i++) {
             Object obj = values[i];
             Element e = new Element("property", "");
             elem.addElement(e);
             e.addAttribute(new Attribute("value", obj.toString()));
         }
-        
+
         return this;
-   }
-    
+    }
+
+    /**
+     * Adds a vector property.
+     * @param name the property name
+     * @param values the vector
+     * @return the current instance
+     */
     public Instance addProperty(String name, Vector values) {
         Element elem = new Element("property", "");
         elem.addAttribute(new Attribute("name", name));
@@ -101,14 +143,21 @@
             if (obj instanceof String) {
                 e.addAttribute(new Attribute("value", obj.toString()));
             } else {
-                // TODO 
-               throw new UnsupportedOperationException("Complex properties are not supported yet");
+                // TODO
+                throw new UnsupportedOperationException(
+                        "Complex properties are not supported yet");
             }
         }
-        
+
         return this;
-   }
-    
+    }
+
+    /**
+     * Adds a map property.
+     * @param name the property name
+     * @param values the map
+     * @return the current instance
+     */
     public Instance addProperty(String name, Map values) {
         Element elem = new Element("property", "");
         elem.addAttribute(new Attribute("name", name));
@@ -117,7 +166,7 @@
         m_conf.add(elem);
         Set entries = values.entrySet();
         Iterator it = entries.iterator();
-        while(it.hasNext()) {
+        while (it.hasNext()) {
             Map.Entry entry = (Entry) it.next();
             Element e = new Element("property", "");
             elem.addElement(e);
@@ -128,14 +177,21 @@
                 e.addAttribute(new Attribute("name", n));
                 e.addAttribute(new Attribute("value", v.toString()));
             } else {
-                // TODO 
-               throw new UnsupportedOperationException("Complex properties are not supported yet");
+                // TODO
+                throw new UnsupportedOperationException(
+                        "Complex properties are not supported yet");
             }
         }
-        
+
         return this;
-   }
-    
+    }
+
+    /**
+     * Adds a dictionary property.
+     * @param name the property name
+     * @param values the dictionary
+     * @return the current instance
+     */
     public Instance addProperty(String name, Dictionary values) {
         Element elem = new Element("property", "");
         elem.addAttribute(new Attribute("name", name));
@@ -143,7 +199,7 @@
 
         m_conf.add(elem);
         Enumeration e = values.keys();
-        while(e.hasMoreElements()) {
+        while (e.hasMoreElements()) {
             Element el = new Element("property", "");
             elem.addElement(el);
 
@@ -153,20 +209,30 @@
                 el.addAttribute(new Attribute("name", n));
                 el.addAttribute(new Attribute("value", v.toString()));
             } else {
-                // TODO 
-               throw new UnsupportedOperationException("Complex properties are not supported yet");
+                // TODO
+                throw new UnsupportedOperationException(
+                        "Complex properties are not supported yet");
             }
         }
-        
-        return this;
-   }
 
+        return this;
+    }
+
+    /**
+     * Ensures the validity of the instance description.
+     */
     private void ensureValidity() {
-        if(m_type == null) {
-            throw new IllegalStateException("Invalid containted instance configuration : the component type is not set");
+        if (m_type == null) {
+            throw new IllegalStateException(
+                    "Invalid containted instance configuration : the component type is not set");
         }
     }
-    
+
+    /**
+     * Gets the instance description in the Element-Attribute form.
+     * @return the root Element of the instance description 
+     * @see org.apache.felix.ipojo.api.HandlerConfiguration#getElement()
+     */
     public Element getElement() {
         ensureValidity();
         Element instance = new Element("instance", "");
@@ -177,4 +243,4 @@
         }
         return instance;
     }
-}
\ No newline at end of file
+}
diff --git a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/InstantiatedService.java b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/InstantiatedService.java
index b53c636..fa67c02 100644
--- a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/InstantiatedService.java
+++ b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/InstantiatedService.java
@@ -24,76 +24,79 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 import java.util.Vector;
-import java.util.Map.Entry;
 
 import org.apache.felix.ipojo.api.HandlerConfiguration;
 import org.apache.felix.ipojo.metadata.Attribute;
 import org.apache.felix.ipojo.metadata.Element;
 import org.apache.felix.ipojo.util.DependencyModel;
 
+/**
+ * Allows defining an instantiated sub-service. An instantiated sub-
+ * service will be reified by instances publishing the required service. 
+ * Those instances are created from public factories
+ * inside the composite.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public class InstantiatedService implements HandlerConfiguration {
-    
+
     /**
      * The required specification.
      */
     private String m_specification;
-    
+
     /**
-     * The LDAP filter of the dependency. 
+     * The LDAP filter of the dependency.
      */
     private String m_filter;
-    
+
     /**
-     * Is the dependency optional? 
+     * Is the dependency optional?
      */
     private boolean m_optional;
-    
+
     /**
-     * Is the dependency aggregate? 
+     * Is the dependency aggregate?
      */
     private boolean m_aggregate;
-  
+
     /**
-     * The dependency binding policy. 
-     * Default: Dynamic policy.
+     * The dependency binding policy. Default: Dynamic policy.
      */
     private int m_policy = DependencyModel.DYNAMIC_BINDING_POLICY;
-    
+
     /**
-     * The dependency comparator.
-     * (used to compare service providers) 
+     * The dependency comparator. (used to compare service providers)
      */
     private String m_comparator;
-    
+
     /**
-     * Instance configuration
-     * List of Element (Property)
+     * Instance configuration List of Element (Property).
      */
     private List m_conf = new ArrayList();
-    
+
     /**
      * Gets the dependency metadata.
-     * @return the 'requires' element describing
-     * the current dependency.
+     * @return the 'subservice' element describing the current 
+    * instantiated service.
      */
     public Element getElement() {
         ensureValidity();
-        
+
         Element dep = new Element("subservice", "");
         dep.addAttribute(new Attribute("action", "instantiate"));
-       
+
         dep.addAttribute(new Attribute("specification", m_specification));
 
-        
         if (m_filter != null) {
             dep.addAttribute(new Attribute("filter", m_filter));
         }
         if (m_comparator != null) {
             dep.addAttribute(new Attribute("comparator", m_comparator));
         }
-  
+
         if (m_optional) {
             dep.addAttribute(new Attribute("optional", "true"));
         }
@@ -108,15 +111,21 @@
         } else if (m_policy == DependencyModel.DYNAMIC_PRIORITY_BINDING_POLICY) {
             dep.addAttribute(new Attribute("policy", "dynamic-priority"));
         }
-        
+
         for (int i = 0; i < m_conf.size(); i++) {
             Element elem = (Element) m_conf.get(i);
             dep.addElement(elem);
         }
-        
+
         return dep;
     }
-    
+
+    /**
+     * Adds a string property.
+     * @param name the property name
+     * @param value the property value
+     * @return the current instantiated sub-service
+     */
     public InstantiatedService addProperty(String name, String value) {
         Element elem = new Element("property", "");
         m_conf.add(elem);
@@ -124,14 +133,20 @@
         elem.addAttribute(new Attribute("value", value));
         return this;
     }
-    
+
+    /**
+     * Adds a list property.
+     * @param name the property name
+     * @param values the property value
+     * @return the current instantiated sub-service
+     */
     public InstantiatedService addProperty(String name, List values) {
         Element elem = new Element("property", "");
         elem.addAttribute(new Attribute("name", name));
         elem.addAttribute(new Attribute("type", "list"));
 
         m_conf.add(elem);
-        
+
         for (int i = 0; i < values.size(); i++) {
             Object obj = values.get(i);
             Element e = new Element("property", "");
@@ -139,31 +154,44 @@
             if (obj instanceof String) {
                 e.addAttribute(new Attribute("value", obj.toString()));
             } else {
-                // TODO 
-               throw new UnsupportedOperationException("Complex properties are not supported yet");
+                // TODO
+                throw new UnsupportedOperationException(
+                        "Complex properties are not supported yet");
             }
         }
-        
+
         return this;
-   }
-    
+    }
+
+    /**
+     * Adds an array property.
+     * @param name the property name
+     * @param values the property value
+     * @return the current instantiated sub-service
+     */
     public InstantiatedService addProperty(String name, String[] values) {
         Element elem = new Element("property", "");
         elem.addAttribute(new Attribute("name", name));
         elem.addAttribute(new Attribute("type", "array"));
 
         m_conf.add(elem);
-        
+
         for (int i = 0; i < values.length; i++) {
             Object obj = values[i];
             Element e = new Element("property", "");
             elem.addElement(e);
             e.addAttribute(new Attribute("value", obj.toString()));
         }
-        
+
         return this;
-   }
-    
+    }
+
+    /**
+     * Adds a vector property.
+     * @param name the property name
+     * @param values the property value
+     * @return the current instantiated sub-service
+     */
     public InstantiatedService addProperty(String name, Vector values) {
         Element elem = new Element("property", "");
         elem.addAttribute(new Attribute("name", name));
@@ -178,14 +206,21 @@
             if (obj instanceof String) {
                 e.addAttribute(new Attribute("value", obj.toString()));
             } else {
-                // TODO 
-               throw new UnsupportedOperationException("Complex properties are not supported yet");
+                // TODO
+                throw new UnsupportedOperationException(
+                        "Complex properties are not supported yet");
             }
         }
-        
+
         return this;
-   }
-    
+    }
+
+    /**
+     * Adds a map property.
+     * @param name the property name
+     * @param values the property value
+     * @return the current instantiated sub-service
+     */
     public InstantiatedService addProperty(String name, Map values) {
         Element elem = new Element("property", "");
         elem.addAttribute(new Attribute("name", name));
@@ -194,7 +229,7 @@
         m_conf.add(elem);
         Set entries = values.entrySet();
         Iterator it = entries.iterator();
-        while(it.hasNext()) {
+        while (it.hasNext()) {
             Map.Entry entry = (Entry) it.next();
             Element e = new Element("property", "");
             elem.addElement(e);
@@ -205,14 +240,21 @@
                 e.addAttribute(new Attribute("name", n));
                 e.addAttribute(new Attribute("value", v.toString()));
             } else {
-                // TODO 
-               throw new UnsupportedOperationException("Complex properties are not supported yet");
+                // TODO
+                throw new UnsupportedOperationException(
+                        "Complex properties are not supported yet");
             }
         }
-        
+
         return this;
-   }
-    
+    }
+
+    /**
+     * Adds a dictionary property.
+     * @param name the property name
+     * @param values the property value
+     * @return the current instantiated sub-service
+     */
     public InstantiatedService addProperty(String name, Dictionary values) {
         Element elem = new Element("property", "");
         elem.addAttribute(new Attribute("name", name));
@@ -220,7 +262,7 @@
 
         m_conf.add(elem);
         Enumeration e = values.keys();
-        while(e.hasMoreElements()) {
+        while (e.hasMoreElements()) {
             Element el = new Element("property", "");
             elem.addElement(el);
 
@@ -230,90 +272,90 @@
                 el.addAttribute(new Attribute("name", n));
                 el.addAttribute(new Attribute("value", v.toString()));
             } else {
-                // TODO 
-               throw new UnsupportedOperationException("Complex properties are not supported yet");
+                // TODO
+                throw new UnsupportedOperationException(
+                        "Complex properties are not supported yet");
             }
         }
-        
+
         return this;
-   }
-    
+    }
+
     /**
      * Sets the required service specification.
      * @param spec the specification
-     * @return the current imported sub-service.
+     * @return the current instantiated sub-service
      */
     public InstantiatedService setSpecification(String spec) {
         m_specification = spec;
         return this;
     }
-    
+
     /**
      * Sets the dependency filter.
      * @param filter the LDAP filter
-     * @return the current imported sub-service
+     * @return the current instantiated sub-service
      */
     public InstantiatedService setFilter(String filter) {
         m_filter = filter;
         return this;
     }
-    
-    
+
     /**
      * Sets the dependency optionality.
-     * @param opt <code>true</code> to set the 
-     * dependency to optional.
-     * @return the current imported sub-service.
+     * @param opt <code>true</code> to set the dependency to optional.
+     * @return the current instantiated sub-service
      */
     public InstantiatedService setOptional(boolean opt) {
         m_optional = opt;
         return this;
     }
-    
+
     /**
      * Sets the dependency cardinality.
-     * @param agg <code>true</code> to set the 
-     * dependency to aggregate.
-     * @return the current imported sub-service.
+     * @param agg <code>true</code> to set the dependency to aggregate.
+     * @return the current instantiated sub-service
      */
     public InstantiatedService setAggregate(boolean agg) {
         m_aggregate = agg;
         return this;
     }
-    
-    
+
     /**
      * Sets the dependency binding policy.
      * @param policy the binding policy
-     * @return the current imported sub-service
+     * @return the current instantiated sub-service
      */
     public InstantiatedService setBindingPolicy(int policy) {
         m_policy = policy;
         return this;
     }
-    
+
     /**
      * Sets the dependency comparator.
      * @param cmp the comparator class name
-     * @return the current imported sub-service
+     * @return the current instantiated sub-service
      */
     public InstantiatedService setComparator(String cmp) {
         m_comparator = cmp;
         return this;
     }
-    
+
     /**
      * Checks dependency configuration validity.
      */
     private void ensureValidity() {
         // Check specification
         if (m_specification == null) {
-            throw new IllegalStateException("The specification of the instantiated service must be set");
+            throw new IllegalStateException(
+                    "The specification of the instantiated service must be set");
         }
 
         // Check binding policy.
-        if (!(m_policy == DependencyModel.DYNAMIC_BINDING_POLICY || m_policy == DependencyModel.STATIC_BINDING_POLICY || m_policy == DependencyModel.DYNAMIC_PRIORITY_BINDING_POLICY)) {
-            throw new IllegalStateException("Unknown binding policy : " + m_policy);
+        if (!(m_policy == DependencyModel.DYNAMIC_BINDING_POLICY
+                || m_policy == DependencyModel.STATIC_BINDING_POLICY || m_policy == DependencyModel.DYNAMIC_PRIORITY_BINDING_POLICY)) {
+            throw new IllegalStateException("Unknown binding policy : "
+                    + m_policy);
         }
     }
 
diff --git a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/ProvidedService.java b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/ProvidedService.java
index 136419e..922c992 100644
--- a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/ProvidedService.java
+++ b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/ProvidedService.java
@@ -25,13 +25,25 @@
 import org.apache.felix.ipojo.metadata.Attribute;
 import org.apache.felix.ipojo.metadata.Element;
 
+/**
+ * Allows defining a provided service. A provided service is a service
+ * 'implemented' by the composite. This implementations relies (by 
+ * delegation) on contained instances and services. 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public class ProvidedService implements HandlerConfiguration {
+    /**
+     * Delegation policy: all.
+     */
     public static final String ALL_POLICY = "all";
-    public static final String ONE_POLICY = "one";
-    
     
     /**
-     * The required specification.
+     * Delegation policy: one. 
+     */
+    public static final String ONE_POLICY = "one";
+    
+    /**
+     * The provided specification.
      */
     private String m_specification;
     
@@ -41,12 +53,11 @@
      */
     private List m_delegation = new ArrayList();
 
-    
-   
+
     /**
-     * Gets the dependency metadata.
-     * @return the 'requires' element describing
-     * the current dependency.
+     * Gets the provided element.
+     * @return the 'provides' element describing
+     * the current provided service.
      */
     public Element getElement() {
         ensureValidity();
@@ -64,9 +75,9 @@
     }
     
     /**
-     * Sets the required service specification.
+     * Sets the provided service specification.
      * @param spec the specification
-     * @return the current exported service.
+     * @return the current provided service.
      */
     public ProvidedService setSpecification(String spec) {
         m_specification = spec;
@@ -74,7 +85,7 @@
     }
     
     /**
-     * Sets the delegation policy of the given method
+     * Sets the delegation policy of the given method.
      * @param method  the method name
      * @param policy the delegation policy
      * @return the current exported service.
@@ -89,7 +100,7 @@
 
     
     /**
-     * Checks dependency configuration validity.
+     * Checks provided service configuration validity.
      */
     private void ensureValidity() {
         // Check specification
diff --git a/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/ExportedServiceTest.java b/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/ExportedServiceTest.java
index ef665ed..3a7dd37 100644
--- a/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/ExportedServiceTest.java
+++ b/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/ExportedServiceTest.java
@@ -1,42 +1,69 @@
+/* 
+ * 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.api.composite;
 
-
 import junit.framework.TestCase;
 
 import org.apache.felix.ipojo.metadata.Element;
 
+/**
+ * Test about {@link ExportedService}.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public class ExportedServiceTest extends TestCase {
-    
 
+    //
+    // <comp:composite name="composite.export.5" architecture="true">
+    // <subservice action="import"
+    // specification="org.apache.felix.ipojo.test.composite.service.BazService"
+    // aggregate="true" optional="true" filter="(!(instance.name=export))"
+    // scope="composite" />
+    // <comp:provides action="export"
+    // specification="org.apache.felix.ipojo.test.composite.service.BazService"
+    // filter="(instance.name=foo1)" />
+    // </comp:composite>
 
-//
-//<comp:composite name="composite.export.5" architecture="true">
-//    <subservice action="import"
-//        specification="org.apache.felix.ipojo.test.composite.service.BazService"
-//        aggregate="true" optional="true" filter="(!(instance.name=export))"
-//        scope="composite" />
-//    <comp:provides action="export"
-//        specification="org.apache.felix.ipojo.test.composite.service.BazService"
-//        filter="(instance.name=foo1)" />
-//</comp:composite>
-
-//    <comp:provides action="export"
-//      specification="org.apache.felix.ipojo.test.composite.service.BazService" />
+    // <comp:provides action="export"
+    // specification="org.apache.felix.ipojo.test.composite.service.BazService"
+    // />
+    /**
+     * Tests simple export.
+     */
     public void testSimple() {
         ExportedService svc = new ExportedService()
-        .setSpecification("org.apache.felix.ipojo.test.composite.service.BazService");
-        
+                .setSpecification("org.apache.felix.ipojo.test.composite.service.BazService");
+
         Element elem = svc.getElement();
-        String name = elem.getName();
-        String action = elem.getAttribute("action");
         String spec = elem.getAttribute("specification");
-        assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.BazService", spec);
+        assertEquals("spec",
+                "org.apache.felix.ipojo.test.composite.service.BazService",
+                spec);
     }
-    
+
+    /**
+     * Tests a malformed export.
+     */
     public void testBad() {
         ExportedService svc = new ExportedService()
-            //.setSpecification("org.apache.felix.ipojo.test.composite.service.BarService") NO SPEC
-            ;
+        // .setSpecification("org.apache.felix.ipojo.test.composite.service.BarService")
+        // NO SPEC
+        ;
         try {
             svc.getElement();
             fail("Invalid element accepted");
@@ -44,75 +71,90 @@
             // OK
         }
     }
-    
- 
-//  <comp:provides action="export"
-//  specification="org.apache.felix.ipojo.test.composite.service.BazService"
-//  aggregate="true" />
+
+    // <comp:provides action="export"
+    // specification="org.apache.felix.ipojo.test.composite.service.BazService"
+    // aggregate="true" />
+    /**
+     * Tests aggregate export.
+     */
     public void testAggregate() {
-        ExportedService svc = new ExportedService()
-        .setSpecification("org.apache.felix.ipojo.test.composite.service.BazService")
-        .setAggregate(true);
-        
-        
+        ExportedService svc = new ExportedService().setSpecification(
+                "org.apache.felix.ipojo.test.composite.service.BazService")
+                .setAggregate(true);
+
         Element elem = svc.getElement();
         String spec = elem.getAttribute("specification");
         String agg = elem.getAttribute("aggregate");
 
-        assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.BazService", spec);
+        assertEquals("spec",
+                "org.apache.felix.ipojo.test.composite.service.BazService",
+                spec);
         assertEquals("aggregate", "true", agg);
     }
-    
-//  <comp:provides action="export"
-//  specification="org.apache.felix.ipojo.test.composite.service.BazService"
-//  optional="true" />
+
+    // <comp:provides action="export"
+    // specification="org.apache.felix.ipojo.test.composite.service.BazService"
+    // optional="true" />
+    /**
+     * Tests optional export.
+     */
     public void testOptional() {
-        ExportedService svc = new ExportedService()
-        .setSpecification("org.apache.felix.ipojo.test.composite.service.BazService")
-        .setOptional(true);
-        
-        
+        ExportedService svc = new ExportedService().setSpecification(
+                "org.apache.felix.ipojo.test.composite.service.BazService")
+                .setOptional(true);
+
         Element elem = svc.getElement();
         String spec = elem.getAttribute("specification");
         String opt = elem.getAttribute("optional");
 
-        assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.BazService", spec);
+        assertEquals("spec",
+                "org.apache.felix.ipojo.test.composite.service.BazService",
+                spec);
         assertEquals("optional", "true", opt);
     }
-//  <comp:provides action="export"
-//  specification="org.apache.felix.ipojo.test.composite.service.BazService"
-//  aggregate="true" optional="true" />
+
+    // <comp:provides action="export"
+    // specification="org.apache.felix.ipojo.test.composite.service.BazService"
+    // aggregate="true" optional="true" />
+    /**
+     * Tests optional and aggregate export.
+     */
     public void testOptionalAndAggregate() {
-        ExportedService svc = new ExportedService()
-        .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService")
-        .setOptional(true)
-        .setAggregate(true);
-        
-        
+        ExportedService svc = new ExportedService().setSpecification(
+                "org.apache.felix.ipojo.test.composite.service.FooService")
+                .setOptional(true).setAggregate(true);
+
         Element elem = svc.getElement();
         String spec = elem.getAttribute("specification");
         String opt = elem.getAttribute("optional");
         String agg = elem.getAttribute("aggregate");
 
-
-        assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.FooService", spec);
+        assertEquals("spec",
+                "org.apache.felix.ipojo.test.composite.service.FooService",
+                spec);
         assertEquals("optional", "true", opt);
         assertEquals("aggregate", "true", agg);
     }
 
-//  <comp:provides action="export"
-//  specification="org.apache.felix.ipojo.test.composite.service.BazService"
-//  filter="(instance.name=foo1)" />
+    // <comp:provides action="export"
+    // specification="org.apache.felix.ipojo.test.composite.service.BazService"
+    // filter="(instance.name=foo1)" />
+    /**
+     * Tests filtered export.
+     */
     public void testFilter() {
-        ExportedService svc = new ExportedService()
-        .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService")
-        .setFilter("(&(int=2)(long=40))");
-         
+        ExportedService svc = new ExportedService().setSpecification(
+                "org.apache.felix.ipojo.test.composite.service.FooService")
+                .setFilter("(&(int=2)(long=40))");
+
         Element elem = svc.getElement();
         String spec = elem.getAttribute("specification");
         String filter = elem.getAttribute("filter");
 
-        assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.FooService", spec);
+        assertEquals("spec",
+                "org.apache.felix.ipojo.test.composite.service.FooService",
+                spec);
         assertEquals("filter", "(&(int=2)(long=40))", filter);
     }
 
diff --git a/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/ImportedServiceTest.java b/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/ImportedServiceTest.java
index 5cf580c..3c889bf 100644
--- a/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/ImportedServiceTest.java
+++ b/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/ImportedServiceTest.java
@@ -1,30 +1,60 @@
+/* 
+ * 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.api.composite;
 
-
 import junit.framework.TestCase;
 
 import org.apache.felix.ipojo.metadata.Element;
 
+/**
+ * Tests about {@link ImportedService}.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public class ImportedServiceTest extends TestCase {
-    
-//    <comp:composite name="composite.requires.1" architecture="true">
-//    <subservice action="import"
-//        specification="org.apache.felix.ipojo.test.composite.service.FooService"
-//        scope="composite" />
-//</comp:composite>
+
+    // <comp:composite name="composite.requires.1" architecture="true">
+    // <subservice action="import"
+    // specification="org.apache.felix.ipojo.test.composite.service.FooService"
+    // scope="composite" />
+    // </comp:composite>
+    /**
+     * Simple test.
+     */
     public void testSimple() {
         ImportedService svc = new ImportedService()
-        .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService");
-        
+                .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService");
+
         Element elem = svc.getElement();
         String spec = elem.getAttribute("specification");
-        assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.FooService", spec);
+        assertEquals("spec",
+                "org.apache.felix.ipojo.test.composite.service.FooService",
+                spec);
     }
-    
+
+    /**
+     * Malformed import.
+     */
     public void testBad() {
         ImportedService svc = new ImportedService()
-            //.setSpecification("org.apache.felix.ipojo.test.composite.service.BarService") NO SPEC
-            ;
+        // .setSpecification("org.apache.felix.ipojo.test.composite.service.BarService")
+        // NO SPEC
+        ;
         try {
             svc.getElement();
             fail("Invalid element accepted");
@@ -32,110 +62,129 @@
             // OK
         }
     }
-    
+
+    /**
+     * Tests scopes.
+     */
     public void testScope() {
-        ImportedService svc = new ImportedService()
-        .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService")
-        .setScope(ImportedService.COMPOSITE_SCOPE);
-        
-        
+        ImportedService svc = new ImportedService().setSpecification(
+                "org.apache.felix.ipojo.test.composite.service.FooService")
+                .setScope(ImportedService.COMPOSITE_SCOPE);
+
         Element elem = svc.getElement();
         String spec = elem.getAttribute("specification");
         String scope = elem.getAttribute("scope");
-        assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.FooService", spec);
+        assertEquals("spec",
+                "org.apache.felix.ipojo.test.composite.service.FooService",
+                spec);
         assertEquals("scope", "composite", scope);
 
     }
-    
-//
-//<comp:composite name="composite.requires.2" architecture="true">
-//    <subservice action="import"
-//        specification="org.apache.felix.ipojo.test.composite.service.FooService"
-//        aggregate="true" scope="composite" />
-//</comp:composite>
+
+    //
+    // <comp:composite name="composite.requires.2" architecture="true">
+    // <subservice action="import"
+    // specification="org.apache.felix.ipojo.test.composite.service.FooService"
+    // aggregate="true" scope="composite" />
+    // </comp:composite>
+    /**
+     * Tests aggregate.
+     */
     public void testAggregate() {
-        ImportedService svc = new ImportedService()
-        .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService")
-        .setScope(ImportedService.COMPOSITE_SCOPE)
-        .setAggregate(true);
-        
-        
+        ImportedService svc = new ImportedService().setSpecification(
+                "org.apache.felix.ipojo.test.composite.service.FooService")
+                .setScope(ImportedService.COMPOSITE_SCOPE).setAggregate(true);
+
         Element elem = svc.getElement();
         String spec = elem.getAttribute("specification");
         String scope = elem.getAttribute("scope");
         String agg = elem.getAttribute("aggregate");
 
-        assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.FooService", spec);
+        assertEquals("spec",
+                "org.apache.felix.ipojo.test.composite.service.FooService",
+                spec);
         assertEquals("scope", "composite", scope);
         assertEquals("aggregate", "true", agg);
     }
-    
-//
-//<comp:composite name="composite.requires.3" architecture="true">
-//    <subservice action="import"
-//        specification="org.apache.felix.ipojo.test.composite.service.FooService"
-//        optional="true" scope="composite" />
-//</comp:composite>
+
+    //
+    // <comp:composite name="composite.requires.3" architecture="true">
+    // <subservice action="import"
+    // specification="org.apache.felix.ipojo.test.composite.service.FooService"
+    // optional="true" scope="composite" />
+    // </comp:composite>
+    /**
+     * Tests optional.
+     */
     public void testOptional() {
-        ImportedService svc = new ImportedService()
-        .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService")
-        .setScope(ImportedService.COMPOSITE_SCOPE)
-        .setOptional(true);
-        
-        
+        ImportedService svc = new ImportedService().setSpecification(
+                "org.apache.felix.ipojo.test.composite.service.FooService")
+                .setScope(ImportedService.COMPOSITE_SCOPE).setOptional(true);
+
         Element elem = svc.getElement();
         String spec = elem.getAttribute("specification");
         String scope = elem.getAttribute("scope");
         String opt = elem.getAttribute("optional");
 
-        assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.FooService", spec);
+        assertEquals("spec",
+                "org.apache.felix.ipojo.test.composite.service.FooService",
+                spec);
         assertEquals("scope", "composite", scope);
         assertEquals("optional", "true", opt);
     }
-//
-//<comp:composite name="composite.requires.4" architecture="true">
-//    <subservice action="import"
-//        specification="org.apache.felix.ipojo.test.composite.service.FooService"
-//        optional="true" aggregate="true" scope="comp:composite" />
-//</comp:composite>
+
+    //
+    // <comp:composite name="composite.requires.4" architecture="true">
+    // <subservice action="import"
+    // specification="org.apache.felix.ipojo.test.composite.service.FooService"
+    // optional="true" aggregate="true" scope="comp:composite" />
+    // </comp:composite>
+    /**
+     * Tests optional and aggregate.
+     */
     public void testOptionalAndAggregate() {
-        ImportedService svc = new ImportedService()
-        .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService")
-        .setScope(ImportedService.COMPOSITE_SCOPE)
-        .setOptional(true)
-        .setAggregate(true);
-        
-        
+        ImportedService svc = new ImportedService().setSpecification(
+                "org.apache.felix.ipojo.test.composite.service.FooService")
+                .setScope(ImportedService.COMPOSITE_SCOPE).setOptional(true)
+                .setAggregate(true);
+
         Element elem = svc.getElement();
         String spec = elem.getAttribute("specification");
         String scope = elem.getAttribute("scope");
         String opt = elem.getAttribute("optional");
         String agg = elem.getAttribute("aggregate");
 
-
-        assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.FooService", spec);
+        assertEquals("spec",
+                "org.apache.felix.ipojo.test.composite.service.FooService",
+                spec);
         assertEquals("scope", "composite", scope);
         assertEquals("optional", "true", opt);
         assertEquals("aggregate", "true", agg);
     }
-//
-//<comp:composite name="composite.requires.5" architecture="true">
-//    <subservice action="import"
-//        specification="org.apache.felix.ipojo.test.composite.service.FooService"
-//        filter="(&amp;(int=2)(long=40))" scope="composite" />
-//</comp:composite>
+
+    //
+    // <comp:composite name="composite.requires.5" architecture="true">
+    // <subservice action="import"
+    // specification="org.apache.felix.ipojo.test.composite.service.FooService"
+    // filter="(&amp;(int=2)(long=40))" scope="composite" />
+    // </comp:composite>
+    /**
+     * Tests filter.
+     */
     public void testFilter() {
-        ImportedService svc = new ImportedService()
-        .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService")
-        .setScope(ImportedService.COMPOSITE_SCOPE)
-        .setFilter("(&(int=2)(long=40))");
-         
+        ImportedService svc = new ImportedService().setSpecification(
+                "org.apache.felix.ipojo.test.composite.service.FooService")
+                .setScope(ImportedService.COMPOSITE_SCOPE).setFilter(
+                        "(&(int=2)(long=40))");
+
         Element elem = svc.getElement();
         String spec = elem.getAttribute("specification");
         String scope = elem.getAttribute("scope");
         String filter = elem.getAttribute("filter");
 
-        assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.FooService", spec);
+        assertEquals("spec",
+                "org.apache.felix.ipojo.test.composite.service.FooService",
+                spec);
         assertEquals("scope", "composite", scope);
         assertEquals("filter", "(&(int=2)(long=40))", filter);
     }
diff --git a/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/InstanceTest.java b/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/InstanceTest.java
index 9d96ae3..02ab484 100644
--- a/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/InstanceTest.java
+++ b/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/InstanceTest.java
@@ -30,8 +30,15 @@
 
 import org.apache.felix.ipojo.metadata.Element;
 
+/**
+ * Tests about {@link Instance}.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public class InstanceTest extends TestCase {
     
+    /**
+     * One simple instance.
+     */
     public void testJustComponent() {
         Instance inst = new Instance("mycmp");
         Element elem = inst.getElement();
@@ -39,6 +46,9 @@
         assertEquals("Check component attribute", "mycmp", cmp);
     }
     
+    /**
+     * Sting property.
+     */
     public void testStringProp() {
         Instance inst = new Instance("mycmp");
         inst.addProperty("p1", "v1");
@@ -59,6 +69,9 @@
 
     }
     
+    /**
+     * Several properties.
+     */
     public void testStringProps() {
         Instance inst = new Instance("mycmp");
         inst.addProperty("p1", "v1");
@@ -79,6 +92,9 @@
         assertEquals("Check property 1 - value", "v2", v);
     }
     
+    /**
+     * List property.
+     */
     public void testListProp() {
         Instance inst = new Instance("mycmp");
         List list = new ArrayList();
@@ -112,6 +128,9 @@
         }
     }
     
+    /**
+     * Array property.
+     */
     public void testArrayProp() {
         Instance inst = new Instance("mycmp");
         String[] list = new String[] {"a", "a", "a"};
@@ -142,6 +161,9 @@
         }
     }
     
+    /**
+     * Vector property.
+     */
     public void testVectorProp() {
         Instance inst = new Instance("mycmp");
         Vector list = new Vector();
@@ -176,6 +198,9 @@
         }
     }
     
+    /**
+     * Map property.
+     */
     public void testMapProp() {
         Instance inst = new Instance("mycmp");
         Map map = new HashMap();
@@ -209,6 +234,9 @@
         }
     }
     
+    /**
+     * Dictionary property.
+     */
     public void testDictProp() {
         Instance inst = new Instance("mycmp");
         Dictionary map = new Properties();
diff --git a/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/InstantiatedServiceTest.java b/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/InstantiatedServiceTest.java
index 7aed767..ec878bf 100644
--- a/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/InstantiatedServiceTest.java
+++ b/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/InstantiatedServiceTest.java
@@ -1,3 +1,21 @@
+/* 
+ * 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.api.composite;
 
 
@@ -5,12 +23,19 @@
 
 import org.apache.felix.ipojo.metadata.Element;
 
+/**
+ * Tests about {@link InstantiatedService}.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public class InstantiatedServiceTest extends TestCase {
     
 //    <comp:composite name="composite.bar.1" architecture="true">
 //    <subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.BarService"/>
 //</comp:composite>
     
+    /**
+     * Simple test.
+     */
     public void testSimple() {
         InstantiatedService svc = new InstantiatedService()
             .setSpecification("org.apache.felix.ipojo.test.composite.service.BarService");
@@ -22,6 +47,9 @@
         assertEquals("action" , "instantiate", action);
     }
     
+    /**
+     * Malformed instantiated service.
+     */
     public void testBad() {
         InstantiatedService svc = new InstantiatedService()
             //.setSpecification("org.apache.felix.ipojo.test.composite.service.BarService") NO SPEC
@@ -42,6 +70,9 @@
 //    <subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.BarService" aggregate="true"/>
 //</comp:composite>
     
+    /**
+     * Aggregate.
+     */
     public void testAggregate() {
         InstantiatedService svc = new InstantiatedService()
             .setSpecification("org.apache.felix.ipojo.test.composite.service.BarService")
@@ -62,6 +93,9 @@
 //<comp:composite name="composite.bar.3" architecture="true">
 //    <subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.BarService" optional="true"/>
 //</comp:composite>
+    /**
+     * Optional.
+     */
     public void testOptional() {
         InstantiatedService svc = new InstantiatedService()
             .setSpecification("org.apache.felix.ipojo.test.composite.service.BarService")
@@ -82,6 +116,9 @@
 //<comp:composite name="composite.bar.4" architecture="true">
 //    <subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.FooService" aggregate="true" optional="true"/>
 //</comp:composite>
+    /**
+     * Aggregate and optional.
+     */
     public void testOptionalAndAggregate() {
         InstantiatedService svc = new InstantiatedService()
             .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService")
@@ -108,6 +145,9 @@
 //        <property name="int" value="5"/>
 //    </subservice>
 //</comp:composite>
+    /**
+     * Instance configuration.
+     */
     public void testWithConfiguration() {
         InstantiatedService svc = new InstantiatedService()
             .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService")
