diff --git a/ipojo.arch/pom.xml b/ipojo.arch/pom.xml
index a6ca99d..4f1e91b 100644
--- a/ipojo.arch/pom.xml
+++ b/ipojo.arch/pom.xml
@@ -7,7 +7,7 @@
   <modelVersion>4.0.0</modelVersion>
   <packaging>ipojo-bundle</packaging>
   <name>Apache Felix iPOJO Arch Command</name>
-  <version>0.7.0-incubator-SNAPSHOT</version>
+  <version>0.7.1-incubator-SNAPSHOT</version>
   <artifactId>org.apache.felix.ipojo.arch</artifactId>
   <dependencies>
     <dependency>
@@ -18,6 +18,12 @@
     </dependency>
     <dependency>
       <groupId>${pom.groupId}</groupId>
+      <artifactId>org.apache.felix.ipojo.metadata</artifactId>
+      <version>${pom.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>${pom.groupId}</groupId>
       <artifactId>org.apache.felix.shell</artifactId>
       <version>0.9.0-incubator-SNAPSHOT</version>
       <scope>provided</scope>
@@ -32,7 +38,7 @@
         <configuration>
           <osgiManifest>
             <bundleName>iPOJO Arch Command</bundleName>
-            <bundleVersion>0.7.0.incubator-SNAPSHOT</bundleVersion>
+            <bundleVersion>0.7.1.incubator-SNAPSHOT</bundleVersion>
             <bundleSymbolicName>${pom.artifactId}</bundleSymbolicName>
             <bundleDescription>Architecture Shell Command (arch)</bundleDescription>
             <iPOJOMetadata>metadata.xml</iPOJOMetadata>
diff --git a/ipojo.arch/src/main/java/org/apache/felix/ipojo/arch/ArchCommandImpl.java b/ipojo.arch/src/main/java/org/apache/felix/ipojo/arch/ArchCommandImpl.java
index b32123c..830b6bc 100644
--- a/ipojo.arch/src/main/java/org/apache/felix/ipojo/arch/ArchCommandImpl.java
+++ b/ipojo.arch/src/main/java/org/apache/felix/ipojo/arch/ArchCommandImpl.java
@@ -21,8 +21,8 @@
 
 import java.io.PrintStream;
 
+import org.apache.felix.ipojo.ComponentInstance;
 import org.apache.felix.ipojo.architecture.Architecture;
-import org.apache.felix.ipojo.architecture.HandlerDescription;
 import org.apache.felix.ipojo.architecture.InstanceDescription;
 import org.ungoverned.osgi.service.shell.Command;
 
@@ -49,7 +49,7 @@
      * @see org.ungoverned.osgi.service.shell.Command#getUsage()
      */
     public String getUsage() {
-        return "arch -> Dispaly architecture information";
+        return "arch [instance name]";
     }
 
     /**
@@ -58,49 +58,32 @@
     public String getShortDescription() {
         return "Architecture command : display the architecture";
     }
-    
-    
-    /**
-     * Return the String corresponding to a component state.
-     * @param state : the state in int
-     * @return : the string of the state (Stopped, Unresolved, Resolved) or "Unknown" if state is not revelant
-     */
-    private String getInstanceState(int state) {
-        switch(state) {
-        case(0) :
-            return "STOPPED";
-        case(1) :
-            return "INVALID";
-        case(2) :
-            return  "VALID";
-        default :
-            return "UNKNOWN";
-        }
-    }
 
     /**
      * @see org.ungoverned.osgi.service.shell.Command#execute(java.lang.String, java.io.PrintStream, java.io.PrintStream)
      */
     public void execute(String line, PrintStream out, PrintStream err) {
         synchronized(this) { 
-        	for(int i=0; i < archiService.length; i++) {
-        		InstanceDescription instance = archiService[i].getInstanceDescription();       
-        		out.println("Instance : " + instance.getName() + " (" + instance.getComponentDescription().getClassName() + ")" + " - " + getInstanceState(instance.getState()) + " from bundle " + instance.getBundleId());
-        		for(int j = 0; j < instance.getHandlers().length; j++) {
-        			HandlerDescription hd = instance.getHandlers()[j];
-        			String hn = hd.getHandlerName();
-        			String hv = "valid";
-        			if(!hd.isValid()) { hv = "invalid"; }
-        			String hi = hd.getHandlerInfo();
-        			out.println("Handler : " + hn + " : " + hv);
-        			if(!hi.equals("")) { out.println(hi); }
+        	if(line.substring("arch".length()).trim().length() == 0) {
+        		for(int i=0; i < archiService.length; i++) {
+        			InstanceDescription instance = archiService[i].getInstanceDescription();
+        			if(instance.getState() == ComponentInstance.VALID) {
+        				out.println("Instance " + instance.getName() + " -> valid");
+        			}
+        			if(instance.getState() == ComponentInstance.INVALID) {
+        				out.println("Instance " + instance.getName() + " -> invalid");
+        			}
+        			if(instance.getState() == ComponentInstance.STOPPED) {
+        				out.println("Instance " + instance.getName() + " -> stopped");
+        			}
         		}
-        		
-        		out.println("Created POJO Objects : ");
-        		for(int j=0;  j < instance.getCreatedObjects().length; j++) {
-        			out.println("\t" + instance.getCreatedObjects()[j]);
+        	} else {
+        		String line2 = line.substring("arch".length()).trim();
+        		for(int i=0; i < archiService.length; i++) {
+        			InstanceDescription instance = archiService[i].getInstanceDescription();
+        			if(instance.getName().equalsIgnoreCase(line2)) { out.println(instance.getDescription()); return;}
         		}
-        		out.print("\n");
+        		err.println("Instance " + line2 + " not found");
         	}
         }
         
diff --git a/ipojo.metadata/pom.xml b/ipojo.metadata/pom.xml
index 9f1fe50..5cea035 100644
--- a/ipojo.metadata/pom.xml
+++ b/ipojo.metadata/pom.xml
@@ -7,6 +7,6 @@
   <modelVersion>4.0.0</modelVersion>
   <artifactId>org.apache.felix.ipojo.metadata</artifactId>
   <packaging>jar</packaging>
-  <version>0.7.0-incubator-SNAPSHOT</version>
+  <version>0.7.1-incubator-SNAPSHOT</version>
   <name>Apache Felix iPOJO Metadata</name>
 </project>
diff --git a/ipojo.metadata/src/main/java/org/apache/felix/ipojo/metadata/Element.java b/ipojo.metadata/src/main/java/org/apache/felix/ipojo/metadata/Element.java
index 4a821f8..cd00a72 100644
--- a/ipojo.metadata/src/main/java/org/apache/felix/ipojo/metadata/Element.java
+++ b/ipojo.metadata/src/main/java/org/apache/felix/ipojo/metadata/Element.java
@@ -309,5 +309,81 @@
 
 		return ns;
 	}
+	
+	public String toXMLString() {
+		return toXMLString(0);
+	}
+	
+	private String toXMLString(int indent) {
+		String xml = "";
+		
+		String tabs = "";
+		for(int j = 0; j < indent; j++) {
+			tabs += "\t";
+		}
+		
+		if(m_nameSpace.equals("")) {
+			xml = tabs + "<" + m_name;
+		} else {
+			xml = tabs + "<" + m_nameSpace+":"+m_name;
+		}
+		
+		for(int i = 0; i < m_attributes.length; i++) {
+			Attribute current = m_attributes[i];
+			if(current.getNameSpace().equals("")) {
+				xml += " " + current.getName() + "=\"" + current.getValue() + "\"";
+			} else {
+				xml += " " + current.getNameSpace() + ":" + current.getName() + "=\"" + current.getValue()+ "\"";
+			}
+		}
+		
+		if(m_elements.length == 0) { xml += "/>"; return xml; }
+		else {
+			xml+=">";
+			for(int i = 0; i < m_elements.length; i++) {
+				xml += "\n";
+				xml += m_elements[i].toXMLString(indent+1);
+			}
+			xml+="\n" + tabs + "</"+m_name+">";
+			return xml;
+		}
+	}
+	
+	public String toString() {
+		return toString(0);
+	}
+	
+	private String toString(int indent) {
+		String xml = "";
+		
+		String tabs = "";
+		for(int j = 0; j < indent; j++) {
+			tabs += "\t";
+		}
+		
+		if(m_nameSpace.equals("")) {
+			xml = tabs + m_name;
+		} else {
+			xml = tabs + m_nameSpace+":"+m_name;
+		}
+		
+		for(int i = 0; i < m_attributes.length; i++) {
+			Attribute current = m_attributes[i];
+			if(current.getNameSpace().equals("")) {
+				xml += " " + current.getName() + "=\"" + current.getValue() + "\"";
+			} else {
+				xml += " " + current.getNameSpace() + ":" + current.getName() + "=\"" + current.getValue()+ "\"";
+			}
+		}
+		
+		if(m_elements.length == 0) { return xml; }
+		else {
+			for(int i = 0; i < m_elements.length; i++) {
+				xml += "\n";
+				xml += m_elements[i].toString(indent+1);
+			}
+			return xml;
+		}
+	}
 
 }
diff --git a/ipojo.plugin/pom.xml b/ipojo.plugin/pom.xml
index b422357..3888168 100644
--- a/ipojo.plugin/pom.xml
+++ b/ipojo.plugin/pom.xml
@@ -6,7 +6,7 @@
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>org.apache.felix.ipojo.plugin</artifactId>
-  <version>0.7.0-incubator-SNAPSHOT</version>
+  <version>0.7.1-incubator-SNAPSHOT</version>
   <name>Apache Felix iPOJO Maven Plugin</name>
   <packaging>maven-plugin</packaging>
   <dependencies>
diff --git a/ipojo.plugin/src/main/java/org/apache/felix/ipojo/plugin/OsgiJarMojo.java b/ipojo.plugin/src/main/java/org/apache/felix/ipojo/plugin/OsgiJarMojo.java
index c61f91a..1367c13 100644
--- a/ipojo.plugin/src/main/java/org/apache/felix/ipojo/plugin/OsgiJarMojo.java
+++ b/ipojo.plugin/src/main/java/org/apache/felix/ipojo/plugin/OsgiJarMojo.java
@@ -152,7 +152,7 @@
 	private OsgiManifest				osgiManifest;
 	
 	private String[][] namespaces;
-	private List referedPackages; 
+	private List referredPackages; 
 
 	/**
 	 * Execute this Mojo
@@ -484,8 +484,8 @@
 		}
 		
 		// Add refered imports form the metadata
-		for(int i = 0; i < referedPackages.size(); i++) {
-			String pack = (String) referedPackages.get(i);
+		for(int i = 0; i < referredPackages.size(); i++) {
+			String pack = (String) referredPackages.get(i);
 			referred.add(pack);
 		}
 		
@@ -879,7 +879,7 @@
 			parser.parse(is);
 		    
 		    meta = handler.getMetadata();
-		    referedPackages = handler.getReferredPackages();
+		    referredPackages = handler.getReferredPackages();
 		    
 		} catch (MalformedURLException e) {
 			getLog().error("Malformed URL for " + outputDirectory+path+ "("+e.getMessage()+")");
diff --git a/ipojo/pom.xml b/ipojo/pom.xml
index eb1ea8d..9cc366f 100644
--- a/ipojo/pom.xml
+++ b/ipojo/pom.xml
@@ -5,10 +5,10 @@
     <version>0.9.0-incubator-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
-  <packaging>osgi-bundle</packaging>
+  <packaging>bundle</packaging>
   <name>Apache Felix iPOJO</name>
   <artifactId>org.apache.felix.ipojo</artifactId>
-  <version>0.7.0-incubator-SNAPSHOT</version>
+  <version>0.7.1-incubator-SNAPSHOT</version>
   <dependencies>
     <dependency>
       <groupId>${pom.groupId}</groupId>
@@ -24,39 +24,47 @@
     <dependency>
       <groupId>${pom.groupId}</groupId>
       <artifactId>org.apache.felix.ipojo.metadata</artifactId>
-      <version>0.7.0-incubator-SNAPSHOT</version>
+      <version>0.7.1-incubator-SNAPSHOT</version>
     </dependency>
   </dependencies>
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.felix.plugins</groupId>
-        <artifactId>maven-osgi-plugin</artifactId>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
         <extensions>true</extensions>
         <configuration>
-          <osgiManifest>
-            <bundleName>iPOJO</bundleName>
-            <bundleSymbolicName>${pom.artifactId}</bundleSymbolicName>
-            <bundleVendor>Clement ESCOFFIER</bundleVendor>
-            <bundleDescription> iPOJO </bundleDescription>
-            <importPackage>
-              org.osgi.framework; specification-version="1.3", 
-              org.osgi.service.cm; specification-version="1.2",
-              org.osgi.service.log; specification-version="1.3"
-            </importPackage>
-            <exportPackage>
-              org.apache.felix.ipojo, 
-              org.apache.felix.ipojo.metadata, 
-              org.apache.felix.ipojo.architecture, 
-              org.apache.felix.ipojo.parser,
-              org.apache.felix.ipojo.util,
-              org.apache.felix.ipojo.handlers.dependency,
-              org.apache.felix.ipojo.handlers.providedservice, 
-              org.apache.felix.ipojo.composite,
-              org.osgi.service.cm; specification-version="1.2",
-              org.osgi.service.log; specification-version="1.3"
-            </exportPackage>
-          </osgiManifest>
+          <instructions>          
+            <Bundle-Name>iPOJO</Bundle-Name>
+            <Bundle-Vendor>Clement ESCOFFIER</Bundle-Vendor>
+            <Bundle-Description> iPOJO </Bundle-Description>
+            <Import-Package>
+              org.osgi.framework; version="1.3", 
+              org.osgi.service.cm; version="1.2",
+              org.osgi.service.log; version="1.3"
+            </Import-Package>
+            <Private-Package>
+    			org.apache.felix.ipojo.composite.architecture,
+    			org.apache.felix.ipojo.composite.service*,
+    			org.apache.felix.ipojo.handlers.architecture,
+    			org.apache.felix.ipojo.handlers.configuration,
+    			org.apache.felix.ipojo.handlers.dependency.nullable,
+              	org.apache.felix.ipojo.handlers.lifecycle.callback,
+              	org.objectweb.asm*
+            </Private-Package>
+            <Export-Package>
+              org.apache.felix.ipojo; version="0.7.1", 
+              org.apache.felix.ipojo.metadata; version="0.7.1", 
+              org.apache.felix.ipojo.architecture; version="0.7.1", 
+              org.apache.felix.ipojo.parser; version="0.7.1",
+              org.apache.felix.ipojo.util; version="0.7.1",
+              org.apache.felix.ipojo.handlers.dependency; version="0.7.1",
+              org.apache.felix.ipojo.handlers.providedservice; version="0.7.1", 
+              org.apache.felix.ipojo.composite; version="0.7.1",
+              org.osgi.service.cm; version="1.2",
+              org.osgi.service.log; version="1.3"
+            </Export-Package>
+          </instructions>
         </configuration>
       </plugin>
     </plugins>
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/Activator.java b/ipojo/src/main/java/org/apache/felix/ipojo/Activator.java
index 0c41a8f..d243539 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/Activator.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/Activator.java
@@ -58,9 +58,10 @@
     private Dictionary[] m_configurations;
 
     /**
-     * @return the bundle context
+     * Return the bundle context.
+     * @return the bundle context.
      */
-    public BundleContext getBundleContext() { return m_bundleContext; }
+    BundleContext getBundleContext() { return m_bundleContext; }
 
     /**
      * Add a component factory to the factory list.
@@ -89,9 +90,11 @@
 
         try {
             parse();
-        } catch (Exception e) {
-            System.err.println("Parse error for the bundle " + m_bundleContext.getBundle().getBundleId() + " : " + e.getMessage());
+        } catch (IOException e) {
+            System.err.println("IO error for the bundle " + m_bundleContext.getBundle().getBundleId() + " : " + e.getMessage());
             return;
+        } catch (ParseException e) {
+            System.err.println("Parse error for the bundle " + m_bundleContext.getBundle().getBundleId() + " : " + e.getMessage());
         }
 
         start(); // Call the internal start method
@@ -137,38 +140,42 @@
      * Start the management factories and create instances.
      */
     private void start() {
-    	// Start the factories
-    	for (int j = 0; j < m_factories.length; j++) { m_factories[j].start(); }
-    	
-    	Dictionary[] outsiders = new Dictionary[0];
-    	for (int i = 0; i < m_configurations.length; i++) {
-    		Dictionary conf = m_configurations[i];
-    		boolean created = false;
-    		for (int j = 0; j < m_factories.length; j++) {
-    			String componentClass = m_factories[j].getComponentClassName();
-    			String factoryName = m_factories[j].getFactoryName();
-    			if (conf.get("component") != null && (conf.get("component").equals(componentClass) || conf.get("component").equals(factoryName))) {
-    				try {
-						m_factories[j].createComponentInstance(conf);
-	    				created = true;
-					} catch (UnacceptableConfiguration e) {
-						System.err.println("Cannot create the instance " + conf.get("name") + " : " + e.getMessage());
-					} 
-    			}
-    		}
-    		if (!created && conf.get("component") != null) {
-    	        if (outsiders.length != 0) {
-    	            Dictionary[] newList = new Dictionary[outsiders.length + 1];
-    	            System.arraycopy(outsiders, 0, newList, 0, outsiders.length);
-    	            newList[outsiders.length] = conf;
-    	            outsiders = newList;
-    	        } else { outsiders = new Dictionary[] {conf}; }
-    	        
-    		}
-    	}
-    	
-    	// Create the instance creator
-    	m_creator = new InstanceCreator(m_bundleContext, outsiders);
+        // Start the factories
+        for (int j = 0; j < m_factories.length; j++) {
+            m_factories[j].start();
+        }
+
+        Dictionary[] outsiders = new Dictionary[0];
+        for (int i = 0; i < m_configurations.length; i++) {
+            Dictionary conf = m_configurations[i];
+            boolean created = false;
+            for (int j = 0; j < m_factories.length; j++) {
+                String componentClass = m_factories[j].getComponentClassName();
+                String factoryName = m_factories[j].getName();
+                if (conf.get("component") != null && (conf.get("component").equals(componentClass) || conf.get("component").equals(factoryName))) {
+                    try {
+                        m_factories[j].createComponentInstance(conf);
+                        created = true;
+                    } catch (UnacceptableConfiguration e) {
+                        System.err.println("Cannot create the instance " + conf.get("name") + " : " + e.getMessage());
+                    }
+                }
+            }
+            if (!created && conf.get("component") != null) {
+                if (outsiders.length != 0) {
+                    Dictionary[] newList = new Dictionary[outsiders.length + 1];
+                    System.arraycopy(outsiders, 0, newList, 0, outsiders.length);
+                    newList[outsiders.length] = conf;
+                    outsiders = newList;
+                } else {
+                    outsiders = new Dictionary[] { conf };
+                }
+
+            }
+        }
+
+        // Create the instance creator
+        m_creator = new InstanceCreator(m_bundleContext, outsiders);
     }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/ComponentFactory.java b/ipojo/src/main/java/org/apache/felix/ipojo/ComponentFactory.java
index 2d66c3d..99d20d7 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/ComponentFactory.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/ComponentFactory.java
@@ -39,21 +39,22 @@
 import org.osgi.service.cm.ManagedServiceFactory;
 
 /**
- * The component factory manages component instance objects.
- * This management consist in creating and managing component instance build with the component factory.
- * This class could export Factory and ManagedServiceFactory services.
+ * The component factory manages component instance objects. This management
+ * consist in creating and managing component instance build with the component
+ * factory. This class could export Factory and ManagedServiceFactory services.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ComponentFactory implements Factory, ManagedServiceFactory {
 
     /**
-     * List of the managed instance managers.
-     * The key of this hashmap is the name (i.e. pid) of the created instance
+     * List of the managed instance managers. The key of this hashmap is the
+     * name (i.e. pid) of the created instance
      */
     private HashMap m_componentInstances = new HashMap();
-    
+
     /**
-     * Ture if the component is a composition. 
+     * Ture if the component is a composition.
      */
     private boolean m_isComposite = false;
 
@@ -71,25 +72,29 @@
      * Component Implementation Class Name.
      */
     private String m_componentClassName = null;
-    
+
     /**
-     * Composition Name. 
+     * Composition Name.
      */
     private String m_compositeName = null;
 
     /**
      * Classloader to delegate loading.
      */
-    private FactoryClassloader m_classLoader = null;  //TODO is this classloader really useful ?
+    private FactoryClassloader m_classLoader = null; // TODO is this
+
+    // classloader really
+    // useful ?
 
     /**
-     * Component Type provided by this factory.  //TODO Should be keep this reference ?
+     * Component Type provided by this factory. //TODO Should be keep this
+     * reference ?
      */
     private Element m_componentMetadata;
-    
+
     /**
-     * Factory Name (i.e. Factory PID).
-     * Could be the component class name if the factory name is not set.
+     * Factory Name (i.e. Factory PID). Could be the component class name if the
+     * factory name is not set.
      */
     private String m_factoryName;
 
@@ -102,12 +107,12 @@
      * Component-Type description exposed by the factory service.
      */
     private ComponentDescription m_componentDesc;
-    
+
     /**
      * Logger for the factory (and all component instance).
      */
     private Logger m_logger;
-    
+
     /**
      * True when the factory is active (non stopping and non starting).
      */
@@ -116,29 +121,29 @@
     /**
      * FactoryClassloader.
      */
-    private class FactoryClassloader extends ClassLoader  {
-    	
-    	/**
-    	 * Map of defined classes [Name, Class Object].
-    	 */
-    	private HashMap m_definedClasses = new HashMap();
+    private class FactoryClassloader extends ClassLoader {
+
+        /**
+         * Map of defined classes [Name, Class Object].
+         */
+        private HashMap m_definedClasses = new HashMap();
 
         /**
          * load the class.
+         * 
          * @see java.lang.ClassLoader#loadClass(java.lang.String, boolean)
          * @param name : the name of the class
          * @param resolve : should be the class resolve now ?
          * @return : the loaded class
          * @throws ClassNotFoundException : the class to load is not found
          */
-        protected synchronized Class loadClass(final String name,
-                final boolean resolve) throws ClassNotFoundException {
+        protected synchronized Class loadClass(final String name, final boolean resolve) throws ClassNotFoundException {
             return m_context.getBundle().loadClass(name);
         }
 
-
         /**
          * Return the URL of the asked ressource.
+         * 
          * @param arg : the name of the resource to find.
          * @return the URL of the resource.
          * @see java.lang.ClassLoader#getResource(java.lang.String)
@@ -149,6 +154,7 @@
 
         /**
          * .
+         * 
          * @param arg : resource to find
          * @return : the enumeration found
          * @throws IOException : if the lookup failed.
@@ -160,39 +166,53 @@
 
         /**
          * The defineClass method.
+         * 
          * @param name : name of the class
          * @param b : the byte array of the class
          * @param domain : the protection domain
          * @return : the defined class.
          * @throws Exception : if a problem is detected during the loading
          */
-        public Class defineClass(String name, byte[] b,
-                ProtectionDomain domain) throws Exception {
-        	if (m_definedClasses.containsKey(name)) { return (Class) m_definedClasses.get(name); } 
+        public Class defineClass(String name, byte[] b, ProtectionDomain domain) throws Exception {
+            if (m_definedClasses.containsKey(name)) {
+                return (Class) m_definedClasses.get(name);
+            }
             Class c = super.defineClass(name, b, 0, b.length, domain);
             m_definedClasses.put(name, c);
             return c;
         }
     }
 
-
     /**
-     * @return the Bundle Context
+     * Return the bundle context.
+     * 
+     * @return the Bundle Context.
      */
-    protected BundleContext getBundleContext() { return m_context; }
+    protected BundleContext getBundleContext() {
+        return m_context;
+    }
 
     /**
+     * Get the implementation class of the component type.
+     * 
      * @return the name of the component-type implementation class.
      */
-    protected String getComponentClassName() { return m_componentClassName; }
-    
+    protected String getComponentClassName() {
+        return m_componentClassName;
+    }
+
     /**
+     * Get the logger used by instances of he current factory.
+     * 
      * @return the factory logger.
      */
-    public Logger getLogger() { return m_logger; }
+    public Logger getLogger() {
+        return m_logger;
+    }
 
     /**
      * Create a instance manager factory.
+     * 
      * @param bc : bundle context
      * @param cm : metadata of the component to create
      */
@@ -200,57 +220,66 @@
         m_context = bc;
         m_componentMetadata = cm;
         if (cm.getName().equalsIgnoreCase("composite")) {
-        	m_componentClassName = null;
-        	m_isComposite = true;
-        	// Get the name
-        	if (cm.containsAttribute("name")) { 
-        		m_compositeName = cm.getAttribute("name");
-        	} else { 
-        		System.err.println("A composite needs a name"); return;
-        	}
-        	// Compute factory name
-        	if (m_componentMetadata.containsAttribute("factory") && !m_componentMetadata.getAttribute("factory").equalsIgnoreCase("no")) { 
-            	m_factoryName = m_componentMetadata.getAttribute("factory");
-            } else { m_factoryName = m_compositeName; }
-        } else  {
-        	if (cm.containsAttribute("className")) { 
-        		m_componentClassName = cm.getAttribute("className");
-        	} else { 
-        		System.err.println("A component needs a class name"); return;
-        	}
-        	if (m_componentMetadata.containsAttribute("factory") && !m_componentMetadata.getAttribute("factory").equalsIgnoreCase("no")) { 
-            	m_factoryName = m_componentMetadata.getAttribute("factory");
-            } else { m_factoryName = m_componentMetadata.getAttribute("className"); }
+            m_componentClassName = null;
+            m_isComposite = true;
+            // Get the name
+            if (cm.containsAttribute("name")) {
+                m_compositeName = cm.getAttribute("name");
+            } else {
+                System.err.println("A composite needs a name");
+                return;
+            }
+            // Compute factory name
+            if (m_componentMetadata.containsAttribute("factory") && !m_componentMetadata.getAttribute("factory").equalsIgnoreCase("no")) {
+                m_factoryName = m_componentMetadata.getAttribute("factory");
+            } else {
+                m_factoryName = m_compositeName;
+            }
+        } else {
+            if (cm.containsAttribute("className")) {
+                m_componentClassName = cm.getAttribute("className");
+            } else {
+                System.err.println("A component needs a class name");
+                return;
+            }
+            if (m_componentMetadata.containsAttribute("factory") && !m_componentMetadata.getAttribute("factory").equalsIgnoreCase("no")) {
+                m_factoryName = m_componentMetadata.getAttribute("factory");
+            } else {
+                m_factoryName = m_componentMetadata.getAttribute("className");
+            }
         }
         if (m_factoryName != null) {
-        	m_logger = new Logger(m_context, m_factoryName, Logger.WARNING);
+            m_logger = new Logger(m_context, m_factoryName, Logger.WARNING);
         } else {
-        	if (m_isComposite) {
-        		m_logger = new Logger(m_context, m_compositeName, Logger.WARNING);
-        	} else {
-        		m_logger = new Logger(m_context, m_componentClassName, Logger.WARNING);
-        	}
+            if (m_isComposite) {
+                m_logger = new Logger(m_context, m_compositeName, Logger.WARNING);
+            } else {
+                m_logger = new Logger(m_context, m_componentClassName, Logger.WARNING);
+            }
         }
     }
 
     /**
-     * Create a instance manager factory. The class is given in parameter.
-     * The component type is not a composite.
+     * Create a instance manager factory. The class is given in parameter. The
+     * component type is not a composite.
+     * 
      * @param bc : bundle context
      * @param clazz : the component class
      * @param cm : metadata of the component
      */
     public ComponentFactory(BundleContext bc, byte[] clazz, Element cm) {
-    	m_context = bc;
+        m_context = bc;
         m_clazz = clazz;
         m_componentClassName = cm.getAttribute("className");
         m_componentMetadata = cm;
-        
+
         // Get factory PID :
-        if (m_componentMetadata.containsAttribute("factory") && !m_componentMetadata.getAttribute("factory").equalsIgnoreCase("no")) { 
-        	m_factoryName = m_componentMetadata.getAttribute("factory"); 
-        } else { m_factoryName = m_componentMetadata.getAttribute("className"); }
-        
+        if (m_componentMetadata.containsAttribute("factory") && !m_componentMetadata.getAttribute("factory").equalsIgnoreCase("no")) {
+            m_factoryName = m_componentMetadata.getAttribute("factory");
+        } else {
+            m_factoryName = m_componentMetadata.getAttribute("className");
+        }
+
         m_logger = new Logger(m_context, m_factoryName, Logger.WARNING);
     }
 
@@ -258,87 +287,101 @@
      * Stop all the instance managers.
      */
     public synchronized void stop() {
-    	m_active = false;
+        m_active = false;
         Collection col = m_componentInstances.values();
         Iterator it = col.iterator();
         while (it.hasNext()) {
             ComponentInstance ci = (ComponentInstance) it.next();
             if (ci.isStarted()) {
-            	ci.stop();
+                ci.dispose();
             }
         }
         m_componentInstances.clear();
-        if (m_sr != null) { m_sr.unregister(); }
+        if (m_sr != null) {
+            m_sr.unregister();
+        }
         m_sr = null;
     }
 
     /**
      * Start all the instance managers.
      */
-    public synchronized void start() {        
+    public synchronized void start() {
+        if (m_active) {
+            return;
+        } // Already started
+
         Properties props = new Properties();
 
         // create a ghost component
         if (!m_isComposite) {
-        	InstanceManager ghost = new InstanceManager(this, m_context);
-        	Properties p = new Properties();
-        	p.put("name", "ghost");
-        	ghost.configure(m_componentMetadata, p);
-        	m_componentDesc = ghost.getComponentDescription();
+            InstanceManager ghost = new InstanceManager(this, m_context);
+            Properties p = new Properties();
+            p.put("name", "ghost");
+            ghost.configure(m_componentMetadata, p);
+            m_componentDesc = ghost.getComponentDescription();
         } else {
-        	CompositeManager ghost = new CompositeManager(this, m_context);
-        	Properties p = new Properties();
-        	p.put("name", "ghost");
-        	ghost.configure(m_componentMetadata, p);
-        	m_componentDesc = ghost.getComponentDescription();
+            CompositeManager ghost = new CompositeManager(this, m_context);
+            Properties p = new Properties();
+            p.put("name", "ghost");
+            ghost.configure(m_componentMetadata, p);
+            m_componentDesc = ghost.getComponentDescription();
         }
-        
+
         // Check if the factory should be exposed
-        if (m_componentMetadata.containsAttribute("factory") && m_componentMetadata.getAttribute("factory").equalsIgnoreCase("no")) { return; }
-        
-        if (!m_isComposite) { 
-        	props.put("component.class", m_componentClassName);
-        } else { 
-        	props.put("component.class", "no implementation class"); 
+        if (m_componentMetadata.containsAttribute("factory") && m_componentMetadata.getAttribute("factory").equalsIgnoreCase("no")) {
+            return;
+        }
+
+        if (!m_isComposite) {
+            props.put("component.class", m_componentClassName);
+        } else {
+            props.put("component.class", "no implementation class");
         }
         props.put("factory.name", m_factoryName);
         props.put("component.providedServiceSpecifications", m_componentDesc.getprovidedServiceSpecification());
         props.put("component.properties", m_componentDesc.getProperties());
         props.put("component.description", m_componentDesc);
         props.put("component.desc", m_componentDesc.toString());
-        
-        // Add Facotry PID to the component properties
+
+        // Add Factory PID to the component properties
         props.put(Constants.SERVICE_PID, m_factoryName);
 
         // Exposition of the factory service
         m_active = true;
-        m_sr = m_context.registerService(new String[] {Factory.class.getName(), ManagedServiceFactory.class.getName()}, this, props);
+        m_sr = m_context.registerService(new String[] { Factory.class.getName(), ManagedServiceFactory.class.getName() }, this, props);
     }
-    
+
     /**
      * Callback called by instance when stopped.
+     * 
      * @param ci : the instance stopping
      */
     protected synchronized void stopped(ComponentInstance ci) {
-    	if (m_active) {
-    		m_componentInstances.remove(ci.getInstanceName());
-    	}
+        if (m_active) {
+            m_componentInstances.remove(ci.getInstanceName());
+        }
     }
 
     /**
-     * @see org.apache.felix.ipojo.Factory#getComponentInfo()
+     * Get the component type description attached to this factory.
+     * @return : the component type description
+     * @see org.apache.felix.ipojo.Factory#getComponentDescription()
      */
-    public ComponentDescription getComponentDescription() { return m_componentDesc; }
+    public ComponentDescription getComponentDescription() {
+        return m_componentDesc;
+    }
 
     /**
      * Load a class.
+     * 
      * @param className : name of the class to load
      * @return the resulting Class object
      * @throws ClassNotFoundException : happen when the class is not found
      */
     public Class loadClass(String className) throws ClassNotFoundException {
-        getLogger().log(Logger.INFO, "[Bundle " + m_context.getBundle().getBundleId() + "] In load for : " + className);
-        if (m_clazz != null && className.equals(m_componentClassName)) {  // Used the factory classloader to load the component implementation class
+        if (m_clazz != null && className.equals(m_componentClassName)) { 
+            // Used the factory classloader to load the component implementation class
             if (m_classLoader == null) {
                 m_classLoader = new FactoryClassloader();
             }
@@ -350,9 +393,10 @@
         }
         return m_context.getBundle().loadClass(className);
     }
-    
+
     /**
      * Define a class.
+     * 
      * @param name : qualified name of the class
      * @param b : byte array of the class
      * @param domain : protection domain of the class
@@ -360,12 +404,15 @@
      * @throws Exception : an exception occur during the definition
      */
     public Class defineClass(String name, byte[] b, ProtectionDomain domain) throws Exception {
-    	if (m_classLoader == null) { m_classLoader = new FactoryClassloader(); }
-    	return m_classLoader.defineClass(name, b, domain);
+        if (m_classLoader == null) {
+            m_classLoader = new FactoryClassloader();
+        }
+        return m_classLoader.defineClass(name, b, domain);
     }
 
     /**
      * Return the URL of a resource.
+     * 
      * @param resName : resource name
      * @return the URL of the resource
      */
@@ -374,188 +421,222 @@
     }
 
     /**
+     * Create an instance.
+     * The given configuration needs to contain the 'name' property.
+     * @param configuration : configuration of the created instance.
+     * @return the created component instance.
+     * @throws UnacceptableConfiguration : occurs if the given configuration is not consistent with the component type of this factory.
      * @see org.apache.felix.ipojo.Factory#createComponentInstance(java.util.Dictionary)
      */
-    public ComponentInstance createComponentInstance(Dictionary configuration)  throws UnacceptableConfiguration {
-    	try {
-    		_isAcceptable(configuration);
-    	} catch (UnacceptableConfiguration e) {
-    		m_logger.log(Logger.ERROR, "The configuration is not acceptable : " + e.getMessage());
-    		throw new UnacceptableConfiguration("The configuration " + configuration + " is not acceptable for " + m_factoryName + ": " + e.getMessage());
-    	}
-    	
-        IPojoContext context = new IPojoContext(m_context);
-        ComponentInstance instance = null;
-        if (!m_isComposite) {
-        	InstanceManager inst = new InstanceManager(this, context);
-        	//context.setComponentInstance(inst);
-        	inst.configure(m_componentMetadata, configuration);
-        	instance = inst;
-        } else {
-        	CompositeManager inst = new CompositeManager(this, context);
-        	//context.setComponentInstance(inst);
-        	inst.configure(m_componentMetadata, configuration);
-        	instance = inst;
+    public ComponentInstance createComponentInstance(Dictionary configuration) throws UnacceptableConfiguration {
+        try {
+            checkAcceptability(configuration);
+        } catch (UnacceptableConfiguration e) {
+            m_logger.log(Logger.ERROR, "The configuration is not acceptable : " + e.getMessage());
+            throw new UnacceptableConfiguration("The configuration " + configuration + " is not acceptable for " + m_factoryName + ": " + e.getMessage());
         }
 
         String pid = null;
-        if (configuration.get("name") != null) { 
-        	pid = (String) configuration.get("name"); 
+        if (configuration.get("name") != null) {
+            pid = (String) configuration.get("name");
         } else {
-        	throw new UnacceptableConfiguration("The name attribute is missing");
+            throw new UnacceptableConfiguration("The name attribute is missing");
         }
-        
+
         if (m_componentInstances.containsKey(pid)) {
-        	throw new UnacceptableConfiguration("Name already used : " + pid);
+            throw new UnacceptableConfiguration("Name already used : " + pid);
         }
-        
+
+        IPojoContext context = new IPojoContext(m_context);
+        ComponentInstance instance = null;
+        if (!m_isComposite) {
+            InstanceManager inst = new InstanceManager(this, context);
+            // context.setComponentInstance(inst);
+            inst.configure(m_componentMetadata, configuration);
+            instance = inst;
+        } else {
+            CompositeManager inst = new CompositeManager(this, context);
+            // context.setComponentInstance(inst);
+            inst.configure(m_componentMetadata, configuration);
+            instance = inst;
+        }
+
         m_componentInstances.put(pid, instance);
         instance.start();
         return instance;
     }
-    
+
     /**
+     * Create an instance.
+     * The given configuration needs to contain the 'name' property.
+     * @param configuration : configuration of the created instance.
+     * @param serviceContext : the service context to push for this instance.
+     * @return the created component instance.
+     * @throws UnacceptableConfiguration : occurs if the given configuration is not consistent with the component type of this factory.
      * @see org.apache.felix.ipojo.Factory#createComponentInstance(java.util.Dictionary)
      */
     public ComponentInstance createComponentInstance(Dictionary configuration, ServiceContext serviceContext) throws UnacceptableConfiguration {
-    	try {
-    		_isAcceptable(configuration);
-    	} catch (UnacceptableConfiguration e) {
-    		m_logger.log(Logger.ERROR, "The configuration is not acceptable : " + e.getMessage());
-    		throw new UnacceptableConfiguration("The configuration " + configuration + " is not acceptable for " + m_factoryName + ": " + e.getMessage());
-    	}
-
-    	IPojoContext context = new IPojoContext(m_context, serviceContext);
-    	ComponentInstance instance = null;
-    	if (!m_isComposite) {
-        	InstanceManager inst = new InstanceManager(this, context);
-        	//context.setComponentInstance(inst);
-        	inst.configure(m_componentMetadata, configuration);
-        	instance = inst;
-        } else {
-        	CompositeManager inst = new CompositeManager(this, context);
-        	//context.setComponentInstance(inst);
-        	inst.configure(m_componentMetadata, configuration);
-        	instance = inst;
+        try {
+            checkAcceptability(configuration);
+        } catch (UnacceptableConfiguration e) {
+            m_logger.log(Logger.ERROR, "The configuration is not acceptable : " + e.getMessage());
+            throw new UnacceptableConfiguration("The configuration " + configuration + " is not acceptable for " + m_factoryName + ": " + e.getMessage());
         }
 
-    	String pid = null;
-        if (configuration.get("name") != null) { 
-        	pid = (String) configuration.get("name"); 
+        String pid = null;
+        if (configuration.get("name") != null) {
+            pid = (String) configuration.get("name");
         } else {
-        	throw new UnacceptableConfiguration("The name attribute is missing");
+            throw new UnacceptableConfiguration("The name attribute is missing");
         }
-        
+
         if (m_componentInstances.containsKey(pid)) {
-        	throw new UnacceptableConfiguration("Name already used : " + pid);
+            throw new UnacceptableConfiguration("Name already used : " + pid);
+        }
+
+        IPojoContext context = new IPojoContext(m_context, serviceContext);
+        ComponentInstance instance = null;
+        if (!m_isComposite) {
+            InstanceManager inst = new InstanceManager(this, context);
+            // context.setComponentInstance(inst);
+            inst.configure(m_componentMetadata, configuration);
+            instance = inst;
+        } else {
+            CompositeManager inst = new CompositeManager(this, context);
+            // context.setComponentInstance(inst);
+            inst.configure(m_componentMetadata, configuration);
+            instance = inst;
         }
 
         m_componentInstances.put(pid, instance);
         instance.start();
         return instance;
     }
-    
-    
 
     /**
+     * Delete an instance.
+     * @param pid : name of the instance to delete
      * @see org.osgi.service.cm.ManagedServiceFactory#deleted(java.lang.String)
      */
     public void deleted(String pid) {
         InstanceManager cm = (InstanceManager) m_componentInstances.remove(pid);
-        if (cm == null) { 
-        	return; // do nothing, the component does not exist !  
-        } else { cm.stop(); }
+        if (cm == null) {
+            return; // do nothing, the component does not exist !
+        } else {
+            cm.dispose();
+        }
     }
 
     /**
-     * @see org.osgi.service.cm.ManagedServiceFactory#getName()
+     * Get the name of this factory.
+     * @return the name of this factory
+     * @see org.apache.felix.ipojo.Factory#getName()
      */
-    public String getName() { return getFactoryName(); }
+    public String getName() {
+        return m_factoryName;
+    }
 
     /**
+     * Create of update an instance.
+     * @param pid : name of the instance
+     * @param properties : configuration of the instance
+     * @throws ConfigurationException : if the configuration is not consistent for this component type
      * @see org.osgi.service.cm.ManagedServiceFactory#updated(java.lang.String, java.util.Dictionary)
      */
     public void updated(String pid, Dictionary properties) throws ConfigurationException {
         InstanceManager cm = (InstanceManager) m_componentInstances.get(pid);
         if (cm == null) {
-        	try {
-        		properties.put("name", pid); // Add the name in the configuration
-        		createComponentInstance(properties);
-        	} catch (UnacceptableConfiguration e) {
-        		m_logger.log(Logger.ERROR, "The configuration is not acceptable : " + e.getMessage());
-        		throw new ConfigurationException(properties.toString(), e.getMessage());
-        	} 
-        } else {            
             try {
-            	properties.put("name", pid); // Add the name in the configuration
-				_isAcceptable(properties); // Test if the configuration is acceptable
-			} catch (UnacceptableConfiguration e) {
-				m_logger.log(Logger.ERROR, "The configuration is not acceptable : " + e.getMessage());
-        		throw new ConfigurationException(properties.toString(), e.getMessage());
-			}
+                properties.put("name", pid); // Add the name in the
+                // configuration
+                createComponentInstance(properties);
+            } catch (UnacceptableConfiguration e) {
+                m_logger.log(Logger.ERROR, "The configuration is not acceptable : " + e.getMessage());
+                throw new ConfigurationException(properties.toString(), e.getMessage());
+            }
+        } else {
+            try {
+                properties.put("name", pid); // Add the name in the
+                // configuration
+                checkAcceptability(properties); // Test if the configuration is
+                // acceptable
+            } catch (UnacceptableConfiguration e) {
+                m_logger.log(Logger.ERROR, "The configuration is not acceptable : " + e.getMessage());
+                throw new ConfigurationException(properties.toString(), e.getMessage());
+            }
             cm.reconfigure(properties); // re-configure the component
         }
     }
-    
+
     /**
-     * @return the factory name
-     */
-    public String getFactoryName() { return m_factoryName; }
-    
-    /**
-     * Check if the given configuration is acceptable as a component instance configuration.
-     * This checks that a name is given in the configuration and if all the configurable properties have a value.
+     * Check if the given configuration is acceptable as a component instance
+     * configuration. This checks that a name is given in the configuration and
+     * if all the configurable properties have a value.
+     * 
      * @param conf : the configuration to check
      * @return true when the configuration seems to be acceptable
      */
     public boolean isAcceptable(Dictionary conf) {
-    	// First check that the configuration contains a name : 
-    	if (conf.get("name") == null) { return false; }
-    	PropertyDescription[] props = m_componentDesc.getProperties();
-    	for (int i = 0; i < props.length; i++) {
-    		PropertyDescription pd = props[i];
-    		// Failed if the props has no default value and the configuration does not push a value 
-    		if (pd.getValue() == null && conf.get(pd.getName()) == null) {
-    			return false;
-    		}
-    	}
-    	return true;
+        // First check that the configuration contains a name :
+        if (conf.get("name") == null) {
+            return false;
+        }
+        PropertyDescription[] props = m_componentDesc.getProperties();
+        for (int i = 0; i < props.length; i++) {
+            PropertyDescription pd = props[i];
+            // Failed if the props has no default value and the configuration
+            // does not push a value
+            if (pd.getValue() == null && conf.get(pd.getName()) == null) {
+                return false;
+            }
+        }
+        return true;
     }
-    
+
     /**
      * Test is a configuration is acceptable for the factory.
+     * 
      * @param conf : the configuration to test.
      * @throws UnacceptableConfiguration : the configuration is not acceptable.
      */
-    private void _isAcceptable(Dictionary conf) throws UnacceptableConfiguration {
-    	if (conf == null || conf.get("name") == null) { throw new UnacceptableConfiguration("The configuration does not contains the \"name\" property"); }
-    	PropertyDescription[] props = m_componentDesc.getProperties();
-    	for (int i = 0; i < props.length; i++) {
-    		PropertyDescription pd = props[i];
-    		// Failed if the props has no default value and the configuration does not push a value 
-    		if (pd.getValue() == null && conf.get(pd.getName()) == null) {
-    			throw new UnacceptableConfiguration("The configuration does not contains the \"" + pd.getName() + "\" property");
-    		}
-    	}
+    private void checkAcceptability(Dictionary conf) throws UnacceptableConfiguration {
+        if (conf == null || conf.get("name") == null) {
+            throw new UnacceptableConfiguration("The configuration does not contains the \"name\" property");
+        }
+        PropertyDescription[] props = m_componentDesc.getProperties();
+        for (int i = 0; i < props.length; i++) {
+            PropertyDescription pd = props[i];
+            // Failed if the props has no default value and the configuration
+            // does not push a value
+            if (pd.getValue() == null && conf.get(pd.getName()) == null) {
+                throw new UnacceptableConfiguration("The configuration does not contains the \"" + pd.getName() + "\" property");
+            }
+        }
     }
 
-	/**
-	 * @see org.apache.felix.ipojo.Factory#reconfigure(java.util.Dictionary)
-	 */
-	public void reconfigure(Dictionary properties) throws UnacceptableConfiguration {
-		if (properties == null || properties.get("name") == null) { throw new UnacceptableConfiguration("The configuration does not contains the \"name\" property"); }
-		String name = (String) properties.get("name");
-		ComponentInstance cm = null;
-		if (m_isComposite) {
-			cm = (CompositeManager) m_componentInstances.get(name);
-		} else  {
-			cm = (InstanceManager) m_componentInstances.get(name);
-		}
-        if (cm == null) { 
-        	return;  // The instance does not exist.
+    /**
+     * Reconfigure an existing instance.
+     * @param properties : the new configuration to push.
+     * @throws UnacceptableConfiguration : occurs if the new configuration is not consistent with the component type.
+     * @see org.apache.felix.ipojo.Factory#reconfigure(java.util.Dictionary)
+     */
+    public void reconfigure(Dictionary properties) throws UnacceptableConfiguration {
+        if (properties == null || properties.get("name") == null) {
+            throw new UnacceptableConfiguration("The configuration does not contains the \"name\" property");
+        }
+        String name = (String) properties.get("name");
+        ComponentInstance cm = null;
+        if (m_isComposite) {
+            cm = (CompositeManager) m_componentInstances.get(name);
         } else {
-            _isAcceptable(properties); // Test if the configuration is acceptable
-		}			
+            cm = (InstanceManager) m_componentInstances.get(name);
+        }
+        if (cm == null) {
+            return; // The instance does not exist.
+        } else {
+            checkAcceptability(properties); // Test if the configuration is
+            // acceptable
+        }
         cm.reconfigure(properties); // re-configure the component
-	}
+    }
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/ComponentInstance.java b/ipojo/src/main/java/org/apache/felix/ipojo/ComponentInstance.java
index 9578dda..3dd5abe 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/ComponentInstance.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/ComponentInstance.java
@@ -26,25 +26,26 @@
 
 /**
  * The component instance class manages one instance of a component type.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public interface ComponentInstance {
 
     /**
-     * Component Instance State : STOPPED.
-     * The component instance is not started.
+     * Component Instance State : STOPPED. The component instance is not
+     * started.
      */
     int STOPPED = 0;
-	
-	/**
-     * Component Instance State : INVALID.
-     * The component is invalid when it start or when a component dependency is unvalid.
+
+    /**
+     * Component Instance State : INVALID. The component is invalid when it
+     * start or when a component dependency is unvalid.
      */
     int INVALID = 1;
 
     /**
-     * Component Instance State : VALID.
-     * The component is resolved when it is running and all its component dependencies are valid.
+     * Component Instance State : VALID. The component is resolved when it is
+     * running and all its component dependencies are valid.
      */
     int VALID = 2;
 
@@ -55,51 +56,65 @@
 
     /**
      * Stop the component instance.
+     * A stopped instance can be re-started.
      */
     void stop();
+    
+    /**
+     * Dispose the component instance.
+     * A disposed instance cannot be re-started.
+     */
+    void dispose();
 
     /**
+     * Return the actual state of the instance. 
      * @return the actual state of the component instance.
      */
     int getState();
 
     /**
-     * @return the component type information.
-     * Each handler can participate to the component description.
+     * Return component-type description of this instance.
+     * @return the component type information. Each handler can participate to
+     * the component description.
      */
     ComponentDescription getComponentDescription();
-    
+
     /**
+     * Return the instance description.
      * @return the instance description of the current instance
      */
     InstanceDescription getInstanceDescription();
 
     /**
+     * Return the factory which create this instance.
      * @return the factory of the component instance.
      */
     ComponentFactory getFactory();
-    
+
     /**
+     * Return the bundle context of this instance.
      * @return the context of the component instance
      */
     BundleContext getContext();
-    
+
     /**
+     * Return the name of the instance.
      * @return the name of the component instance
      */
     String getInstanceName();
-    
+
     /**
+     * Check if the instance is started.
      * @return true if getState returns INVALID or VALID.
      */
     boolean isStarted();
-    
+
     /**
-     * Re-configurare an instance.
-     * Do nothing if the instance does not support dynamic reconfiguration.
-     * The reconfiguration does not stop the instance.
+     * Re-configurare an instance. Do nothing if the instance does not support
+     * dynamic reconfiguration. The reconfiguration does not stop the instance.
+     * 
      * @param configuration : the new configuration.
      */
     void reconfigure(Dictionary configuration);
-    
+
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/CompositeHandler.java b/ipojo/src/main/java/org/apache/felix/ipojo/CompositeHandler.java
index 8dab9a6..ea675c6 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/CompositeHandler.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/CompositeHandler.java
@@ -24,14 +24,16 @@
 import org.apache.felix.ipojo.metadata.Element;
 
 /**
- * Composite Handler Abstract Class.
- * An composite handler need implements these method to be notifed of lifecycle change...
+ * Composite Handler Abstract Class. An composite handler need implements these
+ * method to be notifed of lifecycle change...
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public abstract class CompositeHandler {
-	
-	/**
+
+    /**
      * Configure the handler.
+     * 
      * @param im : the instance manager
      * @param metadata : the metadata of the component
      * @param configuration : the instance configuration
@@ -50,25 +52,35 @@
 
     /**
      * Is the actual state valid for this handler ?
+     * 
      * @return true is the state seems valid for the handler
      */
-    public boolean isValid() { return true; }
+    public boolean isValid() {
+        return true;
+    }
 
     /**
      * This method is called when the component state changed.
+     * 
      * @param state : the new state
      */
-    public void stateChanged(int state) { }
+    public void stateChanged(int state) {
+    }
 
     /**
-     * @return the description of the handler..
+     * Return the description of the handler.
+     * @return the description of the handler.
      */
-    public HandlerDescription getDescription() { return new HandlerDescription(this.getClass().getName(), isValid()); }
+    public HandlerDescription getDescription() {
+        return new HandlerDescription(this.getClass().getName(), isValid());
+    }
 
-	/**
-	 * The instance is reconfiguring.
-	 * @param configuration : New instance configuration.
-	 */
-	public void reconfigure(Dictionary configuration) { }
+    /**
+     * The instance is reconfiguring.
+     * 
+     * @param configuration : New instance configuration.
+     */
+    public void reconfigure(Dictionary configuration) {
+    }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/CompositeManager.java b/ipojo/src/main/java/org/apache/felix/ipojo/CompositeManager.java
index d17f45d..19b461a 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/CompositeManager.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/CompositeManager.java
@@ -31,18 +31,19 @@
 import org.osgi.framework.ServiceReference;
 
 /**
- * iPOJO Composite manager.
- * The composite manager class manages one instance of a component type which is a composition.
- * It manages component lifecycle, and handlers...
+ * iPOJO Composite manager. The composite manager class manages one instance of
+ * a component type which is a composition. It manages component lifecycle, and
+ * handlers...
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class CompositeManager implements ComponentInstance {
-	
-	/**
+
+    /**
      * Parent factory (ComponentFactory).
      */
     private ComponentFactory m_factory;
-    
+
     /**
      * Name of the component instance.
      */
@@ -67,16 +68,16 @@
      * Component type information.
      */
     private ComponentDescription m_componentDesc;
-    
+
     /**
      * Internal service context of the composition.
      */
     private CompositeServiceContext m_internalContext;
-    
 
     // Constructor
     /**
      * Construct a new Component Manager.
+     * 
      * @param factory : the factory managing the instance manager
      * @param bc : the bundle context to give to the instance
      */
@@ -89,21 +90,24 @@
     }
 
     /**
-     * Configure the instance manager.
-     * Stop the existings handler, clear the handler list, change the metadata, recreate the handlers
+     * Configure the instance manager. Stop the existings handler, clear the
+     * handler list, change the metadata, recreate the handler
+     * 
      * @param cm : the component type metadata
      * @param configuration : the configuration of the instance
      */
     public void configure(Element cm, Dictionary configuration) {
         // Stop all previous registred handler
-        if (m_handlers.length != 0) { stop(); }
+        if (m_handlers.length != 0) {
+            stop();
+        }
 
         // Clear the handler list
         m_handlers = new CompositeHandler[0];
 
         // ComponentInfo initialization
         m_componentDesc = new ComponentDescription(m_factory.getName());
-        
+
         // Add the name
         m_name = (String) configuration.get("name");
 
@@ -111,12 +115,14 @@
         for (int i = 0; i < IPojoConfiguration.INTERNAL_COMPOSITE_HANDLERS.length; i++) {
             // Create a new instance
             try {
-            	CompositeHandler h = (CompositeHandler) IPojoConfiguration.INTERNAL_COMPOSITE_HANDLERS[i].newInstance();
+                CompositeHandler h = (CompositeHandler) IPojoConfiguration.INTERNAL_COMPOSITE_HANDLERS[i].newInstance();
                 h.configure(this, cm, configuration);
             } catch (InstantiationException e) {
-                m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + IPojoConfiguration.INTERNAL_HANDLERS[i] + " : " + e.getMessage());
+                m_factory.getLogger().log(Logger.ERROR,
+                        "[" + m_name + "] Cannot instantiate the handler " + IPojoConfiguration.INTERNAL_HANDLERS[i] + " : " + e.getMessage());
             } catch (IllegalAccessException e) {
-                m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + IPojoConfiguration.INTERNAL_HANDLERS[i] + " : " + e.getMessage());
+                m_factory.getLogger().log(Logger.ERROR,
+                        "[" + m_name + "] Cannot instantiate the handler " + IPojoConfiguration.INTERNAL_HANDLERS[i] + " : " + e.getMessage());
             }
         }
 
@@ -129,62 +135,77 @@
                     CompositeHandler h = (CompositeHandler) c.newInstance();
                     h.configure(this, cm, configuration);
                 } catch (ClassNotFoundException e) {
-                    m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + cm.getNamespaces()[i] + " : " + e.getMessage());
+                    m_factory.getLogger()
+                            .log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + cm.getNamespaces()[i] + " : " + e.getMessage());
                 } catch (InstantiationException e) {
-                    m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + cm.getNamespaces()[i] + " : " + e.getMessage());
+                    m_factory.getLogger()
+                            .log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + cm.getNamespaces()[i] + " : " + e.getMessage());
                 } catch (IllegalAccessException e) {
-                    m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + cm.getNamespaces()[i] + " : " + e.getMessage());
+                    m_factory.getLogger()
+                            .log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + cm.getNamespaces()[i] + " : " + e.getMessage());
                 }
             }
         }
     }
 
     /**
+     * Return the component type description of this instance.
      * @return the component type information.
+     * @see org.apache.felix.ipojo.ComponentInstance#getComponentDescription()
      */
-    public ComponentDescription getComponentDescription() { return m_componentDesc; }
-    
+    public ComponentDescription getComponentDescription() {
+        return m_componentDesc;
+    }
+
     /**
+     * Return the instance description of this instance.
      * @return the instance description.
+     * @see org.apache.felix.ipojo.ComponentInstance#getInstanceDescription()
      */
     public synchronized InstanceDescription getInstanceDescription() {
-    	int componentState = getState();
+        int componentState = getState();
         InstanceDescription instanceDescription = new InstanceDescription(m_name, componentState, getContext().getBundle().getBundleId(), m_componentDesc);
         CompositeHandler[] handlers = getRegistredCompositeHandlers();
         for (int i = 0; i < handlers.length; i++) {
-        	instanceDescription.addHandler(handlers[i].getDescription());
+            instanceDescription.addHandler(handlers[i].getDescription());
         }
-        
+
         // Get instances description of internal instance
         ServiceReference[] refs;
-		try {
-			refs = m_internalContext.getServiceReferences(Architecture.class.getName(), null);
-			if (refs != null) {
-				for (int i = 0; i < refs.length; i++) {
-					Architecture arch = (Architecture) m_internalContext.getService(refs[i]);
-					instanceDescription.addInstance(arch.getInstanceDescription());
-					m_internalContext.ungetService(refs[i]);
-				}
-			}
-		} catch (InvalidSyntaxException e) {
-			e.printStackTrace(); // Should not happen
-		}
+        try {
+            refs = m_internalContext.getServiceReferences(Architecture.class.getName(), null);
+            if (refs != null) {
+                for (int i = 0; i < refs.length; i++) {
+                    Architecture arch = (Architecture) m_internalContext.getService(refs[i]);
+                    instanceDescription.addInstance(arch.getInstanceDescription());
+                    m_internalContext.ungetService(refs[i]);
+                }
+            }
+        } catch (InvalidSyntaxException e) {
+            e.printStackTrace(); // Should not happen
+        }
         return instanceDescription;
     }
 
     /**
+     * REturn the list of handlers plugged on this instace.
      * @return the list of the registred handlers.
      */
-    public CompositeHandler[] getRegistredCompositeHandlers() { return m_handlers; }
+    public CompositeHandler[] getRegistredCompositeHandlers() {
+        return m_handlers;
+    }
 
     /**
      * Return a specified handler.
+     * 
      * @param name : class name of the handler to find
      * @return : the handler, or null if not found
      */
     public CompositeHandler getCompositeHandler(String name) {
         for (int i = 0; i < m_handlers.length; i++) {
-            if (m_handlers[i].getClass().getName().equalsIgnoreCase(name)) { return m_handlers[i]; }
+            if (m_handlers[i].getClass().getName().equalsIgnoreCase(name)) {
+                return m_handlers[i];
+            }
         }
         return null;
     }
@@ -195,14 +216,16 @@
      * Start the instance manager.
      */
     public void start() {
-    	if (m_state != STOPPED) { return; } // Instance already started
-    	
+        if (m_state != STOPPED) {
+            return;
+        } // Instance already started
+
         // Start all the handlers
         m_factory.getLogger().log(Logger.INFO, "[" + m_name + "] Start the instance manager with " + m_handlers.length + " handlers");
 
         // The new state of the component is UNRESOLVED
         m_state = INVALID;
-        
+
         m_internalContext.start(); // Turn on the factory tracking
 
         for (int i = 0; i < m_handlers.length; i++) {
@@ -217,29 +240,54 @@
      * Stop the instance manager.
      */
     public void stop() {
-    	if (m_state == STOPPED) { return; } // Instance already stopped
-    	
+        if (m_state == STOPPED) {
+            return;
+        } // Instance already stopped
+
         setState(INVALID);
         // Stop all the handlers
         for (int i = m_handlers.length - 1; i > -1; i--) {
             m_handlers[i].stop();
         }
-        
+
         m_internalContext.stop(); // Turn off the factory tracking
         m_state = STOPPED;
+    }
+    
+    /** 
+     * Dispose the instance.
+     * @see org.apache.felix.ipojo.ComponentInstance#dispose()
+     */
+    public void dispose() {
+        if (m_state != STOPPED) {
+            stop();
+        }
+        
         m_factory.stopped(this);
+
+        // Cleaning
+        m_factory = null;
+        m_name = null;
+        m_context = null;
+        m_handlers = null;
+        m_componentDesc = null;
     }
 
     /**
-     * Set the state of the component.
-     * if the state changed call the stateChanged(int) method on the handlers
+     * Set the state of the component. 
+     * Ff the state changed call the stateChanged(int) method on the handlers.
+     * @param state : new state
      */
     public void setState(int state) {
         if (m_state != state) {
 
             // Log the state change
-            if (state == INVALID) { m_factory.getLogger().log(Logger.INFO, "[" + m_name + "]  State -> INVALID"); }
-            if (state == VALID) { m_factory.getLogger().log(Logger.INFO, "[" + m_name + "] State -> VALID"); }
+            if (state == INVALID) {
+                m_factory.getLogger().log(Logger.INFO, "[" + m_name + "]  State -> INVALID");
+            }
+            if (state == VALID) {
+                m_factory.getLogger().log(Logger.INFO, "[" + m_name + "] State -> VALID");
+            }
 
             // The state changed call the handler stateChange method
             m_state = state;
@@ -250,28 +298,41 @@
     }
 
     /**
-     * @return the actual state of the component.
+     * Get the actual state of the instance.
+     * @return the actual state of the instance
+     * @see org.apache.felix.ipojo.ComponentInstance#getState()
      */
-    public int getState() { return m_state; }
-    
+    public int getState() {
+        return m_state;
+    }
+
     /**
+     * Check if the instance is started.
+     * @return true if the instance is started.
      * @see org.apache.felix.ipojo.ComponentInstance#isStarted()
      */
-    public boolean isStarted() { return m_state != STOPPED; }
+    public boolean isStarted() {
+        return m_state != STOPPED;
+    }
 
     // ===================== end Lifecycle management =====================
 
     // ================== Class & Instance management ===================
 
     /**
+     * Get the factory which create this instance.
      * @return the factory of the component
+     * @see org.apache.felix.ipojo.ComponentInstance#getFactory()
      */
-    public ComponentFactory getFactory() { return m_factory; }
+    public ComponentFactory getFactory() {
+        return m_factory;
+    }
 
-    //  ======================== Handlers Management ======================
+    // ======================== Handlers Management ======================
 
     /**
      * Register the given handler to the current instance manager.
+     * 
      * @param h : the handler to register
      */
     public void register(CompositeHandler h) {
@@ -282,7 +343,7 @@
         }
 
         if (m_handlers != null) {
-        	CompositeHandler[] newList = new CompositeHandler[m_handlers.length + 1];
+            CompositeHandler[] newList = new CompositeHandler[m_handlers.length + 1];
             System.arraycopy(m_handlers, 0, newList, 0, m_handlers.length);
             newList[m_handlers.length] = h;
             m_handlers = newList;
@@ -291,6 +352,7 @@
 
     /**
      * Unregister the given handler.
+     * 
      * @param h : the handler to unregiter
      */
     public void unregister(CompositeHandler h) {
@@ -306,22 +368,24 @@
             if ((m_handlers.length - 1) == 0) {
                 m_handlers = new CompositeHandler[0];
             } else {
-            	CompositeHandler[] newList = new CompositeHandler[m_handlers.length - 1];
+                CompositeHandler[] newList = new CompositeHandler[m_handlers.length - 1];
                 System.arraycopy(m_handlers, 0, newList, 0, idx);
-                if (idx < newList.length)             {
-                    System.arraycopy(
-                            m_handlers, idx + 1, newList, idx, newList.length - idx);
+                if (idx < newList.length) {
+                    System.arraycopy(m_handlers, idx + 1, newList, idx, newList.length - idx);
                 }
                 m_handlers = newList;
             }
         }
     }
 
-
     /**
+     * Get the bundle context used by this instance.
      * @return the parent context of the instance.
+     * @see org.apache.felix.ipojo.ComponentInstance#getContext()
      */
-    public BundleContext getContext() { return m_context; }
+    public BundleContext getContext() {
+        return m_context;
+    }
 
     /**
      * Check the state of all handlers.
@@ -340,25 +404,36 @@
             setState(INVALID);
             return;
         }
-        if (isValid && m_state == INVALID) { setState(VALID); }
+        if (isValid && m_state == INVALID) {
+            setState(VALID);
+        }
     }
 
-	/**
-	 * @see org.apache.felix.ipojo.ComponentInstance#getInstanceName()
-	 */
-	public String getInstanceName() { return m_name; }
+    /**
+     * Get the instance name.
+     * @return the instance name
+     * @see org.apache.felix.ipojo.ComponentInstance#getInstanceName()
+     */
+    public String getInstanceName() {
+        return m_name;
+    }
 
-	/**
-	 * @see org.apache.felix.ipojo.ComponentInstance#reconfigure(java.util.Dictionary)
-	 */
-	public void reconfigure(Dictionary configuration) {
-		for (int i = 0; i < m_handlers.length; i++) {
-	        m_handlers[i].reconfigure(configuration);
-	    }
-	}
-	
-	/**
-	 * @return the internal service context.
-	 */
-	public ServiceContext getServiceContext() { return m_internalContext; }
+    /**
+     * Reconfigure the current instance.
+     * @param configuration : the new instance ocnfiguration.
+     * @see org.apache.felix.ipojo.ComponentInstance#reconfigure(java.util.Dictionary)
+     */
+    public void reconfigure(Dictionary configuration) {
+        for (int i = 0; i < m_handlers.length; i++) {
+            m_handlers[i].reconfigure(configuration);
+        }
+    }
+
+    /**
+     * Get the internal service context of this instance.
+     * @return the internal service context.
+     */
+    public ServiceContext getServiceContext() {
+        return m_internalContext;
+    }
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/DefaultServiceContext.java b/ipojo/src/main/java/org/apache/felix/ipojo/DefaultServiceContext.java
index 114c500..06f2694 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/DefaultServiceContext.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/DefaultServiceContext.java
@@ -27,116 +27,134 @@
 import org.osgi.framework.ServiceRegistration;
 
 /**
- * Default iPOJO Service Context.
- * this service context delegate all calls on the bundle context.
+ * Default iPOJO Service Context. this service context delegate all calls on the
+ * bundle context.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
-/**
- * @author Clement
- *
- */
 public class DefaultServiceContext implements ServiceContext {
-	
-	/**
-	 * The bundle context on which delegate.
-	 */
-	private BundleContext m_context;
-	
-	/**
-	 * Instance attached to this service context.
-	 */
-	private ComponentInstance m_instance;
-	
-	/**
-	 * Constructor. 
-	 * @param bc : the bundle context on which delegate.
-	 */
-	public DefaultServiceContext(BundleContext bc) { m_context = bc; }
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#addServiceListener(org.osgi.framework.ServiceListener, java.lang.String)
-	 */
-	public void addServiceListener(ServiceListener listener, String filter) throws InvalidSyntaxException {
-		m_context.addServiceListener(listener, filter);
-	}
-	
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#addServiceListener(org.osgi.framework.ServiceListener)
-	 */
-	public void addServiceListener(ServiceListener listener) {
-		m_context.addServiceListener(listener);
-	}
+    /**
+     * The bundle context on which delegate.
+     */
+    private BundleContext m_context;
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#getAllServiceReferences(java.lang.String, java.lang.String)
-	 */
-	public ServiceReference[] getAllServiceReferences(String clazz,
-			String filter) throws InvalidSyntaxException {
-		return m_context.getAllServiceReferences(clazz, filter);
-	}
+    /**
+     * Constructor.
+     * 
+     * @param bc : the bundle context on which delegate.
+     */
+    public DefaultServiceContext(BundleContext bc) {
+        m_context = bc;
+    }
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#getService(org.osgi.framework.ServiceReference)
-	 */
-	public Object getService(ServiceReference reference) {
-		return m_context.getService(reference);
-	}
+    /**
+     * Add a service listener.
+     * @param listener : the service lsitener to add.
+     * @param filter : the LDAP filter
+     * @throws InvalidSyntaxException : occurs when the LDAP filter is malformed
+     * @see org.apache.felix.ipojo.ServiceContext#addServiceListener(org.osgi.framework.ServiceListener, java.lang.String)
+     */
+    public void addServiceListener(ServiceListener listener, String filter) throws InvalidSyntaxException {
+        m_context.addServiceListener(listener, filter);
+    }
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#getServiceReference(java.lang.String)
-	 */
-	public ServiceReference getServiceReference(String clazz) {
-		return m_context.getServiceReference(clazz);
-	}
+    /**
+     * Add a service listener.
+     * @param listener : the service listener to add.
+     * @see org.apache.felix.ipojo.ServiceContext#addServiceListener(org.osgi.framework.ServiceListener)
+     */
+    public void addServiceListener(ServiceListener listener) {
+        m_context.addServiceListener(listener);
+    }
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#getServiceReferences(java.lang.String, java.lang.String)
-	 */
-	public ServiceReference[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
-		return m_context.getServiceReferences(clazz, filter);
-	}
+    /**
+     * Get the service references matching with the given query.
+     * @param clazz : Required interface
+     * @param filter : LDAP filter
+     * @return the array of available service reference
+     * @throws InvalidSyntaxException : occurs if the LDAP filter is malformed
+     * @see org.apache.felix.ipojo.ServiceContext#getAllServiceReferences(java.lang.String, java.lang.String)
+     */
+    public ServiceReference[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
+        return m_context.getAllServiceReferences(clazz, filter);
+    }
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#registerService(java.lang.String[], java.lang.Object, java.util.Dictionary)
-	 */
-	public ServiceRegistration registerService(String[] clazzes,
-			Object service, Dictionary properties) {
-		return m_context.registerService(clazzes, service, properties);
-	}
+    /**
+     * Get a service object.
+     * @param reference : the required service reference 
+     * @return the service object or null if the service reference is no more valid or if the service object is not accessible
+     * @see org.apache.felix.ipojo.ServiceContext#getService(org.osgi.framework.ServiceReference)
+     */
+    public Object getService(ServiceReference reference) {
+        return m_context.getService(reference);
+    }
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#registerService(java.lang.String, java.lang.Object, java.util.Dictionary)
-	 */
-	public ServiceRegistration registerService(String clazz, Object service,
-			Dictionary properties) {
-		return m_context.registerService(clazz, service, properties);
-	}
+    /**
+     * Get a service reference for the given interface.
+     * @param clazz : the required interface name
+     * @return a service reference on a available provider or null if no provider available
+     * @see org.apache.felix.ipojo.ServiceContext#getServiceReference(java.lang.String)
+     */
+    public ServiceReference getServiceReference(String clazz) {
+        return m_context.getServiceReference(clazz);
+    }
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#removeServiceListener(org.osgi.framework.ServiceListener)
-	 */
-	public void removeServiceListener(ServiceListener listener) {
-		m_context.removeServiceListener(listener);
+    /**
+     * Get service reference list for the given query.
+     * @param clazz : the name of the requried service interface
+     * @param filter : LDAP filter to apply on service provider
+     * @return : the array of consistent service reference or null if no available provider
+     * @throws InvalidSyntaxException : occrus if the LDAP filter is malformed
+     * @see org.apache.felix.ipojo.ServiceContext#getServiceReferences(java.lang.String, java.lang.String)
+     */
+    public ServiceReference[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
+        return m_context.getServiceReferences(clazz, filter);
+    }
 
-	}
+    /**
+     * Register a service.
+     * @param clazzes : interfaces provided by the service.
+     * @param service : the service object.
+     * @param properties : service properties.
+     * @return the service registration for this service publication.
+     * @see org.apache.felix.ipojo.ServiceContext#registerService(java.lang.String[], java.lang.Object, java.util.Dictionary)
+     */
+    public ServiceRegistration registerService(String[] clazzes, Object service, Dictionary properties) {
+        return m_context.registerService(clazzes, service, properties);
+    }
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#ungetService(org.osgi.framework.ServiceReference)
-	 */
-	public boolean ungetService(ServiceReference reference) {
-		return m_context.ungetService(reference);
-	}
+    /**
+     * Register a service.
+     * @param clazz : interface provided by the service.
+     * @param service : the service object.
+     * @param properties : service properties.
+     * @return the service registration for this service publication.
+     * @see org.apache.felix.ipojo.ServiceContext#registerService(java.lang.String, java.lang.Object, java.util.Dictionary)
+     */
+    public ServiceRegistration registerService(String clazz, Object service, Dictionary properties) {
+        return m_context.registerService(clazz, service, properties);
+    }
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#getComponentInstance()
-	 */
-	public ComponentInstance getComponentInstance() {
-		return m_instance;
-	}
-	
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#setComponentInstance(org.apache.felix.ipojo.ComponentInstance)
-	 */
-	public void setComponentInstance(ComponentInstance ci) { m_instance =  ci; }
+
+    /**
+     * Remove a service listener.
+     * @param listener : the service listner to remove
+     * @see org.apache.felix.ipojo.ServiceContext#removeServiceListener(org.osgi.framework.ServiceListener)
+     */
+    public void removeServiceListener(ServiceListener listener) {
+        m_context.removeServiceListener(listener);
+
+    }
+
+    /**
+     * Unget the service reference.
+     * @param reference : the reference to unget
+     * @return true if you are the last user of the reference
+     * @see org.apache.felix.ipojo.ServiceContext#ungetService(org.osgi.framework.ServiceReference)
+     */
+    public boolean ungetService(ServiceReference reference) {
+        return m_context.ungetService(reference);
+    }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/Factory.java b/ipojo/src/main/java/org/apache/felix/ipojo/Factory.java
index 141a608..9715747 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/Factory.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/Factory.java
@@ -23,52 +23,63 @@
 import org.apache.felix.ipojo.architecture.ComponentDescription;
 
 /**
- * Component Type Factory Service.
- * This service is exposed by a instance manager factory, and allows the dynamic creation of component instance.
+ * Component Type Factory Service. This service is exposed by a instance manager
+ * factory, and allows the dynamic creation of component instance.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public interface Factory {
 
     /**
      * Create an instance manager (i.e. component type instance).
+     * 
      * @param configuration : the configuration properties for this component.
      * @return the created instance manager.
+     * @throws UnacceptableConfiguration : when a given configuration is not valid.
      */
     ComponentInstance createComponentInstance(Dictionary configuration) throws UnacceptableConfiguration;
-    
+
     /**
-     * Create an instance manager (i.e. component type instance).
-     * This has these service interaction in the scope given in argument.
+     * Create an instance manager (i.e. component type instance). This has these
+     * service interaction in the scope given in argument.
+     * 
      * @param configuration : the configuration properties for this component.
      * @param serviceContext : the service context of the component.
      * @return the created instance manager.
+     * @throws UnacceptableConfiguration : when the given configuration isnot valid.
      */
     ComponentInstance createComponentInstance(Dictionary configuration, ServiceContext serviceContext) throws UnacceptableConfiguration;
 
     /**
-     * Get the component type information containing provided service, configuration properties ...
-     * @return the compionent type information.
+     * Get the component type information containing provided service,
+     * configuration properties ...
+     * 
+     * @return the component type information.
      */
     ComponentDescription getComponentDescription();
-    
+
     /**
-     * Check if the given configuration is acceptable as a configuration of a component instance.
+     * Check if the given configuration is acceptable as a configuration of a
+     * component instance.
+     * 
      * @param conf : the configuration to test
      * @return true if the configuration is acceptable
      */
     boolean isAcceptable(Dictionary conf);
-    
+
     /**
+     * Return the factory name.
      * @return the name of the factory.
      */
     String getName();
-    
-    
+
     /**
-     * Reconfigure an instance already created.
-     * This configuration need to have the name property to identify the instance.
+     * Reconfigure an instance already created. This configuration need to have
+     * the name property to identify the instance.
+     * 
      * @param conf : the configuration to reconfigure the instance.
-     * @throws UnacceptableConfiguration : if the given configuration is not consistent for the tragetted instance.
+     * @throws UnacceptableConfiguration : if the given configuration is not
+     * consistent for the tragetted instance.
      */
     void reconfigure(Dictionary conf) throws UnacceptableConfiguration;
 
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/Handler.java b/ipojo/src/main/java/org/apache/felix/ipojo/Handler.java
index 54b46b2..0c474bc 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/Handler.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/Handler.java
@@ -24,14 +24,16 @@
 import org.apache.felix.ipojo.metadata.Element;
 
 /**
- * Handler Abstract Class.
- * An handler need implements tese method to be notifed of lifecycle change, getfield operation and putfield operation
+ * Handler Abstract Class. An handler need implements tese method to be notifed
+ * of lifecycle change, getfield operation and putfield operation
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public abstract class Handler {
 
     /**
      * Configure the handler.
+     * 
      * @param im : the instance manager
      * @param metadata : the metadata of the component
      * @param configuration : the instance configuration
@@ -50,45 +52,64 @@
 
     /**
      * This method is called when a PUTFIELD operation is detected.
+     * 
      * @param fieldName : the field name
      * @param value : the value passed to the field
      */
-    public void setterCallback(String fieldName, Object value) { }
+    public void setterCallback(String fieldName, Object value) {
+    }
 
     /**
      * This method is called when a GETFIELD operation is detected.
+     * 
      * @param fieldName : the field name
      * @param value : the value passed to the field (by the previous handler)
      * @return : the managed value of the field
      */
-    public Object getterCallback(String fieldName, Object value) { return value; }
+    public Object getterCallback(String fieldName, Object value) {
+        return value;
+    }
 
     /**
      * Is the actual state valid for this handler ?
+     * 
      * @return true is the state seems valid for the handler
      */
-    public boolean isValid() { return true; }
+    public boolean isValid() {
+        return true;
+    }
 
     /**
      * This method is called when the component state changed.
+     * 
      * @param state : the new state
      */
-    public void stateChanged(int state) { }
+    public void stateChanged(int state) {
+    }
 
     /**
-     * This method is called when an instance of the component is created, but before someone can use it.
+     * This method is called when an instance of the component is created, but
+     * before someone can use it.
+     * 
      * @param instance : the created instance
      */
-    public void createInstance(Object instance) { }
-    
+    public void createInstance(Object instance) {
+    }
+
     /**
+     * Return the current handler description.
+     * Thesimplest description contains only the name and the validity of the handler.
      * @return the description of the handler..
      */
-    public HandlerDescription getDescription() { return new HandlerDescription(this.getClass().getName(), isValid()); }
+    public HandlerDescription getDescription() {
+        return new HandlerDescription(this.getClass().getName(), isValid());
+    }
 
-	/**
-	 * The instance is reconfiguring.
-	 * @param configuration : New instance configuration.
-	 */
-	public void reconfigure(Dictionary configuration) { }
+    /**
+     * The instance is reconfiguring.
+     * 
+     * @param configuration : New instance configuration.
+     */
+    public void reconfigure(Dictionary configuration) {
+    }
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/IPojoConfiguration.java b/ipojo/src/main/java/org/apache/felix/ipojo/IPojoConfiguration.java
index e431196..706a767 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/IPojoConfiguration.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/IPojoConfiguration.java
@@ -28,9 +28,8 @@
 import org.apache.felix.ipojo.util.Logger;
 
 /**
- * Activator Basic Configuration.
- * - Log Level
- * - Available handlers
+ * Activator Basic Configuration. - Log Level - Available handlers
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class IPojoConfiguration {
@@ -43,21 +42,22 @@
     /**
      * Available handlers in the iPOJO bundle.
      */
-    public static final Class[] INTERNAL_HANDLERS = new Class[] {
-        DependencyHandler.class,
-        ProvidedServiceHandler.class,
+    public static final Class[] INTERNAL_HANDLERS = new Class[] { 
+        DependencyHandler.class, 
+        ProvidedServiceHandler.class, 
         ConfigurationHandler.class,
-        LifecycleCallbackHandler.class,
-        ArchitectureHandler.class
+        LifecycleCallbackHandler.class, 
+        ArchitectureHandler.class 
     };
 
-	/**
-	 * Available composite handlers in the iPOJO bundle.
-	 */
-	public static final Class[] INTERNAL_COMPOSITE_HANDLERS = new Class[] {
-		ServiceInstantiatorHandler.class,
-		ImportExportHandler.class,
-		org.apache.felix.ipojo.composite.architecture.ArchitectureHandler.class
-	};
+    /**
+     * Available composite handlers in the iPOJO bundle.
+     */
+    public static final Class[] INTERNAL_COMPOSITE_HANDLERS = new Class[] { 
+        ServiceInstantiatorHandler.class, 
+        ImportExportHandler.class,
+        org.apache.felix.ipojo.composite.service.provides.ProvidedServiceHandler.class,
+        org.apache.felix.ipojo.composite.architecture.ArchitectureHandler.class
+    };
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/IPojoContext.java b/ipojo/src/main/java/org/apache/felix/ipojo/IPojoContext.java
index 85166b7..9d119e5 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/IPojoContext.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/IPojoContext.java
@@ -34,174 +34,272 @@
 import org.osgi.framework.ServiceRegistration;
 
 /**
- * The iPOJO Context is a BundleContext implementation allowing the separation between Bundle context and Service (Bundle) Context.
+ * The iPOJO Context is a BundleContext implementation allowing the separation
+ * between Bundle context and Service (Bundle) Context.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class IPojoContext implements BundleContext {
-	
-	/**
-	 * BundleContext used to access bundle method.
-	 */
-	private BundleContext m_bundleContext;
-	
-	/**
-	 * Service Context used to access service interaction. 
-	 */
-	private ServiceContext m_serviceContext;
-	
-	/**
-	 * Constructor.
-	 * Used when the service context = the bundle context
-	 * @param bc : bundle context
-	 */
-	public IPojoContext(BundleContext bc) {
-		m_bundleContext = bc;
-		m_serviceContext = new DefaultServiceContext(bc);
-	}
-	
-	/**
-	 * Constructor.
-	 * Used when the service context and the bundle context are different
-	 * @param bc : bundle context
-	 * @param sc : service context
-	 */
-	public IPojoContext(BundleContext bc, ServiceContext sc) {
-		m_bundleContext = bc;
-		m_serviceContext = sc;
-	}
 
-	/**
-	 * @see org.osgi.framework.BundleContext#addBundleListener(org.osgi.framework.BundleListener)
-	 */
-	public void addBundleListener(BundleListener listener) { m_bundleContext.addBundleListener(listener); }
+    /**
+     * BundleContext used to access bundle method.
+     */
+    private BundleContext m_bundleContext;
 
-	/**
-	 * @see org.osgi.framework.BundleContext#addFrameworkListener(org.osgi.framework.FrameworkListener)
-	 */
-	public void addFrameworkListener(FrameworkListener listener) { m_bundleContext.addFrameworkListener(listener); }
+    /**
+     * Service Context used to access service interaction.
+     */
+    private ServiceContext m_serviceContext;
 
-	/**
-	 * @see org.osgi.framework.BundleContext#addServiceListener(org.osgi.framework.ServiceListener, java.lang.String)
-	 */
-	public void addServiceListener(ServiceListener listener, String filter) throws InvalidSyntaxException {
-		m_serviceContext.addServiceListener(listener, filter); 
-	}
+    /**
+     * Constructor. Used when the service context = the bundle context
+     * 
+     * @param bc : bundle context
+     */
+    public IPojoContext(BundleContext bc) {
+        m_bundleContext = bc;
+        m_serviceContext = new DefaultServiceContext(bc);
+    }
 
-	/**
-	 * @see org.osgi.framework.BundleContext#addServiceListener(org.osgi.framework.ServiceListener)
-	 */
-	public void addServiceListener(ServiceListener listener) { m_serviceContext.addServiceListener(listener); }
+    /**
+     * Constructor. Used when the service context and the bundle context are
+     * different
+     * 
+     * @param bc : bundle context
+     * @param sc : service context
+     */
+    public IPojoContext(BundleContext bc, ServiceContext sc) {
+        m_bundleContext = bc;
+        m_serviceContext = sc;
+    }
 
-	/**
-	 * @see org.osgi.framework.BundleContext#createFilter(java.lang.String)
-	 */
-	public Filter createFilter(String filter) throws InvalidSyntaxException {
-		return m_bundleContext.createFilter(filter); 
-	}
+   
+    /**
+     * Add a bundle listener.
+     * @param listener : the listener to add
+     * @see org.osgi.framework.BundleContext#addBundleListener(org.osgi.framework.BundleListener)
+     */
+    public void addBundleListener(BundleListener listener) {
+        m_bundleContext.addBundleListener(listener);
+    }
 
-	/**
-	 * @see org.osgi.framework.BundleContext#getAllServiceReferences(java.lang.String, java.lang.String)
-	 */
-	public ServiceReference[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
-		return m_serviceContext.getAllServiceReferences(clazz, filter); 
-	}
+    /**
+     * Add a framework listener.
+     * @param listener : the listener object to add
+     * @see org.osgi.framework.BundleContext#addFrameworkListener(org.osgi.framework.FrameworkListener)
+     */
+    public void addFrameworkListener(FrameworkListener listener) {
+        m_bundleContext.addFrameworkListener(listener);
+    }
 
-	/**
-	 * @see org.osgi.framework.BundleContext#getBundle()
-	 */
-	public Bundle getBundle() { return m_bundleContext.getBundle(); }
+    /**
+     * Add a service listener.
+     * @param listener : the service lsitener to add.
+     * @param filter : the LDAP filter
+     * @throws InvalidSyntaxException : occurs when the LDAP filter is malformed
+     * @see org.osgi.framework.BundleContext#addServiceListener(org.osgi.framework.ServiceListener, java.lang.String)
+     */
+    public void addServiceListener(ServiceListener listener, String filter) throws InvalidSyntaxException {
+        m_serviceContext.addServiceListener(listener, filter);
+    }
 
-	/**
-	 * @see org.osgi.framework.BundleContext#getBundle(long)
-	 */
-	public Bundle getBundle(long id) { return m_bundleContext.getBundle(id); }
+    /**
+     * Add a service listener.
+     * @param listener : the service listener to add.
+     * @see org.osgi.framework.BundleContext#addServiceListener(org.osgi.framework.ServiceListener)
+     */
+    public void addServiceListener(ServiceListener listener) {
+        m_serviceContext.addServiceListener(listener);
+    }
 
-	/**
-	 * @see org.osgi.framework.BundleContext#getBundles()
-	 */
-	public Bundle[] getBundles() { return m_bundleContext.getBundles();	}
 
-	/**
-	 * @see org.osgi.framework.BundleContext#getDataFile(java.lang.String)
-	 */
-	public File getDataFile(String filename) { return m_bundleContext.getDataFile(filename); }
+    /**
+     * Create a Filter object.
+     * @param filter : the string form of the LDAP filter to create
+     * @return the Filter object.
+     * @throws InvalidSyntaxException : occurs when the given filter is malformed
+     * @see org.osgi.framework.BundleContext#createFilter(java.lang.String)
+     */
+    public Filter createFilter(String filter) throws InvalidSyntaxException {
+        return m_bundleContext.createFilter(filter);
+    }
 
-	/**
-	 * @see org.osgi.framework.BundleContext#getProperty(java.lang.String)
-	 */
-	public String getProperty(String key) { return m_bundleContext.getProperty(key); }
+    /**
+     * Get the service references matching with the given query.
+     * @param clazz : Required interface
+     * @param filter : LDAP filter
+     * @return the array of available service reference
+     * @throws InvalidSyntaxException : occurs if the LDAP filter is malformed
+     * @see org.osgi.framework.BundleContext#getAllServiceReferences(java.lang.String, java.lang.String)
+     */
+    public ServiceReference[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
+        return m_serviceContext.getAllServiceReferences(clazz, filter);
+    }
 
-	/**
-	 * @see org.osgi.framework.BundleContext#getService(org.osgi.framework.ServiceReference)
-	 */
-	public Object getService(ServiceReference reference) { return m_serviceContext.getService(reference); }
+    /**
+     * Get the current bundle.
+     * @return the current bundle
+     * @see org.osgi.framework.BundleContext#getBundle()
+     */
+    public Bundle getBundle() {
+        return m_bundleContext.getBundle();
+    }
 
-	/**
-	 * @see org.osgi.framework.BundleContext#getServiceReference(java.lang.String)
-	 */
-	public ServiceReference getServiceReference(String clazz) { return m_serviceContext.getServiceReference(clazz); }
+    /**
+     * Get the bundle object with the given id.
+     * @param id : bundle id
+     * @return the bundle object
+     * @see org.osgi.framework.BundleContext#getBundle(long)
+     */
+    public Bundle getBundle(long id) {
+        return m_bundleContext.getBundle(id);
+    }
 
-	/**
-	 * @see org.osgi.framework.BundleContext#getServiceReferences(java.lang.String, java.lang.String)
-	 */
-	public ServiceReference[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException { 
-		return m_serviceContext.getServiceReferences(clazz, filter); 
-	}
+    /**
+     * Get installed bundles.
+     * @return the list of installed bundles
+     * @see org.osgi.framework.BundleContext#getBundles()
+     */
+    public Bundle[] getBundles() {
+        return m_bundleContext.getBundles();
+    }
 
-	/**
-	 * @see org.osgi.framework.BundleContext#installBundle(java.lang.String)
-	 */
-	public Bundle installBundle(String location) throws BundleException { return m_bundleContext.installBundle(location); }
 
-	/**
-	 * @see org.osgi.framework.BundleContext#installBundle(java.lang.String, java.io.InputStream)
-	 */
-	public Bundle installBundle(String location, InputStream input) throws BundleException { 
-		return m_bundleContext.installBundle(location, input); 
-	}
+    /**
+     * Get a data file.
+     * @param filename : File name.
+     * @return the File object
+     * @see org.osgi.framework.BundleContext#getDataFile(java.lang.String)
+     */
+    public File getDataFile(String filename) {
+        return m_bundleContext.getDataFile(filename);
+    }
 
-	/**
-	 * @see org.osgi.framework.BundleContext#registerService(java.lang.String[], java.lang.Object, java.util.Dictionary)
-	 */
-	public ServiceRegistration registerService(String[] clazzes,
-			Object service, Dictionary properties) { return m_serviceContext.registerService(clazzes, service, properties); }
+    /**
+     * Get a property value.
+     * @param key : key of the asked property
+     * @return the property value (object) or null if no property are associated with the given key
+     * @see org.osgi.framework.BundleContext#getProperty(java.lang.String)
+     */
+    public String getProperty(String key) {
+        return m_bundleContext.getProperty(key);
+    }
 
-	/**
-	 * @see org.osgi.framework.BundleContext#registerService(java.lang.String, java.lang.Object, java.util.Dictionary)
-	 */
-	public ServiceRegistration registerService(String clazz, Object service,
-			Dictionary properties) { return m_serviceContext.registerService(clazz, service, properties); }
+    /**
+     * Get a service object.
+     * @param reference : the required service reference 
+     * @return the service object or null if the service reference is no more valid or if the service object is not accessible
+     * @see org.osgi.framework.BundleContext#getService(org.osgi.framework.ServiceReference)
+     */
+    public Object getService(ServiceReference reference) {
+        return m_serviceContext.getService(reference);
+    }
 
-	/**
-	 * @see org.osgi.framework.BundleContext#removeBundleListener(org.osgi.framework.BundleListener)
-	 */
-	public void removeBundleListener(BundleListener listener) { m_bundleContext.removeBundleListener(listener); }
+    /**
+     * Get a service reference for the given interface.
+     * @param clazz : the required interface name
+     * @return a service reference on a available provider or null if no provider available
+     * @see org.osgi.framework.BundleContext#getServiceReference(java.lang.String)
+     */
+    public ServiceReference getServiceReference(String clazz) {
+        return m_serviceContext.getServiceReference(clazz);
+    }
 
-	/**
-	 * @see org.osgi.framework.BundleContext#removeFrameworkListener(org.osgi.framework.FrameworkListener)
-	 */
-	public void removeFrameworkListener(FrameworkListener listener) { m_bundleContext.removeFrameworkListener(listener); }
+    /**
+     * Get service reference list for the given query.
+     * @param clazz : the name of the requried service interface
+     * @param filter : LDAP filter to apply on service provider
+     * @return : the array of consistent service reference or null if no available provider
+     * @throws InvalidSyntaxException : occrus if the LDAP filter is malformed
+     * @see org.osgi.framework.BundleContext#getServiceReferences(java.lang.String, java.lang.String)
+     */
+    public ServiceReference[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
+        return m_serviceContext.getServiceReferences(clazz, filter);
+    }
 
-	/**
-	 * @see org.osgi.framework.BundleContext#removeServiceListener(org.osgi.framework.ServiceListener)
-	 */
-	public void removeServiceListener(ServiceListener listener) { m_serviceContext.removeServiceListener(listener); }
+    /**
+     * Install a bundle.
+     * @param location : URL of the bundle to install
+     * @return the installed bundle
+     * @throws BundleException : if the bundle cannot be installed correctly
+     * @see org.osgi.framework.BundleContext#installBundle(java.lang.String)
+     */
+    public Bundle installBundle(String location) throws BundleException {
+        return m_bundleContext.installBundle(location);
+    }
 
-	/**
-	 * @see org.osgi.framework.BundleContext#ungetService(org.osgi.framework.ServiceReference)
-	 */
-	public boolean ungetService(ServiceReference reference) { return m_serviceContext.ungetService(reference); }
-	
-	/**
-	 * Set the instance to the service context.
-	 * @param ci : the component instance
-	 */
-	//public void setComponentInstance(ComponentInstance ci) { m_serviceContext.setComponentInstance(ci); }
-	
-	/**
-	 * Get the instance manager from the service context.
-	 * @return the component manager of the service context
-	 */
-	//public ComponentInstance getComponentInstance() { return m_serviceContext.getComponentInstance(); }
+    /**
+     * Install a bundle.
+     * @param location : URL of the bundle to install
+     * @param input : 
+     * @return the installed bundle
+     * @throws BundleException : if the bundle cannot be installed correctly
+     * @see org.osgi.framework.BundleContext#installBundle(java.lang.String, java.io.InputStream)
+     */
+    public Bundle installBundle(String location, InputStream input) throws BundleException {
+        return m_bundleContext.installBundle(location, input);
+    }
+
+    /**
+     * Register a service.
+     * @param clazzes : interfaces provided by the service.
+     * @param service : the service object.
+     * @param properties : service properties.
+     * @return the service registration for this service publication.
+     * @see org.apache.felix.ipojo.ServiceContext#registerService(java.lang.String[], java.lang.Object, java.util.Dictionary)
+     */
+    public ServiceRegistration registerService(String[] clazzes, Object service, Dictionary properties) {
+        return m_serviceContext.registerService(clazzes, service, properties);
+    }
+
+    /**
+     * Register a service.
+     * @param clazz : interface provided by the service.
+     * @param service : the service object.
+     * @param properties : service properties.
+     * @return the service registration for this service publication.
+     * @see org.osgi.framework.BundleContext#registerService(java.lang.String, java.lang.Object, java.util.Dictionary)
+     */
+    public ServiceRegistration registerService(String clazz, Object service, Dictionary properties) {
+        return m_serviceContext.registerService(clazz, service, properties);
+    }
+
+    /**
+     * Remove a bundle listener.
+     * @param listener : the listener to remove
+     * @see org.osgi.framework.BundleContext#removeBundleListener(org.osgi.framework.BundleListener)
+     */
+    public void removeBundleListener(BundleListener listener) {
+        m_bundleContext.removeBundleListener(listener);
+    }
+
+    /**
+     * Remove a framework listener.
+     * @param listener : the listener to remove
+     * @see org.osgi.framework.BundleContext#removeFrameworkListener(org.osgi.framework.FrameworkListener)
+     */
+    public void removeFrameworkListener(FrameworkListener listener) {
+        m_bundleContext.removeFrameworkListener(listener);
+    }
+
+    /**
+     * Remove a service listener.
+     * @param listener : the service listner to remove
+     * @see org.apache.felix.ipojo.ServiceContext#removeServiceListener(org.osgi.framework.ServiceListener)
+     * @see org.osgi.framework.BundleContext#removeServiceListener(org.osgi.framework.ServiceListener)
+     */
+    public void removeServiceListener(ServiceListener listener) {
+        m_serviceContext.removeServiceListener(listener);
+    }
+
+    /**
+     * Unget the service reference.
+     * @param reference : the reference to unget
+     * @return true if you are the last user of the reference
+     * @see org.osgi.framework.BundleContext#ungetService(org.osgi.framework.ServiceReference)
+     */
+    public boolean ungetService(ServiceReference reference) {
+        return m_serviceContext.ungetService(reference);
+    }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/InstanceCreator.java b/ipojo/src/main/java/org/apache/felix/ipojo/InstanceCreator.java
index 6fa3be8..2254a1a 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/InstanceCreator.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/InstanceCreator.java
@@ -28,172 +28,202 @@
 import org.osgi.framework.ServiceReference;
 
 /**
- * An instance creator aims to create instances and to track their factories. 
+ * An instance creator aims to create instances and to track their factories.
  * It's allow to create instance from outside factories.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class InstanceCreator implements ServiceListener {
-	
-	/**
-	 * Bundle Context.
-	 */
-	private BundleContext m_context;
-	
-	/**
-	 * Logger to log messages if error occurs.
-	 */
-	private Logger m_logger;
-	
-	/**
-	 * This structure aims to manage a configuration.
-	 * It stores all necessary information to create an instance and to track the factory.
-	 */
-	private class ManagedConfiguration {
-		/**
-		 * Configuration of the instance to create.
-		 */
-		private Dictionary m_configuration;
-		
-		/**
-		 * Factory name. 
-		 */
-		private String m_factoryName;
-		
-		/**
-		 * Created instance. 
-		 */
-		private ComponentInstance m_instance;
-		
-		/**
-		 * Constructor.
-		 * @param conf : the configuration to create.
-		 */
-		ManagedConfiguration(Dictionary conf) { m_configuration = conf; }
-		
-		/**
-		 * @return the configuration.
-		 */
-		Dictionary getConfiguration() { return m_configuration; }
-		
-		/**
-		 * @return the factory
-		 */
-		String getFactory() { return m_factoryName; }
-		
-		/**
-		 * @return the instance (or null if no instance are created).
-		 */
-		ComponentInstance getInstance() { return m_instance; }
-		
-		/**
-		 * Set the factory name.
-		 * @param name : the factory name.
-		 */
-		void setFactory(String name) { m_factoryName = name; }
-		
-		/**
-		 * Set the instance object.
-		 * @param instance : the instance
-		 */
-		void setInstance(ComponentInstance instance) { m_instance = instance; }
-	}
-	
-	
-	/**
-	 * Configurations to create and maintains.
-	 */
-	private ManagedConfiguration[] m_configurations;
-	
-	/**
-	 * Constructor.
-	 * @param context : the bundle context.
-	 * @param configurations : configuration set to create and maintain.
-	 */
-	public InstanceCreator(BundleContext context, Dictionary[] configurations) {
-		m_context = context;
-		m_logger = new Logger(context, "InstanceCreator" + context.getBundle().getBundleId(), Logger.WARNING);
-		m_configurations = new ManagedConfiguration[configurations.length];
-		for (int i = 0; i < configurations.length; i++) {
-			ManagedConfiguration conf = new ManagedConfiguration(configurations[i]);
-			m_configurations[i] = conf;
-			
-			// Get the component type name :
-			String componentType = (String) conf.getConfiguration().get("component");
-			Factory fact = null;
-			
-			try {
-				String fil = "(|(" + org.osgi.framework.Constants.SERVICE_PID + "=" + componentType + ")(component.class=" + componentType + "))";
-				ServiceReference[] refs = context.getServiceReferences(org.apache.felix.ipojo.Factory.class.getName(), fil);
-				if (refs != null) { 
-					fact = (Factory) m_context.getService(refs[0]);
-					createInstance(fact, conf);					
-				} else {
-					m_logger.log(Logger.WARNING, "No factory available for the type : " + componentType);
-				}
-			} catch (InvalidSyntaxException e) { m_logger.log(Logger.ERROR, "Invalid syntax filter for the type : " + componentType, e); }
-		}
-		
-		// Register a service listenner on Factory Service
-		try {
-			m_context.addServiceListener(this, "(objectClass=" + Factory.class.getName() + ")");
-		} catch (InvalidSyntaxException e) { m_logger.log(Logger.ERROR, "Invalid syntax filter when registering a listener on Factory Service", e); }
-	}
-	
-	/**
-	 * Create an instance using the given factory and the given configuration.
-	 * @param fact : the facotry name to used.
-	 * @param config : the configuration.
-	 */
-	private void createInstance(Factory fact, ManagedConfiguration config) {
-		Dictionary conf = config.getConfiguration();
-		try {
-			config.setInstance(fact.createComponentInstance(conf));
-			config.setFactory(fact.getName());
-		} catch (UnacceptableConfiguration e) {
-			m_logger.log(Logger.ERROR, "A factory is available for the configuration but the configuration is not acceptable", e);
-		}
-	}
+    /**
+     * Bundle Context.
+     */
+    private BundleContext m_context;
 
-	/**
-	 * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
-	 */
-	public void serviceChanged(ServiceEvent ev) {
-		ServiceReference ref = ev.getServiceReference();
-		String factoryName = (String) ref.getProperty(org.osgi.framework.Constants.SERVICE_PID);
-		String componentClass = (String) ref.getProperty("component.class");
-		
-		if (ev.getType() == ServiceEvent.REGISTERED) { //A new factory appears
-			for (int i = 0; i < m_configurations.length; i++) {
-				if (m_configurations[i].getInstance() == null && (m_configurations[i].getConfiguration().get("component").equals(factoryName) ||  m_configurations[i].getConfiguration().get("component").equals(componentClass))) {
-					Factory fact = (Factory) m_context.getService(ref);
-					createInstance(fact, m_configurations[i]);
-				}
-			}
-			return;
-		}
-		
-		if (ev.getType() == ServiceEvent.UNREGISTERING) {
-			for (int i = 0; i < m_configurations.length; i++) {
-				if (m_configurations[i].getInstance() != null && m_configurations[i].getFactory().equals(factoryName)) {
-					m_configurations[i].setInstance(null);
-					m_configurations[i].setFactory(null);
-					m_context.ungetService(ref);
-				}
-			}
-			return;
-		}
-	}
-	
-	/**
-	 * Stop all created instances.
-	 */
-	public void stop() {
-		for (int i = 0; i < m_configurations.length; i++) {
-			if (m_configurations[i].getInstance() != null) { m_configurations[i].getInstance().stop(); }
-			m_configurations[i].setInstance(null);
-			m_configurations[i].setFactory(null);
-		}
-		m_configurations = null;
-	}
+    /**
+     * Logger to log messages if error occurs.
+     */
+    private Logger m_logger;
+
+    /**
+     * This structure aims to manage a configuration. It stores all necessary
+     * information to create an instance and to track the factory.
+     */
+    private class ManagedConfiguration {
+        /**
+         * Configuration of the instance to create.
+         */
+        private Dictionary m_configuration;
+
+        /**
+         * Factory name.
+         */
+        private String m_factoryName;
+
+        /**
+         * Created instance.
+         */
+        private ComponentInstance m_instance;
+
+        /**
+         * Constructor.
+         * 
+         * @param conf : the configuration to create.
+         */
+        ManagedConfiguration(Dictionary conf) {
+            m_configuration = conf;
+        }
+
+        /**
+         * Return the managed configuration.
+         * @return the configuration.
+         */
+        Dictionary getConfiguration() {
+            return m_configuration;
+        }
+
+        /**
+         * Return the used factory name.
+         * @return the factory
+         */
+        String getFactory() {
+            return m_factoryName;
+        }
+
+        /**
+         * Return the created instance.
+         * @return the instance (or null if no instance are created).
+         */
+        ComponentInstance getInstance() {
+            return m_instance;
+        }
+
+        /**
+         * Set the factory name.
+         * 
+         * @param name : the factory name.
+         */
+        void setFactory(String name) {
+            m_factoryName = name;
+        }
+
+        /**
+         * Set the instance object.
+         * 
+         * @param instance : the instance
+         */
+        void setInstance(ComponentInstance instance) {
+            m_instance = instance;
+        }
+    }
+
+    /**
+     * Configurations to create and maintains.
+     */
+    private ManagedConfiguration[] m_configurations = new ManagedConfiguration[0];
+
+    /**
+     * Constructor.
+     * 
+     * @param context : the bundle context.
+     * @param configurations : configuration set to create and maintain.
+     */
+    public InstanceCreator(BundleContext context, Dictionary[] configurations) {
+        m_context = context;
+        m_logger = new Logger(context, "InstanceCreator" + context.getBundle().getBundleId(), Logger.WARNING);
+        m_configurations = new ManagedConfiguration[configurations.length];
+        for (int i = 0; i < configurations.length; i++) {
+            ManagedConfiguration conf = new ManagedConfiguration(configurations[i]);
+            m_configurations[i] = conf;
+
+            // Get the component type name :
+            String componentType = (String) conf.getConfiguration().get("component");
+            Factory fact = null;
+
+            try {
+                String fil = "(|(" + org.osgi.framework.Constants.SERVICE_PID + "=" + componentType + ")(component.class=" + componentType + "))";
+                ServiceReference[] refs = context.getServiceReferences(org.apache.felix.ipojo.Factory.class.getName(), fil);
+                if (refs != null) {
+                    fact = (Factory) m_context.getService(refs[0]);
+                    createInstance(fact, conf);
+                } else {
+                    m_logger.log(Logger.WARNING, "No factory available for the type : " + componentType);
+                }
+            } catch (InvalidSyntaxException e) {
+                m_logger.log(Logger.ERROR, "Invalid syntax filter for the type : " + componentType, e);
+            }
+        }
+
+        // Register a service listenner on Factory Service
+        try {
+            m_context.addServiceListener(this, "(objectClass=" + Factory.class.getName() + ")");
+        } catch (InvalidSyntaxException e) {
+            m_logger.log(Logger.ERROR, "Invalid syntax filter when registering a listener on Factory Service", e);
+        }
+    }
+
+    /**
+     * Create an instance using the given factory and the given configuration.
+     * 
+     * @param fact : the facotry name to used.
+     * @param config : the configuration.
+     */
+    private void createInstance(Factory fact, ManagedConfiguration config) {
+        Dictionary conf = config.getConfiguration();
+        try {
+            config.setInstance(fact.createComponentInstance(conf));
+            config.setFactory(fact.getName());
+        } catch (UnacceptableConfiguration e) {
+            m_logger.log(Logger.ERROR, "A factory is available for the configuration but the configuration is not acceptable", e);
+        }
+    }
+
+    /**
+     * Service Listener implementation.
+     * @param ev : the service event
+     * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
+     */
+    public void serviceChanged(ServiceEvent ev) {
+        ServiceReference ref = ev.getServiceReference();
+        String factoryName = (String) ref.getProperty(org.osgi.framework.Constants.SERVICE_PID);
+        String componentClass = (String) ref.getProperty("component.class");
+
+        if (ev.getType() == ServiceEvent.REGISTERED) { // A new factory appears
+            for (int i = 0; i < m_configurations.length; i++) {
+                if (m_configurations[i].getInstance() == null
+                        && (m_configurations[i].getConfiguration().get("component").equals(factoryName) || m_configurations[i].getConfiguration().get(
+                                "component").equals(componentClass))) {
+                    Factory fact = (Factory) m_context.getService(ref);
+                    createInstance(fact, m_configurations[i]);
+                }
+            }
+            return;
+        }
+
+        if (ev.getType() == ServiceEvent.UNREGISTERING) {
+            for (int i = 0; i < m_configurations.length; i++) {
+                if (m_configurations[i].getInstance() != null && m_configurations[i].getFactory().equals(factoryName)) {
+                    m_configurations[i].setInstance(null);
+                    m_configurations[i].setFactory(null);
+                    m_context.ungetService(ref);
+                }
+            }
+            return;
+        }
+    }
+
+    /**
+     * Stop all created instances.
+     */
+    public synchronized void stop() {
+        m_context.removeServiceListener(this);
+        for (int i = 0; i < m_configurations.length; i++) {
+            if (m_configurations[i].getInstance() != null) {
+                m_configurations[i].getInstance().stop();
+            }
+            m_configurations[i].setInstance(null);
+            m_configurations[i].setFactory(null);
+        }
+        m_configurations = null;
+    }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/InstanceManager.java b/ipojo/src/main/java/org/apache/felix/ipojo/InstanceManager.java
index 5f9cda3..134d5f3 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/InstanceManager.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/InstanceManager.java
@@ -30,8 +30,9 @@
 import org.osgi.framework.BundleContext;
 
 /**
- * The instance manager class manages one instance of a component type.
- * It manages component lifecycle, component instance creation and handlers.
+ * The instance manager class manages one instance of a component type. It
+ * manages component lifecycle, component instance creation and handlers.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class InstanceManager implements ComponentInstance {
@@ -40,12 +41,12 @@
      * Parent factory (ComponentFactory).
      */
     private ComponentFactory m_factory;
-    
+
     /**
      * Name of the component instance.
      */
     private String m_name;
-    
+
     /**
      * Name of the component type implementation class.
      */
@@ -72,7 +73,7 @@
     private int m_state = STOPPED;
 
     /**
-     * Manipulatd clazz.
+     * Manipulated clazz.
      */
     private Class m_clazz;
 
@@ -89,6 +90,7 @@
     // Constructor
     /**
      * Construct a new Component Manager.
+     * 
      * @param factory : the factory managing the instance manager
      * @param bc : the bundle context to give to the instance
      */
@@ -99,14 +101,17 @@
     }
 
     /**
-     * Configure the instance manager.
-     * Stop the existings handler, clear the handler list, change the metadata, recreate the handlers
+     * Configure the instance manager. Stop the existings handler, clear the
+     * handler list, change the metadata, recreate the handlers
+     * 
      * @param cm : the component type metadata
      * @param configuration : the configuration of the instance
      */
     public void configure(Element cm, Dictionary configuration) {
         // Stop all previous registred handler
-        if (m_handlers.length != 0) { stop(); }
+        if (m_handlers.length != 0) {
+            stop();
+        }
 
         // Clear the handler list
         m_handlers = new Handler[0];
@@ -119,7 +124,7 @@
 
         // ComponentInfo initialization
         m_componentDesc = new ComponentDescription(m_factory.getName(), m_className);
-        
+
         // Add the name
         m_name = (String) configuration.get("name");
 
@@ -130,9 +135,11 @@
                 Handler h = (Handler) IPojoConfiguration.INTERNAL_HANDLERS[i].newInstance();
                 h.configure(this, cm, configuration);
             } catch (InstantiationException e) {
-                m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + IPojoConfiguration.INTERNAL_HANDLERS[i] + " : " + e.getMessage());
+                m_factory.getLogger().log(Logger.ERROR,
+                        "[" + m_name + "] Cannot instantiate the handler " + IPojoConfiguration.INTERNAL_HANDLERS[i] + " : " + e.getMessage());
             } catch (IllegalAccessException e) {
-                m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + IPojoConfiguration.INTERNAL_HANDLERS[i] + " : " + e.getMessage());
+                m_factory.getLogger().log(Logger.ERROR,
+                        "[" + m_name + "] Cannot instantiate the handler " + IPojoConfiguration.INTERNAL_HANDLERS[i] + " : " + e.getMessage());
             }
         }
 
@@ -145,67 +152,72 @@
                     Handler h = (Handler) c.newInstance();
                     h.configure(this, cm, configuration);
                 } catch (ClassNotFoundException e) {
-                    m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + cm.getNamespaces()[i] + " : " + e.getMessage());
+                    m_factory.getLogger()
+                            .log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + cm.getNamespaces()[i] + " : " + e.getMessage());
                 } catch (InstantiationException e) {
-                    m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + cm.getNamespaces()[i] + " : " + e.getMessage());
+                    m_factory.getLogger()
+                            .log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + cm.getNamespaces()[i] + " : " + e.getMessage());
                 } catch (IllegalAccessException e) {
-                    m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + cm.getNamespaces()[i] + " : " + e.getMessage());
+                    m_factory.getLogger()
+                            .log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + cm.getNamespaces()[i] + " : " + e.getMessage());
                 }
             }
         }
     }
 
     /**
+     * Get the compoenent-type description of the current instance.
      * @return the component type information.
+     * @see org.apache.felix.ipojo.ComponentInstance#getComponentDescription()
      */
-    public ComponentDescription getComponentDescription() { return m_componentDesc; }
-    
+    public ComponentDescription getComponentDescription() {
+        return m_componentDesc;
+    }
+
     /**
+     * Get the description of the current instance. 
      * @return the instance description.
+     * @see org.apache.felix.ipojo.ComponentInstance#getInstanceDescription()
      */
     public InstanceDescription getInstanceDescription() {
-    	int componentState = getState();
+        int componentState = getState();
         InstanceDescription instanceDescription = new InstanceDescription(m_name, componentState, getContext().getBundle().getBundleId(), m_componentDesc);
 
         String[] objects = new String[getPojoObjects().length];
         for (int i = 0; i < getPojoObjects().length; i++) {
-        	objects[i] = getPojoObjects()[i].toString();
+            objects[i] = getPojoObjects()[i].toString();
         }
         instanceDescription.setCreatedObjects(objects);
 
         Handler[] handlers = getRegistredHandlers();
         for (int i = 0; i < handlers.length; i++) {
-        	instanceDescription.addHandler(handlers[i].getDescription());
+            instanceDescription.addHandler(handlers[i].getDescription());
         }
         return instanceDescription;
     }
 
     /**
-     * @return the list of the registred handlers.
+     * Get the list of handlers plugged on the instance.
+     * @return the handler array of plugged handlers.
      */
-    public Handler[] getRegistredHandlers() { return m_handlers; }
+    public Handler[] getRegistredHandlers() {
+        return m_handlers;
+    }
 
     /**
      * Return a specified handler.
+     * 
      * @param name : class name of the handler to find
      * @return : the handler, or null if not found
      */
     public Handler getHandler(String name) {
         for (int i = 0; i < m_handlers.length; i++) {
-            if (m_handlers[i].getClass().getName().equalsIgnoreCase(name)) { return m_handlers[i]; }
+            if (m_handlers[i].getClass().getName().equalsIgnoreCase(name)) {
+                return m_handlers[i];
+            }
         }
         return null;
     }
-    
-    /**
-     * @return the component instance name.
-     */
-    public String getComponentName() { return m_name; }
-    
-    /**
-     * @return the implementation class name of the instance.
-     */
-    public String getClassName() { return m_className; }
 
     // ===================== Lifecycle management =====================
 
@@ -213,8 +225,10 @@
      * Start the instance manager.
      */
     public void start() {
-    	if (m_state != STOPPED) { return; } // Instance already started
-    	
+        if (m_state != STOPPED) {
+            return;
+        } // Instance already started
+
         // Start all the handlers
         m_factory.getLogger().log(Logger.INFO, "[" + m_name + "] Start the instance manager with " + m_handlers.length + " handlers");
 
@@ -233,30 +247,58 @@
      * Stop the instance manager.
      */
     public void stop() {
-    	if (m_state == STOPPED) { return; } // Instance already stopped
-    	
+        if (m_state == STOPPED) {
+            return;
+        } // Instance already stopped
+
         setState(INVALID);
         // Stop all the handlers
         for (int i = m_handlers.length - 1; i > -1; i--) {
             m_handlers[i].stop();
         }
         m_pojoObjects = new Object[0];
-        
+
         m_state = STOPPED;
+    }
+    
+    /** 
+     * Dispose the instance.
+     * @see org.apache.felix.ipojo.ComponentInstance#dispose()
+     */
+    public void dispose() {
+        if (m_state != STOPPED) {
+            stop();
+        }
         
         m_factory.stopped(this);
+
+        // Cleaning
+        m_factory = null;
+        m_name = null;
+        m_className = null;
+        m_context = null;
+        m_handlers = null;
+        m_fieldRegistration = null;
+        m_clazz = null;
+        m_pojoObjects = null;
+        m_componentDesc = null;
     }
 
     /**
-     * Set the state of the component.
-     * if the state changed call the stateChanged(int) method on the handlers
+     * Set the state of the component instance.
+     * Ff the state changed call the stateChanged(int) method on the handlers.
+     * @param state : the new state
      */
     public void setState(int state) {
         if (m_state != state) {
 
             // Log the state change
-            if (state == INVALID) { m_factory.getLogger().log(Logger.INFO, "[" + m_name + "]  State -> INVALID"); }
-            if (state == VALID) { m_factory.getLogger().log(Logger.INFO, "[" + m_name + "] State -> VALID"); }
+            if (state == INVALID) {
+                m_factory.getLogger().log(Logger.INFO, "[" + m_name + "]  State -> INVALID");
+            }
+            if (state == VALID) {
+                m_factory.getLogger().log(Logger.INFO, "[" + m_name + "] State -> VALID");
+            }
 
             // The state changed call the handler stateChange method
             m_state = state;
@@ -267,23 +309,35 @@
     }
 
     /**
-     * @return the actual state of the component.
+     * Get the actual state of the instance.
+     * @return the actual state of the component instance.
+     * @see org.apache.felix.ipojo.ComponentInstance#getState()
      */
-    public int getState() { return m_state; }
-    
+    public int getState() {
+        return m_state;
+    }
+
     /**
+     * Check if the instance if started.
+     * @return true if the instance is started.
      * @see org.apache.felix.ipojo.ComponentInstance#isStarted()
      */
-    public boolean isStarted() { return m_state != STOPPED; }
+    public boolean isStarted() {
+        return m_state != STOPPED;
+    }
 
     // ===================== end Lifecycle management =====================
 
     // ================== Class & Instance management ===================
 
     /**
+     * Get the factory which create the current instance.
      * @return the factory of the component
+     * @see org.apache.felix.ipojo.ComponentInstance#getFactory()
      */
-    public ComponentFactory getFactory() { return m_factory; }
+    public ComponentFactory getFactory() {
+        return m_factory;
+    }
 
     /**
      * Load the manipulated class.
@@ -291,17 +345,18 @@
     private void load() {
         try {
             m_clazz = m_factory.loadClass(m_className);
-        } catch (ClassNotFoundException  e) {
+        } catch (ClassNotFoundException e) {
             m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] Class not found during the loading phase : " + e.getMessage());
             return;
         }
     }
 
     /**
+     * Is the implementation class loaded?
      * @return true if the class is loaded
      */
     private boolean isLoaded() {
-        return (m_clazz != null);
+        return m_clazz != null;
     }
 
     /**
@@ -310,7 +365,9 @@
      */
     private void addInstance(Object o) {
         for (int i = 0; (m_pojoObjects != null) && (i < m_pojoObjects.length); i++) {
-            if (m_pojoObjects[i] == o) { return; }
+            if (m_pojoObjects[i] == o) {
+                return;
+            }
         }
 
         if (m_pojoObjects.length > 0) {
@@ -319,28 +376,33 @@
             newInstances[m_pojoObjects.length] = o;
             m_pojoObjects = newInstances;
         } else {
-            m_pojoObjects = new Object[] {o};
+            m_pojoObjects = new Object[] { o };
         }
     }
 
     /**
-     * Remove an instance from the created instance list. The instance will be eated by the garbage collector.
+     * Remove an instance from the created instance list.
+     * The instance will be eated by the garbage collector.
+     * 
      * @param o : the instance to remove
      */
     private void removeInstance(Object o) {
         int idx = -1;
         for (int i = 0; i < m_pojoObjects.length; i++) {
-            if (m_pojoObjects[i] == o) { idx = i; break; }
+            if (m_pojoObjects[i] == o) {
+                idx = i;
+                break;
+            }
         }
 
         if (idx >= 0) {
-            if ((m_pojoObjects.length - 1) == 0) { 
-            	m_pojoObjects = new Element[0]; 
+            if ((m_pojoObjects.length - 1) == 0) {
+                m_pojoObjects = new Element[0];
             } else {
                 Object[] newInstances = new Object[m_pojoObjects.length - 1];
                 System.arraycopy(m_pojoObjects, 0, newInstances, 0, idx);
                 if (idx < newInstances.length) {
-                    System.arraycopy(m_pojoObjects, idx + 1, newInstances, idx, newInstances.length - idx); 
+                    System.arraycopy(m_pojoObjects, idx + 1, newInstances, idx, newInstances.length - idx);
                 }
                 m_pojoObjects = newInstances;
             }
@@ -348,39 +410,53 @@
     }
 
     /**
-     * @return the created instance of the component.
+     * Get the array of object created by the instance.
+     * @return the created instance of the component instance.
      */
-    public Object[] getPojoObjects() { return m_pojoObjects; }
+    public Object[] getPojoObjects() {
+        return m_pojoObjects;
+    }
 
     /**
-     * Delete the created instance (remove it from the list, to allow the garbage collector to eat the instance).
+     * Delete the created instance (remove it from the list, to allow the
+     * garbage collector to eat the instance).
+     * 
      * @param o : the instance to delete
      */
-    public void deletePojoObject(Object o) { removeInstance(o); }
+    public void deletePojoObject(Object o) {
+        removeInstance(o);
+    }
 
     /**
-     * Create an instance of the component.
-     * This method need to be called one time only for singleton provided service
+     * Create an instance of the component. This method need to be called one
+     * time only for singleton provided service
+     * 
      * @return a new instance
      */
     public Object createPojoObject() {
 
-        if (!isLoaded()) { load(); }
+        if (!isLoaded()) {
+            load();
+        }
         Object instance = null;
         try {
 
-            // Try to find if there is a constructor with a bundle context as parameter :
+            // Try to find if there is a constructor with a bundle context as
+            // parameter :
             try {
-                Constructor constructor = m_clazz.getConstructor(new Class[] {InstanceManager.class, BundleContext.class});
+                Constructor constructor = m_clazz.getConstructor(new Class[] { InstanceManager.class, BundleContext.class });
                 constructor.setAccessible(true);
-                instance = constructor.newInstance(new Object[] {this, m_context});
-            } catch (NoSuchMethodException e) { instance = null; }
+                instance = constructor.newInstance(new Object[] { this, m_context });
+            } catch (NoSuchMethodException e) {
+                instance = null;
+            }
 
-            // Create an instance if no instance are already created with <init>()BundleContext
+            // Create an instance if no instance are already created with
+            // <init>()BundleContext
             if (instance == null) {
-                Constructor constructor = m_clazz.getConstructor(new Class[] {InstanceManager.class});
+                Constructor constructor = m_clazz.getConstructor(new Class[] { InstanceManager.class });
                 constructor.setAccessible(true);
-                instance = constructor.newInstance(new Object[] {this});
+                instance = constructor.newInstance(new Object[] { this });
             }
 
         } catch (InstantiationException e) {
@@ -390,10 +466,12 @@
             m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> The Component Instance is not accessible : " + e.getMessage());
             e.printStackTrace();
         } catch (SecurityException e) {
-            m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> The Component Instance is not accessible (security reason) : " + e.getMessage());
+            m_factory.getLogger().log(Logger.ERROR,
+                    "[" + m_name + "] createInstance -> The Component Instance is not accessible (security reason) : " + e.getMessage());
             e.printStackTrace();
         } catch (InvocationTargetException e) {
-            m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> Cannot invoke the constructor method (illegal target) : " + e.getMessage());
+            m_factory.getLogger().log(Logger.ERROR,
+                    "[" + m_name + "] createInstance -> Cannot invoke the constructor method (illegal target) : " + e.getMessage());
             e.printStackTrace();
         } catch (NoSuchMethodException e) {
             m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> Cannot invoke the constructor (method not found) : " + e.getMessage());
@@ -405,32 +483,42 @@
         // Register the new instance
         addInstance(instance);
         // Call createInstance on Handlers :
-        for (int i = 0; i < m_handlers.length; i++) { m_handlers[i].createInstance(instance); }
+        for (int i = 0; i < m_handlers.length; i++) {
+            m_handlers[i].createInstance(instance);
+        }
         return instance;
     }
 
     /**
-     * @return the instance of the component to use for singleton component
+     * Get the first object created by the instance.
+     * If no object created, create and return one object.
+     * @return the instance of the component instance to use for singleton component
      */
     public Object getPojoObject() {
-        if (m_pojoObjects.length == 0) { createPojoObject(); }
+        if (m_pojoObjects.length == 0) {
+            createPojoObject();
+        }
         return m_pojoObjects[0];
     }
 
     /**
+     * Get the manipulated class.
      * @return the manipulated class
      */
     public Class getClazz() {
-        if (!isLoaded()) { load(); }
+        if (!isLoaded()) {
+            load();
+        }
         return m_clazz;
     }
 
-    //  ================== end Class & Instance management ================
+    // ================== end Class & Instance management ================
 
-    //  ======================== Handlers Management ======================
+    // ======================== Handlers Management ======================
 
     /**
      * Register the given handler to the current instance manager.
+     * 
      * @param h : the handler to register
      */
     public void register(Handler h) {
@@ -449,8 +537,9 @@
     }
 
     /**
-     * Register an handler.
-     * The handler will be notified of event on each field given in the list.
+     * Register an handler. The handler will be notified of event on each field
+     * given in the list.
+     * 
      * @param h : the handler to register
      * @param fields : the fields list
      */
@@ -458,13 +547,13 @@
         register(h);
         for (int i = 0; i < fields.length; i++) {
             if (m_fieldRegistration.get(fields[i]) == null) {
-                m_fieldRegistration.put(fields[i], new Handler[] {h});
+                m_fieldRegistration.put(fields[i], new Handler[] { h });
             } else {
                 Handler[] list = (Handler[]) m_fieldRegistration.get(fields[i]);
-                for (int j = 0; j < list.length; j++) { 
-                	if (list[j] == h) { 
-                		return;
-                	} 
+                for (int j = 0; j < list.length; j++) {
+                    if (list[j] == h) {
+                        return;
+                    }
                 }
                 Handler[] newList = new Handler[list.length + 1];
                 System.arraycopy(list, 0, newList, 0, list.length);
@@ -475,15 +564,16 @@
     }
 
     /**
-     * Unregister an handler for the field list.
-     * The handler will not be notified of field access but is allways register on the instance manager.
+     * Unregister an handler for the field list. The handler will not be
+     * notified of field access but is allways register on the instance manager.
+     * 
      * @param h : the handler to unregister.
      * @param fields : the fields list
      */
     public void unregister(Handler h, String[] fields) {
         for (int i = 0; i < fields.length; i++) {
-            if (m_fieldRegistration.get(fields[i]) == null) { 
-            	break;
+            if (m_fieldRegistration.get(fields[i]) == null) {
+                break;
             } else {
                 Handler[] list = (Handler[]) m_fieldRegistration.get(fields[i]);
                 int idx = -1;
@@ -500,9 +590,8 @@
                     } else {
                         Handler[] newList = new Handler[list.length - 1];
                         System.arraycopy(list, 0, newList, 0, idx);
-                        if (idx < newList.length)             {
-                            System.arraycopy(
-                                    list, idx + 1, newList, idx, newList.length - idx);
+                        if (idx < newList.length) {
+                            System.arraycopy(list, idx + 1, newList, idx, newList.length - idx);
                         }
                         list = newList;
                     }
@@ -514,6 +603,7 @@
 
     /**
      * Unregister the given handler.
+     * 
      * @param h : the handler to unregiter
      */
     public void unregister(Handler h) {
@@ -531,9 +621,8 @@
             } else {
                 Handler[] newList = new Handler[m_handlers.length - 1];
                 System.arraycopy(m_handlers, 0, newList, 0, idx);
-                if (idx < newList.length)             {
-                    System.arraycopy(
-                            m_handlers, idx + 1, newList, idx, newList.length - idx);
+                if (idx < newList.length) {
+                    System.arraycopy(m_handlers, idx + 1, newList, idx, newList.length - idx);
                 }
                 m_handlers = newList;
             }
@@ -541,11 +630,15 @@
     }
 
     /**
-     * This method is called by the manipulated class each time that a GETFIELD instruction is found.
-     * The method ask to each handler which value need to be returned.
-     * @param fieldName : the field name on which the GETFIELD instruction is called
+     * This method is called by the manipulated class each time that a GETFIELD
+     * instruction is found. The method ask to each handler which value need to
+     * be returned.
+     * 
+     * @param fieldName : the field name on which the GETFIELD instruction is
+     * called
      * @param initialValue : the value of the field in the code
-     * @return the value decided by the last asked handler (throw a warining if two fields decide two different values)
+     * @return the value decided by the last asked handler (throw a warining if
+     * two fields decide two different values)
      */
     public Object getterCallback(String fieldName, Object initialValue) {
         Object result = null;
@@ -553,7 +646,9 @@
         Handler[] list = (Handler[]) m_fieldRegistration.get(fieldName);
         for (int i = 0; list != null && i < list.length; i++) {
             Object handlerResult = list[i].getterCallback(fieldName, initialValue);
-            if (handlerResult != initialValue) { result = handlerResult; }
+            if (handlerResult != initialValue) {
+                result = handlerResult;
+            }
         }
 
         if (result != null) {
@@ -564,9 +659,11 @@
     }
 
     /**
-     * This method is called by the manipulated class each time that a PUTFILED instruction is found.
-     * the method send to each handler the new value.
-     * @param fieldName : the field name on which the PUTFIELD instruction is called
+     * This method is called by the manipulated class each time that a PUTFILED
+     * instruction is found. the method send to each handler the new value.
+     * 
+     * @param fieldName : the field name on which the PUTFIELD instruction is
+     * called
      * @param objectValue : the value of the field
      */
     public void setterCallback(String fieldName, Object objectValue) {
@@ -579,9 +676,13 @@
     }
 
     /**
+     * Get the bundle context used by this component instance.
      * @return the context of the component.
+     * @see org.apache.felix.ipojo.ComponentInstance#getContext()
      */
-    public BundleContext getContext() { return m_context; }
+    public BundleContext getContext() {
+        return m_context;
+    }
 
     /**
      * Check the state of all handlers.
@@ -601,23 +702,38 @@
             m_pojoObjects = new Object[0];
             return;
         }
-        if (isValid && m_state == INVALID) { setState(VALID); }
+        if (isValid && m_state == INVALID) {
+            setState(VALID);
+        }
     }
 
-	/**
-	 * @see org.apache.felix.ipojo.ComponentInstance#getInstanceName()
-	 */
-	public String getInstanceName() { return m_name; }
+    /**
+     * Get the instance name.
+     * @return the instance name.
+     * @see org.apache.felix.ipojo.ComponentInstance#getInstanceName()
+     */
+    public String getInstanceName() {
+        return m_name;
+    }
 
-	/**
-	 * @see org.apache.felix.ipojo.ComponentInstance#reconfigure(java.util.Dictionary)
-	 */
-	public void reconfigure(Dictionary configuration) {
-		for (int i = 0; i < m_handlers.length; i++) {
-	        m_handlers[i].reconfigure(configuration);
-	    }
-	}
+    /**
+     * Reconfigure the current instance.
+     * @param configuration : the new configuration to push
+     * @see org.apache.felix.ipojo.ComponentInstance#reconfigure(java.util.Dictionary)
+     */
+    public void reconfigure(Dictionary configuration) {
+        for (int i = 0; i < m_handlers.length; i++) {
+            m_handlers[i].reconfigure(configuration);
+        }
+    }
 
+    /**
+     * Get the implementation class of the component type.
+     * @return the class name of the component type.
+     */
+    public String getClassName() {
+        return m_className;
+    }
 
     // ======================= end Handlers Management =====================
 
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/Nullable.java b/ipojo/src/main/java/org/apache/felix/ipojo/Nullable.java
index 1026d3f..e3e32ac 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/Nullable.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/Nullable.java
@@ -20,6 +20,7 @@
 
 /**
  * A nullable object must implement this interface.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public interface Nullable {
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/Pojo.java b/ipojo/src/main/java/org/apache/felix/ipojo/Pojo.java
index bf5d5d8..fb755aa 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/Pojo.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/Pojo.java
@@ -21,13 +21,15 @@
 /**
  * Interface implemented by each object created through an manipulated class.
  * This interface allow to get the component instance from the object.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public interface Pojo {
-	
-	/**
-	 * @return the component instance who create this object.
-	 */
-	ComponentInstance getComponentInstance();
+
+    /**
+     * Get the instance container which create the current object.
+     * @return the component instance who create this object.
+     */
+    ComponentInstance getComponentInstance();
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/ServiceContext.java b/ipojo/src/main/java/org/apache/felix/ipojo/ServiceContext.java
index 24a4176..0f7acf2 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/ServiceContext.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/ServiceContext.java
@@ -26,88 +26,99 @@
 import org.osgi.framework.ServiceRegistration;
 
 /**
- * A service context give the access the a service registry.
- * All service interaction should use this service context.
+ * A service context give the access the a service registry. All service
+ * interaction should use this service context.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public interface ServiceContext {
-	
-	/**
-	 * @param listener
-	 * @param filter
-	 * @throws InvalidSyntaxException
-	 */
-	void addServiceListener(ServiceListener listener, String filter) throws InvalidSyntaxException;
-	
-	/**
-	 * @param listener
-	 */
-	void addServiceListener(ServiceListener listener);
-	
-	/**
-	 * @param clazz
-	 * @param filter
-	 * @return
-	 * @throws InvalidSyntaxException
-	 */
-	ServiceReference[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException;
-	
-	/**
-	 * @param reference
-	 * @return
-	 */
-	Object getService(ServiceReference reference);
-	
-	/**
-	 * @param clazz
-	 * @return
-	 */
-	ServiceReference getServiceReference(String clazz);
-	
-	/**
-	 * @param clazz
-	 * @param filter
-	 * @return
-	 * @throws InvalidSyntaxException
-	 */
-	ServiceReference[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException;
-	
-	/**
-	 * @param clazzes
-	 * @param service
-	 * @param properties
-	 * @return
-	 */
-	ServiceRegistration registerService(String[] clazzes, Object service, Dictionary properties);
-	
-	/**
-	 * @param clazz
-	 * @param service
-	 * @param properties
-	 * @return
-	 */
-	ServiceRegistration registerService(String clazz, Object service, Dictionary properties);
-	
-	/**
-	 * @param listener
-	 */
-	void removeServiceListener(ServiceListener listener);
-	
-	/**
-	 * @param reference
-	 * @return
-	 */
-	boolean ungetService(ServiceReference reference);
-	
-	/**
-	 * @return the component instance who use this service context.
-	 */
-	ComponentInstance getComponentInstance();
-	
-	/**
-	 * Set the component instance using the service context.
-	 * @param ci
-	 */
-	//void setComponentInstance(ComponentInstance ci);
+
+    /**
+     * Add a service listener.
+     * @param listener : the service lsitener to add.
+     * @param filter : the LDAP filter
+     * @throws InvalidSyntaxException : occurs when the LDAP filter is malformed
+     * @see org.osgi.framework.BundleContext#addServiceListener(org.osgi.framework.ServiceListener, java.lang.String)
+     */
+    void addServiceListener(ServiceListener listener, String filter) throws InvalidSyntaxException;
+
+    /**
+     * Add a service listener.
+     * @param listener : the service listener to add.
+     * @see org.osgi.framework.BundleContext#addServiceListener(org.osgi.framework.ServiceListener)
+     */
+    void addServiceListener(ServiceListener listener);
+
+    /**
+     * Get the service references matching with the given query.
+     * @param clazz : Required interface
+     * @param filter : LDAP filter
+     * @return the array of available service reference
+     * @throws InvalidSyntaxException : occurs if the LDAP filter is malformed
+     * @see org.osgi.framework.BundleContext#getAllServiceReferences(java.lang.String, java.lang.String)
+     */
+    ServiceReference[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException;
+
+    /**
+     * Get a service object.
+     * @param reference : the required service reference 
+     * @return the service object or null if the service reference is no more valid or if the service object is not accessible
+     * @see org.osgi.framework.BundleContext#getService(org.osgi.framework.ServiceReference)
+     */
+    Object getService(ServiceReference reference);
+
+    /**
+     * Get a service reference for the given interface.
+     * @param clazz : the required interface name
+     * @return a service reference on a available provider or null if no provider available
+     * @see org.osgi.framework.BundleContext#getServiceReference(java.lang.String)
+     */
+    ServiceReference getServiceReference(String clazz);
+
+    /**
+     * Get service reference list for the given query.
+     * @param clazz : the name of the requried service interface
+     * @param filter : LDAP filter to apply on service provider
+     * @return : the array of consistent service reference or null if no available provider
+     * @throws InvalidSyntaxException : occrus if the LDAP filter is malformed
+     * @see org.osgi.framework.BundleContext#getServiceReferences(java.lang.String, java.lang.String)
+     */
+    ServiceReference[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException;
+
+    /**
+     * Register a service.
+     * @param clazzes : interfaces provided by the service.
+     * @param service : the service object.
+     * @param properties : service properties.
+     * @return the service registration for this service publication.
+     * @see org.apache.felix.ipojo.ServiceContext#registerService(java.lang.String[], java.lang.Object, java.util.Dictionary)
+     */
+    ServiceRegistration registerService(String[] clazzes, Object service, Dictionary properties);
+
+    /**
+     * Register a service.
+     * @param clazz : interface provided by the service.
+     * @param service : the service object.
+     * @param properties : service properties.
+     * @return the service registration for this service publication.
+     * @see org.osgi.framework.BundleContext#registerService(java.lang.String, java.lang.Object, java.util.Dictionary)
+     */
+    ServiceRegistration registerService(String clazz, Object service, Dictionary properties);
+
+    /**
+     * Remove a service listener.
+     * @param listener : the listener to remove
+     * @see org.osgi.framework.BundleContext#removeServiceListener(org.osgi.framework.ServiceListener)
+     */
+    void removeServiceListener(ServiceListener listener);
+
+    /**
+     * Unget the service reference.
+     * @param reference : the reference to unget
+     * @return true if you are the last user of the reference
+     * @see org.osgi.framework.BundleContext#ungetService(org.osgi.framework.ServiceReference)
+     */
+    boolean ungetService(ServiceReference reference);
+
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/UnacceptableConfiguration.java b/ipojo/src/main/java/org/apache/felix/ipojo/UnacceptableConfiguration.java
index 1084b8f..8ace316 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/UnacceptableConfiguration.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/UnacceptableConfiguration.java
@@ -1,19 +1,42 @@
+/* 
+ * 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;
 
 /**
- * UnacceptableConfiguration is throwed when a factory refuses to create an instance.  
+ * UnacceptableConfiguration is throwed when a factory refuses to create an
+ * instance.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class UnacceptableConfiguration extends Exception {
 
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 2998931848886223965L;
-	
-	/**
-	 * @param message : message indicating the error.
-	 */
-	public UnacceptableConfiguration(String message) { super(message); }
+    /**
+     * Exception UID.
+     */
+    private static final long serialVersionUID = 2998931848886223965L;
+
+    /**
+     * Constructor.
+     * @param message : message indicating the error.
+     */
+    public UnacceptableConfiguration(String message) {
+        super(message);
+    }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/architecture/ComponentDescription.java b/ipojo/src/main/java/org/apache/felix/ipojo/architecture/ComponentDescription.java
index a55db2c..6826c70 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/architecture/ComponentDescription.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/architecture/ComponentDescription.java
@@ -20,6 +20,7 @@
 
 /**
  * Component Type information.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ComponentDescription {
@@ -43,34 +44,38 @@
      * Get the name of this component type.
      */
     private String m_name;
-    
+
     /**
      * Constructor.
-     * @param name : name of the component type (factory name). 
+     * 
+     * @param name : name of the component type (factory name).
      * @param className : implementation class.
      */
     public ComponentDescription(String name, String className) {
-    	m_name = name;
-    	m_className = className;
+        m_name = name;
+        m_className = className;
     }
-    
+
     /**
      * Constructor for composite.
-     * @param name : name of the component type (factory name). 
+     * 
+     * @param name : name of the component type (factory name).
      */
     public ComponentDescription(String name) {
-    	m_name = name;
+        m_name = name;
     }
-    
+
     /**
+     * Get a displayable form of the current component type description.
+     * @return displayable form of the component type description
      * @see java.lang.Object#toString()
      */
     public String toString() {
         String res = "";
         if (m_className == null) {
-        	res += "Component Type : " + m_name + " (Composition) \n";
+            res += "Component Type : " + m_name + " (Composition) \n";
         } else {
-        	res += "Component Type : " + m_name + " (" + m_className + ") \n";
+            res += "Component Type : " + m_name + " (" + m_className + ") \n";
         }
         for (int i = 0; i < m_providedServiceSpecification.length; i++) {
             res += "\tProvides : " + m_providedServiceSpecification[i] + "\n";
@@ -82,54 +87,66 @@
     }
 
     /**
+     * Get the implementation class of this component type.
      * @return the component type implementation class name.
      */
-    public String getClassName() { return m_className; }
+    public String getClassName() {
+        return m_className;
+    }
 
     /**
-     * @return the list of configuration properties accepted by the component type.
+     * Get component-type properties.
+     * @return the list of configuration properties accepted by the component type
+     * type.
      */
-    public PropertyDescription[] getProperties() { return m_properties; }
+    public PropertyDescription[] getProperties() {
+        return m_properties;
+    }
 
     /**
      * Add a configuration properties to the component type.
+     * 
      * @param pd : the property to add
      */
-    public void addProperty(PropertyDescription pd) { 
-    	for (int i = 0; i < m_properties.length; i++) {
-    		if (m_properties[i].getName().equals(pd.getName())) { return; }
-    	}
-    	
-    	PropertyDescription[] newProps = new PropertyDescription[m_properties.length + 1];
+    public void addProperty(PropertyDescription pd) {
+        for (int i = 0; i < m_properties.length; i++) {
+            if (m_properties[i].getName().equals(pd.getName())) {
+                return;
+            }
+        }
+
+        PropertyDescription[] newProps = new PropertyDescription[m_properties.length + 1];
         System.arraycopy(m_properties, 0, newProps, 0, m_properties.length);
         newProps[m_properties.length] = pd;
         m_properties = newProps;
     }
 
     /**
+     * Get the list of provided service offered by instances of this type.
      * @return the list of the provided service.
      */
-    public String[] getprovidedServiceSpecification() { return m_providedServiceSpecification; }
+    public String[] getprovidedServiceSpecification() {
+        return m_providedServiceSpecification;
+    }
 
     /**
-     * add a provided service to the component type.
-     * @param serviceSpecification : the provided service to add (interface name)
+     * Add a provided service to the component type.
+     * @param serviceSpecification : the provided service to add (interface
+     * name)
      */
-    public void addProvidedServiceSpecification(String serviceSpecification) { 
+    public void addProvidedServiceSpecification(String serviceSpecification) {
         String[] newSs = new String[m_providedServiceSpecification.length + 1];
         System.arraycopy(m_providedServiceSpecification, 0, newSs, 0, m_providedServiceSpecification.length);
         newSs[m_providedServiceSpecification.length] = serviceSpecification;
         m_providedServiceSpecification = newSs;
     }
-    
+
     /**
+     * Return the component-type name.
      * @return the name of this component type
      */
-    public String getName() { return m_name; }
-    
-    
-
-
-
+    public String getName() {
+        return m_name;
+    }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/architecture/HandlerDescription.java b/ipojo/src/main/java/org/apache/felix/ipojo/architecture/HandlerDescription.java
index 6997099..093e528 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/architecture/HandlerDescription.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/architecture/HandlerDescription.java
@@ -18,14 +18,16 @@
  */
 package org.apache.felix.ipojo.architecture;
 
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
 
 /**
  * Handler Description.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class HandlerDescription {
 
-
     /**
      * Handler Class Name (i.e namespace).
      */
@@ -36,9 +38,9 @@
      */
     private boolean m_isValid;
 
-
     /**
      * Constructor.
+     * 
      * @param name : handler name
      * @param isValid : is the handler valid
      */
@@ -48,18 +50,34 @@
     }
 
     /**
+     * Check if the handler is valid.
      * @return true if the handler is valid.
      */
-    public boolean isValid() { return m_isValid; }
+    public boolean isValid() {
+        return m_isValid;
+    }
 
     /**
+     * Get the handler name.
      * @return the handler name (i.e. namespace).
      */
-    public String getHandlerName() { return m_handlerName; }
+    public String getHandlerName() {
+        return m_handlerName;
+    }
 
     /**
+     * Get handler information.
      * @return the handler information.
      */
-    public String getHandlerInfo() { return ""; };
+    public Element getHandlerInfo() {
+        Element elem = new Element("Handler", "");
+        elem.addAttribute(new Attribute("name", m_handlerName));
+        if (m_isValid) {
+            elem.addAttribute(new Attribute("state", "valid"));
+        } else {
+            elem.addAttribute(new Attribute("state", "invalid"));
+        }
+        return elem;
+    }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/architecture/InstanceDescription.java b/ipojo/src/main/java/org/apache/felix/ipojo/architecture/InstanceDescription.java
index 39b7b6b..2e6c55d 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/architecture/InstanceDescription.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/architecture/InstanceDescription.java
@@ -18,8 +18,13 @@
  */
 package org.apache.felix.ipojo.architecture;
 
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
+
 /**
  * Instance Description.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class InstanceDescription {
@@ -48,12 +53,12 @@
      * BundleId who create the instance.
      */
     private long m_bundleId;
-    
+
     /**
      * Component Type of the instance.
      */
     private ComponentDescription m_type;
-    
+
     /**
      * COntained instance list.
      */
@@ -61,6 +66,7 @@
 
     /**
      * Constructor.
+     * 
      * @param name : the name of the component instance.
      * @param state : the state of the instance.
      * @param bundleId : bundle id owning this instance.
@@ -77,29 +83,44 @@
     }
 
     /**
-     * @return the name of the component.
+     * Get the instance name.
+     * @return the name of the instance.
      */
-    public String getName() { return m_name; }
+    public String getName() {
+        return m_name;
+    }
 
     /**
+     * Get the list of object created by the described instance.
      * @return the created instances
      */
-    public String[] getCreatedObjects() { return m_createdObjects; }
+    public String[] getCreatedObjects() {
+        return m_createdObjects;
+    }
 
     /**
-     * Set the instances array.
+     * Set the array of objects created by the described instance.
+     * @param objects : the list of create objects.
      */
-    public void setCreatedObjects(String[] objects) { m_createdObjects = objects; }
+    public void setCreatedObjects(String[] objects) {
+        m_createdObjects = objects;
+    }
 
     /**
+     * Get the component type description of the described instance.
      * @return : the component type description of this instance.
      */
-    public ComponentDescription getComponentDescription() { return m_type; }
+    public ComponentDescription getComponentDescription() {
+        return m_type;
+    }
 
     /**
+     * Get the plugged handler list.
      * @return the live handler list
      */
-    public HandlerDescription[] getHandlers() { return m_handlers; }
+    public HandlerDescription[] getHandlers() {
+        return m_handlers;
+    }
 
     /**
      * Add an handler description to the list.
@@ -107,27 +128,30 @@
      */
     public void addHandler(HandlerDescription hd) {
         // Verify that the dependency description is not already in the array.
-        for (int i = 0; (i < m_handlers.length); i++) {
+        for (int i = 0; i < m_handlers.length; i++) {
             if (m_handlers[i] == hd) {
-                return; //NOTHING TO DO, the description is already in the array
+                return; // NOTHING TO DO, the description is already in the
+                        // array
             }
         }
-            // The component Description is not in the array, add it
+        // The component Description is not in the array, add it
         HandlerDescription[] newHd = new HandlerDescription[m_handlers.length + 1];
         System.arraycopy(m_handlers, 0, newHd, 0, m_handlers.length);
         newHd[m_handlers.length] = hd;
         m_handlers = newHd;
     }
-    
+
     /**
      * Add an instance description to the contained instance list.
+     * 
      * @param inst : the handler description to add
      */
     public void addInstance(InstanceDescription inst) {
         // Verify that the dependency description is not already in the array.
-        for (int i = 0; (i < m_containedInstances.length); i++) {
+        for (int i = 0; i < m_containedInstances.length; i++) {
             if (m_containedInstances[i] == inst) {
-                return; //NOTHING TO DO, the description is already in the array
+                return; // NOTHING TO DO, the description is already in the
+                        // array
             }
         }
         // The component Description is not in the array, add it
@@ -139,24 +163,79 @@
 
     /**
      * Set the state of the component.
+     * 
      * @param i : the state
      */
-    public void setState(int i) { m_state = i; }
+    public void setState(int i) {
+        m_state = i;
+    }
 
     /**
-     * @return the state of the component.
+     * Get the state of the described instance.
+     * @return the state of the instance.
      */
-    public int getState() { return m_state; }
+    public int getState() {
+        return m_state;
+    }
 
     /**
+     * Get the bundle id of the bundle containing the described instance.
      * @return the bundle id owning the component implementation class.
      */
-    public long getBundleId() { return m_bundleId; }
-    
+    public long getBundleId() {
+        return m_bundleId;
+    }
+
     /**
+     * Get the list of contained instance in the describe instance.
+     * This list contains only instances who exposed their architecture.
      * @return the list of contained instances.
      */
-    public InstanceDescription[] getContainedInstances() { return m_containedInstances; }
+    public InstanceDescription[] getContainedInstances() {
+        return m_containedInstances;
+    }
 
+    /**
+     * Get the instance description.
+     * @return the instance description
+     */
+    public Element getDescription() {
+        Element instance = new Element("Instance", "");
+        instance.addAttribute(new Attribute("name", getName())); // Name
+        // State
+        if (m_state == ComponentInstance.STOPPED) {
+            instance.addAttribute(new Attribute("state", "stopped"));
+        }
+        if (m_state == ComponentInstance.VALID) {
+            instance.addAttribute(new Attribute("state", "valid"));
+        }
+        if (m_state == ComponentInstance.INVALID) {
+            instance.addAttribute(new Attribute("state", "invalid"));
+        }
+        // Bundle
+        instance.addAttribute(new Attribute("bundle", "" + m_bundleId));
+
+        // Component Type
+        instance.addAttribute(new Attribute("component.type", m_type.getName()));
+
+        // Handlers
+        for (int i = 0; i < m_handlers.length; i++) {
+            instance.addElement(m_handlers[i].getHandlerInfo());
+        }
+        // Created Object (empty is composite)
+        for (int i = 0; i < m_createdObjects.length; i++) {
+            Element obj = new Element("Object", "");
+            obj.addAttribute(new Attribute("name", ((Object) m_createdObjects[i]).toString()));
+            instance.addElement(obj);
+        }
+        // Contained instance (exposing architecture) (empty if primitive)
+        for (int i = 0; i < m_containedInstances.length; i++) {
+            Element inst = new Element("ContainedInstances", "");
+            inst.addElement(m_containedInstances[i].getDescription());
+            instance.addElement(inst);
+        }
+        return instance;
+
+    }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/architecture/PropertyDescription.java b/ipojo/src/main/java/org/apache/felix/ipojo/architecture/PropertyDescription.java
index bb52d9a..dfdc3c5 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/architecture/PropertyDescription.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/architecture/PropertyDescription.java
@@ -20,6 +20,7 @@
 
 /**
  * Property Information.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class PropertyDescription {
@@ -41,6 +42,7 @@
 
     /**
      * Constructor.
+     * 
      * @param name : name of the property
      * @param type : type of the property
      * @param value : default value of the property
@@ -52,28 +54,39 @@
     }
 
     /**
+     * Get the current property name.
      * @return the property name.
      */
-    public String getName() { return m_name; }
-    
+    public String getName() {
+        return m_name;
+    }
+
     /**
+     * Get the current property type.
      * @return the property type.
      */
-    public String getType() { return m_type; }
+    public String getType() {
+        return m_type;
+    }
 
     /**
+     * Get the current property value.
      * @return the default value for the property.
      */
-    public String getValue() { return m_value; }
+    public String getValue() {
+        return m_value;
+    }
 
     /**
+     * Get a displayed form of the current property.
+     * @return : a String representing this property.
      * @see java.lang.Object#toString()
      */
     public String toString() {
-        if (m_value != null) { 
-        	return getName() + " - " + getType() + " - " + getValue(); 
-        } else { 
-        	return getName() + " - " + getType() + " - REQUIRED"; 
+        if (m_value != null) {
+            return getName() + " - " + getType() + " - " + getValue();
+        } else {
+            return getName() + " - " + getType() + " - REQUIRED";
         }
     }
 
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/composite/CompositeServiceContext.java b/ipojo/src/main/java/org/apache/felix/ipojo/composite/CompositeServiceContext.java
index 5f4bb40..1eec9bf 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/composite/CompositeServiceContext.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/composite/CompositeServiceContext.java
@@ -35,233 +35,293 @@
 import org.osgi.framework.ServiceRegistration;
 
 /**
- * CompositeServiceContext Class.
- * This class provides an implementation of the service context for composite.
+ * CompositeServiceContext Class. This class provides an implementation of the
+ * service context for composite.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class CompositeServiceContext implements ServiceContext, ServiceListener {
-	
-	private class Record {
-		private ServiceReference m_ref;
-		private ServiceRegistration m_reg;
-		private FactoryProxy m_fact;
-	}
-	
-	private List m_factories = new ArrayList();
-	
-	private BundleContext m_parent;
-	
-	/**
-	 * Internal service registry.
-	 */
-	private ServiceRegistry m_registry;
-	
-	/**
-	 * Component Instance who creates this registry. 
-	 */
-	private ComponentInstance m_instance;
-	
-	/**
-	 * Constructor.
-	 * This constructor instantiate a service registry with the given bundle context.
-	 * @param bc : the bundle context
-	 */
-	public CompositeServiceContext(BundleContext bc) {
-		m_registry = new ServiceRegistry(bc);
-		m_parent = bc;
-	}
-	
-	/**
-	 * Constructor.
-	 * @param bc : the bundle context
-	 * @param ci : the component instance owning this context
-	 */
-	public CompositeServiceContext(BundleContext bc, ComponentInstance ci) {
-		this(bc);
-		m_parent = bc;
-		m_instance = ci;
-	}
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#addServiceListener(org.osgi.framework.ServiceListener)
-	 */
-	public void addServiceListener(ServiceListener arg0) {
-		m_registry.addServiceListener(arg0);
-	}
+    /**
+     * Structure stoing the referense, the factory and the registration.
+     */
+    private class Record {
+        /**
+         * Reference of the proxed factory from the external context.
+         */
+        private ServiceReference m_ref;
+        /**
+         * Registration of the factory in the internal context.
+         */
+        private ServiceRegistration m_reg;
+        /**
+         * Proxed Factory. 
+         */
+        private FactoryProxy m_fact;
+    }
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#addServiceListener(org.osgi.framework.ServiceListener, java.lang.String)
-	 */
-	public void addServiceListener(ServiceListener arg0, String arg1) throws InvalidSyntaxException {
-		m_registry.addServiceListener(arg0, arg1);
-	}
+    /**
+     * List of imported factories.
+     */
+    private List m_factories = new ArrayList();
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#getAllServiceReferences(java.lang.String, java.lang.String)
-	 */
-	public ServiceReference[] getAllServiceReferences(String arg0, String arg1) throws InvalidSyntaxException {
-		return m_registry.getAllServiceReferences(arg0, arg1);
-	}
+    /**
+     * External context.
+     */
+    private BundleContext m_parent;
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#getComponentInstance()
-	 */
-	public ComponentInstance getComponentInstance() {
-		return m_instance;
-	}
+    /**
+     * Internal service registry.
+     */
+    private ServiceRegistry m_registry;
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#getService(org.osgi.framework.ServiceReference)
-	 */
-	public Object getService(ServiceReference arg0) {
-		return m_registry.getService(m_instance, arg0);
-	}
+    /**
+     * Component Instance who creates this registry.
+     */
+    private ComponentInstance m_instance;
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#getServiceReference(java.lang.String)
-	 */
-	public ServiceReference getServiceReference(String arg0) {
-		return m_registry.getServiceReference(arg0);
-	}
+    /**
+     * Constructor. This constructor instantiate a service registry with the
+     * given bundle context.
+     * 
+     * @param bc : the bundle context
+     */
+    public CompositeServiceContext(BundleContext bc) {
+        m_registry = new ServiceRegistry(bc);
+        m_parent = bc;
+    }
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#getServiceReferences(java.lang.String, java.lang.String)
-	 */
-	public ServiceReference[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
-		return m_registry.getServiceReferences(clazz, filter);
-	}
+    /**
+     * Constructor.
+     * 
+     * @param bc : the bundle context
+     * @param ci : the component instance owning this context
+     */
+    public CompositeServiceContext(BundleContext bc, ComponentInstance ci) {
+        this(bc);
+        m_parent = bc;
+        m_instance = ci;
+    }
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#registerService(java.lang.String[], java.lang.Object, java.util.Dictionary)
-	 */
-	public ServiceRegistration registerService(String[] arg0, Object arg1, Dictionary arg2) {
-		return m_registry.registerService(m_instance, arg0, arg1, arg2);
-	}
+    /**
+     * Add a service listener.
+     * @param arg0 : The service listener to add
+     * @see org.apache.felix.ipojo.ServiceContext#addServiceListener(org.osgi.framework.ServiceListener)
+     */
+    public void addServiceListener(ServiceListener arg0) {
+        m_registry.addServiceListener(arg0);
+    }
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#registerService(java.lang.String, java.lang.Object, java.util.Dictionary)
-	 */
-	public ServiceRegistration registerService(String arg0, Object arg1, Dictionary arg2) {
-		return m_registry.registerService(m_instance, arg0, arg1, arg2);
-	}
+    /**
+     * Add a filtered service listener.
+     * @param arg0 : the service listner object to add
+     * @param arg1 : the LDAP filter for this listener
+     * @throws InvalidSyntaxException : throwed if the LDAP filter is malformed
+     * @see org.apache.felix.ipojo.ServiceContext#addServiceListener(org.osgi.framework.ServiceListener,
+     * java.lang.String)
+     */
+    public void addServiceListener(ServiceListener arg0, String arg1) throws InvalidSyntaxException {
+        m_registry.addServiceListener(arg0, arg1);
+    }
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#removeServiceListener(org.osgi.framework.ServiceListener)
-	 */
-	public void removeServiceListener(ServiceListener arg0) {
-		m_registry.removeServiceListener(arg0);
-	}
+    /**
+     * Get all service references.
+     * @param arg0 : The requried service interface.
+     * @param arg1 : LDAP filter
+     * @return the list of all service reference matching with the query
+     * @throws InvalidSyntaxException : occurs when the given filter is malformed
+     * @see org.apache.felix.ipojo.ServiceContext#getAllServiceReferences(java.lang.String,
+     * java.lang.String)
+     */
+    public ServiceReference[] getAllServiceReferences(String arg0, String arg1) throws InvalidSyntaxException {
+        return m_registry.getAllServiceReferences(arg0, arg1);
+    }
 
-	/**
-	 * @see org.apache.felix.ipojo.ServiceContext#ungetService(org.osgi.framework.ServiceReference)
-	 */
-	public boolean ungetService(ServiceReference arg0) {
-		return m_registry.ungetService(m_instance, arg0);
-	}
-	
-	/**
-	 * Initiate the factory list.
-	 */
-	private void importFactories() {
-		try {
-			ServiceReference[] refs = m_parent.getServiceReferences(Factory.class.getName(), null);
-			if (refs != null) {
-				for (int i = 0; i < refs.length; i++) {
-					importFactory(refs[i]);
-				}
-			}
-		} catch (InvalidSyntaxException e) {
-			e.printStackTrace(); // Should not happen
-		}
-	}
-	
-	/**
-	 * Import a factory form the parent to the internal registry.
-	 * @param ref : the reference of the factory to import.
-	 */
-	private void importFactory(ServiceReference ref) {
-		//System.out.println("Add a new factory in the scope : " + ref.getProperty(Constants.SERVICE_PID));
-		Record rec = new Record();
-		m_factories.add(rec);
-		Dictionary dict = new Properties();
-		for (int j = 0; j < ref.getPropertyKeys().length; j++) {
-			dict.put(ref.getPropertyKeys()[j], ref.getProperty(ref.getPropertyKeys()[j]));
-		}
-		rec.m_fact = new FactoryProxy((Factory) m_parent.getService(ref), this); 
-		rec.m_reg = registerService(Factory.class.getName(), rec.m_fact, dict);
-		rec.m_ref = ref;
-	}
-	
-	/**
-	 * Remove a factory of the available factory list.
-	 * @param ref : the reference on the factory to remove.
-	 */
-	private void removeFactory(ServiceReference ref) {
-		//System.out.println("Remove a factory from the scope : " + ref.getProperty(Constants.SERVICE_PID));
-		for (int i = 0; i < m_factories.size(); i++) {
-			Record rec = (Record) m_factories.get(i);
-			if (rec.m_ref == ref) {
-				rec.m_reg.unregister();
-				rec.m_fact = null;
-				m_parent.ungetService(rec.m_ref);
-				m_factories.remove(rec);
-				return;
-			}
-		}
-	}
-	
-	/**
-	 * Start the registry management.
-	 */
-	public void start() {
-		importFactories();
-		try {
-			m_parent.addServiceListener(this, "(" + Constants.OBJECTCLASS + "=" + Factory.class.getName() + ")");
-		} catch (InvalidSyntaxException e) {
-			// Should not happen
-			e.printStackTrace();
-		}
-	}
+    /**
+     * Get a service object for the given service reference.
+     * @param arg0 : the service reference
+     * @return the service object or null if the reference is no more valid or if the object is not accessible
+     * @see org.apache.felix.ipojo.ServiceContext#getService(org.osgi.framework.ServiceReference)
+     */
+    public Object getService(ServiceReference arg0) {
+        return m_registry.getService(m_instance, arg0);
+    }
 
-	/**
-	 * Stop the registry management.
-	 */
-	public synchronized void stop() {
-		m_parent.removeServiceListener(this);
-		m_registry.reset();
-		for (int i = 0; i < m_factories.size(); i++) {
-			Record rec = (Record) m_factories.get(i);
-			removeFactory(rec.m_ref);
-		}
-	}
-	
-	/**
-	 * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
-	 */
-	public void serviceChanged(ServiceEvent event) {
-		if (event.getType() == ServiceEvent.REGISTERED) {
-			if (!containsRef(event.getServiceReference())) {
-				importFactory(event.getServiceReference());
-			}
-			return;
-		}
-		if (event.getType() == ServiceEvent.UNREGISTERING) {
-			if (containsRef(event.getServiceReference())) {
-				removeFactory(event.getServiceReference());
-			}
-		}
-	}
-	
-	/**
-	 * Check if the factory list contain the given reference.
-	 * @param ref : the reference to find.
-	 * @return true if the list contains the given reference.
-	 */
-	private boolean containsRef(ServiceReference ref) {
-		for (int i = 0; i < m_factories.size(); i++) {
-			Record rec = (Record) m_factories.get(i);
-			if (rec.m_ref == ref) { return true; }
-		}
-		return false;
-	}
+    
+    /**
+     * Get a service reference for the required interface.
+     * @param arg0 : the requried interface name
+     * @return the service reference or null if no available provider
+     * @see org.apache.felix.ipojo.ServiceContext#getServiceReference(java.lang.String)
+     */
+    public ServiceReference getServiceReference(String arg0) {
+        return m_registry.getServiceReference(arg0);
+    }
+
+    /**
+     * Get all accessible service reference for the given query.
+     * @param clazz : required interface
+     * @param filter : LDAP filter
+     * @return the list (array) of service reference matching with the query.
+     * @throws InvalidSyntaxException : occurs when the LDAP filter is malformed
+     * @see org.apache.felix.ipojo.ServiceContext#getServiceReferences(java.lang.String, java.lang.String)
+     */
+    public ServiceReference[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
+        return m_registry.getServiceReferences(clazz, filter);
+    }
+
+
+    /**
+     * Register a service inside the composite context.
+     * @param arg0 : list of interfaces to register.
+     * @param arg1 : service object
+     * @param arg2 : properties list
+     * @return the service registration
+     * @see org.apache.felix.ipojo.ServiceContext#registerService(java.lang.String[], java.lang.Object, java.util.Dictionary)
+     */
+    public ServiceRegistration registerService(String[] arg0, Object arg1, Dictionary arg2) {
+        return m_registry.registerService(m_instance, arg0, arg1, arg2);
+    }
+
+    /**
+     * Register a service inside the composite context.
+     * @param arg0 : interface to register.
+     * @param arg1 : service object
+     * @param arg2 : properties list
+     * @return the service registration
+     * @see org.apache.felix.ipojo.ServiceContext#registerService(java.lang.String, java.lang.Object, java.util.Dictionary)
+     */
+    public ServiceRegistration registerService(String arg0, Object arg1, Dictionary arg2) {
+        return m_registry.registerService(m_instance, arg0, arg1, arg2);
+    }
+
+    /**
+     * Remove a service listener.
+     * @param arg0 : the service listener to remove
+     * @see org.apache.felix.ipojo.ServiceContext#removeServiceListener(org.osgi.framework.ServiceListener)
+     */
+    public void removeServiceListener(ServiceListener arg0) {
+        m_registry.removeServiceListener(arg0);
+    }
+
+    /**
+     * Unget a service.
+     * @param arg0 the service reference to unget
+     * @return true
+     * @see org.apache.felix.ipojo.ServiceContext#ungetService(org.osgi.framework.ServiceReference)
+     */
+    public boolean ungetService(ServiceReference arg0) {
+        return m_registry.ungetService(m_instance, arg0);
+    }
+
+    /**
+     * Initiate the factory list.
+     */
+    private void importFactories() {
+        try {
+            ServiceReference[] refs = m_parent.getServiceReferences(Factory.class.getName(), null);
+            if (refs != null) {
+                for (int i = 0; i < refs.length; i++) {
+                    importFactory(refs[i]);
+                }
+            }
+        } catch (InvalidSyntaxException e) {
+            e.printStackTrace(); // Should not happen
+        }
+    }
+
+    /**
+     * Import a factory form the parent to the internal registry.
+     * 
+     * @param ref : the reference of the factory to import.
+     */
+    private void importFactory(ServiceReference ref) {
+        Record rec = new Record();
+        m_factories.add(rec);
+        Dictionary dict = new Properties();
+        for (int j = 0; j < ref.getPropertyKeys().length; j++) {
+            dict.put(ref.getPropertyKeys()[j], ref.getProperty(ref.getPropertyKeys()[j]));
+        }
+        rec.m_fact = new FactoryProxy((Factory) m_parent.getService(ref), this);
+        rec.m_reg = registerService(Factory.class.getName(), rec.m_fact, dict);
+        rec.m_ref = ref;
+    }
+
+    /**
+     * Remove a factory of the available factory list.
+     * 
+     * @param ref : the reference on the factory to remove.
+     */
+    private void removeFactory(ServiceReference ref) {
+        for (int i = 0; i < m_factories.size(); i++) {
+            Record rec = (Record) m_factories.get(i);
+            if (rec.m_ref == ref) {
+                rec.m_reg.unregister();
+                rec.m_fact = null;
+                m_parent.ungetService(rec.m_ref);
+                m_factories.remove(rec);
+                return;
+            }
+        }
+    }
+
+    /**
+     * Start the registry management.
+     */
+    public void start() {
+        importFactories();
+        try {
+            m_parent.addServiceListener(this, "(" + Constants.OBJECTCLASS + "=" + Factory.class.getName() + ")");
+        } catch (InvalidSyntaxException e) {
+            // Should not happen
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * Stop the registry management.
+     */
+    public synchronized void stop() {
+        m_parent.removeServiceListener(this);
+        m_registry.reset();
+        for (int i = 0; i < m_factories.size(); i++) {
+            Record rec = (Record) m_factories.get(i);
+            removeFactory(rec.m_ref);
+        }
+    }
+
+    /**
+     * Service Listener implementation.
+     * @param event : the service event
+     * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
+     */
+    public void serviceChanged(ServiceEvent event) {
+        if (event.getType() == ServiceEvent.REGISTERED) {
+            if (!containsRef(event.getServiceReference())) {
+                importFactory(event.getServiceReference());
+            }
+            return;
+        }
+        if (event.getType() == ServiceEvent.UNREGISTERING) {
+            if (containsRef(event.getServiceReference())) {
+                removeFactory(event.getServiceReference());
+            }
+        }
+    }
+
+    /**
+     * Check if the factory list contain the given reference.
+     * 
+     * @param ref : the reference to find.
+     * @return true if the list contains the given reference.
+     */
+    private boolean containsRef(ServiceReference ref) {
+        for (int i = 0; i < m_factories.size(); i++) {
+            Record rec = (Record) m_factories.get(i);
+            if (rec.m_ref == ref) {
+                return true;
+            }
+        }
+        return false;
+    }
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/composite/FactoryProxy.java b/ipojo/src/main/java/org/apache/felix/ipojo/composite/FactoryProxy.java
index 0244ae9..ffc5c14 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/composite/FactoryProxy.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/composite/FactoryProxy.java
@@ -28,55 +28,102 @@
 
 /**
  * Bridge representing a Factory inside a composition.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class FactoryProxy implements Factory {
-	
-	private Factory m_delegate;
-	private ServiceContext m_context;
-	
-	/**
-	 * Constructor.
-	 * @param fact : the targetted factory.
-	 * @param s : the service context to target.
-	 */
-	public FactoryProxy(Factory fact, ServiceContext s) {
-		m_delegate = fact;
-		m_context = s;
-	}
 
-	/**
-	 * @see org.apache.felix.ipojo.Factory#createComponentInstance(java.util.Dictionary)
-	 */
-	public ComponentInstance createComponentInstance(Dictionary configuration) throws UnacceptableConfiguration {
-		return m_delegate.createComponentInstance(configuration, m_context);
-	}
+    /**
+     * Delegated factory.
+     */
+    private Factory m_delegate;
 
-	/**
-	 * @see org.apache.felix.ipojo.Factory#createComponentInstance(java.util.Dictionary, org.apache.felix.ipojo.ServiceContext)
-	 */
-	public ComponentInstance createComponentInstance(Dictionary configuration, ServiceContext serviceContext) throws UnacceptableConfiguration {
-		return m_delegate.createComponentInstance(configuration, serviceContext);
-	}
+    /**
+     * Destination context.
+     */
+    private ServiceContext m_context;
 
-	/**
-	 * @see org.apache.felix.ipojo.Factory#getComponentDescription()
-	 */
-	public ComponentDescription getComponentDescription() { return m_delegate.getComponentDescription(); }
+    /**
+     * Constructor.
+     * 
+     * @param fact : the targetted factory.
+     * @param s : the service context to target.
+     */
+    public FactoryProxy(Factory fact, ServiceContext s) {
+        m_delegate = fact;
+        m_context = s;
+    }
 
-	/**
-	 * @see org.apache.felix.ipojo.Factory#getName()
-	 */
-	public String getName() { return m_delegate.getName(); }
+    /**
+     * Create an instance manager (i.e. component type instance).
+     * 
+     * @param configuration : the configuration properties for this component.
+     * @return the created instance manager.
+     * @throws UnacceptableConfiguration : when a given configuration is not valid.
+     * @see org.apache.felix.ipojo.Factory#createComponentInstance(java.util.Dictionary)
+     */
+    public ComponentInstance createComponentInstance(Dictionary configuration) throws UnacceptableConfiguration {
+        return m_delegate.createComponentInstance(configuration, m_context);
+    }
 
-	/**
-	 * @see org.apache.felix.ipojo.Factory#isAcceptable(java.util.Dictionary)
-	 */
-	public boolean isAcceptable(Dictionary conf) { return m_delegate.isAcceptable(conf); }
+    /**
+     * Create an instance manager (i.e. component type instance). This has these
+     * service interaction in the scope given in argument.
+     * 
+     * @param configuration : the configuration properties for this component.
+     * @param serviceContext : the service context of the component.
+     * @return the created instance manager.
+     * @throws UnacceptableConfiguration : when the given configuration isnot valid.
+     * @see org.apache.felix.ipojo.Factory#createComponentInstance(java.util.Dictionary,
+     * org.apache.felix.ipojo.ServiceContext)
+     */
+    public ComponentInstance createComponentInstance(Dictionary configuration, ServiceContext serviceContext) throws UnacceptableConfiguration {
+        return m_delegate.createComponentInstance(configuration, serviceContext);
+    }
 
-	/**
-	 * @see org.apache.felix.ipojo.Factory#reconfigure(java.util.Dictionary)
-	 */
-	public void reconfigure(Dictionary conf) throws UnacceptableConfiguration { m_delegate.reconfigure(conf); }
+    /**
+     * Get the component type information containing provided service,
+     * configuration properties ...
+     * 
+     * @return the component type information.
+     * @see org.apache.felix.ipojo.Factory#getComponentDescription()
+     */
+    public ComponentDescription getComponentDescription() {
+        return m_delegate.getComponentDescription();
+    }
+
+    /**
+     * Return the factory name.
+     * @return the name of the factory.
+     * @see org.apache.felix.ipojo.Factory#getName()
+     */
+    public String getName() {
+        return m_delegate.getName();
+    }
+
+    /**
+     * Check if the given configuration is acceptable as a configuration of a
+     * component instance.
+     * 
+     * @param conf : the configuration to test
+     * @return true if the configuration is acceptable
+     * @see org.apache.felix.ipojo.Factory#isAcceptable(java.util.Dictionary)
+     */
+    public boolean isAcceptable(Dictionary conf) {
+        return m_delegate.isAcceptable(conf);
+    }
+
+    /**
+     * Reconfigure an instance already created. This configuration need to have
+     * the name property to identify the instance.
+     * 
+     * @param conf : the configuration to reconfigure the instance.
+     * @throws UnacceptableConfiguration : if the given configuration is not
+     * consistent for the tragetted instance.
+     * @see org.apache.felix.ipojo.Factory#reconfigure(java.util.Dictionary)
+     */
+    public void reconfigure(Dictionary conf) throws UnacceptableConfiguration {
+        m_delegate.reconfigure(conf);
+    }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/composite/ServiceReferenceImpl.java b/ipojo/src/main/java/org/apache/felix/ipojo/composite/ServiceReferenceImpl.java
index ae2f1aa..9238292 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/composite/ServiceReferenceImpl.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/composite/ServiceReferenceImpl.java
@@ -18,70 +18,89 @@
  */
 package org.apache.felix.ipojo.composite;
 
-
 import org.apache.felix.ipojo.ComponentInstance;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.ServiceReference;
 
 /**
- * Internal service reference implemenation.
- * This class is used for in the composition.
+ * Internal service reference implemenation. This class is used for in the
+ * composition.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ServiceReferenceImpl implements ServiceReference {
-	
-	 /**
-	 * Service Registration attached to the service reference.
-	 */
-	private ServiceRegistrationImpl m_registration = null;
-	 
-	 /**
-	 * Constructor.
-	 * @param cm : component instance publishing the service.
-	 * @param sr : registration attached to this service reference.
-	 */
-	public ServiceReferenceImpl(ComponentInstance cm, ServiceRegistrationImpl sr) { m_registration = sr; }
 
-	/**
-	 * Not supported in composite.
-	 * @see org.osgi.framework.ServiceReference#getBundle()
-	 */
-	public Bundle getBundle() { 
-		throw new UnsupportedOperationException("getUsingBundles is not supported in scope");
-	}
-	
-	/**
-	 * @return the service registration for this service reference.
-	 */
-	public ServiceRegistrationImpl getServiceRegistration() { return m_registration; }
+    /**
+     * Service Registration attached to the service reference.
+     */
+    private ServiceRegistrationImpl m_registration = null;
 
-	/**
-	 * @see org.osgi.framework.ServiceReference#getProperty(java.lang.String)
-	 */
-	public Object getProperty(String s) {
-		return m_registration.getProperty(s);
-	}
+    /**
+     * Constructor.
+     * 
+     * @param cm : component instance publishing the service.
+     * @param sr : registration attached to this service reference.
+     */
+    public ServiceReferenceImpl(ComponentInstance cm, ServiceRegistrationImpl sr) {
+        m_registration = sr;
+    }
 
-	/**
-	 * @see org.osgi.framework.ServiceReference#getPropertyKeys()
-	 */
-	public String[] getPropertyKeys() {
-		return m_registration.getPropertyKeys();
-	}
+    /**
+     * Not supported in composite.
+     * @return null
+     * @see org.osgi.framework.ServiceReference#getBundle()
+     */
+    public Bundle getBundle() {
+        throw new UnsupportedOperationException("getUsingBundles is not supported in scope");
+    }
 
-	/**
-	 * Not supported in composite.
-	 * @see org.osgi.framework.ServiceReference#getUsingBundles()
-	 */
-	public Bundle[] getUsingBundles() {
-		throw new UnsupportedOperationException("getUsingBundles is not supported in scope");
-	}
+    /**
+     * Get the service registration for this reference.
+     * @return the service registration for this service reference.
+     */
+    public ServiceRegistrationImpl getServiceRegistration() {
+        return m_registration;
+    }
 
-	/**
-	 * @see org.osgi.framework.ServiceReference#isAssignableTo(org.osgi.framework.Bundle, java.lang.String)
-	 */
-	public boolean isAssignableTo(Bundle arg0, String arg1) {
-		return true;
-	}
+
+    /**
+     * Get a property value.
+     * @param s : the key of the required property.
+     * @return the property value or null if no property for the given key.
+     * @see org.osgi.framework.ServiceReference#getProperty(java.lang.String)
+     */
+    public Object getProperty(String s) {
+        return m_registration.getProperty(s);
+    }
+
+    /**
+     * Get the String arrays of service property keys.
+     * @return : the list of property keys.
+     * @see org.osgi.framework.ServiceReference#getPropertyKeys()
+     */
+    public String[] getPropertyKeys() {
+        return m_registration.getPropertyKeys();
+    }
+
+
+    /**
+     * Unsupported Operation inside composite.
+     * @return bundles using this reference.
+     * @see org.osgi.framework.ServiceReference#getUsingBundles()
+     */
+    public Bundle[] getUsingBundles() {
+        throw new UnsupportedOperationException("getUsingBundles is not supported in scope");
+    }
+
+    /**
+     * Check if the current service reference is assignable to the given bundle.
+     * @param arg0 : the bundle to check
+     * @param arg1 : the class name to check.
+     * @return true in the case of composite
+     * @see org.osgi.framework.ServiceReference#isAssignableTo(org.osgi.framework.Bundle, java.lang.String)
+     */
+    public boolean isAssignableTo(Bundle arg0, String arg1) {
+        return true;
+    }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/composite/ServiceRegistrationImpl.java b/ipojo/src/main/java/org/apache/felix/ipojo/composite/ServiceRegistrationImpl.java
index 4734c86..abdb3ba 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/composite/ServiceRegistrationImpl.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/composite/ServiceRegistrationImpl.java
@@ -32,39 +32,40 @@
 import org.osgi.framework.ServiceRegistration;
 
 /**
- * Internal service registration implemenation.
- * This class is used for in the composition.
+ * Internal service registration implemenation. This class is used for in the
+ * composition.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ServiceRegistrationImpl implements ServiceRegistration {
 
     /**
-     * Service Registry. 
+     * Service Registry.
      */
     private ServiceRegistry m_registry = null;
-   
+
     /**
      * Interfaces associated with the service object.
      */
     private String[] m_classes = null;
-    
+
     /**
-     *  Service Id associated with the service object.
+     * Service Id associated with the service object.
      */
     private Long m_serviceId = null;
-    
+
     /**
      * Service object.
      */
     private Object m_svcObj = null;
-    
+
     /**
      * Service factory interface.
      */
     private ServiceFactory m_factory = null;
-    
+
     /**
-     * Associated property dictionary. 
+     * Associated property dictionary.
      */
     private Map m_propMap = null;
 
@@ -75,10 +76,11 @@
 
     /**
      * Constructor.
+     * 
      * @param registry : the service registry
      * @param cm : component instance
      * @param classes : published interfaces array
-     * @param serviceId : the unique service id 
+     * @param serviceId : the unique service id
      * @param svcObj : the service object or the service factory object
      * @param dict : service properties
      */
@@ -87,33 +89,44 @@
         m_classes = classes;
         m_serviceId = serviceId;
         m_svcObj = svcObj;
-        m_factory = (m_svcObj instanceof ServiceFactory)
-            ? (ServiceFactory) m_svcObj : null;
-
+        if (m_svcObj instanceof ServiceFactory) { m_factory = (ServiceFactory) m_svcObj; }
         initializeProperties(dict);
 
-        // This reference is the "standard" reference for this service and will always be returned by getReference().
-        // Since all reference to this service are supposed to be equal, we use the hashcode of this reference for
+        // This reference is the "standard" reference for this service and will
+        // always be returned by getReference().
+        // Since all reference to this service are supposed to be equal, we use
+        // the hashcode of this reference for
         // a references to this service in ServiceReference.
         m_ref = new ServiceReferenceImpl(cm, this);
     }
 
     /**
+     * Check if the service registration still valid.
      * @return true if the service registration is valid.
      */
-    protected boolean isValid() { return (m_svcObj != null); }
+    protected boolean isValid() {
+        return m_svcObj != null;
+    }
 
     /**
+     * Get the service reference attached with this service registration.
+     * @return the service reference
      * @see org.osgi.framework.ServiceRegistration#getReference()
      */
-    public ServiceReference getReference() { return m_ref; }
+    public ServiceReference getReference() {
+        return m_ref;
+    }
 
     /**
+     * Add properties to a service registration.
+     * @param dict : the properties to add
      * @see org.osgi.framework.ServiceRegistration#setProperties(java.util.Dictionary)
      */
     public void setProperties(Dictionary dict) {
         // Make sure registration is valid.
-        if (!isValid()) { throw new IllegalStateException("The service registration is no longer valid."); }
+        if (!isValid()) {
+            throw new IllegalStateException("The service registration is no longer valid.");
+        }
         // Set the properties.
         initializeProperties(dict);
         // Tell registry about it.
@@ -121,6 +134,7 @@
     }
 
     /**
+     * Unregister the service.
      * @see org.osgi.framework.ServiceRegistration#unregister()
      */
     public void unregister() {
@@ -128,15 +142,17 @@
             m_registry.unregisterService(this);
             m_svcObj = null;
             m_factory = null;
-        } else { 
-        	throw new IllegalStateException("Service already unregistered."); 
+        } else {
+            throw new IllegalStateException("Service already unregistered.");
         }
     }
 
     /**
-     * Look for a property in the service properties. 
+     * Look for a property in the service properties.
+     * 
      * @param key : property key
-     * @return the object associated with the key or null if the key is not present.
+     * @return the object associated with the key or null if the key is not
+     * present.
      */
     protected Object getProperty(String key) {
         return m_propMap.get(key);
@@ -148,6 +164,7 @@
     private transient ArrayList m_list = new ArrayList();
 
     /**
+     * Get the property keys.
      * @return the property keys list.
      */
     protected String[] getPropertyKeys() {
@@ -163,26 +180,30 @@
     }
 
     /**
+     * Get the service object.
      * @return the service object. Call the service factory if needed.
      */
     protected Object getService() {
         // If the service object is a service factory, then
         // let it create the service object.
         if (m_factory != null) {
-            return getFactoryUnchecked(); 
-        } else { return m_svcObj; }
+            return getFactoryUnchecked();
+        } else {
+            return m_svcObj;
+        }
     }
 
     /**
      * Initialize properties.
+     * 
      * @param dict : serivce properties to publish.
      */
     private void initializeProperties(Dictionary dict) {
         // Create a case insensitive map.
-        if (m_propMap == null) { 
-        	m_propMap = new StringMap(false);
-        } else { 
-        	m_propMap.clear();
+        if (m_propMap == null) {
+            m_propMap = new StringMap(false);
+        } else {
+            m_propMap.clear();
         }
 
         if (dict != null) {
@@ -198,6 +219,7 @@
     }
 
     /**
+     * Get a service object via a service factory.
      * @return the service object via the service factory invocation.
      */
     private Object getFactoryUnchecked() {
@@ -205,28 +227,30 @@
     }
 
     /**
-     * Unget a service.
-     * (Internal Method)
+     * Unget a service. (Internal Method)
+     * 
      * @param cm : component instance using the service.
      * @param svcObj : the unget service object.
      */
     private void ungetFactoryUnchecked(ComponentInstance cm, Object svcObj) {
-    	if (cm instanceof InstanceManager) {
-    		m_factory.ungetService(((InstanceManager) cm).getContext().getBundle(), this, svcObj);
-    	}
-        
+        if (cm instanceof InstanceManager) {
+            m_factory.ungetService(((InstanceManager) cm).getContext().getBundle(), this, svcObj);
+        }
+
     }
 
-	/**
-	 * Unget a service.
+    /**
+     * Unget a service.
+     * 
      * @param cm : component instance using the service.
      * @param srvObj : the unget service object.
-	 */
-	public void ungetService(ComponentInstance cm, Object srvObj) {
-		//	If the service object is a service factory, then let is release the service object.
+     */
+    public void ungetService(ComponentInstance cm, Object srvObj) {
+        // If the service object is a service factory, then let is release the
+        // service object.
         if (m_factory != null) {
             ungetFactoryUnchecked(cm, srvObj);
         }
-	}
+    }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/composite/ServiceRegistry.java b/ipojo/src/main/java/org/apache/felix/ipojo/composite/ServiceRegistry.java
index 381b16b..857e123 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/composite/ServiceRegistry.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/composite/ServiceRegistry.java
@@ -32,275 +32,308 @@
 import org.osgi.framework.ServiceRegistration;
 
 /**
- * Internal Service Registry.
- * This class is used for in the composition.
+ * Internal Service Registry. This class is used for in the composition.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ServiceRegistry {
-	
-	/**
-	 * Service Id index. 
-	 */
-	private long m_serviceId = 1L;
-	
-	/**
-	 * List of service listeners. 
-	 */
-	private ArrayList m_listeners = new ArrayList(); // ListenerInfo List
-	
-	/**
-	 * List of service registration. 
-	 */
-	private ArrayList m_regs = new ArrayList();
-	
-	/**
-	 * A "real" bundle context to create LDAP filter.
-	 */
-	private BundleContext m_bc; //BundleContext to create Filter
-	
-	/**
-	 * Listener info structure.
-	 */
-	private class ListenerInfo {	
-		private ServiceListener m_listener;
-		private Filter m_filter;
-	}
-	
-	/**
-	 * Constructor.
-	 * @param bc : bundle context.
-	 */
-	public ServiceRegistry(BundleContext bc) {
-		m_bc = bc;
-	}
 
-	/**
-	 * Add a given service listener with no filter.
-	 * @param arg0 : the service listener to add
-	 */
-	public void addServiceListener(ServiceListener arg0) {
-		ListenerInfo li = new ListenerInfo();
-		li.m_listener = arg0; 
-		li.m_filter = null;
-		m_listeners.add(li);
-	}
+    /**
+     * Service Id index.
+     */
+    private long m_serviceId = 1L;
 
-	/**
-	 * Unget a service.
-	 * @param cm : instance releasing the service.
-	 * @param ref : released reference. 
-	 * @return true if the unget success
-	 */
-	public boolean ungetService(ComponentInstance cm, ServiceReference ref) {
-		
-		ServiceRegistrationImpl reg = ((ServiceReferenceImpl) ref).getServiceRegistration();
-		if (!reg.isValid()) {
-			return false;
-		} else {
-			reg.ungetService(cm, reg.getService());
-			return true;
-		}
-	}
+    /**
+     * List of service listeners.
+     */
+    private ArrayList m_listeners = new ArrayList(); // ListenerInfo List
 
-	/**
-	 * Unregister a service listener.
-	 * @param arg0 : the service listenenr to remove
-	 */
-	public void removeServiceListener(ServiceListener arg0) {
-		m_listeners.remove(arg0);
-	}
+    /**
+     * List of service registration.
+     */
+    private ArrayList m_regs = new ArrayList();
 
-	/**
-	 * Register a service.
-	 * @param cm : provider instance.
-	 * @param clazz : provided interface.
-	 * @param svcObj : service object of service factory object.
-	 * @param dict : service properties. 
-	 * @return the created service registration.
-	 */
-	public ServiceRegistration registerService(ComponentInstance cm, String clazz, Object svcObj, Dictionary dict) {
-		synchronized (m_regs) {
-			ServiceRegistrationImpl reg = new ServiceRegistrationImpl(this, cm, new String[] {clazz}, new Long(m_serviceId++), svcObj, dict);
-			m_regs.add(reg);
-			fireServiceChanged(new ServiceEvent(ServiceEvent.REGISTERED, reg.getReference()));
-			return reg;
-		}
-	}
+    /**
+     * A "real" bundle context to create LDAP filter.
+     */
+    private BundleContext m_bc; // BundleContext to create Filter
 
-	/**
-	 * Register a service.
-	 * @param cm : provider instance.
-	 * @param clazzes : provided interfaces.
-	 * @param svcObj : service object of service factory object.
-	 * @param dict : service properties. 
-	 * @return the created service registration.
-	 */
-	public ServiceRegistration registerService(ComponentInstance cm, String[] clazzes, Object svcObj, Dictionary dict) {
-		synchronized (m_regs) {
-			ServiceRegistrationImpl reg = new ServiceRegistrationImpl(this, cm, clazzes, new Long(m_serviceId++), svcObj, dict);
-			m_regs.add(reg);
-			fireServiceChanged(new ServiceEvent(ServiceEvent.REGISTERED, reg.getReference()));
-			return reg;
-		}
-	}
-	
-	/**
-	 * Dispatch a service event.
-	 * @param event : the service to dispatch
-	 */
-	private void fireServiceChanged(ServiceEvent event) {
-		synchronized (this) {
-			// Iterate on the service listenner list to notify service listener
-			for (int i = 0; i < m_listeners.size(); i++) {
-				ListenerInfo li = (ListenerInfo) m_listeners.get(i);
-				ServiceReference sr = event.getServiceReference();
-				if (li.m_filter == null) { li.m_listener.serviceChanged(event); }
-				if (li.m_filter != null && li.m_filter.match(sr)) { li.m_listener.serviceChanged(event); }
-			}
-		}
-	}
+    /**
+     * Listener info structure.
+     */
+    private class ListenerInfo {
+        /**
+         * Listener object.
+         */
+        private ServiceListener m_listener;
+        /**
+         * Filter associated with the filter.
+         */
+        private Filter m_filter;
+    }
 
-	/**
-	 * Get available (and accessible) service references.
-	 * @param className : required interface
-	 * @param expr : LDAP filter
-	 * @return : the list of available service references.
-	 * @throws InvalidSyntaxException occurs when the LDAP filter is malformed.
-	 */
-	public ServiceReference[] getServiceReferences(String className, String expr) throws InvalidSyntaxException {
-		synchronized (this) {
-			//	Define filter if expression is not null.
-			Filter filter = null;
-			if (expr != null) { filter = m_bc.createFilter(expr); }
-        
-			ArrayList refs = new ArrayList();
-		
-			for (int i = 0; i < m_regs.size(); i++) {
-				ServiceRegistrationImpl reg = (ServiceRegistrationImpl) m_regs.get(i);
-				//	Determine if the registered services matches the search criteria.
-				boolean matched = false;
+    /**
+     * Constructor.
+     * 
+     * @param bc : bundle context.
+     */
+    public ServiceRegistry(BundleContext bc) {
+        m_bc = bc;
+    }
 
-				// If className is null, then look at filter only.
-				if ((className == null) && ((filter == null) || filter.match(reg.getReference()))) { 
-					matched = true; 
-				} else if (className != null) {
-					// If className is not null, then first match the
-					// objectClass property before looking at the
-					// filter.
-					String[] objectClass = (String[]) ((ServiceRegistrationImpl) reg).getProperty(Constants.OBJECTCLASS);
-					for (int classIdx = 0; classIdx < objectClass.length; classIdx++) {
-						if (objectClass[classIdx].equals(className) && ((filter == null) || filter.match(reg.getReference()))) {
-							matched = true;
-							break;
-						}
-					}
-				}
+    /**
+     * Add a given service listener with no filter.
+     * 
+     * @param arg0 : the service listener to add
+     */
+    public void addServiceListener(ServiceListener arg0) {
+        ListenerInfo li = new ListenerInfo();
+        li.m_listener = arg0;
+        li.m_filter = null;
+        m_listeners.add(li);
+    }
 
-				// Add reference if it was a match.
-				if (matched) { refs.add(reg.getReference()); }
-			}
-		
-			if (refs.size() > 0) { return (ServiceReference[]) refs.toArray(new ServiceReference[refs.size()]); }
-			return null;
-		}
-	}
+    /**
+     * Unget a service.
+     * 
+     * @param cm : instance releasing the service.
+     * @param ref : released reference.
+     * @return true if the unget success
+     */
+    public boolean ungetService(ComponentInstance cm, ServiceReference ref) {
 
-	/**
-	 * Look for a service reference.
-	 * @param clazz : required interface.
-	 * @return the first available provider or null if none available.
-	 */
-	public ServiceReference getServiceReference(String clazz) {
-		synchronized (this) {
-			try {
-				ServiceReference[] refs = getServiceReferences(clazz, null);
-				if (refs != null) { return refs[0]; } // If the refs != null we are sure that it exist one references or more.
-			} catch (InvalidSyntaxException ex) { System.err.println("Scope Service Registry : Problem when look for service reference" + ex.getMessage()); }
-			return null;
-		}
-	}
+        ServiceRegistrationImpl reg = ((ServiceReferenceImpl) ref).getServiceRegistration();
+        if (!reg.isValid()) {
+            return false;
+        } else {
+            reg.ungetService(cm, reg.getService());
+            return true;
+        }
+    }
 
-	/**
-	 * Get a service object.
-	 * @param cm : component instance requiring the service.
-	 * @param ref : the required reference.
-	 * @return the service object.
-	 */
-	public  Object getService(ComponentInstance cm, ServiceReference ref) {
-		synchronized (this) {
-			// Look for the service registration for this ref
-			ServiceRegistrationImpl reg = ((ServiceReferenceImpl) ref).getServiceRegistration();
-			if (reg.isValid()) {
-				// Delegate the service providing to the service registration
-				return reg.getService();
-			} else {
-				return null;
-			}
-		}
-	}
+    /**
+     * Unregister a service listener.
+     * 
+     * @param arg0 : the service listenenr to remove
+     */
+    public void removeServiceListener(ServiceListener arg0) {
+        m_listeners.remove(arg0);
+    }
 
-	/**
-	 * Get all service references consistent with the given interface and filter.
-	 * @param clazz : the required interface.
-	 * @param filter : the LDAP filter.
-	 * @return the list of all service reference or null if none available.
-	 * @throws InvalidSyntaxException
-	 */
-	public ServiceReference[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
-		synchronized (this) {
-			// Can delegate on getServiceReference, indeed their is no test on the "modularity" conflict.
-			return getServiceReferences(clazz, filter);
-		}
-	}
+    /**
+     * Register a service.
+     * 
+     * @param cm : provider instance.
+     * @param clazz : provided interface.
+     * @param svcObj : service object of service factory object.
+     * @param dict : service properties.
+     * @return the created service registration.
+     */
+    public ServiceRegistration registerService(ComponentInstance cm, String clazz, Object svcObj, Dictionary dict) {
+        synchronized (m_regs) {
+            ServiceRegistrationImpl reg = new ServiceRegistrationImpl(this, cm, new String[] { clazz }, new Long(m_serviceId++), svcObj, dict);
+            m_regs.add(reg);
+            fireServiceChanged(new ServiceEvent(ServiceEvent.REGISTERED, reg.getReference()));
+            return reg;
+        }
+    }
 
-	/**
-	 * Add a service listener with a filter.
-	 * @param listener : the service listener to add
-	 * @param filter : LDAP filter
-	 */
-	public void addServiceListener(ServiceListener listener, String filter) {
-		synchronized (this) {
-			ListenerInfo li = new ListenerInfo();
-			li.m_listener = listener; 
-			try {
-				li.m_filter = m_bc.createFilter(filter);
-			} catch (InvalidSyntaxException ex) { System.err.println("Scope Service Registry : Problem when creatin a service listener " + ex.getMessage()); }
-			m_listeners.add(li);
-		}
-	}
+    /**
+     * Register a service.
+     * 
+     * @param cm : provider instance.
+     * @param clazzes : provided interfaces.
+     * @param svcObj : service object of service factory object.
+     * @param dict : service properties.
+     * @return the created service registration.
+     */
+    public ServiceRegistration registerService(ComponentInstance cm, String[] clazzes, Object svcObj, Dictionary dict) {
+        synchronized (m_regs) {
+            ServiceRegistrationImpl reg = new ServiceRegistrationImpl(this, cm, clazzes, new Long(m_serviceId++), svcObj, dict);
+            m_regs.add(reg);
+            fireServiceChanged(new ServiceEvent(ServiceEvent.REGISTERED, reg.getReference()));
+            return reg;
+        }
+    }
 
-	/**
-	 * Dispatch a service properties modified event.
-	 * @param reg : the implicated service registration.
-	 */
-	public void servicePropertiesModified(ServiceRegistrationImpl reg) {
-		fireServiceChanged(new ServiceEvent(ServiceEvent.MODIFIED, reg.getReference()));
-	}
+    /**
+     * Dispatch a service event.
+     * 
+     * @param event : the service to dispatch
+     */
+    private void fireServiceChanged(ServiceEvent event) {
+        synchronized (this) {
+            // Iterate on the service listenner list to notify service listener
+            for (int i = 0; i < m_listeners.size(); i++) {
+                ListenerInfo li = (ListenerInfo) m_listeners.get(i);
+                ServiceReference sr = event.getServiceReference();
+                if (li.m_filter == null) {
+                    li.m_listener.serviceChanged(event);
+                }
+                if (li.m_filter != null && li.m_filter.match(sr)) {
+                    li.m_listener.serviceChanged(event);
+                }
+            }
+        }
+    }
 
-	/**
-	 * Unregister a service.
-	 * @param reg : the service registration to unregister
-	 */
-	public void unregisterService(ServiceRegistrationImpl reg) {
-		synchronized (this) {
-			m_regs.remove(reg);
-			fireServiceChanged(new ServiceEvent(ServiceEvent.UNREGISTERING, reg.getReference()));
-		}
-	}
-	
-	/**
-	 * @return the size of the service registry.
-	 */
-	protected int getSize() {
-		return m_regs.size();
-	}
-	
-	/**
-	 * Reset the service registry.
-	 */
-	protected void reset() {
-		m_serviceId = 1L;
-		m_listeners = new ArrayList();
-		m_regs = new ArrayList();
-	}
+    /**
+     * Get available (and accessible) service references.
+     * 
+     * @param className : required interface
+     * @param expr : LDAP filter
+     * @return : the list of available service references.
+     * @throws InvalidSyntaxException occurs when the LDAP filter is malformed.
+     */
+    public ServiceReference[] getServiceReferences(String className, String expr) throws InvalidSyntaxException {
+        synchronized (this) {
+            // Define filter if expression is not null.
+            Filter filter = null;
+            if (expr != null) {
+                filter = m_bc.createFilter(expr);
+            }
+
+            ArrayList refs = new ArrayList();
+
+            for (int i = 0; i < m_regs.size(); i++) {
+                ServiceRegistrationImpl reg = (ServiceRegistrationImpl) m_regs.get(i);
+                // Determine if the registered services matches the search
+                // criteria.
+                boolean matched = false;
+
+                // If className is null, then look at filter only.
+                if ((className == null) && ((filter == null) || filter.match(reg.getReference()))) {
+                    matched = true;
+                } else if (className != null) {
+                    // If className is not null, then first match the
+                    // objectClass property before looking at the
+                    // filter.
+                    String[] objectClass = (String[]) ((ServiceRegistrationImpl) reg).getProperty(Constants.OBJECTCLASS);
+                    for (int classIdx = 0; classIdx < objectClass.length; classIdx++) {
+                        if (objectClass[classIdx].equals(className) && ((filter == null) || filter.match(reg.getReference()))) {
+                            matched = true;
+                            break;
+                        }
+                    }
+                }
+
+                // Add reference if it was a match.
+                if (matched) {
+                    refs.add(reg.getReference());
+                }
+            }
+
+            if (refs.size() > 0) {
+                return (ServiceReference[]) refs.toArray(new ServiceReference[refs.size()]);
+            }
+            return null;
+        }
+    }
+
+    /**
+     * Look for a service reference.
+     * 
+     * @param clazz : required interface.
+     * @return the first available provider or null if none available.
+     */
+    public ServiceReference getServiceReference(String clazz) {
+        synchronized (this) {
+            try {
+                ServiceReference[] refs = getServiceReferences(clazz, null);
+                if (refs != null) {
+                    return refs[0];
+                } // If the refs != null we are sure that it exist one
+                // references or more.
+            } catch (InvalidSyntaxException ex) {
+                System.err.println("Scope Service Registry : Problem when look for service reference" + ex.getMessage());
+            }
+            return null;
+        }
+    }
+
+    /**
+     * Get a service object.
+     * 
+     * @param cm : component instance requiring the service.
+     * @param ref : the required reference.
+     * @return the service object.
+     */
+    public Object getService(ComponentInstance cm, ServiceReference ref) {
+        synchronized (this) {
+            // Look for the service registration for this ref
+            ServiceRegistrationImpl reg = ((ServiceReferenceImpl) ref).getServiceRegistration();
+            if (reg.isValid()) {
+                // Delegate the service providing to the service registration
+                return reg.getService();
+            } else {
+                return null;
+            }
+        }
+    }
+
+    /**
+     * Get all service references consistent with the given interface and
+     * filter.
+     * 
+     * @param clazz : the required interface.
+     * @param filter : the LDAP filter.
+     * @return the list of all service reference or null if none available.
+     * @throws InvalidSyntaxException occurs when the LDAP filter is malformed.
+     */
+    public ServiceReference[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
+        synchronized (this) {
+            // Can delegate on getServiceReference, indeed their is no test on
+            // the "modularity" conflict.
+            return getServiceReferences(clazz, filter);
+        }
+    }
+
+    /**
+     * Add a service listener with a filter.
+     * 
+     * @param listener : the service listener to add
+     * @param filter : LDAP filter
+     */
+    public void addServiceListener(ServiceListener listener, String filter) {
+        synchronized (this) {
+            ListenerInfo li = new ListenerInfo();
+            li.m_listener = listener;
+            try {
+                li.m_filter = m_bc.createFilter(filter);
+            } catch (InvalidSyntaxException ex) {
+                System.err.println("Scope Service Registry : Problem when creatin a service listener " + ex.getMessage());
+            }
+            m_listeners.add(li);
+        }
+    }
+
+    /**
+     * Dispatch a service properties modified event.
+     * 
+     * @param reg : the implicated service registration.
+     */
+    public void servicePropertiesModified(ServiceRegistrationImpl reg) {
+        fireServiceChanged(new ServiceEvent(ServiceEvent.MODIFIED, reg.getReference()));
+    }
+
+    /**
+     * Unregister a service.
+     * 
+     * @param reg : the service registration to unregister
+     */
+    public void unregisterService(ServiceRegistrationImpl reg) {
+        synchronized (this) {
+            m_regs.remove(reg);
+            fireServiceChanged(new ServiceEvent(ServiceEvent.UNREGISTERING, reg.getReference()));
+        }
+    }
+
+    /**
+     * Reset the service registry.
+     */
+    protected void reset() {
+        m_serviceId = 1L;
+        m_listeners = new ArrayList();
+        m_regs = new ArrayList();
+    }
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/composite/StringMap.java b/ipojo/src/main/java/org/apache/felix/ipojo/composite/StringMap.java
index 5800a02..86f5d46 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/composite/StringMap.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/composite/StringMap.java
@@ -23,37 +23,39 @@
 import java.util.TreeMap;
 
 /**
- * Simple utility class that creates a map for string-based keys by
- * extending <tt>TreeMap</tt>. This map can be set to use case-sensitive
- * or case-insensitive comparison when searching for the key.
- * Any keys put into this map will be converted to
- * a <tt>String</tt> using the <tt>toString()</tt> method,
- * since it is only intended to compare strings.
-**/
+ * Simple utility class that creates a map for string-based keys by extending
+ * <tt>TreeMap</tt>. This map can be set to use case-sensitive or
+ * case-insensitive comparison when searching for the key. Any keys put into
+ * this map will be converted to a <tt>String</tt> using the
+ * <tt>toString()</tt> method, since it is only intended to compare strings.
+ * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
+ */
 public class StringMap extends TreeMap {
-    
-	/**
-	 * serialVersionUID.
-	 */
-	private static final long serialVersionUID = 6948801857034259744L;
 
-	/**
+    /**
+     * serialVersionUID.
+     */
+    private static final long serialVersionUID = 6948801857034259744L;
+
+    /**
      * Constructor.
      */
     public StringMap() {
         this(true);
     }
-    
+
     /**
      * Constructor.
+     * 
      * @param caseSensitive : fix if the map if case sensitive or not.
      */
     public StringMap(boolean caseSensitive) {
         super(new StringComparator(caseSensitive));
     }
-    
+
     /**
      * Constructor.
+     * 
      * @param map : initial properties.
      * @param caseSensitive : fix if the map if case sensitive or not.
      */
@@ -61,15 +63,20 @@
         this(caseSensitive);
         putAll(map);
     }
-    
+
     /**
+     * Put a record in the map.
+     * @param key : key
+     * @param value : value
+     * @return an object.
      * @see java.util.TreeMap#put(K, V)
      */
     public Object put(Object key, Object value) {
         return super.put(key.toString(), value);
     }
-    
+
     /**
+     * Check if the map is case-sensitive.
      * @return true if the map is case sensitive.
      */
     public boolean isCaseSensitive() {
@@ -78,6 +85,7 @@
 
     /**
      * Set the case sensitivity.
+     * 
      * @param b : the new case sensitivity.
      */
     public void setCaseSensitive(boolean b) {
@@ -85,10 +93,14 @@
     }
 
     private static class StringComparator implements Comparator {
+        /**
+         * Is the map case sensitive?
+         */
         private boolean m_isCaseSensitive = true;
 
         /**
          * Constructor.
+         * 
          * @param b : true to enable the case sensitivity.
          */
         public StringComparator(boolean b) {
@@ -96,6 +108,10 @@
         }
 
         /**
+         * Compare to object.
+         * @param o1 : first object to compare
+         * @param o2 : second object to compare
+         * @return the comparison result
          * @see java.util.Comparator#compare(T, T)
          */
         public int compare(Object o1, Object o2) {
@@ -107,6 +123,7 @@
         }
 
         /**
+         * Check if the comparator is case sensitive.
          * @return true if the map is case sensitive.
          */
         public boolean isCaseSensitive() {
@@ -115,17 +132,20 @@
 
         /**
          * Set the case sensitivity.
+         * 
          * @param b : true to enable the case sensitivity
          */
         public void setCaseSensitive(boolean b) {
             m_isCaseSensitive = b;
         }
-        
+
         /**
+         * Does not support cloning.
+         * @return The current map
          * @see java.lang.Object#clone()
          */
         public Object clone() {
-        	return this;
+            return this;
         }
     }
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/composite/architecture/ArchitectureHandler.java b/ipojo/src/main/java/org/apache/felix/ipojo/composite/architecture/ArchitectureHandler.java
index 697decb..8053008 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/composite/architecture/ArchitectureHandler.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/composite/architecture/ArchitectureHandler.java
@@ -32,17 +32,19 @@
 
 /**
  * Composite Architecture Handler.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ArchitectureHandler extends CompositeHandler implements Architecture {
 
-	/**
+    /**
      * Composite Manager.
      */
     private CompositeManager m_manager;
 
     /**
-     * Service Registration of the Architecture service provided by this handler.
+     * Service Registration of the Architecture service provided by this
+     * handler.
      */
     private ServiceRegistration m_sr;
 
@@ -52,12 +54,20 @@
     private String m_name;
 
     /**
-     * @see org.apache.felix.ipojo.CompositeHandler#configure(org.apache.felix.ipojo.CompositeManager, org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
+     * Configure the handler.
+     * 
+     * @param im : the instance manager
+     * @param metadata : the metadata of the component
+     * @param configuration : the instance configuration
+     * @see org.apache.felix.ipojo.CompositeHandler#configure(org.apache.felix.ipojo.CompositeManager,
+     * org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
      */
     public void configure(CompositeManager im, Element metadata, Dictionary configuration) {
         if (metadata.containsAttribute("architecture")) {
             String isArchitectureEnabled = (metadata.getAttribute("architecture")).toLowerCase();
-            if (isArchitectureEnabled.equalsIgnoreCase("true")) { im.register(this); }
+            if (isArchitectureEnabled.equalsIgnoreCase("true")) {
+                im.register(this);
+            }
         }
 
         m_name = (String) configuration.get("name");
@@ -66,20 +76,27 @@
     }
 
     /**
+     * Stop the handler.
+     * Unregister the service.
      * @see org.apache.felix.ipojo.Handler#stop()
      */
     public void stop() {
-        try {
-            if (m_sr != null) { m_sr.unregister(); m_sr = null; }
-        } catch (Exception e) { return; }
+        if (m_sr != null) {
+            m_sr.unregister();
+            m_sr = null;
+        }
     }
 
     /**
+     * Start the handler.
+     * Register the service.
      * @see org.apache.felix.ipojo.Handler#start()
      */
     public void start() {
         // Unregister the service if already registred
-        if (m_sr != null) { m_sr.unregister(); }
+        if (m_sr != null) {
+            m_sr.unregister();
+        }
 
         // Register the ManagedService
         BundleContext bc = m_manager.getContext();
@@ -91,6 +108,8 @@
     }
 
     /**
+     * Get the instance description.
+     * @return the instance description
      * @see org.apache.felix.ipojo.architecture.Architecture#getComponentDescription()
      */
     public InstanceDescription getInstanceDescription() {
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/importer/ImportExportDescription.java b/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/importer/ImportExportDescription.java
index df213dc..1a2768b 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/importer/ImportExportDescription.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/importer/ImportExportDescription.java
@@ -21,57 +21,77 @@
 import java.util.List;
 
 import org.apache.felix.ipojo.architecture.HandlerDescription;
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
 
 /**
+ * Description of the Import Export Handler.
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ImportExportDescription extends HandlerDescription {
-	
-	private List m_imports;
-	private List m_exports;
 
-	/**
-	 * Constructor.
-	 * @param name
-	 * @param isValid
-	 * @param importers
-	 * @param exporters
-	 */
-	public ImportExportDescription(String name, boolean isValid, List importers, List exporters) {
-		super(name, isValid);
-		m_imports = importers;
-		m_exports = exporters;
-	}
-	
-	/**
-	 * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
-	 */
-	public String getHandlerInfo() {
-		String s = "";
-		for (int i = 0; i < m_imports.size(); i++) {
-			ServiceImporter imp = (ServiceImporter) m_imports.get(i);
-			if (imp.isSatisfied()) {
-				s += "\t Specification " + imp.getSpecification() + " provided by \n \t";
-				for (int j = 0; j < imp.getProviders().size(); j++) {
-					String prov = (String) imp.getProviders().get(j);
-					s += prov + " ";
-				}	
-			} else {
-				s += "\t Specification " + imp.getSpecification() + " is not statisfied \n";
-			}
-		}
-		for (int i = 0; i < m_exports.size(); i++) {
-			ServiceExporter exp = (ServiceExporter) m_exports.get(i);
-			if (exp.isSatisfied()) {
-				s += "\t Specification " + exp.getSpecification() + " is exported or optional";
-			} else {
-				s += "\t Specification " + exp.getSpecification() + " is not exported";
-			}
-		}
-		return s;
-		
-	}
-	
-	
+    /**
+     * List of imports.
+     */
+    private List m_imports;
+
+    /**
+     * List of exports.
+     */
+    private List m_exports;
+
+    /**
+     * Constructor.
+     * 
+     * @param name : name of the handler
+     * @param isValid : handler validity
+     * @param importers : list of managed imports
+     * @param exporters : list of managed exports
+     */
+    public ImportExportDescription(String name, boolean isValid, List importers, List exporters) {
+        super(name, isValid);
+        m_imports = importers;
+        m_exports = exporters;
+    }
+
+    /**
+     * Build the ImportExport handler description.
+     * @return the handler description
+     * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
+     */
+    public Element getHandlerInfo() {
+        Element handler = super.getHandlerInfo();
+        for (int i = 0; i < m_imports.size(); i++) {
+            ServiceImporter imp = (ServiceImporter) m_imports.get(i);
+            Element impo = new Element("Import", "");
+            impo.addAttribute(new Attribute("Specification", imp.getSpecification()));
+            if (imp.getFilter() != null) { impo.addAttribute(new Attribute("Filter", imp.getFilter())); }
+            if (imp.isSatisfied()) {
+                impo.addAttribute(new Attribute("State", "resolved"));
+                for (int j = 0; j < imp.getProviders().size(); j++) {
+                    Element pr = new Element("Provider", "");
+                    pr.addAttribute(new Attribute("name", (String) imp.getProviders().get(j)));
+                    impo.addElement(pr);
+                }
+            } else {
+                impo.addAttribute(new Attribute("State", "unresolved"));
+            }
+            handler.addElement(impo);
+        }
+        for (int i = 0; i < m_exports.size(); i++) {
+            ServiceExporter exp = (ServiceExporter) m_exports.get(i);
+            Element expo = new Element("Export", "");
+            expo.addAttribute(new Attribute("Specification", exp.getSpecification()));
+            expo.addAttribute(new Attribute("Filter", exp.getFilter()));
+            if (exp.isSatisfied()) {
+                expo.addAttribute(new Attribute("State", "resolved"));
+            } else {
+                expo.addAttribute(new Attribute("State", "unresolved"));
+            }
+            handler.addElement(expo);
+        }
+        return handler;
+
+    }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/importer/ImportExportHandler.java b/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/importer/ImportExportHandler.java
index cf55240..b0b9bd9 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/importer/ImportExportHandler.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/importer/ImportExportHandler.java
@@ -31,211 +31,259 @@
 import org.osgi.framework.BundleContext;
 
 /**
- * This handler manages the importation and the exportation of services from / to the parent context.
+ * This handler manages the importation and the exportation of services from /
+ * to the parent context.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ImportExportHandler extends CompositeHandler {
-	
-	/**
-	 * Composite Manager.
-	 */
-	private CompositeManager m_manager;
-	
-	/**
-	 * Service Scope. 
-	 */
-	private ServiceContext m_scope;
-	
-	/**
-	 * Parent context. 
-	 */
-	private BundleContext m_context;
-	
-	/**
-	 * List of importers. 
-	 */
-	private List m_importers = new ArrayList();
-	
-	/**
-	 * List of exporters.
-	 */
-	private List m_exporters = new ArrayList(); 
-	
-	/**
-	 * Is the handler valid ?
-	 */
-	private boolean m_valid;
 
-	/**
-	 * @see org.apache.felix.ipojo.CompositeHandler#configure(org.apache.felix.ipojo.CompositeManager, org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
-	 */
-	public void configure(CompositeManager im, Element metadata, Dictionary conf) {
-		m_manager = im;
-		m_context = im.getContext();
-		m_scope = m_manager.getServiceContext();
-		
-		Element[] imp = metadata.getElements("import");
-		Element[] exp = metadata.getElements("export");
-		
-		for (int i = 0; i < imp.length; i++) {
-			boolean optional = false;
-			boolean aggregate = false;
-			String specification = null;
-			
-			if (!imp[i].containsAttribute("specification")) { // Malformed import
-				im.getFactory().getLogger().log(Logger.ERROR, "Malformed import : the specification attribute is mandatory");
-			} else {
-				specification = imp[i].getAttribute("specification");
-				String filter = "(&(objectClass=" + specification + ")(!(service.pid=" + m_manager.getInstanceName() + ")))"; // Cannot import yourself
-				if (imp[i].containsAttribute("optional") && imp[i].getAttribute("optional").equalsIgnoreCase("true")) { optional = true; }
-				if (imp[i].containsAttribute("aggregate") && imp[i].getAttribute("aggregate").equalsIgnoreCase("true")) { aggregate = true; }
-				if (imp[i].containsAttribute("filter")) { 
-					String classnamefilter = "(objectClass=" + specification + ")";
-			        filter = "";
-			        if (!imp[i].getAttribute("filter").equals("")) {
-			            filter = "(&" + classnamefilter + imp[i].getAttribute("filter") + ")";
-			        } else {
-			            filter = classnamefilter;
-			        }
-				}
-				ServiceImporter si = new ServiceImporter(specification, filter, aggregate, optional, this);
-				m_importers.add(si);
-			}
-		}
-		
-		for (int i = 0; i < exp.length; i++) {
-			boolean optional = false;
-			boolean aggregate = false;
-			String specification = null;
-			
-			if (!exp[i].containsAttribute("specification")) { // Malformed exports
-				im.getFactory().getLogger().log(Logger.ERROR, "Malformed exports : the specification attribute is mandatory");
-			} else {
-				specification = exp[i].getAttribute("specification");
-				String filter = "(objectClass=" + specification + ")";
-				if (exp[i].containsAttribute("optional") && exp[i].getAttribute("optional").equalsIgnoreCase("true")) { optional = true; }
-				if (exp[i].containsAttribute("aggregate") && exp[i].getAttribute("aggregate").equalsIgnoreCase("true")) { aggregate = true; }
-				if (exp[i].containsAttribute("filter")) { 
-					String classnamefilter = "(objectClass=" + specification + ")";
-			        filter = "";
-			        if (!imp[i].getAttribute("filter").equals("")) {
-			            filter = "(&" + classnamefilter + exp[i].getAttribute("filter") + ")";
-			        } else {
-			            filter = classnamefilter;
-			        }
-			    }
-				ServiceExporter si = new ServiceExporter(specification, filter, aggregate, optional, this);
-				// Update the componenet type description
-				
-				m_manager.getComponentDescription().addProvidedServiceSpecification(specification);
-				m_exporters.add(si);
-			}
-		}
-		
-		if (m_importers.size() > 0 || m_exporters.size() > 0) {
-			im.register(this);
-		}
-	}
+    /**
+     * Composite Manager.
+     */
+    private CompositeManager m_manager;
 
-	/**
-	 * @see org.apache.felix.ipojo.CompositeHandler#start()
-	 */
-	public void start() {
-		for (int i = 0; i < m_importers.size(); i++) {
-			ServiceImporter si = (ServiceImporter) m_importers.get(i);
-			si.configure(m_context, m_scope);
-			si.start();
-		}
-		
-		for (int i = 0; i < m_exporters.size(); i++) {
-			ServiceExporter se = (ServiceExporter) m_exporters.get(i);
-			se.configure(m_scope, m_context);
-			se.start();
-		}
-		
-	}
+    /**
+     * Service Scope.
+     */
+    private ServiceContext m_scope;
 
-	/**
-	 * @see org.apache.felix.ipojo.CompositeHandler#stop()
-	 */
-	public void stop() {
-		for (int i = 0; i < m_importers.size(); i++) {
-			ServiceImporter si = (ServiceImporter) m_importers.get(i);
-			si.stop();
-		}
-		
-		for (int i = 0; i < m_exporters.size(); i++) {
-			ServiceExporter se = (ServiceExporter) m_exporters.get(i);
-			se.stop();
-		}
-	}
-	
-	/**
-	 * @see org.apache.felix.ipojo.CompositeHandler#isValid()
-	 */
-	public boolean isValid() {
-		for (int i = 0; i < m_importers.size(); i++) {
-			ServiceImporter si = (ServiceImporter) m_importers.get(i);
-			if (!si.isSatisfied()) { m_valid = false; return false; }
-		}
-		
-		for (int i = 0; i < m_exporters.size(); i++) {
-			ServiceExporter se = (ServiceExporter) m_exporters.get(i);
-			if (!se.isSatisfied()) { m_valid = false; return false; }
-		}
-	
-		m_valid = true;
-		return true;
-	}
+    /**
+     * Parent context.
+     */
+    private BundleContext m_context;
 
-	/**
-	 * Notify the handler that an importer is no more valid.
-	 * @param importer : the implicated importer.
-	 */
-	protected void invalidating(ServiceImporter importer) {
-		//	An import is no more valid
-		if (m_valid) { m_manager.checkInstanceState(); }
-		
-	}
+    /**
+     * List of importers.
+     */
+    private List m_importers = new ArrayList();
 
-	/**
-	 * Notify the handler that an importer becomes valid.
-	 * @param importer : the implicated importer.
-	 */
-	protected void validating(ServiceImporter importer) {
-		// An import becomes valid
-		if (!m_valid && isValid()) { m_manager.checkInstanceState(); }
-		
-	}
+    /**
+     * List of exporters.
+     */
+    private List m_exporters = new ArrayList();
 
-	/**
-	 * Notify the handler that an exporter becomes invalid.
-	 * @param exporter : the impcated exporter.
-	 */
-	protected void invalidating(ServiceExporter exporter) {
-		// An import is no more valid
-		if (m_valid) { m_manager.checkInstanceState(); }
-		
-	}
+    /**
+     * Is the handler valid ?
+     */
+    private boolean m_valid;
 
-	/**
-	 * Notify the handler that an exporter becomes valid.
-	 * @param exporter : the impcated exporter.
-	 */
-	protected void validating(ServiceExporter exporter) {
-		// An import becomes valid
-		if (!m_valid && isValid()) { m_manager.checkInstanceState(); }
-		
-	}
-	
-	/**
-	 * @return the attached composite manager.
-	 */
-	protected CompositeManager getManager() { return m_manager; }
-	
-	
-	/**
-	 * @see org.apache.felix.ipojo.CompositeHandler#getDescription()
-	 */
-	public HandlerDescription getDescription() { return new ImportExportDescription(this.getClass().getName(), isValid(), m_importers, m_exporters); }
+    /**
+     * Configure the handler.
+     * 
+     * @param im : the instance manager
+     * @param metadata : the metadata of the component
+     * @param conf : the instance configuration
+     * @see org.apache.felix.ipojo.CompositeHandler#configure(org.apache.felix.ipojo.CompositeManager,
+     * org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
+     */
+    public void configure(CompositeManager im, Element metadata, Dictionary conf) {
+        m_manager = im;
+        m_context = im.getContext();
+        m_scope = m_manager.getServiceContext();
+
+        Element[] imp = metadata.getElements("import");
+        Element[] exp = metadata.getElements("export");
+
+        for (int i = 0; i < imp.length; i++) {
+            boolean optional = false;
+            boolean aggregate = false;
+            String specification = null;
+
+            if (!imp[i].containsAttribute("specification")) { // Malformed
+                                                                // import
+                im.getFactory().getLogger().log(Logger.ERROR, "Malformed import : the specification attribute is mandatory");
+            } else {
+                specification = imp[i].getAttribute("specification");
+                String filter = "(&(objectClass=" + specification + ")(!(service.pid=" + m_manager.getInstanceName() + ")))"; // Cannot
+                                                                                                                                // import
+                                                                                                                                // yourself
+                if (imp[i].containsAttribute("optional") && imp[i].getAttribute("optional").equalsIgnoreCase("true")) {
+                    optional = true;
+                }
+                if (imp[i].containsAttribute("aggregate") && imp[i].getAttribute("aggregate").equalsIgnoreCase("true")) {
+                    aggregate = true;
+                }
+                if (imp[i].containsAttribute("filter")) {
+                    String classnamefilter = "(objectClass=" + specification + ")";
+                    filter = "";
+                    if (!imp[i].getAttribute("filter").equals("")) {
+                        filter = "(&" + classnamefilter + imp[i].getAttribute("filter") + ")";
+                    } else {
+                        filter = classnamefilter;
+                    }
+                }
+                ServiceImporter si = new ServiceImporter(specification, filter, aggregate, optional, m_context, m_scope, this);
+                m_importers.add(si);
+            }
+        }
+
+        for (int i = 0; i < exp.length; i++) {
+            boolean optional = false;
+            boolean aggregate = false;
+            String specification = null;
+
+            if (!exp[i].containsAttribute("specification")) { // Malformed
+                                                                // exports
+                im.getFactory().getLogger().log(Logger.ERROR, "Malformed exports : the specification attribute is mandatory");
+            } else {
+                specification = exp[i].getAttribute("specification");
+                String filter = "(objectClass=" + specification + ")";
+                if (exp[i].containsAttribute("optional") && exp[i].getAttribute("optional").equalsIgnoreCase("true")) {
+                    optional = true;
+                }
+                if (exp[i].containsAttribute("aggregate") && exp[i].getAttribute("aggregate").equalsIgnoreCase("true")) {
+                    aggregate = true;
+                }
+                if (exp[i].containsAttribute("filter")) {
+                    String classnamefilter = "(objectClass=" + specification + ")";
+                    filter = "";
+                    if (!imp[i].getAttribute("filter").equals("")) {
+                        filter = "(&" + classnamefilter + exp[i].getAttribute("filter") + ")";
+                    } else {
+                        filter = classnamefilter;
+                    }
+                }
+                ServiceExporter si = new ServiceExporter(specification, filter, aggregate, optional, m_scope, m_context, this);
+                // Update the componenet type description
+
+                m_manager.getComponentDescription().addProvidedServiceSpecification(specification);
+                m_exporters.add(si);
+            }
+        }
+
+        if (m_importers.size() > 0 || m_exporters.size() > 0) {
+            im.register(this);
+        }
+    }
+
+    /**
+     * Start the handler.
+     * Start importers and exporters.
+     * @see org.apache.felix.ipojo.CompositeHandler#start()
+     */
+    public void start() {
+        for (int i = 0; i < m_importers.size(); i++) {
+            ServiceImporter si = (ServiceImporter) m_importers.get(i);
+            si.start();
+        }
+
+        for (int i = 0; i < m_exporters.size(); i++) {
+            ServiceExporter se = (ServiceExporter) m_exporters.get(i);
+            se.start();
+        }
+
+    }
+
+    /**
+     * Stop the handler.
+     * Stop all importers and exporters.
+     * @see org.apache.felix.ipojo.CompositeHandler#stop()
+     */
+    public void stop() {
+        for (int i = 0; i < m_importers.size(); i++) {
+            ServiceImporter si = (ServiceImporter) m_importers.get(i);
+            si.stop();
+        }
+
+        for (int i = 0; i < m_exporters.size(); i++) {
+            ServiceExporter se = (ServiceExporter) m_exporters.get(i);
+            se.stop();
+        }
+    }
+
+    /**
+     * Check the handler validity.
+     * @return true if all importers and exporters are valid
+     * @see org.apache.felix.ipojo.CompositeHandler#isValid()
+     */
+    public boolean isValid() {
+        for (int i = 0; i < m_importers.size(); i++) {
+            ServiceImporter si = (ServiceImporter) m_importers.get(i);
+            if (!si.isSatisfied()) {
+                m_valid = false;
+                return false;
+            }
+        }
+
+        for (int i = 0; i < m_exporters.size(); i++) {
+            ServiceExporter se = (ServiceExporter) m_exporters.get(i);
+            if (!se.isSatisfied()) {
+                m_valid = false;
+                return false;
+            }
+        }
+
+        m_valid = true;
+        return true;
+    }
+
+    /**
+     * Notify the handler that an importer is no more valid.
+     * 
+     * @param importer : the implicated importer.
+     */
+    protected void invalidating(ServiceImporter importer) {
+        // An import is no more valid
+        if (m_valid) {
+            m_manager.checkInstanceState();
+        }
+
+    }
+
+    /**
+     * Notify the handler that an importer becomes valid.
+     * 
+     * @param importer : the implicated importer.
+     */
+    protected void validating(ServiceImporter importer) {
+        // An import becomes valid
+        if (!m_valid && isValid()) {
+            m_manager.checkInstanceState();
+        }
+
+    }
+
+    /**
+     * Notify the handler that an exporter becomes invalid.
+     * 
+     * @param exporter : the impcated exporter.
+     */
+    protected void invalidating(ServiceExporter exporter) {
+        // An import is no more valid
+        if (m_valid) {
+            m_manager.checkInstanceState();
+        }
+
+    }
+
+    /**
+     * Notify the handler that an exporter becomes valid.
+     * 
+     * @param exporter : the impcated exporter.
+     */
+    protected void validating(ServiceExporter exporter) {
+        // An import becomes valid
+        if (!m_valid && isValid()) {
+            m_manager.checkInstanceState();
+        }
+
+    }
+
+    /**
+     * Get the composite maanger.
+     * @return the attached composite manager.
+     */
+    protected CompositeManager getManager() {
+        return m_manager;
+    }
+
+    /**
+     * Get the import / export handler description.
+     * @return the handler description
+     * @see org.apache.felix.ipojo.CompositeHandler#getDescription()
+     */
+    public HandlerDescription getDescription() {
+        return new ImportExportDescription(this.getClass().getName(), isValid(), m_importers, m_exporters);
+    }
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/importer/ServiceExporter.java b/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/importer/ServiceExporter.java
index 0b8b570..5f54f6c 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/importer/ServiceExporter.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/importer/ServiceExporter.java
@@ -35,267 +35,324 @@
 
 /**
  * Export an service from the scope to the parent context.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ServiceExporter implements ServiceListener {
-	
-	private BundleContext m_destination;
-	private ServiceContext m_origin;
-	
-	private String m_specification;
-	private Filter m_filter;
-	private String m_filterStr;
-	
-	private boolean m_aggregate = false;
-	private boolean m_optional = false;
-	
-	private ImportExportHandler m_handler;
-	
-	private boolean m_isValid;
-	
-	private class Record {
-		private ServiceReference m_ref;
-		private ServiceRegistration m_reg;
-		private Object m_svcObject;
-	}
-	
-	private List/*<Record>*/ m_records = new ArrayList()/*<Record>*/;
-	
-	/**
-	 * Constructor.
-	 * @param specification
-	 * @param filter
-	 * @param multiple
-	 * @param optional
-	 * @param from
-	 * @param to
-	 * @param exp
-	 */
-	public ServiceExporter(String specification, String filter, boolean multiple, boolean optional, ServiceContext from, BundleContext to, ImportExportHandler exp) {
-		this.m_destination = to;
-		this.m_origin = from;
-		this.m_handler = exp;
-		try {
-			this.m_filter = to.createFilter(filter);
-		} catch (InvalidSyntaxException e) { e.printStackTrace(); return; }
-		this.m_aggregate = multiple;
-		this.m_specification = specification;
-		this.m_optional = optional;
-	}
-	
-	/**
-	 * @param specification
-	 * @param filter
-	 * @param multiple
-	 * @param optional
-	 * @param exp
-	 */
-	public ServiceExporter(String specification, String filter, boolean multiple, boolean optional, ImportExportHandler exp) {
-		this.m_handler = exp;
-		this.m_filterStr = filter;
-		this.m_aggregate = multiple;
-		this.m_specification = specification;
-		this.m_optional = optional;
-	}
-	
-	/**
-	 * @param from
-	 * @param to
-	 */
-	public void configure(ServiceContext from, BundleContext to) {
-		this.m_destination = to;
-		this.m_origin = from;
-		try {
-			this.m_filter = to.createFilter(m_filterStr);
-		} catch (InvalidSyntaxException e) { e.printStackTrace(); return; }
-	}
-	
-	/**
-	 * 
-	 */
-	public void start() {
-		try {
-			ServiceReference[] refs = m_origin.getServiceReferences(m_specification, null);
-			if (refs != null) {
-				for (int i = 0; i < refs.length; i++) {
-					if (m_filter.match(refs[i])) {
-						Record rec = new Record();
-						rec.m_ref = refs[i];
-						m_records.add(rec);
-					}
-				}
-			}
-		} catch (InvalidSyntaxException e) { e.printStackTrace(); }
-		
-		// Publish available services 
-		if (m_records.size() > 0) {
-			if (m_aggregate) {
-				for (int i = 0; i < m_records.size(); i++) {
-					Record rec = (Record) m_records.get(i);
-					rec.m_svcObject = m_origin.getService(rec.m_ref);
-					rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
-				}
-			} else {
-				Record rec = (Record) m_records.get(0);
-				rec.m_svcObject = m_origin.getService(rec.m_ref);
-				rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
-			}
-		}
-		
-		// Register service listener
-		try {
-			m_origin.addServiceListener(this, "(" + Constants.OBJECTCLASS + "=" + m_specification + ")");
-		} catch (InvalidSyntaxException e) { e.printStackTrace(); }
-		
-		m_isValid = isSatisfied();
-	}
-	
-	/**
-	 * @param ref
-	 * @return
-	 */
-	private Dictionary getProps(ServiceReference ref) {
-		Properties prop = new Properties();
-		String[] keys = ref.getPropertyKeys();
-		for (int i = 0; i < keys.length; i++) {
-			prop.put(keys[i], ref.getProperty(keys[i]));
-		}
-		
-		prop.put(Constants.SERVICE_PID, m_handler.getManager().getInstanceName());
-		prop.put("factory.pid", m_handler.getManager().getFactory().getFactoryName());
 
-		return prop;
-	}
-	
-	/**
-	 * 
-	 */
-	public void stop() {
-		m_origin.removeServiceListener(this);
-		
-		for (int i = 0; i < m_records.size(); i++) {
-			Record rec = (Record) m_records.get(i);
-			rec.m_svcObject = null;
-			if (rec.m_reg != null) {
-				rec.m_reg.unregister();
-				m_origin.ungetService(rec.m_ref);
-				rec.m_ref = null;
-			}
-		}
-		
-		m_records.clear();
-		
-	}
-	
-	/**
-	 * @return
-	 */
-	public boolean isSatisfied() {
-		return m_optional || m_records.size() > 0;
-	}
-	
-	/**
-	 * @param ref
-	 * @return
-	 */
-	private List/*<Record>*/ getRecordsByRef(ServiceReference ref) {
-		List l = new ArrayList();
-		for (int i = 0; i < m_records.size(); i++) {
-			Record rec = (Record) m_records.get(i);
-			if (rec.m_ref == ref) { l.add(rec); }
-		}
-		return l;
-	}
-	
-	/**
-	 * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
-	 */
-	public void serviceChanged(ServiceEvent ev) {
-		if (ev.getType() == ServiceEvent.REGISTERED) { arrivalManagement(ev.getServiceReference()); }
-		if (ev.getType() == ServiceEvent.UNREGISTERING) { departureManagement(ev.getServiceReference()); }
-		
-		if (ev.getType() == ServiceEvent.MODIFIED) {
-			if (m_filter.match(ev.getServiceReference())) {
-				// Test if the ref is always matching with the filter
-				List l = getRecordsByRef(ev.getServiceReference());
-				if (l.size() > 0) { // The ref is already contained => update the properties
-					for (int i = 0; i < l.size(); i++) { // Stop the implied record
-						Record rec = (Record) l.get(i);
-						if (rec.m_reg != null) { rec.m_reg.setProperties(getProps(rec.m_ref)); }
-					}
-				} else  { // it is a new mathcing service => add it
-					arrivalManagement(ev.getServiceReference());
-				}
-			} else {
-				List l = getRecordsByRef(ev.getServiceReference());
-				if (l.size() > 0) { // The ref is already contained => the service does no more match
-					departureManagement(ev.getServiceReference());
-				}
-			}
-		}
-	}
-	
-	/**
-	 * @param ref
-	 */
-	private void arrivalManagement(ServiceReference ref) {
-		// Check if the new service match
-		if (m_filter.match(ref)) {
-			// Add it to the record list
-			Record rec = new Record();
-			rec.m_ref = ref;
-			m_records.add(rec);
-			// Publishing ?
-			if (m_records.size() == 1 || m_aggregate) { // If the service is the first one, or if it is a multiple imports
-				rec.m_svcObject = m_origin.getService(rec.m_ref);
-				rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
-			}			
-			// Compute the new state 
-			if (!m_isValid && isSatisfied()) {
-				m_isValid = true;
-				m_handler.validating(this);
-			}
-		}
-	}
-	
-	/**
-	 * @param ref
-	 */
-	private void departureManagement(ServiceReference ref) {
-		List l = getRecordsByRef(ref);
-		for (int i = 0; i < l.size(); i++) { // Stop the implied record
-			Record rec = (Record) l.get(i);
-			if (rec.m_reg != null) {
-				rec.m_svcObject = null;
-				rec.m_reg.unregister();
-				rec.m_reg = null;
-				m_origin.ungetService(rec.m_ref);
-			}
-		}
-		m_records.removeAll(l);
-		
-		// Check the validity & if we need to reimport the service
-		if (m_records.size() > 0) {
-			// There is other available services
-			if (!m_aggregate) {  // Import the next one
-				Record rec = (Record) m_records.get(0);
-				if (rec.m_svcObject == null) { // It is the first service who disappears - create the next one
-					rec.m_svcObject = m_origin.getService(rec.m_ref);
-					rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
-				}
-			}
-		} else {
-			if (!m_optional) {
-				m_isValid = false;
-				m_handler.invalidating(this);
-			}
-		}
-	}
-	
-	/**
-	 * @return the exported specification.
-	 */
-	protected String getSpecification() {
-		return m_specification;
-	}
+    /**
+     * Destination context.
+     */
+    private BundleContext m_destination;
+
+    /**
+     * Origin context.
+     */
+    private ServiceContext m_origin;
+
+    /**
+     * Exported specification.
+     */
+    private String m_specification;
+
+    /**
+     * LDAP filter filtering internal provider.
+     */
+    private Filter m_filter;
+
+    /**
+     * String form of the LDAP filter.
+     */
+    private String m_filterStr;
+
+    /**
+     * Should be exported several providers.
+     */
+    private boolean m_aggregate = false;
+
+    /**
+     * Is this exports optional?
+     */
+    private boolean m_optional = false;
+
+    /**
+     * Reference of the handler.
+     */
+    private ImportExportHandler m_handler;
+
+    /**
+     * Is the exporter valid?
+     */
+    private boolean m_isValid;
+
+    /**
+     * Structure Reference, Registration, Service Object.
+     */
+    private class Record {
+        /**
+         * Internal Reference.
+         */
+        private ServiceReference m_ref;
+        /**
+         * External Registration.
+         */
+        private ServiceRegistration m_reg;
+        /**
+         * Exposed object.
+         */
+        private Object m_svcObject;
+    }
+
+    /**
+     * List of managed records.
+     */
+    private List/*<Record>*/m_records = new ArrayList()/* <Record> */;
+
+    /**
+     * Constructor.
+     * 
+     * @param specification : exported service specification.
+     * @param filter : LDAP filter
+     * @param multiple : is the export an aggregate export?
+     * @param optional : is the export optional?
+     * @param from : internal service context
+     * @param to : external bundle context
+     * @param exp : handler
+     */
+    public ServiceExporter(String specification, String filter, boolean multiple, boolean optional, ServiceContext from, BundleContext to,
+            ImportExportHandler exp) {
+        this.m_destination = to;
+        this.m_origin = from;
+        this.m_handler = exp;
+        try {
+            this.m_filter = to.createFilter(filter);
+        } catch (InvalidSyntaxException e) {
+            e.printStackTrace();
+            return;
+        }
+        this.m_aggregate = multiple;
+        this.m_specification = specification;
+        this.m_optional = optional;
+    }
+
+    /**
+     * Start method.
+     * Start the provider traking and the publication.
+     */
+    public void start() {
+        try {
+            ServiceReference[] refs = m_origin.getServiceReferences(m_specification, null);
+            if (refs != null) {
+                for (int i = 0; i < refs.length; i++) {
+                    if (m_filter.match(refs[i])) {
+                        Record rec = new Record();
+                        rec.m_ref = refs[i];
+                        m_records.add(rec);
+                    }
+                }
+            }
+        } catch (InvalidSyntaxException e) {
+            e.printStackTrace();
+        }
+
+        // Publish available services
+        if (m_records.size() > 0) {
+            if (m_aggregate) {
+                for (int i = 0; i < m_records.size(); i++) {
+                    Record rec = (Record) m_records.get(i);
+                    rec.m_svcObject = m_origin.getService(rec.m_ref);
+                    rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
+                }
+            } else {
+                Record rec = (Record) m_records.get(0);
+                rec.m_svcObject = m_origin.getService(rec.m_ref);
+                rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
+            }
+        }
+
+        // Register service listener
+        try {
+            m_origin.addServiceListener(this, "(" + Constants.OBJECTCLASS + "=" + m_specification + ")");
+        } catch (InvalidSyntaxException e) {
+            e.printStackTrace();
+        }
+
+        m_isValid = isSatisfied();
+    }
+
+    /**
+     * Transform service reference property in a dictionary.
+     * Service.PID and Factory.PID are injected too.
+     * @param ref : the service reference.
+     * @return the dictionary containing all property of the given service reference.
+     */
+    private Dictionary getProps(ServiceReference ref) {
+        Properties prop = new Properties();
+        String[] keys = ref.getPropertyKeys();
+        for (int i = 0; i < keys.length; i++) {
+            prop.put(keys[i], ref.getProperty(keys[i]));
+        }
+
+        prop.put(Constants.SERVICE_PID, m_handler.getManager().getInstanceName());
+        prop.put("factory.pid", m_handler.getManager().getFactory().getName());
+
+        return prop;
+    }
+
+    /**
+     * Stop an exporter.
+     * Remove the service listener
+     * Unregister all exported services.
+     */
+    public void stop() {
+        m_origin.removeServiceListener(this);
+
+        for (int i = 0; i < m_records.size(); i++) {
+            Record rec = (Record) m_records.get(i);
+            rec.m_svcObject = null;
+            if (rec.m_reg != null) {
+                rec.m_reg.unregister();
+                m_origin.ungetService(rec.m_ref);
+                rec.m_ref = null;
+            }
+        }
+
+        m_records.clear();
+
+    }
+
+    /**
+     * Check the exporter validity.
+     * @return true if optional or 'valid'
+     */
+    public boolean isSatisfied() {
+        return m_optional || m_records.size() > 0;
+    }
+
+    /**
+     * Get the list of records using the given reference.
+     * @param ref : the service reference
+     * @return the list of records using the given reference, empty if no record used this reference
+     */
+    private List/* <Record> */getRecordsByRef(ServiceReference ref) {
+        List l = new ArrayList();
+        for (int i = 0; i < m_records.size(); i++) {
+            Record rec = (Record) m_records.get(i);
+            if (rec.m_ref == ref) {
+                l.add(rec);
+            }
+        }
+        return l;
+    }
+
+    /**
+     * Service Listener Implementation.
+     * @param ev : the service event
+     * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
+     */
+    public void serviceChanged(ServiceEvent ev) {
+        if (ev.getType() == ServiceEvent.REGISTERED) {
+            arrivalManagement(ev.getServiceReference());
+        }
+        if (ev.getType() == ServiceEvent.UNREGISTERING) {
+            departureManagement(ev.getServiceReference());
+        }
+
+        if (ev.getType() == ServiceEvent.MODIFIED) {
+            if (m_filter.match(ev.getServiceReference())) {
+                // Test if the ref is always matching with the filter
+                List l = getRecordsByRef(ev.getServiceReference());
+                if (l.size() > 0) { // The ref is already contained => update
+                    // the properties
+                    for (int i = 0; i < l.size(); i++) { // Stop the implied
+                        // record
+                        Record rec = (Record) l.get(i);
+                        if (rec.m_reg != null) {
+                            rec.m_reg.setProperties(getProps(rec.m_ref));
+                        }
+                    }
+                } else { // it is a new mathcing service => add it
+                    arrivalManagement(ev.getServiceReference());
+                }
+            } else {
+                List l = getRecordsByRef(ev.getServiceReference());
+                if (l.size() > 0) { // The ref is already contained => the
+                    // service does no more match
+                    departureManagement(ev.getServiceReference());
+                }
+            }
+        }
+    }
+
+    /**
+     * Manage the arrival of a service.
+     * @param ref : the new service reference.
+     */
+    private void arrivalManagement(ServiceReference ref) {
+        // Check if the new service match
+        if (m_filter.match(ref)) {
+            // Add it to the record list
+            Record rec = new Record();
+            rec.m_ref = ref;
+            m_records.add(rec);
+            // Publishing ?
+            if (m_records.size() == 1 || m_aggregate) { // If the service is the
+                // first one, or if it
+                // is a multiple imports
+                rec.m_svcObject = m_origin.getService(rec.m_ref);
+                rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
+            }
+            // Compute the new state
+            if (!m_isValid && isSatisfied()) {
+                m_isValid = true;
+                m_handler.validating(this);
+            }
+        }
+    }
+
+    /**
+     * Manage the departure of a service.
+     * @param ref : the new service reference.
+     */
+    private void departureManagement(ServiceReference ref) {
+        List l = getRecordsByRef(ref);
+        for (int i = 0; i < l.size(); i++) { // Stop the implied record
+            Record rec = (Record) l.get(i);
+            if (rec.m_reg != null) {
+                rec.m_svcObject = null;
+                rec.m_reg.unregister();
+                rec.m_reg = null;
+                m_origin.ungetService(rec.m_ref);
+            }
+        }
+        m_records.removeAll(l);
+
+        // Check the validity & if we need to reimport the service
+        if (m_records.size() > 0) {
+            // There is other available services
+            if (!m_aggregate) { // Import the next one
+                Record rec = (Record) m_records.get(0);
+                if (rec.m_svcObject == null) { // It is the first service who
+                    // disappears - create the next
+                    // one
+                    rec.m_svcObject = m_origin.getService(rec.m_ref);
+                    rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
+                }
+            }
+        } else {
+            if (!m_optional) {
+                m_isValid = false;
+                m_handler.invalidating(this);
+            }
+        }
+    }
+
+    
+    protected String getSpecification() {
+        return m_specification;
+    }
+    
+    public String getFilter() {
+        return m_filterStr;
+    }
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/importer/ServiceImporter.java b/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/importer/ServiceImporter.java
index 79ef6f7..98a2eff 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/importer/ServiceImporter.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/importer/ServiceImporter.java
@@ -34,283 +34,332 @@
 import org.osgi.framework.ServiceRegistration;
 
 /**
- * Import a service form the parent to the internal service registry. 
+ * Import a service form the parent to the internal service registry.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ServiceImporter implements ServiceListener {
-	
-	private ServiceContext m_destination;
-	private BundleContext m_origine;
-	
-	private String m_specification;
-	private Filter m_filter;
-	private String m_filterStr;
-	
-	private boolean m_aggregate = false;
-	private boolean m_optional = false;
-	
-	private boolean m_isValid;
-	
-	private ImportExportHandler m_handler;
-	
-	private class Record {
-		private ServiceReference m_ref;
-		private ServiceRegistration m_reg;
-		private Object m_svcObject;
-	}
-	
-	private List/*<Record>*/ m_records = new ArrayList()/*<Record>*/;
-	
-	/**
-	 * Constructor.
-	 * @param specification : targetted specification
-	 * @param filter : LDAP filter
-	 * @param multiple : should the importer imports several services ?
-	 * @param optional : is the import optional ?
-	 * @param from : parent context
-	 * @param to : internal context 
-	 * @param in : handler
-	 */
-	public ServiceImporter(String specification, String filter, boolean multiple, boolean optional, BundleContext from, ServiceContext to, ImportExportHandler in) {
-		this.m_destination = to;
-		this.m_origine = from;
-		try {
-			this.m_filter = from.createFilter(filter);
-		} catch (InvalidSyntaxException e) { e.printStackTrace(); return; }
-		this.m_aggregate = multiple;
-		this.m_specification = specification;
-		this.m_optional = optional;
-		this.m_handler = in;
-	}
-	
-	/**
-	 * Constructor.
-	 * @param specification : targetted specification
-	 * @param filter : LDAP filter
-	 * @param multiple : should the importer imports several services ?
-	 * @param optional : is the import optional ?
-	 * @param in : handler
-	 */
-	public ServiceImporter(String specification, String filter, boolean multiple, boolean optional, ImportExportHandler in) {
-		this.m_filterStr = filter;
-		this.m_aggregate = multiple;
-		this.m_filterStr = filter;
-		this.m_specification = specification;
-		this.m_optional = optional;
-		this.m_handler = in;
-	}
-	
-	/**
-	 * Configure the origin and the destination of the import.
-	 * @param from : origine (parent)
-	 * @param to : destination (internal scope)
-	 */
-	public void configure(BundleContext from, ServiceContext to) {
-		this.m_destination = to;
-		this.m_origine = from;
-		try {
-			this.m_filter = from.createFilter(m_filterStr);
-		} catch (InvalidSyntaxException e) { e.printStackTrace(); return; }
-	}
-	
-	/**
-	 * Start method to begin the import.
-	 */
-	public void start() {
-		try {
-			ServiceReference[] refs = m_origine.getServiceReferences(m_specification, null);
-			if (refs != null) {
-				for (int i = 0; i < refs.length; i++) {
-					if (m_filter.match(refs[i])) {
-						Record rec = new Record();
-						rec.m_ref = refs[i];
-						m_records.add(rec);
-					}
-				}
-			}
-		} catch (InvalidSyntaxException e) { e.printStackTrace(); }
-		
-		// Publish available services 
-		if (m_records.size() > 0) {
-			if (m_aggregate) {
-				for (int i = 0; i < m_records.size(); i++) {
-					Record rec = (Record) m_records.get(i);
-					rec.m_svcObject = m_origine.getService(rec.m_ref);
-					rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
-				}
-			} else {
-				Record rec = (Record) m_records.get(0);
-				rec.m_svcObject = m_origine.getService(rec.m_ref);
-				rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
-			}
-		}
-		
-		// Register service listener
-		try {
-			m_origine.addServiceListener(this, "(" + Constants.OBJECTCLASS + "=" + m_specification + ")");
-		} catch (InvalidSyntaxException e) { e.printStackTrace(); }
-		
-		m_isValid = isSatisfied();
-	}
-	
-	/**
-	 * Get the properties for the exposed service from the given reference.
-	 * @param ref : the reference.
-	 * @return the property dictionary
-	 */
-	private Dictionary getProps(ServiceReference ref) {
-		Properties prop = new Properties();
-		String[] keys = ref.getPropertyKeys();
-		for (int i = 0; i < keys.length; i++) {
-			prop.put(keys[i], ref.getProperty(keys[i]));
-		}
-		return prop;
-	}
-	
-	/**
-	 * Stop the management of the import.
-	 */
-	public void stop() {
-		
-		m_origine.removeServiceListener(this);
-		
-		for (int i = 0; i < m_records.size(); i++) {
-			Record rec = (Record) m_records.get(i);
-			rec.m_svcObject = null;
-			if (rec.m_reg != null) {
-				rec.m_reg.unregister();
-				m_origine.ungetService(rec.m_ref);
-				rec.m_ref = null;
-			}
-		}
-		
-		m_records.clear();
-		
-	}
-	
-	/**
-	 * @return true if the import is satisfied.
-	 */
-	public boolean isSatisfied() {
-		return m_optional || m_records.size() > 0;
-	}
-	
-	/**
-	 * Get the record list using the given reference.
-	 * @param ref : the reference
-	 * @return the list containing all record using the given reference
-	 */
-	private List/*<Record>*/ getRecordsByRef(ServiceReference ref) {
-		List l = new ArrayList();
-		for (int i = 0; i < m_records.size(); i++) {
-			Record rec = (Record) m_records.get(i);
-			if (rec.m_ref == ref) { l.add(rec); }
-		}
-		return l;
-	}
-	
-	/**
-	 * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
-	 */
-	public void serviceChanged(ServiceEvent ev) {
-		if (ev.getType() == ServiceEvent.REGISTERED) { arrivalManagement(ev.getServiceReference()); }
-		if (ev.getType() == ServiceEvent.UNREGISTERING) { departureManagement(ev.getServiceReference()); }
-		
-		if (ev.getType() == ServiceEvent.MODIFIED) {
-			if (m_filter.match(ev.getServiceReference())) {
-				// Test if the ref is always matching with the filter
-				List l = getRecordsByRef(ev.getServiceReference());
-				if (l.size() > 0) { // The ref is already contained => update the properties
-					for (int i = 0; i < l.size(); i++) { // Stop the implied record
-						Record rec = (Record) l.get(i);
-						if (rec.m_reg != null) { rec.m_reg.setProperties(getProps(rec.m_ref)); }
-					}
-				} else  { // it is a new mathcing service => add it
-					arrivalManagement(ev.getServiceReference());
-				}
-			} else {
-				List l = getRecordsByRef(ev.getServiceReference());
-				if (l.size() > 0) { // The ref is already contained => the service does no more match
-					departureManagement(ev.getServiceReference());
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Manage the arrival of a consitent service.
-	 * @param ref : the arrival service reference
-	 */
-	private void arrivalManagement(ServiceReference ref) {
-		//	Check if the new service match
-		if (m_filter.match(ref)) {
-			// Add it to the record list
-			Record rec = new Record();
-			rec.m_ref = ref;
-			m_records.add(rec);
-			// Publishing ?
-			if (m_records.size() == 1 || m_aggregate) { // If the service is the first one, or if it is a multiple imports
-				rec.m_svcObject = m_origine.getService(rec.m_ref);
-				rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
-			}			
-			// Compute the new state 
-			if (!m_isValid && isSatisfied()) {
-				m_isValid = true;
-				m_handler.validating(this);
-			}
-		}
-	}
-	
-	/**
-	 * Manage the departure of a used reference.
-	 * @param ref : the leaving reference
-	 */
-	private void departureManagement(ServiceReference ref) {
-		List l = getRecordsByRef(ref);
-		for (int i = 0; i < l.size(); i++) { // Stop the implied record
-			Record rec = (Record) l.get(i);
-			if (rec.m_reg != null) {
-				rec.m_svcObject = null;
-				rec.m_reg.unregister();
-				rec.m_reg = null;
-				m_origine.ungetService(rec.m_ref);
-			}
-		}
-		m_records.removeAll(l);
-		
-		// Check the validity & if we need to reimport the service
-		if (m_records.size() > 0) {
-			// There is other available services
-			if (!m_aggregate) {  // Import the next one
-				Record rec = (Record) m_records.get(0);
-				if (rec.m_svcObject == null) { // It is the first service who disappears - create the next one
-					rec.m_svcObject = m_origine.getService(rec.m_ref);
-					rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
-				}
-			}
-		} else {
-			if (!m_optional) {
-				m_isValid = false;
-				m_handler.invalidating(this);
-			}
-		}
-	}
-	
-	/**
-	 * @return the targetted specification.
-	 */
-	public String getSpecification() { return m_specification; }
-		
-	/**
-	 * @return the list of all imported services.
-	 */
-	protected List getProviders() {
-		List l = new ArrayList();
-		for (int i = 0; i < m_records.size(); i++) {
-			l.add((((Record) m_records.get(i)).m_ref).getProperty(Constants.SERVICE_PID));
-		}
-		return l;
-		
-	}
+
+    /**
+     * Destination context.
+     */
+    private ServiceContext m_destination;
+
+    /**
+     * Origine Context.
+     */
+    private BundleContext m_origine;
+
+    /**
+     * Imported Specification.
+     */
+    private String m_specification;
+
+    /**
+     * LDAP filter filtering external providers.
+     */
+    private Filter m_filter;
+
+    /**
+     * String form of the LDAP filter.
+     */
+    private String m_filterStr;
+
+    /**
+     * Should we importer several providers?
+     */
+    private boolean m_aggregate = false;
+
+    /**
+     * Is the import optional?
+     */
+    private boolean m_optional = false;
+
+    /**
+     * Is the importer valid?
+     */
+    private boolean m_isValid;
+
+    /**
+     * Reference on the handler.
+     */
+    private ImportExportHandler m_handler;
+
+    private class Record {
+        /**
+         * External Reference.
+         */
+        private ServiceReference m_ref;
+        /**
+         * Internal Registration.
+         */
+        private ServiceRegistration m_reg;
+        /**
+         * Exposed Object.
+         */
+        private Object m_svcObject;
+    }
+
+    /**
+     * List of managed records.
+     */
+    private List/*<Record>*/m_records = new ArrayList()/* <Record> */;
+
+    /**
+     * Constructor.
+     * 
+     * @param specification : targetted specification
+     * @param filter : LDAP filter
+     * @param multiple : should the importer imports several services ?
+     * @param optional : is the import optional ?
+     * @param from : parent context
+     * @param to : internal context
+     * @param in : handler
+     */
+    public ServiceImporter(String specification, String filter, boolean multiple, boolean optional, BundleContext from, ServiceContext to,
+            ImportExportHandler in) {
+        this.m_destination = to;
+        this.m_origine = from;
+        try {
+            this.m_filter = from.createFilter(filter);
+        } catch (InvalidSyntaxException e) {
+            e.printStackTrace();
+            return;
+        }
+        this.m_aggregate = multiple;
+        this.m_specification = specification;
+        this.m_optional = optional;
+        this.m_handler = in;
+    }
+
+    /**
+     * Start method to begin the import.
+     */
+    public void start() {
+        try {
+            ServiceReference[] refs = m_origine.getServiceReferences(m_specification, null);
+            if (refs != null) {
+                for (int i = 0; i < refs.length; i++) {
+                    if (m_filter.match(refs[i])) {
+                        Record rec = new Record();
+                        rec.m_ref = refs[i];
+                        m_records.add(rec);
+                    }
+                }
+            }
+        } catch (InvalidSyntaxException e) {
+            e.printStackTrace();
+        }
+
+        // Publish available services
+        if (m_records.size() > 0) {
+            if (m_aggregate) {
+                for (int i = 0; i < m_records.size(); i++) {
+                    Record rec = (Record) m_records.get(i);
+                    rec.m_svcObject = m_origine.getService(rec.m_ref);
+                    rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
+                }
+            } else {
+                Record rec = (Record) m_records.get(0);
+                rec.m_svcObject = m_origine.getService(rec.m_ref);
+                rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
+            }
+        }
+
+        // Register service listener
+        try {
+            m_origine.addServiceListener(this, "(" + Constants.OBJECTCLASS + "=" + m_specification + ")");
+        } catch (InvalidSyntaxException e) {
+            e.printStackTrace();
+        }
+
+        m_isValid = isSatisfied();
+    }
+
+    /**
+     * Get the properties for the exposed service from the given reference.
+     * 
+     * @param ref : the reference.
+     * @return the property dictionary
+     */
+    private Dictionary getProps(ServiceReference ref) {
+        Properties prop = new Properties();
+        String[] keys = ref.getPropertyKeys();
+        for (int i = 0; i < keys.length; i++) {
+            prop.put(keys[i], ref.getProperty(keys[i]));
+        }
+        return prop;
+    }
+
+    /**
+     * Stop the management of the import.
+     */
+    public void stop() {
+
+        m_origine.removeServiceListener(this);
+
+        for (int i = 0; i < m_records.size(); i++) {
+            Record rec = (Record) m_records.get(i);
+            rec.m_svcObject = null;
+            if (rec.m_reg != null) {
+                rec.m_reg.unregister();
+                m_origine.ungetService(rec.m_ref);
+                rec.m_ref = null;
+            }
+        }
+
+        m_records.clear();
+
+    }
+
+    /**
+     * Check if the import is statisfied.
+     * @return true if the import is optional or at least one provider is imported
+     */
+    public boolean isSatisfied() {
+        return m_optional || m_records.size() > 0;
+    }
+
+    /**
+     * Get the record list using the given reference.
+     * 
+     * @param ref : the reference
+     * @return the list containing all record using the given reference
+     */
+    private List/* <Record> */getRecordsByRef(ServiceReference ref) {
+        List l = new ArrayList();
+        for (int i = 0; i < m_records.size(); i++) {
+            Record rec = (Record) m_records.get(i);
+            if (rec.m_ref == ref) {
+                l.add(rec);
+            }
+        }
+        return l;
+    }
+
+    /**
+     * Service Listener Implementation.
+     * @param ev : the service event
+     * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
+     */
+    public void serviceChanged(ServiceEvent ev) {
+        if (ev.getType() == ServiceEvent.REGISTERED) {
+            arrivalManagement(ev.getServiceReference());
+        }
+        if (ev.getType() == ServiceEvent.UNREGISTERING) {
+            departureManagement(ev.getServiceReference());
+        }
+
+        if (ev.getType() == ServiceEvent.MODIFIED) {
+            if (m_filter.match(ev.getServiceReference())) {
+                // Test if the ref is always matching with the filter
+                List l = getRecordsByRef(ev.getServiceReference());
+                if (l.size() > 0) { // The ref is already contained => update
+                                    // the properties
+                    for (int i = 0; i < l.size(); i++) { // Stop the implied
+                                                            // record
+                        Record rec = (Record) l.get(i);
+                        if (rec.m_reg != null) {
+                            rec.m_reg.setProperties(getProps(rec.m_ref));
+                        }
+                    }
+                } else { // it is a new mathcing service => add it
+                    arrivalManagement(ev.getServiceReference());
+                }
+            } else {
+                List l = getRecordsByRef(ev.getServiceReference());
+                if (l.size() > 0) { // The ref is already contained => the
+                                    // service does no more match
+                    departureManagement(ev.getServiceReference());
+                }
+            }
+        }
+    }
+
+    /**
+     * Manage the arrival of a consitent service.
+     * 
+     * @param ref : the arrival service reference
+     */
+    private void arrivalManagement(ServiceReference ref) {
+        // Check if the new service match
+        if (m_filter.match(ref)) {
+            // Add it to the record list
+            Record rec = new Record();
+            rec.m_ref = ref;
+            m_records.add(rec);
+            // Publishing ?
+            if (m_records.size() == 1 || m_aggregate) { // If the service is the
+                                                        // first one, or if it
+                                                        // is a multiple imports
+                rec.m_svcObject = m_origine.getService(rec.m_ref);
+                rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
+            }
+            // Compute the new state
+            if (!m_isValid && isSatisfied()) {
+                m_isValid = true;
+                m_handler.validating(this);
+            }
+        }
+    }
+
+    /**
+     * Manage the departure of a used reference.
+     * 
+     * @param ref : the leaving reference
+     */
+    private void departureManagement(ServiceReference ref) {
+        List l = getRecordsByRef(ref);
+        for (int i = 0; i < l.size(); i++) { // Stop the implied record
+            Record rec = (Record) l.get(i);
+            if (rec.m_reg != null) {
+                rec.m_svcObject = null;
+                rec.m_reg.unregister();
+                rec.m_reg = null;
+                m_origine.ungetService(rec.m_ref);
+            }
+        }
+        m_records.removeAll(l);
+
+        // Check the validity & if we need to reimport the service
+        if (m_records.size() > 0) {
+            // There is other available services
+            if (!m_aggregate) { // Import the next one
+                Record rec = (Record) m_records.get(0);
+                if (rec.m_svcObject == null) { // It is the first service who
+                                                // disappears - create the next
+                                                // one
+                    rec.m_svcObject = m_origine.getService(rec.m_ref);
+                    rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
+                }
+            }
+        } else {
+            if (!m_optional) {
+                m_isValid = false;
+                m_handler.invalidating(this);
+            }
+        }
+    }
+
+    public String getSpecification() {
+        return m_specification;
+    }
+
+    /**
+     * Build the list of imported service provider.
+     * @return the list of all imported services.
+     */
+    protected List getProviders() {
+        List l = new ArrayList();
+        for (int i = 0; i < m_records.size(); i++) {
+            l.add((((Record) m_records.get(i)).m_ref).getProperty(Constants.SERVICE_PID));
+        }
+        return l;
+
+    }
+
+    public String getFilter() {
+        return m_filterStr;
+    }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceInstantiatorDescription.java b/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceInstantiatorDescription.java
index 598faa3..883e508 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceInstantiatorDescription.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceInstantiatorDescription.java
@@ -25,49 +25,65 @@
 
 import org.apache.felix.ipojo.ComponentInstance;
 import org.apache.felix.ipojo.architecture.HandlerDescription;
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
 import org.osgi.framework.ServiceReference;
 
 /**
  * Description of the Service Instantiator Handler.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ServiceInstantiatorDescription extends HandlerDescription {
-	
-	/**
-	 * List of managed service instances.
-	 */
-	private List m_instances;
 
-	/**
-	 * Constructor.
-	 * @param arg0 : name of the handler
-	 * @param arg1 : validity of the handler
-	 * @param insts : list of service instance
-	 */
-	public ServiceInstantiatorDescription(String arg0, boolean arg1, List insts) {
-		super(arg0, arg1);
-		m_instances = insts;
-	}
-	
-	/**
-	 * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
-	 */
-	public String getHandlerInfo() {
-		String r = "";
-		for (int i = 0; i < m_instances.size(); i++) {
-			SvcInstance inst = (SvcInstance) m_instances.get(i);
-			HashMap map = inst.getUsedReferences();
-			Set keys = map.keySet();
-			Iterator it = keys.iterator();
-			while (it.hasNext()) {
-				ServiceReference ref = (ServiceReference) it.next();
-				Object o = map.get(ref);
-				if (o != null  && o instanceof ComponentInstance) {
-					r += "\t Specification " + inst.getSpecification() + " instantiated from " + ((ComponentInstance) o).getComponentDescription().getName() + " \n";
-				}
-			}
-		}
-		return r;
-	}
+    /**
+     * List of managed service instances.
+     */
+    private List m_instances;
+
+    /**
+     * Constructor.
+     * 
+     * @param arg0 : name of the handler
+     * @param arg1 : validity of the handler
+     * @param insts : list of service instance
+     */
+    public ServiceInstantiatorDescription(String arg0, boolean arg1, List insts) {
+        super(arg0, arg1);
+        m_instances = insts;
+    }
+
+    /**
+     * Build service instantiator handler description.
+     * @return the handler description
+     * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
+     */
+    public Element getHandlerInfo() {
+        Element services = super.getHandlerInfo();
+        for (int i = 0; i < m_instances.size(); i++) {
+            SvcInstance inst = (SvcInstance) m_instances.get(i);
+            Element service = new Element("Service", "");
+            service.addAttribute(new Attribute("Specification", inst.getSpecification()));
+            String state = "unresolved";
+            if (inst.isSatisfied()) {
+                state = "resolved";
+            }
+            service.addAttribute(new Attribute("State", state));
+            HashMap map = inst.getUsedReferences();
+            Set keys = map.keySet();
+            Iterator it = keys.iterator();
+            while (it.hasNext()) {
+                ServiceReference ref = (ServiceReference) it.next();
+                Object o = map.get(ref);
+                if (o != null) {
+                    Element fact = new Element("Factory", "");
+                    fact.addAttribute(new Attribute("Name", ((ComponentInstance) o).getComponentDescription().getName()));
+                    service.addElement(fact);
+                }
+            }
+            services.addElement(service);
+        }
+        return services;
+    }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceInstantiatorHandler.java b/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceInstantiatorHandler.java
index 1810c5f..d641cb0 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceInstantiatorHandler.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceInstantiatorHandler.java
@@ -30,129 +30,155 @@
 import org.apache.felix.ipojo.metadata.Element;
 
 /**
- * Service Instantiator Class.
- * This handler allows to instantiate service instance inside the composition.
+ * Service Instantiator Class. This handler allows to instantiate service
+ * instance inside the composition.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ServiceInstantiatorHandler extends CompositeHandler {
-	
-	/**
-	 * Composite Manager. 
-	 */
-	private CompositeManager m_manager;
-	
-	/**
-	 * Is the handler valid ?
-	 */
-	private boolean m_isValid = false;
-	
-	/**
-	 * List of instances to manage.
-	 */
-	private List/*<SvcInstance>*/ m_instances = new ArrayList();
 
-	/**
-	 * @see org.apache.felix.ipojo.CompositeHandler#configure(org.apache.felix.ipojo.CompositeManager, org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
-	 */
-	public void configure(CompositeManager im, Element metadata, Dictionary conf) {
-		m_manager = im;
-		Element[] services = metadata.getElements("service");
-		for (int i = 0; i < services.length; i++) {
-			String spec = services[i].getAttribute("specification");
-			String filter = "(objectClass=" + Factory.class.getName() + ")";
-			if (services[i].containsAttribute("filter")) { 
-				String classnamefilter = "(&(objectClass=" + Factory.class.getName() + ")(!(service.pid=" + m_manager.getInstanceName() + ")))";  // Cannot instantaite yourself
-		        filter = "";
-		        if (!services[i].getAttribute("filter").equals("")) {
-		            filter = "(&" + classnamefilter + services[i].getAttribute("filter") + ")";
-		        } else {
-		            filter = classnamefilter;
-		        }
-			}
-			Properties prop = new Properties();
-			for (int k = 0; k < services[i].getElements("property").length; k++) {
-				String key = services[i].getElements("property")[k].getAttribute("name");
-				String value = services[i].getElements("property")[k].getAttribute("value");
-				prop.put(key, value);
-			}
-			boolean agg = false;
-			if (services[i].containsAttribute("aggregate") && services[i].getAttribute("aggregate").equalsIgnoreCase("true")) { agg = true; }
-			boolean opt = false;
-			if (services[i].containsAttribute("optional") && services[i].getAttribute("optional").equalsIgnoreCase("true")) { opt = true; }
-			SvcInstance inst = new SvcInstance(this, spec, prop, agg, opt, filter);
-			m_instances.add(inst);
-		}
-		if (m_instances.size() > 0) {
-			m_manager.register(this);
-		}
-	}
+    /**
+     * Composite Manager.
+     */
+    private CompositeManager m_manager;
 
-	/**
-	 * @see org.apache.felix.ipojo.CompositeHandler#start()
-	 */
-	public void start() {
-		// Init
-		for (int i = 0; i < m_instances.size(); i++) {
-			SvcInstance inst = (SvcInstance) m_instances.get(i);
-			inst.start();
-		}
-		
-		m_isValid = isValid();
-	}
-	
-	/**
-	 * @see org.apache.felix.ipojo.CompositeHandler#isValid()
-	 */
-	public boolean isValid() {
-		for (int i = 0; i < m_instances.size(); i++) {
-			SvcInstance inst = (SvcInstance) m_instances.get(i);
-			if (!inst.isSatisfied()) {
-				return false;
-			}
-		}
-		return true;
-	}
+    /**
+     * Is the handler valid ?
+     */
+    private boolean m_isValid = false;
 
-	/**
-	 * @see org.apache.felix.ipojo.CompositeHandler#stop()
-	 */
-	public void stop() {
-		for (int i = 0; i < m_instances.size(); i++) {
-			SvcInstance inst = (SvcInstance) m_instances.get(i);
-			inst.stop();
-		}
-		m_instances.clear();
-	}
-	
-	/**
-	 * An service instance becomes valid.
-	 */
-	public void validate() {
-		if (!m_isValid) {
-			if (isValid()) { m_manager.checkInstanceState(); }
-			m_isValid = true;
-		}
-	}
-	
-	/**
-	 * A service instance becomes invalid.
-	 */
-	public void invalidate() {
-		if (m_isValid) {
-			if (!isValid()) { m_manager.checkInstanceState(); }
-			m_isValid = false;
-		}
-	}
-	
-	/**
-	 * @see org.apache.felix.ipojo.CompositeHandler#getDescription()
-	 */
-	public HandlerDescription getDescription() {
-		return new ServiceInstantiatorDescription(this.getClass().getName(), isValid(), m_instances);
-	}
-	
-	/**
-	 * @return the composite manager.
-	 */
-	protected CompositeManager getManager() { return m_manager; }
+    /**
+     * List of instances to manage.
+     */
+    private List/* <SvcInstance> */m_instances = new ArrayList();
+
+    /**
+     * Configure the handler.
+     * 
+     * @param im : the instance manager
+     * @param metadata : the metadata of the component
+     * @param conf : the instance configuration
+     * @see org.apache.felix.ipojo.CompositeHandler#configure(org.apache.felix.ipojo.CompositeManager,
+     * org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
+     */
+    public void configure(CompositeManager im, Element metadata, Dictionary conf) {
+        m_manager = im;
+        Element[] services = metadata.getElements("service");
+        for (int i = 0; i < services.length; i++) {
+            String spec = services[i].getAttribute("specification");
+            String filter = "(&(objectClass=" + Factory.class.getName() + ")(!(service.pid=" + m_manager.getComponentDescription().getName() + ")))"; // Cannot reinstantiate yourself
+            if (services[i].containsAttribute("filter")) {
+                String classnamefilter = "(&(objectClass=" + Factory.class.getName() + ")(!(service.pid=" + m_manager.getComponentDescription().getName() + ")))"; // Cannot reinstantiate yourself
+                filter = "";
+                if (!services[i].getAttribute("filter").equals("")) {
+                    filter = "(&" + classnamefilter + services[i].getAttribute("filter") + ")";
+                } else {
+                    filter = classnamefilter;
+                }
+            }
+            Properties prop = new Properties();
+            for (int k = 0; k < services[i].getElements("property").length; k++) {
+                String key = services[i].getElements("property")[k].getAttribute("name");
+                String value = services[i].getElements("property")[k].getAttribute("value");
+                prop.put(key, value);
+            }
+            boolean agg = false;
+            if (services[i].containsAttribute("aggregate") && services[i].getAttribute("aggregate").equalsIgnoreCase("true")) {
+                agg = true;
+            }
+            boolean opt = false;
+            if (services[i].containsAttribute("optional") && services[i].getAttribute("optional").equalsIgnoreCase("true")) {
+                opt = true;
+            }
+            SvcInstance inst = new SvcInstance(this, spec, prop, agg, opt, filter);
+            m_instances.add(inst);
+        }
+        if (m_instances.size() > 0) {
+            m_manager.register(this);
+        }
+    }
+
+    /**
+     * Start the service instantiator handler.
+     * Start all created service instance.
+     * @see org.apache.felix.ipojo.CompositeHandler#start()
+     */
+    public void start() {
+        // Init
+        for (int i = 0; i < m_instances.size(); i++) {
+            SvcInstance inst = (SvcInstance) m_instances.get(i);
+            inst.start();
+        }
+
+        m_isValid = isValid();
+    }
+
+    /**
+     * Check the handler validity.
+     * @return true if oall created service isntance are valid
+     * @see org.apache.felix.ipojo.CompositeHandler#isValid()
+     */
+    public boolean isValid() {
+        for (int i = 0; i < m_instances.size(); i++) {
+            SvcInstance inst = (SvcInstance) m_instances.get(i);
+            if (!inst.isSatisfied()) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Handler stop method.
+     * Stop all created service instance.
+     * @see org.apache.felix.ipojo.CompositeHandler#stop()
+     */
+    public void stop() {
+        for (int i = 0; i < m_instances.size(); i++) {
+            SvcInstance inst = (SvcInstance) m_instances.get(i);
+            inst.stop();
+        }
+        m_instances.clear();
+    }
+
+    /**
+     * An service instance becomes valid.
+     */
+    public void validate() {
+        if (!m_isValid) {
+            if (isValid()) {
+                m_manager.checkInstanceState();
+            }
+            m_isValid = true;
+        }
+    }
+
+    /**
+     * A service instance becomes invalid.
+     */
+    public void invalidate() {
+        if (m_isValid) {
+            if (!isValid()) {
+                m_manager.checkInstanceState();
+            }
+            m_isValid = false;
+        }
+    }
+
+    /**
+     * Get the service instantiator handler description.
+     * @return the description
+     * @see org.apache.felix.ipojo.CompositeHandler#getDescription()
+     */
+    public HandlerDescription getDescription() {
+        return new ServiceInstantiatorDescription(this.getClass().getName(), isValid(), m_instances);
+    }
+
+    /**
+     * Get the composite manager.
+     * @return the composite manager.
+     */
+    protected CompositeManager getManager() {
+        return m_manager;
+    }
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/SvcInstance.java b/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/SvcInstance.java
index 848d73f..b73f2e9 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/SvcInstance.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/SvcInstance.java
@@ -22,6 +22,7 @@
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.Properties;
 import java.util.Set;
 
 import org.apache.felix.ipojo.ComponentInstance;
@@ -29,319 +30,391 @@
 import org.apache.felix.ipojo.ServiceContext;
 import org.apache.felix.ipojo.UnacceptableConfiguration;
 import org.apache.felix.ipojo.architecture.PropertyDescription;
+import org.apache.felix.ipojo.util.Logger;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceEvent;
 import org.osgi.framework.ServiceListener;
 import org.osgi.framework.ServiceReference;
 
 /**
- * Manage a service instantiation.
- * This service create componenet instance providing the required service specification.
+ * Manage a service instantiation. This service create componenet instance
+ * providing the required service specification.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class SvcInstance implements ServiceListener {
-	
-	/**
-	 * Required specification.
-	 */
-	private String m_specification;
-	
-	/**
-	 * Configuration to push to the instance. 
-	 */
-	private Dictionary m_configuration;
-	
-	/**
-	 * Map of factory references => instance or NO_INSTANCE.
-	 */
-	private HashMap /*ServiceReference*/ m_usedRef = new HashMap();
-	
-	/**
-	 * Does we instantiate several provider ?
-	 */
-	private boolean m_isAggregate = false;
-	
-	/**
-	 * Is the service optional ? 
-	 */
-	private boolean m_isOptional = false;
-	
-	/**
-	 * Handler creating the service instance.
-	 */
-	private ServiceInstantiatorHandler m_handler;
-	
-	/**
-	 * Service Context (internal scope).
-	 */
-	private ServiceContext m_context;
-	
-	/**
-	 * Parent context.
-	 */
-	//private BundleContext m_parent;
-	
-	/**
-	 * True if the service instantiation is valid.
-	 */
-	private boolean m_isValid = false;
-	
-	/**
-	 * String form of the factory filter.
-	 */
-	private String m_filterStr;
-	
-	/**
-	 * Name of the last create instance.
-	 */
-	private long m_index = 0;
-	
-	/**
-	 * Constructor.
-	 * @param h : the handler.
-	 * @param spec : required specification.
-	 * @param conf : instance configuration.
-	 * @param isAgg : is the svc instance an aggregate service ?
-	 * @param isOpt : is the svc instance optional ?
-	 */
-	public SvcInstance(ServiceInstantiatorHandler h, String spec, Dictionary conf, boolean isAgg, boolean isOpt, String filt) {
-		m_handler = h;
-		m_context = h.getManager().getServiceContext();
-		//m_parent = h.getManager().getContext();
-		m_specification = spec;
-		m_configuration = conf;
-		m_isAggregate = isAgg;
-		m_isOptional = isOpt;
-		m_filterStr = filt;
-	}
-	
-	/**
-	 * Start the service instance.
-	 * @param sc
-	 */
-	public void start() {
-		initFactoryList();
-		// Register factory listener
-		try {
-			m_context.addServiceListener(this, m_filterStr);
-		} catch (InvalidSyntaxException e) { 
-			e.printStackTrace(); // Should not happens
-		}
 
-		// Init the instances 
-		if (m_usedRef.size() > 0) {
-			Set keys = m_usedRef.keySet();
-			Iterator it = keys.iterator();
-			if (m_isAggregate) {
-				while (it.hasNext()) {
-					ServiceReference ref = (ServiceReference) it.next();
-					createInstance(ref);
-				}
-			} else {
-				ServiceReference ref = (ServiceReference) it.next();
-				createInstance(ref);
-			}
-		}
-		m_isValid = isSatisfied();
-	}
-	
-	/**
-	 * Stop the service instance.
-	 */
-	public void stop() {
-		m_context.removeServiceListener(this);
-		Set keys = m_usedRef.keySet();
-		Iterator it = keys.iterator();
-		while (it.hasNext()) {
-			ServiceReference ref = (ServiceReference) it.next();
-			Object o = m_usedRef.get(ref);
-			if (o != null) {
-				((ComponentInstance) o).stop();
-			}
-		}
-		m_usedRef.clear();
-		m_isValid = false;
-	}
-	
-	/**
-	 * @return true if at least one instance is created.
-	 */
-	private boolean isAnInstanceCreated() {
-		Set keys = m_usedRef.keySet();
-		Iterator it = keys.iterator();
-		ServiceReference ref = (ServiceReference) it.next();
-		Object o = m_usedRef.get(ref);
-		return o != null;
-	}
-	
-	/**
-	 * Create an instance for the given reference.
-	 */
-	private void createInstance(ServiceReference ref) {
-		try {
-			Factory factory = (Factory) m_context.getService(ref);
-			ComponentInstance instance = factory.createComponentInstance(m_configuration);
-			m_usedRef.put(ref, instance);
-			m_context.ungetService(ref);
-		} catch (UnacceptableConfiguration e) {
-			System.err.println("A matching factory (" + ref.getProperty("service.pid") + ") seems to refuse the given configuration : " + e.getMessage());
-		}
-	}
-	
-	/**
-	 * Create an instance for the next available factory.
-	 */
-	private void createNextInstance() {
-		Set keys = m_usedRef.keySet();
-		Iterator it = keys.iterator();
-		ServiceReference ref = (ServiceReference) it.next();
-		try {
-			Factory factory = (Factory) m_context.getService(ref);
-			ComponentInstance instance = factory.createComponentInstance(m_configuration);
-			m_usedRef.put(ref, instance);
-			m_context.ungetService(ref);
-		} catch (UnacceptableConfiguration e) {
-			System.err.println("A matching factory seems to refuse the given configuration : " + e.getMessage());
-		}
-	}
-	
-	/**
-	 * Kill an instance (if exist).
-	 */
-	private void stopInstance(ServiceReference ref) {
-		Object o = m_usedRef.get(ref);
-		if (o != null) {
-			((ComponentInstance) o).stop();
-		}
-	}
+    /**
+     * Required specification.
+     */
+    private String m_specification;
 
+    /**
+     * Configuration to push to the instance.
+     */
+    private Dictionary m_configuration;
 
-	/**
-	 * Init the list of available factory.
-	 */
-	public void initFactoryList() {
-		// Init factory list
-		try {
-			ServiceReference[] refs = m_context.getServiceReferences(Factory.class.getName(), m_filterStr);
-			if (refs == null) { return; }
-			for (int i = 0; i < refs.length; i++) {
-				ServiceReference ref = refs[i];
-				Factory fact = (Factory) m_context.getService(ref);
-				// Check provided spec & conf
-				if (match(fact)) {
-					m_usedRef.put(ref, null);
-				}
-				fact = null;
-				m_context.ungetService(ref);
-			}
-		} catch (InvalidSyntaxException e) {
-			e.printStackTrace(); // Should not happen
-		}
-	}
-	
-	/**
-	 * @return true if the service instance if satisfied.
-	 */
-	public boolean isSatisfied() {
-		return m_isOptional || m_usedRef.size() > 0;
-	}
-	
-	/**
-	 * Does the service instance match with the given factory.
-	 * @param fact : the factory to test.
-	 * @return true if the factory match, false otherwise.
-	 */
-	private boolean match(Factory fact) {
-		// Check if the factory can provide the spec
-		for (int i = 0; i < fact.getComponentDescription().getprovidedServiceSpecification().length; i++) {
-			if (fact.getComponentDescription().getprovidedServiceSpecification()[i].equals(m_specification)) {
-				
-				// Check that the factory needs every properties contained in the configuration
-				Enumeration e = m_configuration.keys();
-				while (e.hasMoreElements()) {
-					String k = (String) e.nextElement();
-					if (!containsProperty(k, fact)) {
-						return false;
-					}
-				}
-				
-				// Add an unique name if not specified.
-				if (m_configuration.get("name") == null) {
-					m_configuration.put("name", this.toString() + "-" + m_index);
-					m_index++;
-				}
-				
-				// Check the acceptability.
-				return (fact.isAcceptable(m_configuration));
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Does the factory support the given property ?
-	 * @param name : name of the property
-	 * @param factory : factory to test
-	 * @return true if the factory support this property
-	 */
-	private boolean containsProperty(String name, Factory factory) {
-		PropertyDescription[] props = factory.getComponentDescription().getProperties();
-		for (int i = 0; i < props.length; i++) {
-			if (props[i].getName().equalsIgnoreCase(name)) { return true; }
-		}
-		if (name.equalsIgnoreCase("name")) { return true; } // Skip the name property
-		return false;
-	}
+    /**
+     * Map of factory references => instance or NO_INSTANCE.
+     */
+    private HashMap /* ServiceReference */m_usedRef = new HashMap();
 
-	/**
-	 * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
-	 */
-	public void serviceChanged(ServiceEvent ev) {
-		if (ev.getType() == ServiceEvent.REGISTERED) {
-			// Check the matching
-			Factory fact = (Factory) m_context.getService(ev.getServiceReference());
-			if (match(fact)) {
-				m_usedRef.put(ev.getServiceReference(), null);
-				if (m_isAggregate) { // Create an instance for the new factory
-					createInstance(ev.getServiceReference());
-					if (!m_isValid) { m_isValid = true; m_handler.validate(); }
-				} else { 
-					if (!isAnInstanceCreated()) { createInstance(ev.getServiceReference()); }
-					if (!m_isValid) { m_isValid = true; m_handler.validate(); }
-				}
-			}
-			fact = null;
-			m_context.ungetService(ev.getServiceReference());
-			return;
-		}
-		if (ev.getType() == ServiceEvent.UNREGISTERING) {
-			// Remove the ref is contained
-			Object o = m_usedRef.remove(ev.getServiceReference());
-			if (o != null) { 
-				stopInstance(ev.getServiceReference());
-				if (m_usedRef.size() > 0) {
-					if (!m_isAggregate) {
-						createNextInstance(); // Create an instance with another factory
-					} 
-				} else { // No more candidate
-					if (!m_isOptional) { m_isValid = false; m_handler.invalidate(); }
-				}
-			}
-		}
-	}
+    /**
+     * Does we instantiate several provider ?
+     */
+    private boolean m_isAggregate = false;
 
-	/**
-	 * @return the required specification.
-	 */
-	public String getSpecification() {
-		return m_specification;
-	}
-	
-	/**
-	 * @return the map of used references.
-	 */
-	protected HashMap getUsedReferences() { 
-		return m_usedRef;
-	}
+    /**
+     * Is the service optional ?
+     */
+    private boolean m_isOptional = false;
+
+    /**
+     * Handler creating the service instance.
+     */
+    private ServiceInstantiatorHandler m_handler;
+
+    /**
+     * Service Context (internal scope).
+     */
+    private ServiceContext m_context;
+
+    /**
+     * True if the service instantiation is valid.
+     */
+    private boolean m_isValid = false;
+
+    /**
+     * String form of the factory filter.
+     */
+    private String m_filterStr;
+
+    /**
+     * Name of the last create instance.
+     */
+    private static Long m_index = new Long(0);
+
+    /**
+     * Constructor.
+     * 
+     * @param h : the handler.
+     * @param spec : required specification.
+     * @param conf : instance configuration.
+     * @param isAgg : is the svc instance an aggregate service ?
+     * @param isOpt : is the svc instance optional ?
+     * @param filt : LDAP filter
+     */
+    public SvcInstance(ServiceInstantiatorHandler h, String spec, Dictionary conf, boolean isAgg, boolean isOpt, String filt) {
+        m_handler = h;
+        m_context = h.getManager().getServiceContext();
+        m_specification = spec;
+        m_configuration = conf;
+        m_isAggregate = isAgg;
+        m_isOptional = isOpt;
+        m_filterStr = filt;
+    }
+
+    /**
+     * Start the service instance.
+     * 
+     * @param sc
+     */
+    public void start() {
+        initFactoryList();
+        // Register factory listener
+        try {
+            m_context.addServiceListener(this, m_filterStr);
+        } catch (InvalidSyntaxException e) {
+            e.printStackTrace(); // Should not happens
+        }
+
+        // Init the instances
+        if (m_usedRef.size() > 0) {
+            Set keys = m_usedRef.keySet();
+            Iterator it = keys.iterator();
+            if (m_isAggregate) {
+                while (it.hasNext()) {
+                    ServiceReference ref = (ServiceReference) it.next();
+                    createInstance(ref);
+                }
+            } else {
+                ServiceReference ref = (ServiceReference) it.next();
+                createInstance(ref);
+            }
+        }
+        m_isValid = isSatisfied();
+    }
+
+    /**
+     * Stop the service instance.
+     */
+    public void stop() {
+        m_context.removeServiceListener(this);
+        Set keys = m_usedRef.keySet();
+        Iterator it = keys.iterator();
+        while (it.hasNext()) {
+            ServiceReference ref = (ServiceReference) it.next();
+            Object o = m_usedRef.get(ref);
+            if (o != null) {
+                ((ComponentInstance) o).dispose();
+            }
+        }
+        m_usedRef.clear();
+        m_isValid = false;
+    }
+
+    /**
+     * Check if an instance is already created.
+     * @return true if at least one instance is created.
+     */
+    private boolean isAnInstanceCreated() {
+        Set keys = m_usedRef.keySet();
+        Iterator it = keys.iterator();
+        ServiceReference ref = (ServiceReference) it.next();
+        Object o = m_usedRef.get(ref);
+        return o != null;
+    }
+
+    /**
+     * Create an instance for the given reference.
+     * @param ref : the service reference to used to create the instance.
+     */
+    private void createInstance(ServiceReference ref) {
+        try {
+            Factory factory = (Factory) m_context.getService(ref);
+            
+            //  Add an unique name if not specified.
+            Properties p = new Properties();
+            Enumeration kk = m_configuration.keys();
+            while (kk.hasMoreElements()) {
+                String k = (String) kk.nextElement();
+                p.put(k, m_configuration.get(k));
+            }
+            
+            if (p.get("name") == null) {
+                synchronized (m_index) {
+                    p.put("name", this.toString() + "-" + m_index.longValue());
+                    m_index = new Long(m_index.longValue() + 1);
+                }
+            }
+            
+            ComponentInstance instance = factory.createComponentInstance(p);
+            m_usedRef.put(ref, instance);
+            m_context.ungetService(ref);
+        } catch (UnacceptableConfiguration e) {
+            m_handler.getManager().getFactory().getLogger().log(Logger.ERROR,
+                    "A matching factory (" + ref.getProperty("service.pid") + ") seems to refuse the given configuration : " + e.getMessage());
+        }
+    }
+
+    /**
+     * Create an instance for the next available factory.
+     */
+    private void createNextInstance() {
+        Set keys = m_usedRef.keySet();
+        Iterator it = keys.iterator();
+        ServiceReference ref = (ServiceReference) it.next();
+        try {
+            Factory factory = (Factory) m_context.getService(ref);
+
+            // Add an unique name if not specified.
+            Properties p = new Properties();
+            Enumeration kk = m_configuration.keys();
+            while (kk.hasMoreElements()) {
+                String k = (String) kk.nextElement();
+                p.put(k, m_configuration.get(k));
+            }
+            
+            if (p.get("name") == null) {
+                synchronized (m_index) {
+                    p.put("name", this.toString() + "-" + m_index.longValue());
+                    m_index = new Long(m_index.longValue() + 1);
+                }
+            }
+            
+            ComponentInstance instance = factory.createComponentInstance(p);
+            m_usedRef.put(ref, instance);
+            m_context.ungetService(ref);
+        } catch (UnacceptableConfiguration e) {
+            m_handler.getManager().getFactory().getLogger().log(Logger.ERROR,
+                    "A matching factory (" + ref.getProperty("service.pid") + ") seems to refuse the given configuration : " + e.getMessage());
+        }
+    }
+
+    /**
+     * Kill an instance (if exist).
+     * If an instance if created by using the given reference, this reference is disposed.
+     * @param ref : the leaving reference. 
+     */
+    private void stopInstance(ServiceReference ref) {
+        Object o = m_usedRef.get(ref);
+        if (o != null) {
+            ((ComponentInstance) o).dispose();
+        }
+    }
+
+    /**
+     * Init the list of available factory.
+     */
+    public void initFactoryList() {
+        // Init factory list
+        try {
+            ServiceReference[] refs = m_context.getServiceReferences(Factory.class.getName(), m_filterStr);
+            if (refs == null) {
+                return;
+            }
+            for (int i = 0; i < refs.length; i++) {
+                ServiceReference ref = refs[i];
+                Factory fact = (Factory) m_context.getService(ref);
+                // Check provided spec & conf
+                if (match(fact)) {
+                    m_usedRef.put(ref, null);
+                }
+                fact = null;
+                m_context.ungetService(ref);
+            }
+        } catch (InvalidSyntaxException e) {
+            e.printStackTrace(); // Should not happen
+        }
+    }
+
+    /**
+     * Check if the service isntance is statisfed.
+     * @return true if the service instance if satisfied.
+     */
+    public boolean isSatisfied() {
+        return m_isOptional || m_usedRef.size() > 0;
+    }
+
+    /**
+     * Does the service instance match with the given factory.
+     * 
+     * @param fact : the factory to test.
+     * @return true if the factory match, false otherwise.
+     */
+    private boolean match(Factory fact) {
+        // Check if the factory can provide the spec
+        for (int i = 0; i < fact.getComponentDescription().getprovidedServiceSpecification().length; i++) {
+            if (fact.getComponentDescription().getprovidedServiceSpecification()[i].equals(m_specification)) {
+
+                // Check that the factory needs every properties contained in
+                // the configuration
+                Enumeration e = m_configuration.keys();
+                while (e.hasMoreElements()) {
+                    String k = (String) e.nextElement();
+                    if (!containsProperty(k, fact)) {
+                        return false;
+                    }
+                }
+
+                // Add an unique name if not specified.
+                Properties p = new Properties();
+                Enumeration keys = m_configuration.keys();
+                while (keys.hasMoreElements()) {
+                    String k = (String) keys.nextElement();
+                    p.put(k, m_configuration.get(k));
+                }
+                
+                if (p.get("name") == null) {
+                    synchronized (m_index) {
+                        p.put("name", this.toString() + "-" + m_index.longValue());
+                        m_index = new Long(m_index.longValue() + 1);
+                    }
+                }
+
+                // Check the acceptability.
+                return fact.isAcceptable(p);
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Does the factory support the given property ?
+     * 
+     * @param name : name of the property
+     * @param factory : factory to test
+     * @return true if the factory support this property
+     */
+    private boolean containsProperty(String name, Factory factory) {
+        PropertyDescription[] props = factory.getComponentDescription().getProperties();
+        for (int i = 0; i < props.length; i++) {
+            if (props[i].getName().equalsIgnoreCase(name)) {
+                return true;
+            }
+        }
+        if (name.equalsIgnoreCase("name")) {
+            return true;
+        } // Skip the name property
+        return false;
+    }
+
+    /**
+     * Service Listener Implementation.
+     * @param ev : the service event
+     * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
+     */
+    public void serviceChanged(ServiceEvent ev) {
+        if (ev.getType() == ServiceEvent.REGISTERED) {
+            // Check the matching
+            Factory fact = (Factory) m_context.getService(ev.getServiceReference());
+            if (match(fact)) {
+                m_usedRef.put(ev.getServiceReference(), null);
+                if (m_isAggregate) { // Create an instance for the new
+                    // factory
+                    createInstance(ev.getServiceReference());
+                    if (!m_isValid) {
+                        m_isValid = true;
+                        m_handler.validate();
+                    }
+                } else {
+                    if (!isAnInstanceCreated()) {
+                        createInstance(ev.getServiceReference());
+                    }
+                    if (!m_isValid) {
+                        m_isValid = true;
+                        m_handler.validate();
+                    }
+                }
+            }
+            fact = null;
+            m_context.ungetService(ev.getServiceReference());
+            return;
+        }
+        if (ev.getType() == ServiceEvent.UNREGISTERING) {
+            // Remove the ref is contained
+            Object o = m_usedRef.remove(ev.getServiceReference());
+            if (o != null) {
+                stopInstance(ev.getServiceReference());
+                if (m_usedRef.size() > 0) {
+                    if (!m_isAggregate) {
+                        createNextInstance(); // Create an instance with
+                        // another factory
+                    }
+                } else { // No more candidate
+                    if (!m_isOptional) {
+                        m_isValid = false;
+                        m_handler.invalidate();
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Get the required specification.
+     * @return the required specification.
+     */
+    public String getSpecification() {
+        return m_specification;
+    }
+
+    /**
+     * Get the map of used references [ref, component instance].
+     * @return the map of used references.
+     */
+    protected HashMap getUsedReferences() {
+        return m_usedRef;
+    }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/architecture/ArchitectureHandler.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/architecture/ArchitectureHandler.java
index 684d258..f85a83d 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/architecture/ArchitectureHandler.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/architecture/ArchitectureHandler.java
@@ -32,6 +32,7 @@
 
 /**
  * Achtiecture Handler : do reflection on your component.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ArchitectureHandler extends Handler implements Architecture {
@@ -42,7 +43,8 @@
     private InstanceManager m_manager;
 
     /**
-     * Service Registration of the Architecture service provided by this handler.
+     * Service Registration of the Architecture service provided by this
+     * handler.
      */
     private ServiceRegistration m_sr;
 
@@ -52,12 +54,20 @@
     private String m_name;
 
     /**
-     * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.InstanceManager, org.apache.felix.ipojo.metadata.Element)
+     * Configure the handler.
+     * 
+     * @param im : the instance manager
+     * @param metadata : the metadata of the component
+     * @param configuration : the instance configuration
+     * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.InstanceManager,
+     * org.apache.felix.ipojo.metadata.Element)
      */
     public void configure(InstanceManager im, Element metadata, Dictionary configuration) {
         if (metadata.containsAttribute("architecture")) {
             String isArchitectureEnabled = (metadata.getAttribute("architecture")).toLowerCase();
-            if (isArchitectureEnabled.equalsIgnoreCase("true")) { im.register(this); }
+            if (isArchitectureEnabled.equalsIgnoreCase("true")) {
+                im.register(this);
+            }
         }
 
         m_name = (String) configuration.get("name");
@@ -66,20 +76,27 @@
     }
 
     /**
+     * Stop method.
+     * Unregister the service if published.
      * @see org.apache.felix.ipojo.Handler#stop()
      */
     public void stop() {
-        try {
-            if (m_sr != null) { m_sr.unregister(); m_sr = null; }
-        } catch (Exception e) { return; }
+        if (m_sr != null) {
+            m_sr.unregister();
+            m_sr = null;
+        }
     }
 
     /**
+     * Start method.
+     * Register the service.
      * @see org.apache.felix.ipojo.Handler#start()
      */
     public void start() {
         // Unregister the service if already registred
-        if (m_sr != null) { m_sr.unregister(); }
+        if (m_sr != null) {
+            m_sr.unregister();
+        }
 
         // Register the ManagedService
         BundleContext bc = m_manager.getContext();
@@ -92,6 +109,8 @@
     }
 
     /**
+     * Get the instance description.
+     * @return the instance description
      * @see org.apache.felix.ipojo.architecture.Architecture#getComponentDescription()
      */
     public InstanceDescription getInstanceDescription() {
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurableProperty.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurableProperty.java
index 68fc08f..5a184b4 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurableProperty.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurableProperty.java
@@ -23,9 +23,11 @@
 import java.lang.reflect.InvocationTargetException;
 
 import org.apache.felix.ipojo.parser.ParseUtils;
+import org.apache.felix.ipojo.util.Logger;
 
 /**
  * Configurable Property.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ConfigurableProperty {
@@ -52,38 +54,61 @@
 
     /**
      * Configurable Property Constructor.
+     * 
      * @param name : name of the property (optional)
      * @param field : name of the field (mandatory)
      * @param value : initial value of the property (optional)
+     * @param type : the type of the property
      * @param ch : configuration handler managing this configurable property
      */
     public ConfigurableProperty(String name, String field, String value, String type, ConfigurationHandler ch) {
         m_handler = ch;
-        if (name != null) { 
-        	m_name = name; 
-        } else { 
-        	m_name = field; 
+        if (name != null) {
+            m_name = name;
+        } else {
+            m_name = field;
         }
         m_field = field;
-        if (value != null) { setValue(m_field, value, type); }
+        if (value != null) {
+            setValue(m_field, value, type);
+        }
 
     }
 
     /**
      * Set the value of the property.
+     * 
+     * @param field : name of the field attached to the property
      * @param strValue : value of the property (String)
+     * @param type : type of the property
      */
     private void setValue(String field, String strValue, String type) {
         Object value = null;
 
-        if (type.equals("string") || type.equals("String")) { value = new String(strValue); }
-        if (type.equals("boolean")) { value = new Boolean(strValue); }
-        if (type.equals("byte")) { value = new Byte(strValue); }
-        if (type.equals("short")) { value = new Short(strValue); }
-        if (type.equals("int")) { value = new Integer(strValue); }
-        if (type.equals("long")) { value = new Long(strValue); }
-        if (type.equals("float")) { value = new Float(strValue); }
-        if (type.equals("double")) { value = new Double(strValue); }
+        if (type.equals("string") || type.equals("String")) {
+            value = new String(strValue);
+        }
+        if (type.equals("boolean")) {
+            value = new Boolean(strValue);
+        }
+        if (type.equals("byte")) {
+            value = new Byte(strValue);
+        }
+        if (type.equals("short")) {
+            value = new Short(strValue);
+        }
+        if (type.equals("int")) {
+            value = new Integer(strValue);
+        }
+        if (type.equals("long")) {
+            value = new Long(strValue);
+        }
+        if (type.equals("float")) {
+            value = new Float(strValue);
+        }
+        if (type.equals("double")) {
+            value = new Double(strValue);
+        }
         // Array :
         if (type.endsWith("[]")) {
             String internalType = type.substring(0, type.length() - 2);
@@ -92,35 +117,34 @@
         }
 
         if (value == null) {
-            // Else it is a neither a primitive type neither a String -> create the object by calling a constructor with a string in argument.
+            // Else it is a neither a primitive type neither a String -> create
+            // the object by calling a constructor with a string in argument.
             try {
                 Class c = m_handler.getInstanceManager().getContext().getBundle().loadClass(type);
-                Constructor cst = c.getConstructor(new Class[] {String.class});
-                value = cst.newInstance(new Object[] {strValue});
+                Constructor cst = c.getConstructor(new Class[] { String.class });
+                value = cst.newInstance(new Object[] { strValue });
             } catch (ClassNotFoundException e) {
-                System.err.println("Class not found exception in setValue on " + type);
-                e.printStackTrace();
+                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                        "Class not found exception in setValue on " + type + " : " + e.getMessage());
                 return;
             } catch (SecurityException e) {
-                e.printStackTrace();
+                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Security excption in setValue on " + type + " : " + e.getMessage());
                 return;
             } catch (NoSuchMethodException e) {
-                System.err.println("Constructor not found exeption in setValue on " + type);
-                e.printStackTrace();
+                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                        "Constructor not found exeption in setValue on " + type + " : " + e.getMessage());
                 return;
             } catch (IllegalArgumentException e) {
-                System.err.println("Argument problem to call the constructor of the type " + type);
-                e.printStackTrace();
+                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Argument problem to call the constructor of the type " + type);
                 return;
             } catch (InstantiationException e) {
-                System.err.println("Instantiation problem  " + type);
-                e.printStackTrace();
+                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Instantiation problem  " + type);
                 return;
             } catch (IllegalAccessException e) {
-                e.printStackTrace();
+                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Illegal Access " + type);
+                return;
             } catch (InvocationTargetException e) {
-                System.err.println("Invocation problem " + type);
-                e.printStackTrace();
+                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Invocation problem " + type);
                 return;
             }
         }
@@ -131,109 +155,123 @@
 
     /**
      * Set array value to the current property.
+     * 
      * @param internalType : type of the property
      * @param values : new property value
      */
     private void setArrayValue(String internalType, String[] values) {
-        if (internalType.equals("string") || internalType.equals("String")) { 
-        	String[] str = new String[values.length];
-        	for (int i = 0; i < values.length; i++) { str[i] = new String(values[i]); }
-        	m_value = str;
-        	return;
+        if (internalType.equals("string") || internalType.equals("String")) {
+            String[] str = new String[values.length];
+            for (int i = 0; i < values.length; i++) {
+                str[i] = new String(values[i]);
+            }
+            m_value = str;
+            return;
         }
         if (internalType.equals("boolean")) {
             boolean[] bool = new boolean[values.length];
-            for (int i = 0; i < values.length; i++) { bool[i] = new Boolean(values[i]).booleanValue(); }
+            for (int i = 0; i < values.length; i++) {
+                bool[i] = new Boolean(values[i]).booleanValue();
+            }
             m_value = bool;
             return;
         }
         if (internalType.equals("byte")) {
             byte[] byt = new byte[values.length];
-            for (int i = 0; i < values.length; i++) { byt[i] = new Byte(values[i]).byteValue(); }
+            for (int i = 0; i < values.length; i++) {
+                byt[i] = new Byte(values[i]).byteValue();
+            }
             m_value = byt;
             return;
         }
         if (internalType.equals("short")) {
             short[] shor = new short[values.length];
-            for (int i = 0; i < values.length; i++) { shor[i] = new Short(values[i]).shortValue(); }
+            for (int i = 0; i < values.length; i++) {
+                shor[i] = new Short(values[i]).shortValue();
+            }
             m_value = shor;
             return;
         }
         if (internalType.equals("int")) {
             int[] in = new int[values.length];
-            for (int i = 0; i < values.length; i++) { in[i] = new Integer(values[i]).intValue(); }
+            for (int i = 0; i < values.length; i++) {
+                in[i] = new Integer(values[i]).intValue();
+            }
             m_value = in;
             return;
         }
         if (internalType.equals("long")) {
             long[] ll = new long[values.length];
-            for (int i = 0; i < values.length; i++) { ll[i] = new Long(values[i]).longValue(); }
+            for (int i = 0; i < values.length; i++) {
+                ll[i] = new Long(values[i]).longValue();
+            }
             m_value = ll;
             return;
         }
         if (internalType.equals("float")) {
             float[] fl = new float[values.length];
-            for (int i = 0; i < values.length; i++) { fl[i] = new Float(values[i]).floatValue(); }
+            for (int i = 0; i < values.length; i++) {
+                fl[i] = new Float(values[i]).floatValue();
+            }
             m_value = fl;
-            return; 
+            return;
         }
         if (internalType.equals("double")) {
             double[] dl = new double[values.length];
-            for (int i = 0; i < values.length; i++) { dl[i] = new Double(values[i]).doubleValue(); }
+            for (int i = 0; i < values.length; i++) {
+                dl[i] = new Double(values[i]).doubleValue();
+            }
             m_value = dl;
             return;
         }
 
-        // Else it is a neither a primitive type neither a String -> create the object by calling a constructor with a string in argument.
+        // Else it is a neither a primitive type neither a String -> create the
+        // object by calling a constructor with a string in argument.
         try {
             Class c = m_handler.getInstanceManager().getContext().getBundle().loadClass(internalType);
-            Constructor cst = c.getConstructor(new Class[] {String.class});
+            Constructor cst = c.getConstructor(new Class[] { String.class });
             Object[] ob = (Object[]) Array.newInstance(c, values.length);
             for (int i = 0; i < values.length; i++) {
-                ob[i] = cst.newInstance(new Object[] {values[i].trim()});
+                ob[i] = cst.newInstance(new Object[] { values[i].trim() });
             }
             m_value = ob;
             return;
         } catch (ClassNotFoundException e) {
-            System.err.println("Class not found exception in setValue on " + internalType);
-            e.printStackTrace();
+            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Class not found exception in setValue on " + internalType);
         } catch (SecurityException e) {
-            e.printStackTrace();
+            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Secutiry Exception in setValue on " + internalType);
         } catch (NoSuchMethodException e) {
-            System.err.println("Constructor not found exeption in setValue on " + internalType);
-            e.printStackTrace();
+            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Constructor not found exception in setValue on " + internalType);
         } catch (IllegalArgumentException e) {
-            System.err.println("Argument problem to call the constructor of the type " + internalType);
-            e.printStackTrace();
+            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Argument problem to call the constructor of the type " + internalType);
         } catch (InstantiationException e) {
-            System.err.println("Instantiation problem  " + internalType);
-            e.printStackTrace();
+            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Instantiation problem  " + internalType);
         } catch (IllegalAccessException e) {
-            e.printStackTrace();
+            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Illegal Access Exception in  " + internalType);
         } catch (InvocationTargetException e) {
-            System.err.println("Invocation problem " + internalType);
-            e.printStackTrace();
+            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Invocation problem " + internalType);
         }
     }
 
-    /**
-     * @return the name of the property.
-     */
-    public String getName() { return m_name; }
+    public String getName() {
+        return m_name;
+    }
 
-    /**
-     * @return the field of the property.
-     */
-    public String getField() { return m_field; }
+    public String getField() {
+        return m_field;
+    }
 
-    /**
-     * @return the value of the property.
-     */
-    public Object getValue() { return m_value; }
+
+    public Object getValue() {
+        return m_value;
+    }
 
     /**
      * Fix the value of the property.
+     * 
      * @param value : the new value.
      */
-    public void setValue(Object value) { m_value = value; }
+    public void setValue(Object value) {
+        m_value = value;
+    }
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java
index a66472a..53a1904 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java
@@ -33,6 +33,7 @@
 
 /**
  * Handler managing the Configuration Admin.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ConfigurationHandler extends Handler {
@@ -48,8 +49,8 @@
     private ConfigurableProperty[] m_configurableProperties = new ConfigurableProperty[0];
 
     /**
-     * ProvidedServiceHandler of the component.
-     * It is useful to priopagate properties to service registrations.
+     * ProvidedServiceHandler of the component. It is useful to priopagate
+     * properties to service registrations.
      */
     private ProvidedServiceHandler m_providedServiceHandler;
 
@@ -57,8 +58,7 @@
      * Properties propagated at the last "updated".
      */
     private Dictionary m_propagated = new Properties();
-    
-    
+
     /**
      * Properties to propage.
      */
@@ -75,12 +75,21 @@
     private ServiceRegistration m_sr;
 
     /**
+     * Get the instance manager.
      * @return instance manager of this handler.
      */
-    protected InstanceManager getInstanceManager() { return m_manager; }
+    protected InstanceManager getInstanceManager() {
+        return m_manager;
+    }
 
     /**
-     * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.InstanceManager, org.apache.felix.ipojo.metadata.Element)
+     * Configure the handler.
+     * 
+     * @param im : the instance manager
+     * @param metadata : the metadata of the component
+     * @param configuration : the instance configuration
+     * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.InstanceManager,
+     * org.apache.felix.ipojo.metadata.Element)
      */
     public void configure(InstanceManager im, Element metadata, Dictionary configuration) {
         // Store the component manager
@@ -90,34 +99,41 @@
 
         // Build the hashmap
         Element[] confs = metadata.getElements("Properties", "");
-        if (confs.length == 0) { return; }
+        if (confs.length == 0) {
+            return;
+        }
 
         // Check if the component is dynamically configurable
         m_isConfigurable = false;
-        if (confs[0].containsAttribute("configurable") && confs[0].getAttribute("configurable").equalsIgnoreCase("true")) { m_isConfigurable = true; m_toPropagate = configuration; }
+        if (confs[0].containsAttribute("configurable") && confs[0].getAttribute("configurable").equalsIgnoreCase("true")) {
+            m_isConfigurable = true;
+            m_toPropagate = configuration;
+        }
 
         Element[] configurables = confs[0].getElements("Property");
 
         for (int i = 0; i < configurables.length; i++) {
             String fieldName = configurables[i].getAttribute("field");
             String name = null;
-            if (configurables[i].containsAttribute("name")) { 
-            	name = configurables[i].getAttribute("name"); 
-            } else { 
-            	name = fieldName; 
+            if (configurables[i].containsAttribute("name")) {
+                name = configurables[i].getAttribute("name");
+            } else {
+                name = fieldName;
             }
             String value = null;
-            if (configurables[i].containsAttribute("value")) { value = configurables[i].getAttribute("value"); }
-
-            if (name != null && configuration.get(name) != null && configuration.get(name) instanceof String) { 
-            	value = (String) configuration.get(name); 
-            } else { 
-            	if (fieldName != null &&  configuration.get(fieldName) != null && configuration.get(fieldName) instanceof String) { 
-            		value = (String) configuration.get(fieldName); 
-            	} 
+            if (configurables[i].containsAttribute("value")) {
+                value = configurables[i].getAttribute("value");
             }
 
-            // Detect the type of the property 
+            if (name != null && configuration.get(name) != null && configuration.get(name) instanceof String) {
+                value = (String) configuration.get(name);
+            } else {
+                if (fieldName != null && configuration.get(fieldName) != null && configuration.get(fieldName) instanceof String) {
+                    value = (String) configuration.get(fieldName);
+                }
+            }
+
+            // Detect the type of the property
             Element manipulation = metadata.getElements("Manipulation")[0];
             String type = null;
             for (int kk = 0; kk < manipulation.getElements("Field").length; kk++) {
@@ -125,14 +141,18 @@
                     type = manipulation.getElements("Field")[kk].getAttribute("type");
                 }
             }
-            if (type == null) { m_manager.getFactory().getLogger().log(Logger.ERROR, "[" + m_manager.getClassName() + "] The field " + fieldName + " does not exist in the implementation"); return; }
-            
+            if (type == null) {
+                m_manager.getFactory().getLogger().log(Logger.ERROR,
+                        "[" + m_manager.getClassName() + "] The field " + fieldName + " does not exist in the implementation");
+                return;
+            }
+
             ConfigurableProperty cp = new ConfigurableProperty(name, fieldName, value, type, this);
-            
-            if (cp.getValue() != null) { 
-            	cd.addProperty(new PropertyDescription(name, type, cp.getValue().toString())); 
-            } else { 
-            	cd.addProperty(new PropertyDescription(name, type, null)); 
+
+            if (cp.getValue() != null) {
+                cd.addProperty(new PropertyDescription(name, type, cp.getValue().toString()));
+            } else {
+                cd.addProperty(new PropertyDescription(name, type, null));
             }
 
             addProperty(cp);
@@ -143,15 +163,16 @@
             for (int k = 0; k < m_configurableProperties.length; k++) {
                 fields[k] = m_configurableProperties[k].getField();
 
-                // Check if the instance configuration contains value for the current property :
+                // Check if the instance configuration contains value for the
+                // current property :
                 String name = m_configurableProperties[k].getName();
                 String fieldName = m_configurableProperties[k].getField();
-                if (name != null && configuration.get(name) != null && !(configuration.get(name) instanceof String)) { 
-                	m_configurableProperties[k].setValue(configuration.get(name)); 
-                } else { 
-                	if (fieldName != null &&  configuration.get(fieldName) != null && !(configuration.get(fieldName) instanceof String)) { 
-                		m_configurableProperties[k].setValue(configuration.get(fieldName)); 
-                	} 
+                if (name != null && configuration.get(name) != null && !(configuration.get(name) instanceof String)) {
+                    m_configurableProperties[k].setValue(configuration.get(name));
+                } else {
+                    if (fieldName != null && configuration.get(fieldName) != null && !(configuration.get(fieldName) instanceof String)) {
+                        m_configurableProperties[k].setValue(configuration.get(fieldName));
+                    }
                 }
             }
             m_manager.register(this, fields);
@@ -159,11 +180,16 @@
     }
 
     /**
+     * Stop method.
+     * Do nothing.
      * @see org.apache.felix.ipojo.Handler#stop()
      */
-    public void stop() {    }
+    public void stop() {
+    }
 
     /**
+     * Start method.
+     * Propagate properties if the propagation is activated.
      * @see org.apache.felix.ipojo.Handler#start()
      */
     public void start() {
@@ -172,14 +198,19 @@
 
         // Propagation
         if (m_isConfigurable) {
-        	for (int i = 0; i < m_configurableProperties.length; i++) {
-        		m_toPropagate.put(m_configurableProperties[i].getName(), m_configurableProperties[i].getValue());
-        	}
-        	reconfigure(m_toPropagate);
+            for (int i = 0; i < m_configurableProperties.length; i++) {
+                m_toPropagate.put(m_configurableProperties[i].getName(), m_configurableProperties[i].getValue());
+            }
+            reconfigure(m_toPropagate);
         }
     }
 
+
     /**
+     * Setter Callback Method.
+     * Check if the modified field is a configurable property to update the value.
+     * @param fieldName : field name
+     * @param value : new value
      * @see org.apache.felix.ipojo.Handler#setterCallback(java.lang.String, java.lang.Object)
      */
     public void setterCallback(String fieldName, Object value) {
@@ -193,11 +224,17 @@
                 }
             }
         }
-        //Else do nothing
+        // Else do nothing
     }
 
     /**
-     * @see org.apache.felix.ipojo.Handler#getterCallback(java.lang.String, java.lang.Object)
+     * Getter Callback Method.
+     * Check if the field is a configurable property to push the stored value.
+     * @param fieldName : field name
+     * @param value : value pushed by the previous handler
+     * @return the stored value or the previous value.
+     * @see org.apache.felix.ipojo.Handler#getterCallback(java.lang.String,
+     * java.lang.Object)
      */
     public Object getterCallback(String fieldName, Object value) {
         // Check if the field is a configurable property
@@ -210,26 +247,35 @@
     }
 
     /**
-     * @see org.apache.felix.ipojo.Handler#stateChanged(int)
+     * Handler state changed.
+     * @param state : the new instance state.
+     * @see org.apache.felix.ipojo.CompositeHandler#stateChanged(int)
      */
     public void stateChanged(int state) {
         if (state == InstanceManager.VALID) {
-            if (m_sr == null) { start(); }
+            if (m_sr == null) {
+                start();
+            }
             return;
         }
         if (state == InstanceManager.INVALID) {
-            if (m_sr != null) { stop(); }
+            if (m_sr != null) {
+                stop();
+            }
             return;
         }
     }
 
     /**
      * Add the given property metadata to the property metadata list.
+     * 
      * @param p : property metdata to add
      */
     protected void addProperty(ConfigurableProperty p) {
         for (int i = 0; (m_configurableProperties != null) && (i < m_configurableProperties.length); i++) {
-            if (m_configurableProperties[i].getName().equals(p.getName())) { return; }
+            if (m_configurableProperties[i].getName().equals(p.getName())) {
+                return;
+            }
         }
 
         if (m_configurableProperties.length > 0) {
@@ -238,27 +284,33 @@
             newProp[m_configurableProperties.length] = p;
             m_configurableProperties = newProp;
         } else {
-            m_configurableProperties = new ConfigurableProperty[] {p};
+            m_configurableProperties = new ConfigurableProperty[] { p };
         }
     }
 
     /**
      * Check if the liste contains the property.
+     * 
      * @param name : name of the property
      * @return true if the property exist in the list
      */
     protected boolean containsProperty(String name) {
         for (int i = 0; (m_configurableProperties != null) && (i < m_configurableProperties.length); i++) {
-            if (m_configurableProperties[i].getName().equals(name)) { return true; }
+            if (m_configurableProperties[i].getName().equals(name)) {
+                return true;
+            }
         }
         return false;
     }
-    
+
     /**
+     * Reconfigure the component instance.
+     * Check if the new configuration modify the current configuration.
+     * @param np : the new configuration
      * @see org.apache.felix.ipojo.Handler#reconfigure(java.util.Dictionary)
      */
     public void reconfigure(Dictionary np) {
-    	Properties toPropagate = new Properties();
+        Properties toPropagate = new Properties();
         Enumeration keysEnumeration = np.keys();
         while (keysEnumeration.hasMoreElements()) {
             String name = (String) keysEnumeration.nextElement();
@@ -269,14 +321,19 @@
                 if (m_configurableProperties[i].getName().equals(name)) {
                     // Check if the value has change
                     if (m_configurableProperties[i].getValue() == null || !m_configurableProperties[i].getValue().equals(value)) {
-                        m_manager.setterCallback(m_configurableProperties[i].getField(), value); // says that the value has changed
+                        m_manager.setterCallback(m_configurableProperties[i].getField(), value); // says
+                                                                                                    // that
+                                                                                                    // the
+                                                                                                    // value
+                                                                                                    // has
+                                                                                                    // changed
                     }
                     find = true;
                     // Else do nothing
                 }
             }
             if (!find) {
-                //The property is not a configurable property
+                // The property is not a configurable property
                 toPropagate.put(name, value);
             }
         }
@@ -284,10 +341,10 @@
         // Propagation of the properties to service registrations :
         if (m_providedServiceHandler != null && !toPropagate.isEmpty()) {
             m_providedServiceHandler.removeProperties(m_propagated);
-            
+
             // Remove to name props
             toPropagate.remove("name");
-            
+
             m_providedServiceHandler.addProperties(toPropagate);
             m_propagated = toPropagate;
         }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/Dependency.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/Dependency.java
index 64bc089..78059fd 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/Dependency.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/Dependency.java
@@ -32,6 +32,7 @@
 
 /**
  * Represent a service dependency of the component instance.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class Dependency implements ServiceListener {
@@ -50,67 +51,64 @@
      * Reference on the Dependency Handler.
      */
     private DependencyHandler m_handler;
-    
+
     /**
      * Field of the dependency.
      */
     private String m_field;
-    
+
     /**
-     * List of dependency callback. 
+     * List of dependency callback.
      */
     private DependencyCallback[] m_callbacks = new DependencyCallback[0];
-    
+
     /**
      * Service Specification required by the dependency.
      */
     private String m_specification;
-    
+
     /**
      * Is the dependency a multiple dependency ?
      */
     private boolean m_isMultiple = false;
-    
+
     /**
      * Is the Dependency an optional dependency ?
      */
     private boolean m_isOptional = false;
-    
+
     /**
      * LDAP Filter of the Dependency (String form).
      */
     private String m_strFilter;
-    
 
     /**
-     * Array of Service Objects.
-     * When cardinality = 1 : just the first element is returned
-     * When cardinality = ?..n : all the array is returned
+     * Array of Service Objects. When cardinality = 1 : just the first element
+     * is returned When cardinality = ?..n : all the array is returned
      * m_services : Array
      */
     private Object[] m_services = new Object[0];
 
     /**
-     * Array of service references.
-     * m_ref : Array
+     * Array of service references. m_ref : Array
      */
     private ServiceReference[] m_ref = new ServiceReference[0];
 
     /**
-     * State of the dependency.
-     * 0 : stopped, 1 : valid, 2 : invalid.
-     * m_state : int
+     * State of the dependency. 0 : stopped, 1 : valid, 2 : invalid. m_state :
+     * int
      */
     private int m_state;
 
     /**
-     * True if the reference list change after the creation of a service object array.
+     * True if the reference list change after the creation of a service object
+     * array.
      */
     private boolean m_change;
 
     /**
-     * Class of the dependency.
-     * Usefull to create in the case of multiple dependency
+     * Class of the dependency. Usefull to create in the case of multiple
+     * dependency
      */
     private Class m_clazz;
 
@@ -119,9 +117,9 @@
      */
     private Filter m_filter;
 
-
     /**
      * Dependency contructor. After the creation the dependency is not started.
+     * 
      * @param dh : the dependency handler managing this dependency
      * @param field : field of the dependency
      * @param spec : required specification
@@ -136,39 +134,44 @@
         m_strFilter = filter;
     }
 
-    /**
-     * @return the field attached to the dependency.
-     */
-    public String getField() { return m_field; }
-    
-    /**
-     * @return the specification tracked by the dependency.
-     */
-    public String getSpecification() { return m_specification; }
-    
-    /**
-     * @return true is the dependency is optional.
-     */
-    public boolean isOptional() { return m_isOptional; }
-    
-    /**
-     * @return true if the dependency is multiple.
-     */
-    public boolean isMultiple() { return m_isMultiple; }
-    
+    public String getField() {
+        return m_field;
+    }
+
+
+    public String getSpecification() {
+        return m_specification;
+    }
+
+
+    public boolean isOptional() {
+        return m_isOptional;
+    }
+
+
+    public boolean isMultiple() {
+        return m_isMultiple;
+    }
+
     /**
      * Set the dependency to multiple.
      */
-    protected void setMultiple() { m_isMultiple = true; }
-    
+    protected void setMultiple() {
+        m_isMultiple = true;
+    }
+
     /**
      * Set the tracked specification for this dependency.
+     * 
      * @param spec : the tracked specification (interface name)
      */
-    protected void setSpecification(String spec) { m_specification = spec; }
-    
+    protected void setSpecification(String spec) {
+        m_specification = spec;
+    }
+
     /**
      * Add a callback to the dependency.
+     * 
      * @param cb : callback to add
      */
     protected void addDependencyCallback(DependencyCallback cb) {
@@ -178,37 +181,43 @@
             newCallbacks[m_callbacks.length] = cb;
             m_callbacks = newCallbacks;
         } else {
-            m_callbacks = new DependencyCallback[] {cb};
+            m_callbacks = new DependencyCallback[] { cb };
         }
     }
-    
-    /**
-     * @return the filter attached to the dependency.
-     */
-    public String getFilter() { return m_strFilter; }
+
+
+    public String getFilter() {
+        return m_strFilter;
+    }
+
+
+    public DependencyHandler getDependencyHandler() {
+        return m_handler;
+    }
 
     /**
-     * @return the dependency handler of this dependency.
-     */
-    public DependencyHandler getDependencyHandler() { return m_handler; }
-
-    /**
+     * Build the map [service object, service reference] of used services.
      * @return the used service.
      */
     public HashMap getUsedServices() {
         HashMap hm = new HashMap();
         if (m_isMultiple) {
             for (int i = 0; i < m_ref.length; i++) {
-                if (i < m_services.length) { hm.put(((Object) m_services[i]).toString(), m_ref[i]); }
+                if (i < m_services.length) {
+                    hm.put(((Object) m_services[i]).toString(), m_ref[i]);
+                }
             }
         } else {
-            if (m_ref.length != 0 && m_services.length != 0) { hm.put((m_services[0]).toString(), m_ref[0]); }
+            if (m_ref.length != 0 && m_services.length != 0) {
+                hm.put((m_services[0]).toString(), m_ref[0]);
+            }
         }
         return hm;
     }
 
     /**
      * A dependency is satisfied if it is optional of ref.length != 0.
+     * 
      * @return true is the dependency is satified
      */
     protected boolean isSatisfied() {
@@ -216,28 +225,35 @@
     }
 
     /**
-     * This method is called by the replaced code in the component implementation class.
-     * Construct the service object list is necessary.
-     * @return null or a service object or a list of service object according to the dependency.
+     * This method is called by the replaced code in the component
+     * implementation class. Construct the service object list is necessary.
+     * 
+     * @return null or a service object or a list of service object according to
+     * the dependency.
      */
     protected Object get() {
-       // m_handler.getInstanceManager().getFactory().getLogger().log(Logger.INFO, "[" + m_handler.getInstanceManager().getClassName() + "] Call get for a dependency on : " + m_metadata.getServiceSpecification()
-       //         + " Multiple : " + m_metadata.isMultiple() + " Optional : " + m_metadata.isOptional());
+        // m_handler.getInstanceManager().getFactory().getLogger().log(Logger.INFO,
+        // "[" + m_handler.getInstanceManager().getClassName() + "] Call get for
+        // a dependency on : " + m_metadata.getServiceSpecification()
+        // + " Multiple : " + m_metadata.isMultiple() + " Optional : " +
+        // m_metadata.isOptional());
         try {
 
             // 1 : Test if there is any change in the reference list :
             if (!m_change) {
                 if (!m_isMultiple) {
                     if (m_services.length > 0) {
-                        return m_services[0]; 
+                        return m_services[0];
                     }
                 } else {
                     return m_services;
                 }
             }
 
-            // 2 : Else there is a change in the list -> recompute the m_services array
-            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.INFO, "[" + m_handler.getInstanceManager().getClassName() + "] Create a service array of " + m_clazz.getName());
+            // 2 : Else there is a change in the list -> recompute the
+            // m_services array
+            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.INFO,
+                    "[" + m_handler.getInstanceManager().getClassName() + "] Create a service array of " + m_clazz.getName());
             m_services = (Object[]) Array.newInstance(m_clazz, m_ref.length);
 
             for (int i = 0; i < m_ref.length; i++) {
@@ -245,49 +261,69 @@
             }
 
             m_change = false;
-   //         m_handler.getInstanceManager().getFactory().getLogger().log(Logger.INFO, "[" + m_handler.getInstanceManager().getClassName() + "] Create an array with the size " + m_services.length);
+            // m_handler.getInstanceManager().getFactory().getLogger().log(Logger.INFO,
+            // "[" + m_handler.getInstanceManager().getClassName() + "] Create
+            // an array with the size " + m_services.length);
 
-
-            // 3 : The service object list is populated, I return either the first service object, either the array.
+            // 3 : The service object list is populated, I return either the
+            // first service object, either the array.
             // Return null or an empty array if no service are found.
             if (!m_isMultiple) {
                 if (m_services.length > 0) {
                     return m_services[0];
                 } else {
                     // Load the nullable class
-                    //String[] segment = m_metadata.getServiceSpecification().split("[.]");
-                    //String className = "org.apache.felix.ipojo." + segment[segment.length - 1] + "Nullable";
-                	String className = m_specification + "Nullable";
-            //        m_handler.getInstanceManager().getFactory().getLogger().log(Logger.INFO, "[" + m_handler.getInstanceManager().getClassName() + "] Try to load the nullable class for " + getMetadata().getServiceSpecification() + " -> " + className);
+                    // String[] segment =
+                    // m_metadata.getServiceSpecification().split("[.]");
+                    // String className = "org.apache.felix.ipojo." +
+                    // segment[segment.length - 1] + "Nullable";
+                    String className = m_specification + "Nullable";
+                    // m_handler.getInstanceManager().getFactory().getLogger().log(Logger.INFO,
+                    // "[" + m_handler.getInstanceManager().getClassName() + "]
+                    // Try to load the nullable class for " +
+                    // getMetadata().getServiceSpecification() + " -> " +
+                    // className);
                     Class nullableClazz = m_handler.getNullableClass(className);
 
                     if (nullableClazz == null) {
-                        m_handler.getInstanceManager().getFactory().getLogger().log(Logger.INFO, "[" + m_handler.getInstanceManager().getClassName() + "] Cannot load the nullable class to return a dependency object for " + m_field + " -> " + m_specification);
+                        m_handler.getInstanceManager().getFactory().getLogger().log(
+                                Logger.INFO,
+                                "[" + m_handler.getInstanceManager().getClassName() + "] Cannot load the nullable class to return a dependency object for "
+                                        + m_field + " -> " + m_specification);
                         return null;
                     }
 
-                    // The nullable class is loaded, create the object and return it
+                    // The nullable class is loaded, create the object and
+                    // return it
                     Object instance = nullableClazz.newInstance();
-             //       m_handler.getInstanceManager().getFactory().getLogger().log(Logger.INFO, "[" + m_handler.getInstanceManager().getClassName() + "] Nullable object created for " + getMetadata().getServiceSpecification() + " -> " + instance);
+                    // m_handler.getInstanceManager().getFactory().getLogger().log(Logger.INFO,
+                    // "[" + m_handler.getInstanceManager().getClassName() + "]
+                    // Nullable object created for " +
+                    // getMetadata().getServiceSpecification() + " -> " +
+                    // instance);
                     return instance;
                 }
             } else { // Multiple dependency
                 return m_services;
             }
         } catch (Exception e) {
-            // There is a problem in the dependency resolving (like in stopping method)
+            // There is a problem in the dependency resolving (like in stopping
+            // method)
             if (!m_isMultiple) {
-                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Return null, an exception was throwed in the get method", e);
-                return null; 
+                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                        "[" + m_handler.getInstanceManager().getClassName() + "] Return null, an exception was throwed in the get method", e);
+                return null;
             } else {
-                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Return an empty array, an exception was throwed in the get method", e);
-                return Array.newInstance(m_clazz, 0); 
+                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                        "[" + m_handler.getInstanceManager().getClassName() + "] Return an empty array, an exception was throwed in the get method", e);
+                return Array.newInstance(m_clazz, 0);
             }
         }
     }
 
     /**
      * Method calld when a service event is throwed.
+     * 
      * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
      * @param event : the received service event
      */
@@ -296,26 +332,28 @@
 
             // If a service goes way.
             if (event.getType() == ServiceEvent.UNREGISTERING) {
-                if (containsSR(event.getServiceReference())) { departureManagement(event.getServiceReference()); }
+                if (containsSR(event.getServiceReference())) {
+                    departureManagement(event.getServiceReference());
+                }
                 return;
             }
 
             // If a service arrives
             if (event.getType() == ServiceEvent.REGISTERED) {
-                if (m_filter.match(event.getServiceReference())) { 
-                	arrivalManagement(event.getServiceReference());
+                if (m_filter.match(event.getServiceReference())) {
+                    arrivalManagement(event.getServiceReference());
                 }
                 return;
             }
             // If a service is modified
             if (event.getType() == ServiceEvent.MODIFIED) {
                 if (m_filter.match(event.getServiceReference())) {
-                    if (!containsSR(event.getServiceReference())) { 
-                    	arrivalManagement(event.getServiceReference()); 
+                    if (!containsSR(event.getServiceReference())) {
+                        arrivalManagement(event.getServiceReference());
                     }
                 } else {
-                    if (containsSR(event.getServiceReference())) { 
-                    	departureManagement(event.getServiceReference()); 
+                    if (containsSR(event.getServiceReference())) {
+                        departureManagement(event.getServiceReference());
                     }
                 }
                 return;
@@ -326,27 +364,34 @@
 
     /**
      * Method called when a service arrives.
+     * 
      * @param ref : the arriving service reference
      */
     private void arrivalManagement(ServiceReference ref) {
-        // Add the new service inside the ref list
-        m_handler.getInstanceManager().getFactory().getLogger().log(Logger.INFO, "[" + m_handler.getInstanceManager().getClassName() + "] Add a service for a dependency");
         addReference(ref);
         if (isSatisfied()) {
             m_state = RESOLVED;
-            if (m_isMultiple || m_ref.length == 1) { m_change = true; callBindMethod(ref); }
+            if (m_isMultiple || m_ref.length == 1) {
+                m_change = true;
+                callBindMethod(ref);
+            }
         }
         m_handler.checkContext();
     }
 
     /**
      * Method called when a service goes away.
+     * 
      * @param ref : the leaving service reference
      */
     private void departureManagement(ServiceReference ref) {
         // Call unbind method
-        if (!m_isMultiple && ref == m_ref[0]) { callUnbindMethod(ref); }
-        if (m_isMultiple) { callUnbindMethod(ref); }
+        if (!m_isMultiple && ref == m_ref[0]) {
+            callUnbindMethod(ref);
+        }
+        if (m_isMultiple) {
+            callUnbindMethod(ref);
+        }
 
         // Unget the service reference
         m_handler.getInstanceManager().getContext().ungetService(ref);
@@ -362,10 +407,16 @@
         // Is there any change ?
         if (!m_isMultiple && index == 0) {
             m_change = true;
-            if (m_ref.length != 0) { callBindMethod(m_ref[0]); }
+            if (m_ref.length != 0) {
+                callBindMethod(m_ref[0]);
+            }
         }
-        if (!m_isMultiple && index != 0) { m_change = false; }
-        if (m_isMultiple) { m_change = true;  }
+        if (!m_isMultiple && index != 0) {
+            m_change = false;
+        }
+        if (m_isMultiple) {
+            m_change = true;
+        }
 
         m_handler.checkContext();
         return;
@@ -373,46 +424,64 @@
 
     /**
      * Call unbind callback method.
+     * 
      * @param ref : reference to send (if accepted) to the method
      */
     private void callUnbindMethod(ServiceReference ref) {
         if (m_handler.getInstanceManager().getState() == InstanceManager.VALID) {
             for (int i = 0; i < m_callbacks.length; i++) {
                 if (m_callbacks[i].getMethodType() == DependencyCallback.UNBIND) {
-                    // Try to call the bind method with a service reference inside
+                    // Try to call the bind method with a service reference
+                    // inside
                     try {
                         m_callbacks[i].call(ref);
                     } catch (NoSuchMethodException e) {
-                        // The method was not found : try without service reference
+                        // The method was not found : try without service
+                        // reference
                         try {
                             m_callbacks[i].call();
                         } catch (NoSuchMethodException e1) {
-                            // The method was not found : try with the service object
+                            // The method was not found : try with the service
+                            // object
                             try {
                                 m_callbacks[i].call(m_handler.getInstanceManager().getContext().getService(ref));
                             } catch (NoSuchMethodException e2) {
-                                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Unbind method not found", e2);
+                                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                                        "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Unbind method not found", e2);
                                 return;
                             } catch (IllegalAccessException e2) {
-                                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Illegal access on unbind method", e2);
+                                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                                        "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Illegal access on unbind method",
+                                        e2);
                                 return;
                             } catch (InvocationTargetException e2) {
-                                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Invocation Target Exception in the unbind method", e2);
+                                m_handler.getInstanceManager().getFactory().getLogger().log(
+                                        Logger.ERROR,
+                                        "[" + m_handler.getInstanceManager().getClassName()
+                                                + "] Dependency Callback Error : Invocation Target Exception in the unbind method", e2);
                                 return;
                             }
                         } catch (IllegalAccessException e1) {
-                            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Illegal access on unbind method", e1);
+                            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                                    "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Illegal access on unbind method", e1);
                             return;
                         } catch (InvocationTargetException e1) {
-                            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Invocation Target Exception in the unbind method", e1);
+                            m_handler.getInstanceManager().getFactory().getLogger().log(
+                                    Logger.ERROR,
+                                    "[" + m_handler.getInstanceManager().getClassName()
+                                            + "] Dependency Callback Error : Invocation Target Exception in the unbind method", e1);
                             return;
                         }
 
                     } catch (IllegalAccessException e) {
-                        m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Illegal access on bind method", e);
+                        m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                                "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Illegal access on bind method", e);
                         return;
                     } catch (InvocationTargetException e) {
-                        m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Invocation Target Exception in the bind method", e);
+                        m_handler.getInstanceManager().getFactory().getLogger().log(
+                                Logger.ERROR,
+                                "[" + m_handler.getInstanceManager().getClassName()
+                                        + "] Dependency Callback Error : Invocation Target Exception in the bind method", e);
                         return;
                     }
                 }
@@ -422,50 +491,75 @@
 
     /**
      * Call the bind method.
+     * 
      * @param instance : instance on which calling the bind method.
      */
     protected void callBindMethod(Object instance) {
-        // Check optional case : nullable object case : do not call bind on nullable object
-        if (m_isOptional && m_ref.length == 0) { return; }
-
+        // Check optional case : nullable object case : do not call bind on
+        // nullable object
+        if (m_isOptional && m_ref.length == 0) {
+            return;
+        }
 
         if (m_isMultiple) {
             for (int i = 0; i < m_ref.length; i++) {
                 for (int j = 0; j < m_callbacks.length; j++) {
                     if (m_callbacks[j].getMethodType() == DependencyCallback.BIND) {
-                        // Try to call the bind method with a service reference inside
+                        // Try to call the bind method with a service reference
+                        // inside
                         try {
                             m_callbacks[j].callOnInstance(instance, m_ref[i]);
                         } catch (NoSuchMethodException e) {
-                            // The method was not found : try without service reference
+                            // The method was not found : try without service
+                            // reference
                             try {
                                 m_callbacks[j].callOnInstance(instance);
                             } catch (NoSuchMethodException e1) {
-                                // The method was not found : try with the service object
+                                // The method was not found : try with the
+                                // service object
                                 try {
                                     m_callbacks[j].callOnInstance(instance, m_handler.getInstanceManager().getContext().getService(m_ref[i]));
                                 } catch (NoSuchMethodException e2) {
-                                    m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Bind method not found", e2);
+                                    m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                                            "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Bind method not found", e2);
                                     return;
                                 } catch (IllegalAccessException e2) {
-                                    m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Illegal access on bind method", e2);
+                                    m_handler.getInstanceManager().getFactory().getLogger()
+                                            .log(
+                                                    Logger.ERROR,
+                                                    "[" + m_handler.getInstanceManager().getClassName()
+                                                            + "] Dependency Callback Error : Illegal access on bind method", e2);
                                     return;
                                 } catch (InvocationTargetException e2) {
-                                    m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Invocation Target Exception in the bind method", e2);
+                                    m_handler.getInstanceManager().getFactory().getLogger().log(
+                                            Logger.ERROR,
+                                            "[" + m_handler.getInstanceManager().getClassName()
+                                                    + "] Dependency Callback Error : Invocation Target Exception in the bind method", e2);
                                     return;
                                 }
                             } catch (IllegalAccessException e1) {
-                                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Illegal access on bind method", e1);
+                                m_handler.getInstanceManager().getFactory().getLogger()
+                                        .log(
+                                                Logger.ERROR,
+                                                "[" + m_handler.getInstanceManager().getClassName()
+                                                        + "] Dependency Callback Error : Illegal access on bind method", e1);
                                 return;
                             } catch (InvocationTargetException e1) {
-                                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Invocation Target Exception in the bind method", e1);
+                                m_handler.getInstanceManager().getFactory().getLogger().log(
+                                        Logger.ERROR,
+                                        "[" + m_handler.getInstanceManager().getClassName()
+                                                + "] Dependency Callback Error : Invocation Target Exception in the bind method", e1);
                                 return;
                             }
                         } catch (IllegalAccessException e) {
-                            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Illegal access on bind method", e);
+                            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                                    "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Illegal access on bind method", e);
                             return;
                         } catch (InvocationTargetException e) {
-                            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Invocation Target Exception in the bind method" + e);
+                            m_handler.getInstanceManager().getFactory().getLogger().log(
+                                    Logger.ERROR,
+                                    "[" + m_handler.getInstanceManager().getClassName()
+                                            + "] Dependency Callback Error : Invocation Target Exception in the bind method" + e);
                             return;
                         }
                     }
@@ -474,40 +568,59 @@
         } else {
             for (int j = 0; j < m_callbacks.length; j++) {
                 if (m_callbacks[j].getMethodType() == DependencyCallback.BIND) {
-                    // Try to call the bind method with a service reference inside
+                    // Try to call the bind method with a service reference
+                    // inside
                     try {
                         m_callbacks[j].callOnInstance(instance, m_ref[0]);
                     } catch (NoSuchMethodException e) {
-                        // The method was not found : try without service reference
+                        // The method was not found : try without service
+                        // reference
                         try {
                             m_callbacks[j].callOnInstance(instance);
                         } catch (NoSuchMethodException e1) {
-                            // The method was not found : try with the service object
+                            // The method was not found : try with the service
+                            // object
                             try {
                                 m_callbacks[j].callOnInstance(instance, m_handler.getInstanceManager().getContext().getService(m_ref[0]));
                             } catch (NoSuchMethodException e2) {
-                                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Bind method not found", e2);
+                                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                                        "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Bind method not found", e2);
                                 return;
                             } catch (IllegalAccessException e2) {
-                                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Illegal access on bind method", e2);
+                                m_handler.getInstanceManager().getFactory().getLogger()
+                                        .log(
+                                                Logger.ERROR,
+                                                "[" + m_handler.getInstanceManager().getClassName()
+                                                        + "] Dependency Callback Error : Illegal access on bind method", e2);
                                 return;
                             } catch (InvocationTargetException e2) {
-                                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Invocation Target Exception in the bind method", e2);
+                                m_handler.getInstanceManager().getFactory().getLogger().log(
+                                        Logger.ERROR,
+                                        "[" + m_handler.getInstanceManager().getClassName()
+                                                + "] Dependency Callback Error : Invocation Target Exception in the bind method", e2);
                                 return;
                             }
                         } catch (IllegalAccessException e1) {
-                            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Illegal access on bind method", e1);
+                            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                                    "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Illegal access on bind method", e1);
                             return;
                         } catch (InvocationTargetException e1) {
-                            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Invocation Target Exception in the bind method", e1);
+                            m_handler.getInstanceManager().getFactory().getLogger().log(
+                                    Logger.ERROR,
+                                    "[" + m_handler.getInstanceManager().getClassName()
+                                            + "] Dependency Callback Error : Invocation Target Exception in the bind method", e1);
                             return;
                         }
 
                     } catch (IllegalAccessException e) {
-                        m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Illegal access on bind method", e);
+                        m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                                "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Illegal access on bind method", e);
                         return;
                     } catch (InvocationTargetException e) {
-                        m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Invocation Target Exception in the bind method", e);
+                        m_handler.getInstanceManager().getFactory().getLogger().log(
+                                Logger.ERROR,
+                                "[" + m_handler.getInstanceManager().getClassName()
+                                        + "] Dependency Callback Error : Invocation Target Exception in the bind method", e);
                         return;
                     }
                 }
@@ -517,6 +630,7 @@
 
     /**
      * Call bind method with the service reference in parameter (if accepted).
+     * 
      * @param ref : the service reference of the new service
      */
     private void callBindMethod(ServiceReference ref) {
@@ -524,41 +638,61 @@
         if (m_handler.getInstanceManager().getState() == InstanceManager.VALID) {
             for (int i = 0; i < m_callbacks.length; i++) {
                 if (m_callbacks[i].getMethodType() == DependencyCallback.BIND) {
-                    // Try to call the bind method with a service reference inside
+                    // Try to call the bind method with a service reference
+                    // inside
                     try {
                         m_callbacks[i].call(ref);
                     } catch (NoSuchMethodException e) {
-                        // The method was not found : try without service reference
+                        // The method was not found : try without service
+                        // reference
                         try {
-                            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.INFO, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Call the Bind method");
+                            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.INFO,
+                                    "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Call the Bind method");
                             m_callbacks[i].call();
                         } catch (NoSuchMethodException e1) {
-                            // The method was not found : try with the service object
+                            // The method was not found : try with the service
+                            // object
                             try {
                                 m_callbacks[i].call(m_handler.getInstanceManager().getContext().getService(ref));
                             } catch (NoSuchMethodException e2) {
-                                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Bind method not found", e2);
+                                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                                        "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Bind method not found", e2);
                                 return;
                             } catch (IllegalAccessException e2) {
-                                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Illegal access on bind method", e2);
+                                m_handler.getInstanceManager().getFactory().getLogger()
+                                        .log(
+                                                Logger.ERROR,
+                                                "[" + m_handler.getInstanceManager().getClassName()
+                                                        + "] Dependency Callback Error : Illegal access on bind method", e2);
                                 return;
                             } catch (InvocationTargetException e2) {
-                                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Invocation Target Exception in the bind method", e2);
+                                m_handler.getInstanceManager().getFactory().getLogger().log(
+                                        Logger.ERROR,
+                                        "[" + m_handler.getInstanceManager().getClassName()
+                                                + "] Dependency Callback Error : Invocation Target Exception in the bind method", e2);
                                 return;
                             }
                         } catch (IllegalAccessException e1) {
-                            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Illegal access on bind method", e1);
+                            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                                    "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Illegal access on bind method", e1);
                             return;
                         } catch (InvocationTargetException e1) {
-                            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Invocation Target Exception in the bind method", e1);
+                            m_handler.getInstanceManager().getFactory().getLogger().log(
+                                    Logger.ERROR,
+                                    "[" + m_handler.getInstanceManager().getClassName()
+                                            + "] Dependency Callback Error : Invocation Target Exception in the bind method", e1);
                             return;
                         }
 
                     } catch (IllegalAccessException e) {
-                        m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Illegal access on bind method", e);
+                        m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                                "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Illegal access on bind method", e);
                         return;
                     } catch (InvocationTargetException e) {
-                        m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Dependency Callback Error : Invocation Target Exception in the bind method", e);
+                        m_handler.getInstanceManager().getFactory().getLogger().log(
+                                Logger.ERROR,
+                                "[" + m_handler.getInstanceManager().getClassName()
+                                        + "] Dependency Callback Error : Invocation Target Exception in the bind method", e);
                         return;
                     }
                 }
@@ -579,30 +713,37 @@
             filter = classnamefilter;
         }
 
-        m_handler.getInstanceManager().getFactory().getLogger().log(Logger.INFO, "[" + m_handler.getInstanceManager().getClassName() + "] Start a dependency on : " + m_specification + " with " + m_strFilter);
+        m_handler.getInstanceManager().getFactory().getLogger().log(Logger.INFO,
+                "[" + m_handler.getInstanceManager().getClassName() + "] Start a dependency on : " + m_specification + " with " + m_strFilter);
         m_state = UNRESOLVED;
 
         try {
             m_clazz = m_handler.getInstanceManager().getContext().getBundle().loadClass(m_specification);
         } catch (ClassNotFoundException e) {
-            System.err.println("Cannot load the interface class for the dependency " + m_field + " [" + m_specification + "]");
-            e.printStackTrace();
+            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                    "Cannot load the interface class for the dependency " + m_field + " [" + m_specification + "]");
         }
 
         try {
             // Look if the service is already present :
             ServiceReference[] sr = m_handler.getInstanceManager().getContext().getServiceReferences(m_specification, filter);
             if (sr != null) {
-                for (int i = 0; i < sr.length; i++) { addReference(sr[i]); }
+                for (int i = 0; i < sr.length; i++) {
+                    addReference(sr[i]);
+                }
                 m_state = RESOLVED;
             }
             // Register a listener :
             m_handler.getInstanceManager().getContext().addServiceListener(this);
-            m_filter = m_handler.getInstanceManager().getContext().createFilter(filter); // Store the filter
-            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.INFO, "[" + m_handler.getInstanceManager().getClassName() + "] Create a filter from : " + filter);
+            m_filter = m_handler.getInstanceManager().getContext().createFilter(filter); // Store
+                                                                                            // the
+                                                                                            // filter
+            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.INFO,
+                    "[" + m_handler.getInstanceManager().getClassName() + "] Create a filter from : " + filter);
             m_change = true;
         } catch (InvalidSyntaxException e1) {
-            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] A filter is malformed : " + filter);
+            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                    "[" + m_handler.getInstanceManager().getClassName() + "] A filter is malformed : " + filter);
             e1.printStackTrace();
         }
     }
@@ -611,7 +752,8 @@
      * Stop the dependency.
      */
     public void stop() {
-        m_handler.getInstanceManager().getFactory().getLogger().log(Logger.INFO, "[" + m_handler.getInstanceManager().getClassName() + "] Stop a dependency on : " + m_specification + " with " + m_strFilter);
+        m_handler.getInstanceManager().getFactory().getLogger().log(Logger.INFO,
+                "[" + m_handler.getInstanceManager().getClassName() + "] Stop a dependency on : " + m_specification + " with " + m_strFilter);
         m_state = UNRESOLVED;
 
         // Unget all services references
@@ -627,14 +769,20 @@
 
     /**
      * Return the state of the dependency.
+     * 
      * @return the state of the dependency (1 : valid, 2 : invalid)
      */
     public int getState() {
-        return (m_isOptional) ? 1 : m_state;
+        if (m_isOptional) { 
+            return 1;
+        } else { 
+            return m_state;
+        }
     }
 
     /**
      * Return the list of service reference.
+     * 
      * @return the service reference list.
      */
     public ServiceReference[] getServiceReferences() {
@@ -643,6 +791,7 @@
 
     /**
      * Add a service reference in the current list.
+     * 
      * @param r : the new service reference to add
      */
     private void addReference(ServiceReference r) {
@@ -658,12 +807,13 @@
             newSR[m_ref.length] = r;
             m_ref = newSR;
         } else {
-            m_ref = new ServiceReference[] {r};
+            m_ref = new ServiceReference[] { r };
         }
     }
 
     /**
      * Find if a service registration il already registred.
+     * 
      * @param sr : the service registration to find.
      * @return true if the service registration is already in the array
      */
@@ -678,8 +828,10 @@
 
     /**
      * Remove a service reference in the current list.
+     * 
      * @param r : the new service reference to remove
-     * @return the index of the founded element, or -1 if the element is not found
+     * @return the index of the founded element, or -1 if the element is not
+     * found
      */
     private int removeReference(ServiceReference r) {
         if (m_ref == null) {
@@ -701,9 +853,8 @@
             } else { // Otherwise, we need to do some array copying.
                 ServiceReference[] newSR = new ServiceReference[m_ref.length - 1];
                 System.arraycopy(m_ref, 0, newSR, 0, idx);
-                if (idx < newSR.length)             {
-                    System.arraycopy(
-                            m_ref, idx + 1, newSR, idx, newSR.length - idx);
+                if (idx < newSR.length) {
+                    System.arraycopy(m_ref, idx + 1, newSR, idx, newSR.length - idx);
                 }
                 m_ref = newSR;
             }
@@ -711,5 +862,4 @@
         return idx;
     }
 
-
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyCallback.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyCallback.java
index d197cb6..33a8fa6 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyCallback.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyCallback.java
@@ -25,9 +25,10 @@
 import org.apache.felix.ipojo.util.Logger;
 import org.osgi.framework.ServiceReference;
 
-
 /**
- * This class allwos the creation of callback when service dependency arrives or disappear.
+ * This class allwos the creation of callback when service dependency arrives or
+ * disappear.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class DependencyCallback {
@@ -51,12 +52,12 @@
      * Callback method name.
      */
     private String m_callback;
-    
+
     /**
      * Is the callback a static callback.
      */
     private boolean m_isStatic;
-    
+
     /**
      * The instance manager.
      */
@@ -64,9 +65,11 @@
 
     /**
      * Constructor.
+     * 
      * @param dep : the dependency attached to this depednency callback
      * @param method : the method to call
-     * @param methodType : is the method to call a bind method or an unbind method
+     * @param methodType : is the method to call a bind method or an unbind
+     * method
      * @param isStatic : is the method to call static ?
      */
     public DependencyCallback(Dependency dep, String method, int methodType, boolean isStatic) {
@@ -76,31 +79,33 @@
         m_manager = dep.getDependencyHandler().getInstanceManager();
     }
 
-    /**
-     * @return the method type.
-     */
-    public int getMethodType() { return m_methodType; }
+
+    public int getMethodType() {
+        return m_methodType;
+    }
 
     /**
      * 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 {
-    	// Get the method object
-    	Method method = m_manager.getClazz().getDeclaredMethod(m_callback, new Class[] {});
-    	method.setAccessible(true);
-    	
-        if (m_isStatic) { 
-        	method.invoke(null, new Object[] {}); 
+        // Get the method object
+        Method method = m_manager.getClazz().getDeclaredMethod(m_callback, new Class[] {});
+        method.setAccessible(true);
+
+        if (m_isStatic) {
+            method.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) {
-                m_manager.getFactory().getLogger().log(Logger.INFO, "[" + m_manager.getClassName() + "] Create the first instance " + m_manager.getPojoObject());
-                method.invoke(m_manager.getPojoObject(), new Object[]{});
+                m_manager.getFactory().getLogger()
+                        .log(Logger.INFO, "[" + m_manager.getClassName() + "] Create the first instance " + m_manager.getPojoObject());
+                method.invoke(m_manager.getPojoObject(), new Object[] {});
             } else {
                 for (int i = 0; i < m_manager.getPojoObjects().length; i++) {
                     method.invoke(m_manager.getPojoObjects()[i], new Object[] {});
@@ -111,28 +116,30 @@
 
     /**
      * Call the callback method with a service reference.
+     * 
      * @param ref : the service reference to send to the 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(ServiceReference ref) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
-    	// Get the method object
-    	Method method = m_manager.getClazz().getDeclaredMethod(m_callback, new Class[] {ServiceReference.class});
-    	method.setAccessible(true);
-    	
-        if (m_isStatic) { 
-        	method.invoke(null, new Object[] {ref}); 
+        // Get the method object
+        Method method = m_manager.getClazz().getDeclaredMethod(m_callback, new Class[] { ServiceReference.class });
+        method.setAccessible(true);
+
+        if (m_isStatic) {
+            method.invoke(null, new Object[] { ref });
         } else {
             // Two cases :
             // - if instances already exists : call on each instances
             // - if no instance exists : create an instance
             if (m_manager.getPojoObjects().length == 0) {
-                m_manager.getFactory().getLogger().log(Logger.INFO, "[" + m_manager.getClassName() + "] Create the first instance " + m_manager.getPojoObject());
-                method.invoke(m_manager.getPojoObject(), new Object[]{ref});
+                m_manager.getFactory().getLogger()
+                        .log(Logger.INFO, "[" + m_manager.getClassName() + "] Create the first instance " + m_manager.getPojoObject());
+                method.invoke(m_manager.getPojoObject(), new Object[] { ref });
             } else {
                 for (int i = 0; i < m_manager.getPojoObjects().length; i++) {
-                    method.invoke(m_manager.getPojoObjects()[i], new Object[] {ref});
+                    method.invoke(m_manager.getPojoObjects()[i], new Object[] { ref });
                 }
             }
         }
@@ -140,28 +147,30 @@
 
     /**
      * Call the callback method with an object.
+     * 
      * @param o : the object to send to the 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(Object o) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
-    	// Get the method object
-    	Method method = m_manager.getClazz().getDeclaredMethod(m_callback, new Class[] {Object.class});
-    	method.setAccessible(true);
-    	
-        if (m_isStatic) { 
-        	method.invoke(null, new Object[] {o}); 
+        // Get the method object
+        Method method = m_manager.getClazz().getDeclaredMethod(m_callback, new Class[] { Object.class });
+        method.setAccessible(true);
+
+        if (m_isStatic) {
+            method.invoke(null, new Object[] { o });
         } else {
             // Two cases :
             // - if instances already exists : call on each instances
             // - if no instance exists : create an instance
             if (m_manager.getPojoObjects().length == 0) {
-                m_manager.getFactory().getLogger().log(Logger.INFO, "[" + m_manager.getClassName() + "] Create the first instance " + m_manager.getPojoObject());
-                method.invoke(m_manager.getPojoObject(), new Object[]{o});
+                m_manager.getFactory().getLogger()
+                        .log(Logger.INFO, "[" + m_manager.getClassName() + "] Create the first instance " + m_manager.getPojoObject());
+                method.invoke(m_manager.getPojoObject(), new Object[] { o });
             } else {
                 for (int i = 0; i < m_manager.getPojoObjects().length; i++) {
-                    method.invoke(m_manager.getPojoObjects()[i], new Object[] {o});
+                    method.invoke(m_manager.getPojoObjects()[i], new Object[] { o });
                 }
             }
         }
@@ -169,19 +178,21 @@
 
     /**
      * Call the callback on the given instance with no parameters.
+     * 
      * @param instance : the instance on which call 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
      */
-    protected void callOnInstance(Object instance) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { 
-    	Method method = instance.getClass().getDeclaredMethod(m_callback, new Class[] {});
-    	method.setAccessible(true);
-    	method.invoke(instance, new Object[] {});
-   	}
+    protected void callOnInstance(Object instance) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
+        Method method = instance.getClass().getDeclaredMethod(m_callback, new Class[] {});
+        method.setAccessible(true);
+        method.invoke(instance, new Object[] {});
+    }
 
     /**
      * Call the callback on the given instance with the given argument.
+     * 
      * @param instance : the instance on which call the callback
      * @param ref : the service reference to send to the callback
      * @throws NoSuchMethodException : the method is not found
@@ -190,13 +201,14 @@
      * @throws InvocationTargetException
      */
     protected void callOnInstance(Object instance, ServiceReference ref) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
-    	Method method = instance.getClass().getDeclaredMethod(m_callback, new Class[] {ServiceReference.class});
-    	method.setAccessible(true);
-    	method.invoke(instance, new Object[] {ref});
+        Method method = instance.getClass().getDeclaredMethod(m_callback, new Class[] { ServiceReference.class });
+        method.setAccessible(true);
+        method.invoke(instance, new Object[] { ref });
     }
-    
+
     /**
      * 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
@@ -205,8 +217,8 @@
      * @throws InvocationTargetException
      */
     protected void callOnInstance(Object instance, Object o) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
-    	Method method = instance.getClass().getDeclaredMethod(m_callback, new Class[] {Object.class});
-    	method.setAccessible(true);
-    	method.invoke(instance, new Object[] {o});
+        Method method = instance.getClass().getDeclaredMethod(m_callback, new Class[] { Object.class });
+        method.setAccessible(true);
+        method.invoke(instance, new Object[] { o });
     }
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java
index 6919911..8da733c 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java
@@ -63,29 +63,14 @@
      */
     private ServiceReference[] m_serviceReferences;
 
-    /**
-     * @return true if the dependency is a multiple dependency.
-     */
     public boolean isMultiple() { return m_multiple; }
 
-    /**
-     * @return true if the dependency is an optional dependency.
-     */
     public boolean isOptional() { return m_optional; }
 
-    /**
-     * @return the filter.
-     */
     public String getFilter() { return m_filter; }
 
-    /**
-     * @return the needed interface.
-     */
     public String getInterface() { return m_interface; }
 
-    /**
-     * @return the state of the dependency.
-     */
     public int getState() { return m_state; }
 
     /**
@@ -107,11 +92,13 @@
     }
 
     /**
+     * Get the service refrence array.
      * @return the array of service reference (only if the cardinality could be n).
      */
     public ServiceReference[] getServiceReferences() { return m_serviceReferences; }
 
     /**
+     * Get the service reference if only 1 used.
      * @return the ServiceReference (only if the cardinality could be 1).
      */
     public ServiceReference getServiceReference() { return m_serviceReferences[0]; }
@@ -123,6 +110,7 @@
     public void setServiceReferences(ServiceReference[] sr) { m_serviceReferences = sr; }
 
     /**
+     * Get the used service map.
      * @return the hashmap [object reference, service reference] containing the used services
      */
     public HashMap getUsedServices() { return m_usedServices; }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java
index 210f0e5..93cecdd 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java
@@ -30,6 +30,7 @@
 
 /**
  * The dependency handler manages a list of dependencies.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class DependencyHandler extends Handler {
@@ -54,10 +55,11 @@
      */
     private int m_state;
 
-//  ===================== Fields getters & setters =====================
+    // ===================== Fields getters & setters =====================
 
     /**
      * Add a dependency.
+     * 
      * @param dep : the dependency to add
      */
     private void addDependency(Dependency dep) {
@@ -72,12 +74,13 @@
             newDep[m_dependencies.length] = dep;
             m_dependencies = newDep;
         } else {
-            m_dependencies = new Dependency[] {dep};
+            m_dependencies = new Dependency[] { dep };
         }
     }
 
     /**
      * Add a nullable class.
+     * 
      * @param clazz : the class to add
      */
     private void addNullableClass(Class clazz) {
@@ -92,21 +95,27 @@
             newClass[m_nullableClasses.length] = clazz;
             m_nullableClasses = newClass;
         } else {
-            m_nullableClasses = new Class[] {clazz};
+            m_nullableClasses = new Class[] { clazz };
         }
     }
 
     /**
+     * Get the list of managed dependency.
      * @return the dependency list
      */
-    public Dependency[] getDependencies() { return m_dependencies; }
+    public Dependency[] getDependencies() {
+        return m_dependencies;
+    }
 
     /**
+     * Get the instance manager.
      * @return the instance manager
      */
-    protected InstanceManager getInstanceManager() { return m_manager; }
+    protected InstanceManager getInstanceManager() {
+        return m_manager;
+    }
 
-//  ===================== Handler implementation =====================
+    // ===================== Handler implementation =====================
 
     /**
      * Check the validity of the dependencies.
@@ -124,7 +133,7 @@
             if (validateComponentDependencies()) {
                 // The dependencies are valid
                 if (initialState == InstanceManager.INVALID) {
-                    //There is a state change
+                    // There is a state change
                     m_state = InstanceManager.VALID;
                     m_manager.checkInstanceState();
                 }
@@ -132,7 +141,7 @@
             } else {
                 // The dependencies are not valid
                 if (initialState == InstanceManager.VALID) {
-                    //There is a state change
+                    // There is a state change
                     m_state = InstanceManager.INVALID;
                     m_manager.checkInstanceState();
                 }
@@ -143,8 +152,11 @@
     }
 
     /**
-     * Check if the dependency given is valid in the sense that metadata are consistent.
+     * Check if the dependency given is valid in the sense that metadata are
+     * consistent.
+     * 
      * @param dep : the dependency to check
+     * @param manipulation : the component-type manipulation metadata
      * @return true if the dependency is valid
      */
     private boolean checkDependency(Dependency dep, Element manipulation) {
@@ -160,7 +172,8 @@
         }
 
         if (type == null) {
-            m_manager.getFactory().getLogger().log(Logger.ERROR, "[DependencyHandler on " + m_manager.getClassName() + "] A declared dependency was not found in the class : " + dep.getField());
+            m_manager.getFactory().getLogger().log(Logger.ERROR,
+                    "[DependencyHandler on " + m_manager.getClassName() + "] A declared dependency was not found in the class : " + dep.getField());
             return false;
         }
 
@@ -171,21 +184,30 @@
                 type = type.substring(0, type.length() - 2);
             }
 
-            if (dep.getSpecification() == null) { dep.setSpecification(type); }
+            if (dep.getSpecification() == null) {
+                dep.setSpecification(type);
+            }
 
             if (!dep.getSpecification().equals(type)) {
-                m_manager.getFactory().getLogger().log(Logger.WARNING, "[DependencyHandler on " + m_manager.getClassName() + "] The field type [" + type + "] and the needed service interface [" + dep.getSpecification() + "] are not the same");
+                m_manager.getFactory().getLogger().log(
+                        Logger.WARNING,
+                        "[DependencyHandler on " + m_manager.getClassName() + "] The field type [" + type + "] and the needed service interface ["
+                                + dep.getSpecification() + "] are not the same");
                 dep.setSpecification(type);
             }
         } else {
-            m_manager.getFactory().getLogger().log(Logger.WARNING, "[DependencyHandler on " + m_manager.getClassName() + "] The declared dependency " + dep.getField() + "  does not exist in the code");
+            m_manager.getFactory().getLogger().log(Logger.WARNING,
+                    "[DependencyHandler on " + m_manager.getClassName() + "] The declared dependency " + dep.getField() + "  does not exist in the code");
         }
         return true;
     }
 
-
     /**
-     * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.InstanceManager, org.apache.felix.ipojo.metadata.Element)
+     * Configure the handler.
+     * @param im : the instance manager
+     * @param componentMetadata : the component type metadata
+     * @param configuration : the instance configuration
+     * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.InstanceManager, org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
      */
     public void configure(InstanceManager im, Element componentMetadata, Dictionary configuration) {
         m_manager = im;
@@ -198,19 +220,26 @@
             // Create the dependency metadata
             String field = deps[i].getAttribute("field");
             String serviceSpecification = null;
-            if (deps[i].containsAttribute("interface")) { serviceSpecification = deps[i].getAttribute("interface"); }
+            if (deps[i].containsAttribute("interface")) {
+                serviceSpecification = deps[i].getAttribute("interface");
+            }
             String filter = "";
-            if (deps[i].containsAttribute("filter")) { filter = deps[i].getAttribute("filter"); }
+            if (deps[i].containsAttribute("filter")) {
+                filter = deps[i].getAttribute("filter");
+            }
             boolean optional = false;
-            if (deps[i].containsAttribute("optional") && deps[i].getAttribute("optional").equals("true")) { optional = true; }
+            if (deps[i].containsAttribute("optional") && deps[i].getAttribute("optional").equals("true")) {
+                optional = true;
+            }
 
             Dependency dep = new Dependency(this, field, serviceSpecification, filter, optional);
             // Check the dependency :
             Element manipulation = componentMetadata.getElements("Manipulation")[0];
-            if (checkDependency(dep, manipulation)) { 
-            	addDependency(dep); 
-            } else { 
-            	m_manager.getFactory().getLogger().log(Logger.ERROR, "[DependencyHandler on " + m_manager.getClassName() + "] The dependency on " + dep.getField() + " is not valid");
+            if (checkDependency(dep, manipulation)) {
+                addDependency(dep);
+            } else {
+                m_manager.getFactory().getLogger().log(Logger.ERROR,
+                        "[DependencyHandler on " + m_manager.getClassName() + "] The dependency on " + dep.getField() + " is not valid");
             }
 
             // Look for dependency callback :
@@ -218,13 +247,16 @@
                 String method = deps[i].getElements("Callback", "")[j].getAttribute("method");
                 String type = deps[i].getElements("Callback", "")[j].getAttribute("type");
                 int methodType = 0;
-                if (type.equals("bind")) { 
-                	methodType = DependencyCallback.BIND; 
-                } else { 
-                	methodType = DependencyCallback.UNBIND;
+                if (type.equals("bind")) {
+                    methodType = DependencyCallback.BIND;
+                } else {
+                    methodType = DependencyCallback.UNBIND;
                 }
                 boolean isStatic = false;
-                if (deps[i].getElements("Callback", "")[j].containsAttribute("isStatic") && deps[i].getElements("Callback", "")[j].getAttribute("isStatic").equals("true")) { isStatic = true; }
+                if (deps[i].getElements("Callback", "")[j].containsAttribute("isStatic")
+                        && deps[i].getElements("Callback", "")[j].getAttribute("isStatic").equals("true")) {
+                    isStatic = true;
+                }
                 DependencyCallback dc = new DependencyCallback(dep, method, methodType, isStatic);
                 dep.addDependencyCallback(dc);
             }
@@ -241,36 +273,45 @@
 
     /**
      * Create a nullable class for the given dependency.
+     * 
      * @param dep : the dependency
      */
     private void createNullableClass(Dependency dep) {
-        m_manager.getFactory().getLogger().log(Logger.INFO, "[DependencyHandler on " + m_manager.getClassName() + "] Try to load the nullable class for " + dep.getSpecification());
-        
-        //String[] segment = dep.getMetadata().getServiceSpecification().split("[.]");
-        //String className = "org/apache/felix/ipojo/" + segment[segment.length - 1] + "Nullable";
-		String className = dep.getSpecification() + "Nullable";
+        m_manager.getFactory().getLogger().log(Logger.INFO,
+                "[DependencyHandler on " + m_manager.getClassName() + "] Try to load the nullable class for " + dep.getSpecification());
+
+        // String[] segment =
+        // dep.getMetadata().getServiceSpecification().split("[.]");
+        // String className = "org/apache/felix/ipojo/" + segment[segment.length
+        // - 1] + "Nullable";
+        String className = dep.getSpecification() + "Nullable";
         String resource = dep.getSpecification().replace('.', '/') + ".class";
-        URL url =  m_manager.getContext().getBundle().getResource(resource);
+        URL url = m_manager.getContext().getBundle().getResource(resource);
 
         try {
-            byte[] b = NullableObjectWriter.dump(url,  dep.getSpecification());
+            byte[] b = NullableObjectWriter.dump(url, dep.getSpecification());
             Class c = null;
             try {
-            	c = m_manager.getFactory().defineClass(className, b, null);
-            } catch (Exception e) { 
-            	System.err.println("Cannot define !!!");
+                c = m_manager.getFactory().defineClass(className, b, null);
+            } catch (Exception e) {
+                m_manager.getFactory().getLogger().log(Logger.ERROR, "Cannot define the nullable class : " + e.getMessage());
+                return;
             }
-            addNullableClass(c); 
-            m_manager.getFactory().getLogger().log(Logger.INFO, "[DependencyHandler on " + m_manager.getClassName() + "] Nullable class created for " + dep.getSpecification());
+            addNullableClass(c);
+            m_manager.getFactory().getLogger().log(Logger.INFO,
+                    "[DependencyHandler on " + m_manager.getClassName() + "] Nullable class created for " + dep.getSpecification());
         } catch (Exception e2) {
-            m_manager.getFactory().getLogger().log(Logger.ERROR, "[DependencyHandler on " + m_manager.getClassName() + "] Cannot load the nullable class for  " + dep.getSpecification(), e2);
+            m_manager.getFactory().getLogger().log(Logger.ERROR,
+                    "[DependencyHandler on " + m_manager.getClassName() + "] Cannot load the nullable class for  " + dep.getSpecification(), e2);
         }
     }
 
     /**
      * Return the nullable class corresponding to the given name.
+     * 
      * @param name the needed type
-     * @return the class correspondig to the name, or null if the class does not exist.
+     * @return the class correspondig to the name, or null if the class does not
+     * exist.
      */
     protected Class getNullableClass(String name) {
         for (int i = 0; i < m_nullableClasses.length; i++) {
@@ -283,10 +324,13 @@
     }
 
     /**
+     * GetterCallback Method.
+     * @param fieldName : the field name.
+     * @param value : the value passed to the field (by the previous handler).
+     * @return the object that the dependency handler want to push.
      * @see org.apache.felix.ipojo.Handler#getterCallback(java.lang.String, java.lang.Object)
      */
     public Object getterCallback(String fieldName, Object value) {
-        //TODO : non effiecent
         for (int i = 0; i < m_dependencies.length; i++) {
             Dependency dep = m_dependencies[i];
             if (dep.getField().equals(fieldName)) {
@@ -299,22 +343,28 @@
     }
 
     /**
+     * Check the handler validity.
+     * @return true if all mandatory dependencies are resolved.
      * @see org.apache.felix.ipojo.Handler#isValid()
      */
     public boolean isValid() {
-        return (m_state == InstanceManager.VALID);
+        return m_state == InstanceManager.VALID;
     }
 
     /**
+     * Handler start method.
      * @see org.apache.felix.ipojo.Handler#start()
      */
     public void start() {
         m_manager.getFactory().getLogger().log(Logger.INFO, "[DependencyHandler on " + m_manager.getClassName() + "] Start the dependency handler");
 
-        // Start the dependencies, for optional dependencies create Nullable class
+        // Start the dependencies, for optional dependencies create Nullable
+        // class
         for (int i = 0; i < m_dependencies.length; i++) {
             Dependency dep = m_dependencies[i];
-            if (dep.isOptional() && !dep.isMultiple()) { createNullableClass(dep); }
+            if (dep.isOptional() && !dep.isMultiple()) {
+                createNullableClass(dep);
+            }
             dep.start();
         }
         // Check the state
@@ -323,19 +373,29 @@
     }
 
     /**
+     * Handler stateChanged method.
+     * @param state : new instance state
      * @see org.apache.felix.ipojo.Handler#stateChanged(int)
      */
-    public void stateChanged(int state) { m_state = state; }
+    public void stateChanged(int state) {
+        m_state = state;
+    }
 
     /**
+     * Handler stop method.
      * @see org.apache.felix.ipojo.Handler#stop()
      */
     public void stop() {
-        for (int i = 0; i < m_dependencies.length; i++) { m_dependencies[i].stop(); }
+        for (int i = 0; i < m_dependencies.length; i++) {
+            m_dependencies[i].stop();
+        }
         m_nullableClasses = new Class[0];
     }
 
     /**
+     * Handler createInstance method.
+     * This method is overided to allow delayed callback invocation.
+     * @param instance : the created object
      * @see org.apache.felix.ipojo.Handler#createInstance(java.lang.Object)
      */
     public void createInstance(Object instance) {
@@ -345,6 +405,7 @@
     }
 
     /**
+     * Check if dependencies are resolved.
      * @return true if all dependencies are resolved.
      */
     private boolean validateComponentDependencies() {
@@ -353,15 +414,18 @@
             Dependency dep = m_dependencies[i];
             valide = valide & dep.isSatisfied();
             if (!valide) {
-                m_manager.getFactory().getLogger().log(Logger.INFO, "[DependencyHandler on " + m_manager.getClassName() + "] Component Dependencies are not valid : " + dep.getSpecification());
+                m_manager.getFactory().getLogger().log(Logger.INFO,
+                        "[DependencyHandler on " + m_manager.getClassName() + "] Component Dependencies are not valid : " + dep.getSpecification());
                 return false;
             }
         }
         m_manager.getFactory().getLogger().log(Logger.INFO, "[DependencyHandler on " + m_manager.getClassName() + "] Component Dependencies are valid");
         return valide;
     }
-    
+
     /**
+     * Get the dependency handler description.
+     * @return the dependency handler description.
      * @see org.apache.felix.ipojo.Handler#getDescription()
      */
     public HandlerDescription getDescription() {
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java
index a67109d..10a6344 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java
@@ -21,14 +21,16 @@
 import java.util.Iterator;
 
 import org.apache.felix.ipojo.architecture.HandlerDescription;
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
 
 /**
  * Dependency Handler Description.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class DependencyHandlerDescription extends HandlerDescription {
 
-
     /**
      * Dependencies managed by the dependency handler.
      */
@@ -36,6 +38,7 @@
 
     /**
      * Constructor.
+     * 
      * @param isValid : the validity of the dependency handler.
      */
     public DependencyHandlerDescription(boolean isValid) {
@@ -43,19 +46,24 @@
     }
 
     /**
+     * Get dependencies description.
      * @return the dependencies list.
      */
-    public DependencyDescription[] getDependencies() { return m_dependencies; }
+    public DependencyDescription[] getDependencies() {
+        return m_dependencies;
+    }
 
     /**
      * Add a dependency.
+     * 
      * @param dep : the dependency to add
      */
     public void addDependency(DependencyDescription dep) {
         // Verify that the dependency description is not already in the array.
-        for (int i = 0; (i < m_dependencies.length); i++) {
+        for (int i = 0; i < m_dependencies.length; i++) {
             if (m_dependencies[i] == dep) {
-                return; //NOTHING TO DO, the description is already in the array
+                return; // NOTHING TO DO, the description is already in the
+                        // array
             }
         }
         // The component Description is not in the array, add it
@@ -66,21 +74,31 @@
     }
 
     /**
+     * Build Dependency Handler description.
+     * @return the handler description.
      * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
      */
-    public String getHandlerInfo() {
-        String info = "";
+    public Element getHandlerInfo() {
+        Element deps = super.getHandlerInfo();
         for (int i = 0; i < m_dependencies.length; i++) {
             String state = "resolved";
-            if (m_dependencies[i].getState() == 2) { state = "unresolved"; }
-            info += "\t Dependency on " + m_dependencies[i].getInterface() + "[" + m_dependencies[i].getFilter() + "] is " + state;
+            if (m_dependencies[i].getState() == 2) {
+                state = "unresolved";
+            }
+            Element dep = new Element("Dependency", "");
+            dep.addAttribute(new Attribute("Specification", m_dependencies[i].getInterface()));
+            dep.addAttribute(new Attribute("Filter", m_dependencies[i].getFilter()));
+            dep.addAttribute(new Attribute("State", state));
+            Element usages = new Element("Usages", "");
             Iterator it = m_dependencies[i].getUsedServices().keySet().iterator();
             while (it.hasNext()) {
-                info += "\n \t\t Uses : " + it.next();
+                Element use = new Element("Use", "");
+                use.addAttribute(new Attribute("object", it.next().toString()));
+                usages.addElement(use);
             }
-            info += "\n";
+            deps.addElement(dep);
         }
-        return info;
+        return deps;
     }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/nullable/MethodSignature.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/nullable/MethodSignature.java
index 93d1530..7dd02f0 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/nullable/MethodSignature.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/nullable/MethodSignature.java
@@ -43,7 +43,7 @@
     /**
      * Exception thored by the method.
      */
-    private String[] m_exception;
+    private String[] m_exception = new String[0];
 
     /**
      * MethodSignature constructor.
@@ -57,10 +57,11 @@
         m_name = name;
         m_desc = desc;
         m_signature = sign;
-        m_exception = exc;
+        if (exc != null) { m_exception = exc; }
     }
 
     /**
+     * Get the method description.
      * @return the description of the method.
      */
     public String getDesc() {
@@ -68,6 +69,7 @@
     }
 
     /**
+     * Get the list of declared exception.
      * @return the String array of exception throwed by the method.
      */
     public String[] getException() {
@@ -75,6 +77,7 @@
     }
 
     /**
+     * Get the method name.
      * @return the name of the method.
      */
     public String getName() {
@@ -82,6 +85,7 @@
     }
 
     /**
+     * Get the method signature.
      * @return the signature of the method.
      */
     public String getSignature() {
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/nullable/MethodSignatureVisitor.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/nullable/MethodSignatureVisitor.java
index a5d9799..a1f64b9 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/nullable/MethodSignatureVisitor.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/nullable/MethodSignatureVisitor.java
@@ -60,7 +60,8 @@
     }
 
     /**
-     * @return the mthod signature array.
+     * Get the method signatures list.
+     * @return the method signature array.
      */
     public MethodSignature[] getMethods() {
         return m_methods;
@@ -86,6 +87,7 @@
     }
 
     /**
+     * Visit a method.
      * @see org.objectweb.asm.ClassVisitor#visit(int, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[])
      * @param arg0 : version
      * @param arg1 : access
@@ -97,6 +99,7 @@
     public void visit(int arg0, int arg1, String arg2, String arg3, String arg4, String[] arg5) { }
 
     /**
+     * Visit sources.
      * @see org.objectweb.asm.ClassVisitor#visitSource(java.lang.String, java.lang.String)
      * @param arg0 : source
      * @param arg1 : debug
@@ -104,6 +107,7 @@
     public void visitSource(String arg0, String arg1) { }
 
     /**
+     * Visit an outer class.
      * @see org.objectweb.asm.ClassVisitor#visitOuterClass(java.lang.String, java.lang.String, java.lang.String)
      * @param arg0 : owner
      * @param arg1 : name
@@ -112,6 +116,7 @@
     public void visitOuterClass(String arg0, String arg1, String arg2) { }
 
     /**
+     * Visit an annotation.
      * @see org.objectweb.asm.ClassVisitor#visitAnnotation(java.lang.String, boolean)
      * @param arg0 : desc
      * @param arg1 : visible
@@ -120,12 +125,14 @@
     public AnnotationVisitor visitAnnotation(String arg0, boolean arg1) { return null; }
 
     /**
+     * Visit an attribute.
      * @see org.objectweb.asm.ClassVisitor#visitAttribute(org.objectweb.asm.Attribute)
      * @param arg0 : Attribute
      */
     public void visitAttribute(Attribute arg0) { }
 
     /**
+     * Visit an inner class.
      * @see org.objectweb.asm.ClassVisitor#visitInnerClass(java.lang.String, java.lang.String, java.lang.String, int)
      * @param arg0 : name
      * @param arg1 : outerclass
@@ -135,6 +142,7 @@
     public void visitInnerClass(String arg0, String arg1, String arg2, int arg3) { }
 
     /**
+     * Visit a field.
      * @see org.objectweb.asm.ClassVisitor#visitField(int, java.lang.String, java.lang.String, java.lang.String, java.lang.Object)
      * @param arg0 : access
      * @param arg1 : name
@@ -146,6 +154,7 @@
     public FieldVisitor visitField(int arg0, String arg1, String arg2, String arg3, Object arg4) { return null; }
 
     /**
+     * End of the visit.
      * @see org.objectweb.asm.ClassVisitor#visitEnd()
      */
     public void visitEnd() { }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/nullable/NullableObjectWriter.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/nullable/NullableObjectWriter.java
index 0228e10..132f56e 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/nullable/NullableObjectWriter.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/nullable/NullableObjectWriter.java
@@ -18,7 +18,6 @@
  */
 package org.apache.felix.ipojo.handlers.dependency.nullable;
 
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
@@ -29,19 +28,22 @@
 import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.Type;
 
-/** Create the proxy class.
+/**
+ * Create the proxy class.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class NullableObjectWriter implements Opcodes {
 
-    /** Return the proxy classname for the contract contractname
-     * on the service object soc.
+    /**
+     * Return the proxy classname for the contract contractname on the service
+     * object soc.
+     * 
      * @param url URL of the needed contract
      * @param contractName String
      * @return byte[]
      */
-    public static byte[] dump(URL url,
-            String contractName) {
+    public static byte[] dump(URL url, String contractName) {
 
         ClassReader cr = null;
         InputStream is = null;
@@ -55,14 +57,14 @@
 
             ClassWriter cw = new ClassWriter(true);
 
-            //String[] segment = contractName.split("[.]");
-            //String className = "org/apache/felix/ipojo/" + segment[segment.length - 1] + "Nullable";
+            // String[] segment = contractName.split("[.]");
+            // String className = "org/apache/felix/ipojo/" +
+            // segment[segment.length - 1] + "Nullable";
             String className = contractName.replace('.', '/') + "Nullable";
 
-
             // Create the class
-            cw.visit(V1_2, ACC_PUBLIC + ACC_SUPER, className, null,
-                    "java/lang/Object", new String[]{contractName.replace('.', '/'), "org/apache/felix/ipojo/Nullable"});
+            cw.visit(V1_2, ACC_PUBLIC + ACC_SUPER, className, null, "java/lang/Object", new String[] { contractName.replace('.', '/'),
+                "org/apache/felix/ipojo/Nullable" });
 
             // Inject a constructor <INIT>()V
             MethodVisitor cst = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
@@ -85,38 +87,43 @@
                 MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, name, desc, sign, exc);
 
                 Type returnType = Type.getReturnType(desc);
-                    // TODO : manage the other type primitive for Nullable
-                    // Primitive type :
+                // Primitive type :
                 switch (returnType.getSort()) {
                     case Type.BOOLEAN:
                     case Type.INT:
                     case Type.BYTE:
+                    case Type.CHAR:
                     case Type.SHORT:
                         // Integer or Boolean : return 0 ( false)
                         mv.visitInsn(ICONST_0);
                         mv.visitInsn(IRETURN);
                         break;
                     case Type.LONG:
-                    	mv.visitInsn(LCONST_0);
-                    	mv.visitInsn(LRETURN);
-                    	break;
+                        mv.visitInsn(LCONST_0);
+                        mv.visitInsn(LRETURN);
+                        break;
                     case Type.DOUBLE:
                         // Double : return 0.0
                         mv.visitInsn(DCONST_0);
                         mv.visitInsn(DRETURN);
                         break;
-                    case Type.ARRAY :
-                    case Type.OBJECT :
+                    case Type.FLOAT:
+                        // Double : return 0.0
+                        mv.visitInsn(FCONST_0);
+                        mv.visitInsn(FRETURN);
+                        break;
+                    case Type.ARRAY:
+                    case Type.OBJECT:
                         // Return always null for array and object
                         mv.visitInsn(ACONST_NULL);
                         mv.visitInsn(ARETURN);
                         break;
-                    case Type.VOID :
+                    case Type.VOID:
                         mv.visitInsn(RETURN);
                         break;
-                    default :
+                    default:
                         System.err.println("Type not yet managed : " + returnType);
-                    	break;
+                        break;
                 }
                 mv.visitMaxs(0, 0);
                 mv.visitEnd();
@@ -124,7 +131,7 @@
 
             // End process
             cw.visitEnd();
-            b =  cw.toByteArray();
+            b = cw.toByteArray();
 
         } catch (IOException e) {
             e.printStackTrace();
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallback.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallback.java
index 95d9588..5385d38 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallback.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallback.java
@@ -25,11 +25,12 @@
 
 /**
  * This class is the implementation of callback on lifecycle transition.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class LifecycleCallback {
-	
-	 /**
+
+    /**
      * Initial state of the transition.
      */
     private int m_initialState;
@@ -43,7 +44,7 @@
      * Callback object.
      */
     private Callback m_callback;
-    
+
     /**
      * Method called by the callback.
      */
@@ -51,6 +52,7 @@
 
     /**
      * LifecycleCallback constructor.
+     * 
      * @param hh : the callback handler calling the callback
      * @param initialState : initial state of the callback
      * @param finalState : finali state of the callback
@@ -58,17 +60,27 @@
      * @param isStatic : is the method static ?
      */
     public LifecycleCallback(LifecycleCallbackHandler hh, String initialState, String finalState, String method, boolean isStatic) {
-    	if (initialState.equals("VALID")) { m_initialState = InstanceManager.VALID; }
-        if (initialState.equals("INVALID")) { m_initialState = InstanceManager.INVALID; }
-        if (finalState.equals("VALID")) { m_finalState = InstanceManager.VALID; }
-        if (finalState.equals("INVALID")) { m_finalState = InstanceManager.INVALID; }
-        
+        if (initialState.equals("VALID")) {
+            m_initialState = InstanceManager.VALID;
+        }
+        if (initialState.equals("INVALID")) {
+            m_initialState = InstanceManager.INVALID;
+        }
+        if (finalState.equals("VALID")) {
+            m_finalState = InstanceManager.VALID;
+        }
+        if (finalState.equals("INVALID")) {
+            m_finalState = InstanceManager.INVALID;
+        }
+
         m_method = method;
         m_callback = new Callback(method, isStatic, hh.getInstanceManager());
     }
 
     /**
-     * Call the hook method when the transition from inital to final state is detected.
+     * Call the hook method when the transition from inital to final state is
+     * detected.
+     * 
      * @throws NoSuchMethodException : Method is not found in the class
      * @throws InvocationTargetException : The method is not static
      * @throws IllegalAccessException : The method can not be invoked
@@ -76,24 +88,17 @@
     protected void call() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
         m_callback.call();
     }
-    
-    /**
-     * @return Returns the m_finalState.
-     */
+
     public int getFinalState() {
         return m_finalState;
     }
 
-    /**
-     * @return Returns the m_initialState.
-     */
     public int getInitialState() {
         return m_initialState;
     }
-    
-    /**
-     * @return the method called by this callback.
-     */
-    public String getMethod() { return m_method; }
+
+    public String getMethod() {
+        return m_method;
+    }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallbackHandler.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallbackHandler.java
index 3ee96ea..931612e 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallbackHandler.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallbackHandler.java
@@ -29,6 +29,7 @@
 
 /**
  * Lifecycle callback handler.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class LifecycleCallbackHandler extends Handler {
@@ -48,18 +49,21 @@
      */
     private InstanceManager m_manager;
 
-	/**
-	 * Does a POJO object be created at starting.
-	 */
-	private boolean m_immediate = false;
+    /**
+     * Does a POJO object be created at starting.
+     */
+    private boolean m_immediate = false;
 
     /**
      * Add the given callback to the callback list.
+     * 
      * @param hk : the element to add
      */
     private void addCallback(LifecycleCallback hk) {
         for (int i = 0; (m_callbacks != null) && (i < m_callbacks.length); i++) {
-            if (m_callbacks[i] == hk) { return; }
+            if (m_callbacks[i] == hk) {
+                return;
+            }
         }
 
         if (m_callbacks.length > 0) {
@@ -68,19 +72,25 @@
             newHk[m_callbacks.length] = hk;
             m_callbacks = newHk;
         } else {
-            m_callbacks = new LifecycleCallback[] {hk};
+            m_callbacks = new LifecycleCallback[] { hk };
         }
 
     }
 
     /**
-     * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.InstanceManager, org.apache.felix.ipojo.metadata.Element)
+     * Configure the handler.
+     * @param cm : the instance manager
+     * @param metadata : the component type metadata
+     * @param configuration : the instance configuration
+     * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.InstanceManager, org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
      */
     public void configure(InstanceManager cm, Element metadata, Dictionary configuration) {
         m_manager = cm;
         m_callbacks = new LifecycleCallback[0];
-        
-        if (metadata.containsAttribute("immediate") && metadata.getAttribute("immediate").equalsIgnoreCase("true")) { m_immediate = true; }
+
+        if (metadata.containsAttribute("immediate") && metadata.getAttribute("immediate").equalsIgnoreCase("true")) {
+            m_immediate = true;
+        }
 
         Element[] hooksMetadata = metadata.getElements("callback");
         for (int i = 0; i < hooksMetadata.length; i++) {
@@ -89,20 +99,27 @@
             String finalState = hooksMetadata[i].getAttribute("final");
             String method = hooksMetadata[i].getAttribute("method");
             boolean isStatic = false;
-            if (hooksMetadata[i].containsAttribute("isStatic") && hooksMetadata[i].getAttribute("isStatic").equals("true")) { isStatic = true; }
+            if (hooksMetadata[i].containsAttribute("isStatic") && hooksMetadata[i].getAttribute("isStatic").equals("true")) {
+                isStatic = true;
+            }
 
             LifecycleCallback hk = new LifecycleCallback(this, initialState, finalState, method, isStatic);
             addCallback(hk);
         }
-        if (m_callbacks.length > 0 || m_immediate) { m_manager.register(this); }
+        if (m_callbacks.length > 0 || m_immediate) {
+            m_manager.register(this);
+        }
     }
 
     /**
+     * Start the handler. 
      * @see org.apache.felix.ipojo.Handler#start()
      */
-    public void start() { } //Do nothing during the start
+    public void start() {
+    } // Do nothing during the start
 
     /**
+     * Stop the handler.
      * @see org.apache.felix.ipojo.Handler#stop()
      */
     public void stop() {
@@ -110,30 +127,40 @@
     }
 
     /**
+     * Get the instance manager.
      * @return the instance manager
      */
-    protected InstanceManager getInstanceManager() { return m_manager; }
+    protected InstanceManager getInstanceManager() {
+        return m_manager;
+    }
 
     /**
-     * When the state change call the associated hooks.
+     * When the state change call the associated callback.
+     * 
+     * @param state : the new isntance state.
      * @see org.apache.felix.ipojo.Handler#stateChanged(int)
      */
     public void stateChanged(int state) {
-    	// Manage immediate component
-    	if (m_state == ComponentInstance.INVALID && state == ComponentInstance.VALID && m_manager.getPojoObjects().length == 0) {
-    		m_manager.createPojoObject();
-    	}
-    	
+        // Manage immediate component
+        if (m_state == ComponentInstance.INVALID && state == ComponentInstance.VALID && m_manager.getPojoObjects().length == 0) {
+            m_manager.createPojoObject();
+        }
+
         for (int i = 0; i < m_callbacks.length; i++) {
             if (m_callbacks[i].getInitialState() == m_state && m_callbacks[i].getFinalState() == state) {
                 try {
                     m_callbacks[i].call();
                 } catch (NoSuchMethodException e) {
-                    m_manager.getFactory().getLogger().log(Logger.ERROR, "[" + m_manager.getClassName() + "] The callback method " + m_callbacks[i].getMethod() + " is not found", e);
+                    m_manager.getFactory().getLogger().log(Logger.ERROR,
+                            "[" + m_manager.getClassName() + "] The callback method " + m_callbacks[i].getMethod() + " is not found", e);
                 } catch (IllegalAccessException e) {
-                	m_manager.getFactory().getLogger().log(Logger.ERROR, "[" + m_manager.getClassName() + "] The callback method " + m_callbacks[i].getMethod() + " is not accessible", e);
+                    m_manager.getFactory().getLogger().log(Logger.ERROR,
+                            "[" + m_manager.getClassName() + "] The callback method " + m_callbacks[i].getMethod() + " is not accessible", e);
                 } catch (InvocationTargetException e) {
-                	m_manager.getFactory().getLogger().log(Logger.ERROR, "[" + m_manager.getClassName() + "] The callback method " + m_callbacks[i].getMethod() + " has throws an exception : " + e.getMessage() + " -> " + e.getCause());
+                    m_manager.getFactory().getLogger().log(
+                            Logger.ERROR,
+                            "[" + m_manager.getClassName() + "] The callback method " + m_callbacks[i].getMethod() + " has throws an exception : "
+                                    + e.getMessage() + " -> " + e.getCause());
                 }
             }
         }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/Property.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/Property.java
index 6e0664f..c468932 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/Property.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/Property.java
@@ -27,18 +27,17 @@
 import org.apache.felix.ipojo.util.Logger;
 
 /**
- * Represent a property i.e. a set : [name, type, value].
- * A property can be attached to a field.
- * The value of the property is thefield value.
- * When the value change, the published value change too.
+ * Represent a property i.e. a set : [name, type, value]. A property can be
+ * attached to a field. The value of the property is thefield value. When the
+ * value change, the published value change too.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class Property {
 
     /**
-     * A property is link with a service.
-     * This field represent this provided service.
-     * m_providedService : ProvidedService
+     * A property is link with a service. This field represent this provided
+     * service. m_providedService : ProvidedService
      */
     private ProvidedService m_providedService;
 
@@ -46,7 +45,7 @@
      * Value of the property (before we know the type).
      */
     private Object m_value;
-    
+
     /**
      * Field of the property.
      */
@@ -69,6 +68,7 @@
 
     /**
      * Property constructor.
+     * 
      * @param ps : the provided service
      * @param name : name of the property
      * @param field : name of the field (if a field is attached to the property)
@@ -85,27 +85,38 @@
 
         // Dynamic property case :
         if (m_field != null) {
-            if (m_name == null) { m_name = m_field; }
+            if (m_name == null) {
+                m_name = m_field;
+            }
         }
-        
+
         // Check type if not already set
         if (m_type == null) {
-        	if (field == null) { ps.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "The property " + m_name + " has neither type neither field."); return; }
+            if (field == null) {
+                ps.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "The property " + m_name + " has neither type neither field.");
+                return;
+            }
             for (int j = 0; j < manipulation.getElements("Field").length; j++) {
                 if (field.equals(manipulation.getElements("Field")[j].getAttribute("name"))) {
                     m_type = manipulation.getElements("Field")[j].getAttribute("type");
                     break;
                 }
             }
-            if (m_type == null) { m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + ps.getInstanceManager().getClassName() + "] A declared property was not found in the class : " + m_field); }
+            if (m_type == null) {
+                m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                        "[" + ps.getInstanceManager().getClassName() + "] A declared property was not found in the class : " + m_field);
+            }
         }
-        
-        if (m_initialValue != null) { setValue(m_initialValue); }
+
+        if (m_initialValue != null) {
+            setValue(m_initialValue);
+        }
     }
 
     /**
-     * Property constructor.
-     * This constructor is used only for non-field property (property not attached to a field).
+     * Property constructor. This constructor is used only for non-field
+     * property (property not attached to a field).
+     * 
      * @param ps : the provided service
      * @param name : the name of the property
      * @param value : the value of the property
@@ -118,13 +129,17 @@
     }
 
     /**
+     * Get the property value.
      * @return the Object value of the property
      */
-    protected Object get() { return m_value; }
+    protected Object get() {
+        return m_value;
+    }
 
     /**
-     * This method is automaticaly called when the value of the property is changed.
-     * Set the value of a property.
+     * This method is automaticaly called when the value of the property is
+     * changed. Set the value of a property.
+     * 
      * @param s : the new value of the property (in String)
      */
     protected void set(String s) {
@@ -132,8 +147,9 @@
     }
 
     /**
-     * This method is called when the value of the property is changed.
-     * Set the value of a property.
+     * This method is called when the value of the property is changed. Set the
+     * value of a property.
+     * 
      * @param o : the new value of the property (object)
      */
     protected void set(Object o) {
@@ -142,6 +158,7 @@
 
     /**
      * Set the provided service of this property.
+     * 
      * @param ps : the provided service to attached.
      */
     void setProvidedService(ProvidedService ps) {
@@ -150,6 +167,7 @@
 
     /**
      * Set the value of the property.
+     * 
      * @param value : value of the property (String)
      */
     private void setValue(String value) {
@@ -162,154 +180,210 @@
         }
 
         // Simple :
-        if (m_type.equals("string") || m_type.equals("String")) { m_value = new String(value); return; }
-        if (m_type.equals("boolean")) { m_value = new Boolean(value); return; }
-        if (m_type.equals("byte")) { m_value = new Byte(value); return; }
-        if (m_type.equals("short")) { m_value = new Short(value); return; }
-        if (m_type.equals("int")) { m_value = new Integer(value); return; }
-        if (m_type.equals("long")) { m_value = new Long(value); return; }
-        if (m_type.equals("float")) { m_value = new Float(value); return; }
-        if (m_type.equals("double")) { m_value = new Double(value); return; }
+        if (m_type.equals("string") || m_type.equals("String")) {
+            m_value = new String(value);
+            return;
+        }
+        if (m_type.equals("boolean")) {
+            m_value = new Boolean(value);
+            return;
+        }
+        if (m_type.equals("byte")) {
+            m_value = new Byte(value);
+            return;
+        }
+        if (m_type.equals("short")) {
+            m_value = new Short(value);
+            return;
+        }
+        if (m_type.equals("int")) {
+            m_value = new Integer(value);
+            return;
+        }
+        if (m_type.equals("long")) {
+            m_value = new Long(value);
+            return;
+        }
+        if (m_type.equals("float")) {
+            m_value = new Float(value);
+            return;
+        }
+        if (m_type.equals("double")) {
+            m_value = new Double(value);
+            return;
+        }
 
-        // Else it is a neither a primitive type neither a String -> create the object by calling a constructor with a string in argument.
+        // Else it is a neither a primitive type neither a String -> create the
+        // object by calling a constructor with a string in argument.
         try {
             Class c = m_providedService.getInstanceManager().getContext().getBundle().loadClass(m_type);
-            //Class string = m_providedService.getComponentManager().getContext().getBundle().loadClass("java.lang.String");
-            Constructor cst = c.getConstructor(new Class[] {String.class});
-            m_value = cst.newInstance(new Object[] {value});
+            // Class string =
+            // m_providedService.getComponentManager().getContext().getBundle().loadClass("java.lang.String");
+            Constructor cst = c.getConstructor(new Class[] { String.class });
+            m_value = cst.newInstance(new Object[] { value });
         } catch (ClassNotFoundException e) {
-            System.err.println("Class not found exception in setValue on " + m_type);
-            e.printStackTrace();
+            m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Class not found exception in setValue on " + m_type);
         } catch (SecurityException e) {
-            e.printStackTrace();
+            m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Security Exception in setValue on " + m_type);
         } catch (NoSuchMethodException e) {
-            System.err.println("Constructor not found exeption in setValue on " + m_type);
-            e.printStackTrace();
+            m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Constructor not found exeption in setValue on " + m_type);
         } catch (IllegalArgumentException e) {
-            System.err.println("Argument problem to call the constructor of the type " + m_type);
-            e.printStackTrace();
+            m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Argument problem to call the constructor of the type " + m_type);
         } catch (InstantiationException e) {
-            System.err.println("Instantiation problem  " + m_type);
-            e.printStackTrace();
+            m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Instantiation problem  " + m_type);
         } catch (IllegalAccessException e) {
-            e.printStackTrace();
+            m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Illegal Access Exception in setValue on " + m_type);
         } catch (InvocationTargetException e) {
-            System.err.println("Invocation problem " + m_type);
-            e.printStackTrace();
+            m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Invocation problem " + m_type);
         }
     }
 
     /**
      * Set a array value to the current property.
+     * 
      * @param internalType : internal array type
      * @param values : the new value
      */
     private void setArrayValue(String internalType, String[] values) {
-        if (internalType.equals("string") || internalType.equals("String")) { m_value = values; return; }
+        if (internalType.equals("string") || internalType.equals("String")) {
+            m_value = values;
+            return;
+        }
         if (internalType.equals("boolean")) {
             boolean[] bool = new boolean[values.length];
-            for (int i = 0; i < values.length; i++) { bool[i] = new Boolean(values[i]).booleanValue(); }
+            for (int i = 0; i < values.length; i++) {
+                bool[i] = new Boolean(values[i]).booleanValue();
+            }
             m_value = bool;
             return;
         }
         if (internalType.equals("byte")) {
             byte[] byt = new byte[values.length];
-            for (int i = 0; i < values.length; i++) { byt[i] = new Byte(values[i]).byteValue(); }
+            for (int i = 0; i < values.length; i++) {
+                byt[i] = new Byte(values[i]).byteValue();
+            }
             m_value = byt;
             return;
         }
         if (internalType.equals("short")) {
             short[] shor = new short[values.length];
-            for (int i = 0; i < values.length; i++) { shor[i] = new Short(values[i]).shortValue(); }
+            for (int i = 0; i < values.length; i++) {
+                shor[i] = new Short(values[i]).shortValue();
+            }
             m_value = shor;
             return;
         }
         if (internalType.equals("int")) {
             int[] in = new int[values.length];
-            for (int i = 0; i < values.length; i++) { in[i] = new Integer(values[i]).intValue(); }
+            for (int i = 0; i < values.length; i++) {
+                in[i] = new Integer(values[i]).intValue();
+            }
             m_value = in;
             return;
         }
         if (internalType.equals("long")) {
             long[] ll = new long[values.length];
-            for (int i = 0; i < values.length; i++) { ll[i] = new Long(values[i]).longValue(); }
+            for (int i = 0; i < values.length; i++) {
+                ll[i] = new Long(values[i]).longValue();
+            }
             m_value = ll;
             return;
         }
         if (internalType.equals("float")) {
             float[] fl = new float[values.length];
-            for (int i = 0; i < values.length; i++) { fl[i] = new Float(values[i]).floatValue(); }
+            for (int i = 0; i < values.length; i++) {
+                fl[i] = new Float(values[i]).floatValue();
+            }
             m_value = fl;
-            return; 
+            return;
         }
         if (internalType.equals("double")) {
             double[] dl = new double[values.length];
-            for (int i = 0; i < values.length; i++) { dl[i] = new Double(values[i]).doubleValue(); }
+            for (int i = 0; i < values.length; i++) {
+                dl[i] = new Double(values[i]).doubleValue();
+            }
             m_value = dl;
-            return; 
+            return;
         }
 
-        // Else it is a neither a primitive type neither a String -> create the object by calling a constructor with a string in argument.
+        // Else it is a neither a primitive type neither a String -> create the
+        // object by calling a constructor with a string in argument.
         try {
             Class c = m_providedService.getInstanceManager().getContext().getBundle().loadClass(internalType);
-            Constructor cst = c.getConstructor(new Class[] {String.class});
+            Constructor cst = c.getConstructor(new Class[] { String.class });
             Object[] ob = (Object[]) Array.newInstance(c, values.length);
             for (int i = 0; i < values.length; i++) {
-                ob[i] = cst.newInstance(new Object[] {values[i]});
+                ob[i] = cst.newInstance(new Object[] { values[i] });
             }
             m_value = ob;
             return;
         } catch (ClassNotFoundException e) {
-            System.err.println("Class not found exception in setValue on " + internalType);
-            e.printStackTrace();
+            m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Class not found exception in setArrayValue on " + internalType);
         } catch (SecurityException e) {
-            e.printStackTrace();
+            m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Security Exception in setArrayValue on " + internalType);
         } catch (NoSuchMethodException e) {
-            System.err.println("Constructor not found exeption in setValue on " + internalType);
-            e.printStackTrace();
+            m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                    "Constructor not found exception in setArrayValue on " + internalType);
         } catch (IllegalArgumentException e) {
-            System.err.println("Argument problem to call the constructor of the type " + internalType);
-            e.printStackTrace();
+            m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR,
+                    "Argument problem to call the constructor of the type " + internalType);
         } catch (InstantiationException e) {
-            System.err.println("Instantiation problem  " + internalType);
-            e.printStackTrace();
+            m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Instantiation problem  " + internalType);
         } catch (IllegalAccessException e) {
-            e.printStackTrace();
+            m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Illegal Access Exception in setArrayValue on " + internalType);
         } catch (InvocationTargetException e) {
-            System.err.println("Invocation problem " + internalType);
-            e.printStackTrace();
+            m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Invocation problem " + internalType);
         }
     }
 
     /**
+     * Get the stored value.
      * @return the value of the property.
      */
-    public Object getValue() { return m_value; }
-    
+    public Object getValue() {
+        return m_value;
+    }
+
     /**
+     * Get the property name.
      * @return the name of the property
      */
-    public String getName() { return m_name; }
-    
+    public String getName() {
+        return m_name;
+    }
+
     /**
-     * @return the field name of the property (null if the property has no field).
+     * Get the property field.
+     * @return the field name of the property (null if the property has no
+     * field).
      */
-    protected String getField() { return m_field; }
+    protected String getField() {
+        return m_field;
+    }
 
-	/**
-	 * Set the type of the property.
-	 * @param type : the type to attached to the property
-	 */
-	public void setType(String type) { m_type = type; }
-	
-	/**
-	 * @return the type of the property.
-	 */
-	public String getType() { return m_type; }
+    /**
+     * Set the type of the property.
+     * 
+     * @param type : the type to attached to the property
+     */
+    public void setType(String type) {
+        m_type = type;
+    }
 
-	/**
-	 * @return the initial value of the property.
-	 */
-	public String getInitialValue() { return m_initialValue; }
-	
+    /**
+     * Get the property type.
+     * @return the type of the property.
+     */
+    public String getType() {
+        return m_type;
+    }
+
+    /**
+     * Get the property initial value.
+     * @return the initial value of the property.
+     */
+    public String getInitialValue() {
+        return m_initialValue;
+    }
+
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java
index d446087..37fe087 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java
@@ -29,9 +29,9 @@
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 
-
 /**
  * Provided Service represent a provided service by the component.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ProvidedService implements ServiceFactory {
@@ -67,15 +67,13 @@
     private int m_factoryPolicy = SINGLETON_FACTORY;
 
     /**
-     * The service registration.
-     * is null when the service is not registred.
+     * The service registration. is null when the service is not registred.
      * m_serviceRegistration : ServiceRegistration
      */
     private ServiceRegistration m_serviceRegistration;
 
     /**
-     * Link to the owner handler.
-     * m_handler : Provided Service Handler
+     * Link to the owner handler. m_handler : Provided Service Handler
      */
     private ProvidedServiceHandler m_handler;
 
@@ -84,42 +82,47 @@
      */
     private Property[] m_properties = new Property[0];
 
-
     /**
      * Construct a provided service object.
+     * 
      * @param handler : the provided service handler.
      * @param specification : specifications provided by this provided service
      * @param factoryPolicy : service providing policy
      */
     public ProvidedService(ProvidedServiceHandler handler, String[] specification, int factoryPolicy) {
         m_handler = handler;
-        
+
         m_serviceSpecification = specification;
         m_factoryPolicy = factoryPolicy;
-        
-        //Add service pid and factory pid
+
+        // Add service pid and factory pid
         addProperty(new Property(this, org.osgi.framework.Constants.SERVICE_PID, handler.getInstanceManager().getInstanceName()));
-        addProperty(new Property(this, "factory.pid", handler.getInstanceManager().getFactory().getFactoryName()));
+        addProperty(new Property(this, "factory.pid", handler.getInstanceManager().getFactory().getName()));
     }
-    
-    //TODO check if we need to erase previous props or add to the previous props.
+
+    // TODO check if we need to erase previous props or add to the previous
+    // props.
     /**
      * Add properties to the provided service.
+     * 
      * @param props : the properties to attached to the service registration
      */
-    protected void setProperties(Property[] props) { 
-    	for (int i = 0; i < props.length; i++) {
-    		addProperty(props[i]);
-    	}
+    protected void setProperties(Property[] props) {
+        for (int i = 0; i < props.length; i++) {
+            addProperty(props[i]);
+        }
     }
 
     /**
      * Add the given property to the property list.
+     * 
      * @param p : the element to add
      */
     private synchronized void addProperty(Property p) {
         for (int i = 0; (m_properties != null) && (i < m_properties.length); i++) {
-            if (m_properties[i] == p) { return; }
+            if (m_properties[i] == p) {
+                return;
+            }
         }
 
         if (m_properties.length > 0) {
@@ -127,29 +130,33 @@
             System.arraycopy(m_properties, 0, newProp, 0, m_properties.length);
             newProp[m_properties.length] = p;
             m_properties = newProp;
-        } else { 
-        	m_properties = new Property[] {p}; 
+        } else {
+            m_properties = new Property[] { p };
         }
     }
 
     /**
      * Remove a property.
+     * 
      * @param name : the property to remove
      */
     private synchronized void removeProperty(String name) {
         int idx = -1;
         for (int i = 0; i < m_properties.length; i++) {
-            if (m_properties[i].getName() == name) { idx = i; break; }
+            if (m_properties[i].getName() == name) {
+                idx = i;
+                break;
+            }
         }
 
         if (idx >= 0) {
-            if ((m_properties.length - 1) == 0) { 
-            	m_properties = new Property[0]; 
+            if ((m_properties.length - 1) == 0) {
+                m_properties = new Property[0];
             } else {
                 Property[] newPropertiesList = new Property[m_properties.length - 1];
                 System.arraycopy(m_properties, 0, newPropertiesList, 0, idx);
                 if (idx < newPropertiesList.length) {
-                    System.arraycopy(m_properties, idx + 1, newPropertiesList, idx, newPropertiesList.length - idx); 
+                    System.arraycopy(m_properties, idx + 1, newPropertiesList, idx, newPropertiesList.length - idx);
                 }
                 m_properties = newPropertiesList;
             }
@@ -157,33 +164,43 @@
     }
 
     /**
-     * @return the service reference of the provided service (null if the service is not published).
+     * Get the service reference of the service registration.
+     * @return the service reference of the provided service (null if the
+     * service is not published).
      */
     public ServiceReference getServiceReference() {
-        if (m_serviceRegistration != null) { 
-        	return m_serviceRegistration.getReference(); 
-        } else { return null; }
+        if (m_serviceRegistration != null) {
+            return m_serviceRegistration.getReference();
+        } else {
+            return null;
+        }
     }
 
     /**
      * Return a service object for the dependency.
-     * @see org.osgi.framework.ServiceFactory#getService(org.osgi.framework.Bundle, org.osgi.framework.ServiceRegistration)
+     * 
+     * @see org.osgi.framework.ServiceFactory#getService(org.osgi.framework.Bundle,
+     * org.osgi.framework.ServiceRegistration)
      * @param bundle : the bundle
      * @param registration : the service registration of the registred service
-     * @return : a new service object or a already created service object (in the case of singleton)
+     * @return : a new service object or a already created service object (in
+     * the case of singleton)
      */
     public Object getService(Bundle bundle, ServiceRegistration registration) {
 
-        switch(m_factoryPolicy) {
+        switch (m_factoryPolicy) {
 
-            case SINGLETON_FACTORY :
+            case SINGLETON_FACTORY:
                 return m_handler.getInstanceManager().getPojoObject();
 
-            case SERVICE_FACTORY :
+            case SERVICE_FACTORY:
                 return m_handler.getInstanceManager().createPojoObject();
 
-            default :
-                m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Unknown factory policy for " + m_serviceSpecification + " : " + m_factoryPolicy);
+            default:
+                m_handler.getInstanceManager().getFactory().getLogger().log(
+                        Logger.ERROR,
+                        "[" + m_handler.getInstanceManager().getClassName() + "] Unknown factory policy for " + m_serviceSpecification + " : "
+                                + m_factoryPolicy);
                 return null;
         }
 
@@ -191,19 +208,21 @@
 
     /**
      * The unget method.
-     * @see org.osgi.framework.ServiceFactory#ungetService(org.osgi.framework.Bundle, org.osgi.framework.ServiceRegistration, java.lang.Object)
+     * 
+     * @see org.osgi.framework.ServiceFactory#ungetService(org.osgi.framework.Bundle,
+     * org.osgi.framework.ServiceRegistration, java.lang.Object)
      * @param bundle : bundle
      * @param registration : service registration
      * @param service : service object
      */
     public void ungetService(Bundle bundle, ServiceRegistration registration, Object service) {
-        //Nothing to do
+        // Nothing to do
     }
 
     /**
-     * Register the service.
-     * The service object must be able to serve this service.
-     * To avoid cycle in Check Context, the registred service is set to registred before the real registration.
+     * Register the service. The service object must be able to serve this
+     * service. To avoid cycle in Check Context, the registred service is set to
+     * registred before the real registration.
      */
     protected synchronized void registerService() {
         if (m_serviceRegistration == null) {
@@ -214,9 +233,7 @@
             // Contruct the service properties list
             Properties serviceProperties = getServiceProperties();
 
-            m_serviceRegistration =
-                    m_handler.getInstanceManager().getContext().registerService(
-                    		m_serviceSpecification, this, serviceProperties);
+            m_serviceRegistration = m_handler.getInstanceManager().getContext().registerService(m_serviceSpecification, this, serviceProperties);
         }
     }
 
@@ -227,32 +244,33 @@
         if (m_serviceRegistration != null) {
             try {
                 m_serviceRegistration.unregister();
-            } catch (Exception e) { return; }
+            } catch (Exception e) {
+                return;
+            }
             m_serviceRegistration = null;
         }
     }
 
     /**
+     * Get the current provided service state.
      * @return The state of the provided service.
      */
     public int getState() {
-    	if (m_serviceRegistration == null) { 
-    		return UNREGISTERED; 
-    	} else { 
-    		return REGISTERED; 
-    	}
+        if (m_serviceRegistration == null) {
+            return UNREGISTERED;
+        } else {
+            return REGISTERED;
+        }
     }
 
-    /**
-     * @return the instance manager.
-     */
     protected InstanceManager getInstanceManager() {
         return m_handler.getInstanceManager();
     }
 
     /**
-     * Return the list of properties attached to this service.
-     * This list contains only property where a value are assigned.
+     * Return the list of properties attached to this service. This list
+     * contains only property where a value are assigned.
+     * 
      * @return the properties attached to the provided service.
      */
     private Properties getServiceProperties() {
@@ -267,6 +285,7 @@
     }
 
     /**
+     * Get the list of properties attached to the service registration.
      * @return the properties attached to the provided service.
      */
     public Property[] getProperties() {
@@ -274,15 +293,15 @@
     }
 
     /**
-     * Update the service properties.
-     * The new list of properties is sended to the service registry.
+     * Update the service properties. The new list of properties is sended to
+     * the service registry.
      */
     public synchronized void update() {
         // Contruct the service properties list
         Properties serviceProperties = getServiceProperties();
-        
+
         if (serviceProperties == null) {
-        	m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Cannot get the properties of the provided service");
+            m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Cannot get the properties of the provided service");
         }
 
         // Update the service registration
@@ -293,6 +312,7 @@
 
     /**
      * Add properties to the list.
+     * 
      * @param props : properties to add
      */
     protected void addProperties(Dictionary props) {
@@ -307,6 +327,7 @@
 
     /**
      * Remove properties from the list.
+     * 
      * @param props : properties to remove
      */
     protected void deleteProperties(Dictionary props) {
@@ -317,9 +338,21 @@
         }
     }
 
-	/**
-	 * @return the list of provided service specifications (i.e. java interface).
-	 */
-	public String[] getServiceSpecification() { return m_serviceSpecification; }
+    /**
+     * Get the published service specifications.
+     * @return the list of provided service specifications (i.e. java
+     * interface).
+     */
+    public String[] getServiceSpecification() {
+        return m_serviceSpecification;
+    }
+
+    /**
+     * Get the service registration.
+     * @return the service registration of this service.
+     */
+    public ServiceRegistration getServiceRegistration() {
+        return m_serviceRegistration;
+    }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java
index 0041298..daec557 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java
@@ -20,24 +20,24 @@
 
 import java.util.Properties;
 
-import org.apache.felix.ipojo.handlers.dependency.DependencyDescription;
 import org.osgi.framework.ServiceReference;
 
 /**
  * Provided Service Description.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ProvidedServiceDescription {
-	
-	/**
-	 * State : the service is unregistered.
-	 */
-	public static final int UNREGISTERED = 0;
-	
-	/**
-	 * State : the service is registered.
-	 */
-	public static final int REGISTERED = 1;
+
+    /**
+     * State : the service is unregistered.
+     */
+    public static final int UNREGISTERED = 0;
+
+    /**
+     * State : the service is registered.
+     */
+    public static final int REGISTERED = 1;
 
     /**
      * Provided Service Specification.
@@ -45,11 +45,6 @@
     private String[] m_serviceSpecification;
 
     /**
-     * Dependency of the service.
-     */
-    private DependencyDescription[] m_dependencies = new DependencyDescription[0];
-
-    /**
      * State.
      */
     private int m_state;
@@ -59,31 +54,33 @@
      */
     private ServiceReference m_serviceReference;
 
-//    /**
-//     * Handler on the component description who contains this description.
-//     */
-//    private InstanceDescription m_parent;
+    // /**
+    // * Handler on the component description who contains this description.
+    // */
+    // private InstanceDescription m_parent;
 
     /**
      * Properties of the provided service.
      */
     private Properties m_properties = new Properties();
 
-
     /**
      * Constructor.
+     * 
      * @param serviceSpecification : the provided contract
      * @param state : state (UNREGITRED | REGISTRED)
-     * @param sr : Service Registration (to obtain the reference), or null if state is UNREGISTRED
+     * @param sr : Service Registration (to obtain the reference), or null if
+     * state is UNREGISTRED
      */
     public ProvidedServiceDescription(String[] serviceSpecification, int state, ServiceReference sr) {
         m_serviceSpecification = serviceSpecification;
         m_state = state;
         m_serviceReference = sr;
-       // m_parent = parent;
+        // m_parent = parent;
     }
 
     /**
+     * Get the list of provided service specifications.
      * @return the provided contract name.
      */
     public String[] getServiceSpecification() {
@@ -92,6 +89,7 @@
 
     /**
      * Add a property to the current provided service description.
+     * 
      * @param key : the key of the property
      * @param value : the value of the property
      */
@@ -101,6 +99,7 @@
 
     /**
      * Set the set of properties. This function create a clone of the argument.
+     * 
      * @param props : the properties
      */
     public void setProperty(Properties props) {
@@ -108,13 +107,7 @@
     }
 
     /**
-     * @return the dependeny description list.
-     */
-    public DependencyDescription[] getDependencies() {
-        return m_dependencies;
-    }
-
-    /**
+     * Get the list of properties.
      * @return the properties.
      */
     public Properties getProperties() {
@@ -122,13 +115,15 @@
     }
 
     /**
-     * @return the state of the provided service (UNREGISTRED | REGISTRED).
+     * Get provided service state.
+     * @return the state of the provided service (UNREGISTERED | REGISTRED).
      */
     public int getState() {
         return m_state;
     }
 
     /**
+     * Get the service reference.
      * @return the service reference (null if the service is unregistred).
      */
     public ServiceReference getServiceReference() {
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
index 7253e15..86ae62d 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
@@ -32,11 +32,12 @@
 import org.osgi.framework.Constants;
 
 /**
+ * Composite PRovided Service Handler.
+ * This handler maange the service providing for a composition.
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ProvidedServiceHandler extends Handler {
 
-
     /**
      * The list of the provided service.
      */
@@ -49,12 +50,15 @@
 
     /**
      * Add a provided service to the list .
+     * 
      * @param ps : the provided service to add
      */
     private void addProvidedService(ProvidedService ps) {
-        //  Verify that the provided service is not already in the array.
+        // Verify that the provided service is not already in the array.
         for (int i = 0; (m_providedServices != null) && (i < m_providedServices.length); i++) {
-            if (m_providedServices[i] == ps) { return; }
+            if (m_providedServices[i] == ps) {
+                return;
+            }
         }
 
         if (m_providedServices.length > 0) {
@@ -62,23 +66,33 @@
             System.arraycopy(m_providedServices, 0, newPS, 0, m_providedServices.length);
             newPS[m_providedServices.length] = ps;
             m_providedServices = newPS;
-        } else { 
-        	m_providedServices = new ProvidedService[] {ps}; 
+        } else {
+            m_providedServices = new ProvidedService[] { ps };
         }
     }
 
     /**
+     * Get the instance manager.
      * @return the instance manager.
      */
-    public InstanceManager getInstanceManager() { return m_manager; }
+    public InstanceManager getInstanceManager() {
+        return m_manager;
+    }
 
     /**
+     * Get the array of provided service.
      * @return the list of the provided service.
      */
-    public ProvidedService[] getProvidedService() { return m_providedServices; }
+    public ProvidedService[] getProvidedService() {
+        return m_providedServices;
+    }
 
     /**
-     * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.InstanceManager, org.apache.felix.ipojo.metadata.Element)
+     * Configure the handler.
+     * @param im : the instance manager
+     * @param componentMetadata : the component type metadata
+     * @param configuration : the instance configuration
+     * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.InstanceManager, org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
      */
     public void configure(InstanceManager im, Element componentMetadata, Dictionary configuration) {
         // Fix the instance manager & clean the provided service list
@@ -97,7 +111,7 @@
             String[] serviceSpecification = new String[0];
             if (providedServices[i].containsAttribute("interface")) {
                 String serviceSpecificationStr = providedServices[i].getAttribute("interface");
-                //Get serviceSpecification if exist in the metadata
+                // Get serviceSpecification if exist in the metadata
                 serviceSpecification = ParseUtils.parseArrays(serviceSpecificationStr);
             } else {
                 serviceSpecification = new String[manipulation.getElements("Interface").length];
@@ -105,11 +119,17 @@
                     serviceSpecification[j] = manipulation.getElements("Interface")[j].getAttribute("name");
                 }
             }
-            if (serviceSpecification.length == 0) { m_manager.getFactory().getLogger().log(Logger.ERROR, "Cannot instantiate a provided service : no specifications found (no interfaces implemented by the pojo)"); return; }
+            if (serviceSpecification.length == 0) {
+                m_manager.getFactory().getLogger().log(Logger.ERROR,
+                        "Cannot instantiate a provided service : no specifications found (no interfaces implemented by the pojo)");
+                return;
+            }
 
             // Get the factory policy
             int factory = ProvidedService.SINGLETON_FACTORY;
-            if (providedServices[i].containsAttribute("factory") && providedServices[i].getAttribute("factory").equals("service")) { factory = ProvidedService.SERVICE_FACTORY; }
+            if (providedServices[i].containsAttribute("factory") && providedServices[i].getAttribute("factory").equals("service")) {
+                factory = ProvidedService.SERVICE_FACTORY;
+            }
 
             // Then create the provided service
             ProvidedService ps = new ProvidedService(this, serviceSpecification, factory);
@@ -118,20 +138,28 @@
             Property[] properties = new Property[props.length];
             for (int j = 0; j < props.length; j++) {
                 String name = null;
-                if (props[j].containsAttribute("name")) { name = props[j].getAttribute("name"); }
+                if (props[j].containsAttribute("name")) {
+                    name = props[j].getAttribute("name");
+                }
                 String value = null;
-                if (props[j].containsAttribute("value")) { value = props[j].getAttribute("value"); }
+                if (props[j].containsAttribute("value")) {
+                    value = props[j].getAttribute("value");
+                }
                 String type = null;
-                if (props[j].containsAttribute("type")) { type = props[j].getAttribute("type"); }
+                if (props[j].containsAttribute("type")) {
+                    type = props[j].getAttribute("type");
+                }
                 String field = null;
-                if (props[j].containsAttribute("field")) { field = props[j].getAttribute("field"); }
+                if (props[j].containsAttribute("field")) {
+                    field = props[j].getAttribute("field");
+                }
 
-                if (name != null && configuration.get(name) != null && configuration.get(name) instanceof String) { 
-                	value = (String) configuration.get(name); 
-                } else { 
-                	if (field != null &&  configuration.get(field) != null && configuration.get(field) instanceof String) { 
-                		value = (String) configuration.get(field); 
-                	}
+                if (name != null && configuration.get(name) != null && configuration.get(name) instanceof String) {
+                    value = (String) configuration.get(name);
+                } else {
+                    if (field != null && configuration.get(field) != null && configuration.get(field) instanceof String) {
+                        value = (String) configuration.get(field);
+                    }
                 }
 
                 Property prop = new Property(ps, name, field, type, value, manipulation);
@@ -140,22 +168,26 @@
 
             // Attached to properties to the provided service
             ps.setProperties(properties);
-            
+
             if (checkProvidedService(ps, manipulation)) {
                 addProvidedService(ps);
                 // Change ComponentInfo
-                for (int k = 0; k < ps.getServiceSpecification().length; k++) { cd.addProvidedServiceSpecification(ps.getServiceSpecification()[k]); }
-                for (int k = 0; k < ps.getProperties().length; k++) { 
-                	if (!ps.getProperties()[k].getName().equals(Constants.SERVICE_PID) && !ps.getProperties()[k].getName().equals("factory.pid")) {
-                		cd.addProperty(new PropertyDescription(ps.getProperties()[k].getName(), ps.getProperties()[k].getType(), ps.getProperties()[k].getInitialValue())); 
-                	}
+                for (int k = 0; k < ps.getServiceSpecification().length; k++) {
+                    cd.addProvidedServiceSpecification(ps.getServiceSpecification()[k]);
+                }
+                for (int k = 0; k < ps.getProperties().length; k++) {
+                    if (!ps.getProperties()[k].getName().equals(Constants.SERVICE_PID) && !ps.getProperties()[k].getName().equals("factory.pid")) {
+                        cd.addProperty(new PropertyDescription(ps.getProperties()[k].getName(), ps.getProperties()[k].getType(), ps.getProperties()[k]
+                                .getInitialValue()));
+                    }
                 }
             } else {
                 String itfs = "";
                 for (int j = 0; j < serviceSpecification.length; j++) {
                     itfs = itfs + " " + serviceSpecification[j];
                 }
-                m_manager.getFactory().getLogger().log(Logger.ERROR, "[" + m_manager.getClassName() + "] The provided service" + itfs + " is not valid, it will be removed");
+                m_manager.getFactory().getLogger().log(Logger.ERROR,
+                        "[" + m_manager.getClassName() + "] The provided service" + itfs + " is not valid, it will be removed");
                 ps = null;
             }
 
@@ -168,13 +200,14 @@
                 for (int j = 0; j < ps.getProperties().length; j++) {
                     Property prop = ps.getProperties()[j];
 
-                    // Check if the instance configuration has a value for this property
-                    if (prop.getName() != null && configuration.get(prop.getName()) != null && !(configuration.get(prop.getName()) instanceof String)) { 
-                    	prop.set(configuration.get(prop.getName())); 
-                    } else { 
-                    	if (prop.getField() != null && configuration.get(prop.getField()) != null && !(configuration.get(prop.getField()) instanceof String)) { 
-                    		prop.set(configuration.get(prop.getField())); 
-                    	}
+                    // Check if the instance configuration has a value for this
+                    // property
+                    if (prop.getName() != null && configuration.get(prop.getName()) != null && !(configuration.get(prop.getName()) instanceof String)) {
+                        prop.set(configuration.get(prop.getName()));
+                    } else {
+                        if (prop.getField() != null && configuration.get(prop.getField()) != null && !(configuration.get(prop.getField()) instanceof String)) {
+                            prop.set(configuration.get(prop.getField()));
+                        }
                     }
                     if (prop.getField() != null) {
                         String[] newFields = new String[fields.length + 1];
@@ -185,28 +218,34 @@
                 }
             }
 
-            m_manager.register(this, fields); 
+            m_manager.register(this, fields);
         }
     }
 
     /**
-     * Check the provided service given in argument in the sense that the metadata are consistent.
-     * @param ps : the provided service to check
+     * Check the provided service given in argument in the sense that the
+     * metadata are consistent.
+     * 
+     * @param ps : the provided service to check.
+     * @param manipulation : componenet-type manipulation metadata.
      * @return true if the provided service is correct
      */
     private boolean checkProvidedService(ProvidedService ps, Element manipulation) {
 
         for (int i = 0; i < ps.getServiceSpecification().length; i++) {
-        	boolean b = false;
-        	for (int ii = 0; ii < manipulation.getElements("Interface").length; ii++) {
+            boolean b = false;
+            for (int ii = 0; ii < manipulation.getElements("Interface").length; ii++) {
                 if (manipulation.getElements("Interface")[ii].getAttribute("name").equals(ps.getServiceSpecification()[i])) {
                     b = true;
                 }
             }
-        	if (!b) { 
-        		m_manager.getFactory().getLogger().log(Logger.ERROR, "[" + m_manager.getClassName() + "] The service specification " + ps.getServiceSpecification()[i] + " is not implemented by the component class");
-        		return false; 
-        	}
+            if (!b) {
+                m_manager.getFactory().getLogger().log(
+                        Logger.ERROR,
+                        "[" + m_manager.getClassName() + "] The service specification " + ps.getServiceSpecification()[i]
+                                + " is not implemented by the component class");
+                return false;
+            }
 
         }
 
@@ -226,10 +265,11 @@
                     }
                 }
                 if (type == null) {
-                	m_manager.getFactory().getLogger().log(Logger.ERROR, "[" + m_manager.getClassName() + "] A declared property was not found in the class : " + prop.getField());
+                    m_manager.getFactory().getLogger().log(Logger.ERROR,
+                            "[" + m_manager.getClassName() + "] A declared property was not found in the class : " + prop.getField());
                     return false;
                 }
-                prop.setType(type); //Set the type
+                prop.setType(type); // Set the type
             }
         }
         return true;
@@ -237,18 +277,27 @@
 
     /**
      * Stop the provided service handler.
+     * 
      * @see org.apache.felix.ipojo.Handler#stop()
      */
-    public void stop() { }
+    public void stop() {
+    }
 
     /**
      * Start the provided service handler.
+     * 
      * @see org.apache.felix.ipojo.Handler#start()
      */
-    public void start() { }
+    public void start() {
+    }
 
-    /**
-     * @see org.apache.felix.ipojo.Handler#setterCallback(java.lang.String, java.lang.Object)
+   /**
+    * Setter Callback Method.
+    * Check if the modified field is a property to update the value.
+    * @param fieldName : field name
+    * @param value : new value
+     * @see org.apache.felix.ipojo.Handler#setterCallback(java.lang.String,
+     * java.lang.Object)
      */
     public void setterCallback(String fieldName, Object value) {
         // Verify that the field name coreespond to a dependency
@@ -263,13 +312,21 @@
                     update = true;
                 }
             }
-            if (update) { ps.update(); }
+            if (update) {
+                ps.update();
+            }
         }
-        //Else do nothing
+        // Else do nothing
     }
 
     /**
-     * @see org.apache.felix.ipojo.Handler#getterCallback(java.lang.String, java.lang.Object)
+     * Getter Callback Method.
+     * Check if the field is a property to push the stored value.
+     * @param fieldName : field name
+     * @param value : value pushed by the previous handler
+     * @return the stored value or the previous value.
+     * @see org.apache.felix.ipojo.Handler#getterCallback(java.lang.String,
+     * java.lang.Object)
      */
     public Object getterCallback(String fieldName, Object value) {
         for (int i = 0; i < m_providedServices.length; i++) {
@@ -287,14 +344,16 @@
     }
 
     /**
-     * Register the services if the new state is VALID.
-     * Unregister the services if the new state is UNRESOLVED.
-     * @see org.apache.felix.ipojo.Handler#stateChanged(int)
+     * Register the services if the new state is VALID. Unregister the services
+     * if the new state is UNRESOLVED.
+     * 
+     * @param state : the new instance state.
+     * @see org.apache.felix.ipojo.CompositeHandler#stateChanged(int)
      */
     public void stateChanged(int state) {
         // If the new state is UNRESOLVED => unregister all the services
         if (state == InstanceManager.INVALID) {
-        	for (int i = 0; i < m_providedServices.length; i++) {
+            for (int i = 0; i < m_providedServices.length; i++) {
                 m_providedServices[i].unregisterService();
             }
             return;
@@ -302,7 +361,7 @@
 
         // If the new state is VALID => regiter all the services
         if (state == InstanceManager.VALID) {
-        	for (int i = 0; i < m_providedServices.length; i++) {
+            for (int i = 0; i < m_providedServices.length; i++) {
                 m_providedServices[i].registerService();
             }
             return;
@@ -312,6 +371,7 @@
 
     /**
      * Add properties to all provided services.
+     * 
      * @param dict : dictionary fo properties to add
      */
     public void addProperties(Dictionary dict) {
@@ -323,6 +383,7 @@
 
     /**
      * Remove properties form all provided services.
+     * 
      * @param dict : dictionary of properties to delete.
      */
     public void removeProperties(Dictionary dict) {
@@ -331,46 +392,56 @@
             m_providedServices[i].update();
         }
     }
-	
-	/**
-	 * @see org.apache.felix.ipojo.Handler#getDescription()
-	 */
-	public HandlerDescription getDescription() {
-		ProvidedServiceHandlerDescription pshd = new ProvidedServiceHandlerDescription(this.isValid());
 
-		for (int j = 0; j < getProvidedService().length; j++) {
-			ProvidedService ps = getProvidedService()[j];
-			ProvidedServiceDescription psd = new ProvidedServiceDescription(ps.getServiceSpecification(), ps.getState(), ps.getServiceReference());
+    /**
+     * Build the provided service description.
+     * @return the handler description.
+     * @see org.apache.felix.ipojo.Handler#getDescription()
+     */
+    public HandlerDescription getDescription() {
+        ProvidedServiceHandlerDescription pshd = new ProvidedServiceHandlerDescription(this.isValid());
 
-			Properties props = new Properties();
-			for (int k = 0; k < ps.getProperties().length; k++) {
-				Property prop = ps.getProperties()[k];
-				if (prop.getValue() != null) { props.put(prop.getName(), prop.getValue().toString()); }
-			}
-			psd.setProperty(props);
-			pshd.addProvidedService(psd);
-		}
-		return pshd;
-	}
-	
-	/**
-	 * @see org.apache.felix.ipojo.Handler#reconfigure(java.util.Dictionary)
-	 */
-	public void reconfigure(Dictionary dict) {
-		for (int j = 0; j < getProvidedService().length; j++) {
-			ProvidedService ps = getProvidedService()[j];
-			Property[] props = ps.getProperties();
-			boolean update = false;
-			for (int k = 0; k < props.length; k++) {
-				if (dict.get(props[k].getName()) != null) {
-					update = true;
-					if (dict.get(props[k].getName()) instanceof String) {
-						props[k].set((String) dict.get(props[k].getName()));
-					} else { props[k].set(dict.get(props[k].getName())); }
-				}
-			}
-			if (update) { ps.update(); }
-		}
-	}
+        for (int j = 0; j < getProvidedService().length; j++) {
+            ProvidedService ps = getProvidedService()[j];
+            ProvidedServiceDescription psd = new ProvidedServiceDescription(ps.getServiceSpecification(), ps.getState(), ps.getServiceReference());
+
+            Properties props = new Properties();
+            for (int k = 0; k < ps.getProperties().length; k++) {
+                Property prop = ps.getProperties()[k];
+                if (prop.getValue() != null) {
+                    props.put(prop.getName(), prop.getValue().toString());
+                }
+            }
+            psd.setProperty(props);
+            pshd.addProvidedService(psd);
+        }
+        return pshd;
+    }
+
+    /**
+     * Reconfigure provided service.
+     * @param dict : the new instance configuration.
+     * @see org.apache.felix.ipojo.Handler#reconfigure(java.util.Dictionary)
+     */
+    public void reconfigure(Dictionary dict) {
+        for (int j = 0; j < getProvidedService().length; j++) {
+            ProvidedService ps = getProvidedService()[j];
+            Property[] props = ps.getProperties();
+            boolean update = false;
+            for (int k = 0; k < props.length; k++) {
+                if (dict.get(props[k].getName()) != null) {
+                    update = true;
+                    if (dict.get(props[k].getName()) instanceof String) {
+                        props[k].set((String) dict.get(props[k].getName()));
+                    } else {
+                        props[k].set(dict.get(props[k].getName()));
+                    }
+                }
+            }
+            if (update) {
+                ps.update();
+            }
+        }
+    }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java
index 90acdc6..3645089 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java
@@ -21,9 +21,12 @@
 import java.util.Iterator;
 
 import org.apache.felix.ipojo.architecture.HandlerDescription;
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
 
 /**
  * Provided Service Handler Description.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ProvidedServiceHandlerDescription extends HandlerDescription {
@@ -33,9 +36,9 @@
      */
     private ProvidedServiceDescription[] m_providedServices = new ProvidedServiceDescription[0];
 
-
     /**
      * Constructor.
+     * 
      * @param isValid : the validity of the provided service handler.
      */
     public ProvidedServiceHandlerDescription(boolean isValid) {
@@ -43,19 +46,25 @@
     }
 
     /**
+     * Get the provided service descriptions.
      * @return the provided service description list.
      */
-    public ProvidedServiceDescription[] getProvidedServices() { return m_providedServices; }
+    public ProvidedServiceDescription[] getProvidedServices() {
+        return m_providedServices;
+    }
 
     /**
      * Add a provided service.
+     * 
      * @param pds : the provided service to add
      */
     public void addProvidedService(ProvidedServiceDescription pds) {
-        //Verify that the provided service description is not already in the array.
-        for (int i = 0; (i < m_providedServices.length); i++) {
+        // Verify that the provided service description is not already in the
+        // array.
+        for (int i = 0; i < m_providedServices.length; i++) {
             if (m_providedServices[i] == pds) {
-                return; //NOTHING DO DO, the description is already in the array
+                return; // NOTHING DO DO, the description is already in the
+                        // array
             }
         }
         // The component Description is not in the array, add it
@@ -66,27 +75,40 @@
     }
 
     /**
+     * Build the provided service handler description.
+     * @return the handler description.
      * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
      */
-    public String getHandlerInfo() {
-        String info = "";
+    public Element getHandlerInfo() {
+        Element services = super.getHandlerInfo();
         for (int i = 0; i < m_providedServices.length; i++) {
+            Element service = new Element("service", "");
             String state = "unregistered";
-            if (m_providedServices[i].getState() == ProvidedService.REGISTERED) { state = "registered"; }
-            String spec = "";
-            for (int j = 0; j < m_providedServices[i].getServiceSpecification().length; j++) {
-                spec += m_providedServices[i].getServiceSpecification()[j] + " ";
+            if (m_providedServices[i].getState() == ProvidedService.REGISTERED) {
+                state = "registered";
             }
-            info += "\t Provided Service [" + spec + "] is " + state;
+            String spec = "[";
+            for (int j = 0; j < m_providedServices[i].getServiceSpecification().length; j++) {
+                if (j == 0) {
+                    spec += m_providedServices[i].getServiceSpecification()[j];
+                } else {
+                    spec += ", " + m_providedServices[i].getServiceSpecification()[j];
+                }
+            }
+            spec += "]";
+            service.addAttribute(new Attribute("specifications", spec));
+            service.addAttribute(new Attribute("state", state));
             Iterator it = m_providedServices[i].getProperties().keySet().iterator();
             while (it.hasNext()) {
+                Element prop = new Element("property", "");
                 String k = (String) it.next();
-                info += "\n\t\t Service Property : " + k + " = " + m_providedServices[i].getProperties().getProperty(k);
+                prop.addAttribute(new Attribute("name", k));
+                prop.addAttribute(new Attribute("value", m_providedServices[i].getProperties().getProperty(k).toString()));
+                service.addElement(prop);
             }
+            services.addElement(service);
         }
-        return info;
+        return services;
     }
 
-
-
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/parser/ManifestMetadataParser.java b/ipojo/src/main/java/org/apache/felix/ipojo/parser/ManifestMetadataParser.java
index 58ff68a..09cd633 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/parser/ManifestMetadataParser.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/parser/ManifestMetadataParser.java
@@ -25,8 +25,8 @@
 import org.apache.felix.ipojo.metadata.Element;
 
 /**
- * Manifest Metadata parser.
- * Read a manifest file and construct metadata
+ * Manifest Metadata parser. Read a manifest file and construct metadata
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ManifestMetadataParser {
@@ -42,6 +42,7 @@
     private Element[] m_elements = new Element[0];
 
     /**
+     * Get the array of component type metadata.
      * @return the component metadata (composite & component).
      * @throws ParseException when a parsing error occurs
      */
@@ -51,17 +52,18 @@
         Element[] all = new Element[components.length + composites.length];
         int l = 0;
         for (int i = 0; i < components.length; i++) {
-        	all[l] = components[i];
-        	l++;
+            all[l] = components[i];
+            l++;
         }
         for (int i = 0; i < composites.length; i++) {
-        	all[l] = composites[i];
-        	l++;
+            all[l] = composites[i];
+            l++;
         }
         return all;
     }
 
     /**
+     * Get the array of instance configuration described in the metadata.
      * @return the instances list.
      * @throws ParseException : if the metadata cannot be parsed successfully
      */
@@ -73,53 +75,64 @@
         }
         return dicts;
     }
-    
+
     /**
      * Parse an Element to get a dictionary.
+     * 
      * @param instance : the Element describing an instance.
      * @return : the resulting dictionary
-     * @throws ParseException
+     * @throws ParseException : occurs when a configuration cannot be parse correctly.
      */
     private Dictionary parseInstance(Element instance) throws ParseException {
-    	Dictionary dict = new Properties();
-    	if (!instance.containsAttribute("name")) { throw new ParseException("An instance does not have the 'name' attribute"); }
-    	if (!instance.containsAttribute("component")) { throw new ParseException("An instance does not have the 'component' attribute"); }
-    	dict.put("name", instance.getAttribute("name"));
-    	dict.put("component", instance.getAttribute("component"));
-    	
-    	for (int i = 0; i < instance.getElements("property").length; i++) {
-    		parseProperty(instance.getElements("property")[i], dict);
-    	}
-    	
-    	return dict;
+        Dictionary dict = new Properties();
+        if (!instance.containsAttribute("name")) {
+            throw new ParseException("An instance does not have the 'name' attribute");
+        }
+        if (!instance.containsAttribute("component")) {
+            throw new ParseException("An instance does not have the 'component' attribute");
+        }
+        dict.put("name", instance.getAttribute("name"));
+        dict.put("component", instance.getAttribute("component"));
+
+        for (int i = 0; i < instance.getElements("property").length; i++) {
+            parseProperty(instance.getElements("property")[i], dict);
+        }
+
+        return dict;
     }
-    
+
     /**
-     * @param prop
-     * @param dict
-     * @throws ParseException
+     * Parse a property.
+     * @param prop : the current element to parse
+     * @param dict : the dictionary to populate
+     * @throws ParseException : occurs if the proeprty cannot be parsed correctly
      */
     private void parseProperty(Element prop, Dictionary dict) throws ParseException {
-    	// Check that the property has a name 
-    	if (!prop.containsAttribute("name")) { throw new ParseException("A property does not have the 'name' attribute"); }
-    	// Final case : the property element has a 'value' attribute
-    	if (prop.containsAttribute("value")) { 
-    		dict.put(prop.getAttribute("name"), prop.getAttribute("value")); 
-    	} else {
-    		// Recursive case
-    		// Check if there is 'property' element
-    		Element[] subProps = prop.getElements("property");
-    		if (subProps.length == 0) { throw new ParseException("A complex property must have at least one 'property' sub-element"); }
-    		Dictionary dict2 = new Properties();
-    		for (int i = 0; i < subProps.length; i++) {
-    			parseProperty(subProps[i], dict2);
-    			dict.put(prop.getAttribute("name"), dict2);
-    		}
-    	}
+        // Check that the property has a name
+        if (!prop.containsAttribute("name")) {
+            throw new ParseException("A property does not have the 'name' attribute");
+        }
+        // Final case : the property element has a 'value' attribute
+        if (prop.containsAttribute("value")) {
+            dict.put(prop.getAttribute("name"), prop.getAttribute("value"));
+        } else {
+            // Recursive case
+            // Check if there is 'property' element
+            Element[] subProps = prop.getElements("property");
+            if (subProps.length == 0) {
+                throw new ParseException("A complex property must have at least one 'property' sub-element");
+            }
+            Dictionary dict2 = new Properties();
+            for (int i = 0; i < subProps.length; i++) {
+                parseProperty(subProps[i], dict2);
+                dict.put(prop.getAttribute("name"), dict2);
+            }
+        }
     }
 
     /**
      * Add an element to the list.
+     * 
      * @param elem : the element to add
      */
     private void addElement(Element elem) {
@@ -128,11 +141,14 @@
             System.arraycopy(m_elements, 0, newElementsList, 0, m_elements.length);
             newElementsList[m_elements.length] = elem;
             m_elements = newElementsList;
-        } else { m_elements = new Element[] {elem}; }
+        } else {
+            m_elements = new Element[] { elem };
+        }
     }
 
     /**
      * Remove an element to the list.
+     * 
      * @return an element to remove
      */
     private Element removeLastElement() {
@@ -155,32 +171,37 @@
 
     /**
      * Parse the given dictionnary and create the instance managers.
+     * 
      * @param dict : the given headers of the manifest file
      * @throws ParseException : if any error occurs
      */
     public void parse(Dictionary dict) throws ParseException {
         m_headers = dict;
         String componentClassesStr = (String) m_headers.get("iPOJO-Components");
-        //Add the ipojo element inside the element list
+        // Add the ipojo element inside the element list
         addElement(new Element("iPOJO", ""));
         parseElements(componentClassesStr.trim());
     }
 
     /**
      * Parse the metadata from the string given in argument.
+     * 
      * @param metadata : the metadata to parse
      * @return Element : the root element resulting of the parsing
      * @throws ParseException : if any error occurs
      */
-    public static Element parse(String metadata) throws ParseException  {
+    public static Element parse(String metadata) throws ParseException {
         ManifestMetadataParser parser = new ManifestMetadataParser();
         parser.parseElements(metadata);
-        if (parser.m_elements.length != 1) { throw new ParseException("Error in parsing, root element not found : " + metadata); }
+        if (parser.m_elements.length != 1) {
+            throw new ParseException("Error in parsing, root element not found : " + metadata);
+        }
         return parser.m_elements[0];
     }
 
     /**
      * Paser the given string.
+     * 
      * @param s : the string to parse
      */
     private void parseElements(String s) {
@@ -189,9 +210,9 @@
         for (int i = 0; i < string.length; i++) {
             char c = string[i];
 
-            switch(c) {
-            	// Beginning of an attribute.
-                case '$' : 
+            switch (c) {
+                // Beginning of an attribute.
+                case '$':
                     String attName = "";
                     String attValue = "";
                     String attNs = "";
@@ -201,7 +222,9 @@
                         if (c == ':') {
                             attNs = attName;
                             attName = "";
-                        } else { attName = attName + c; }
+                        } else {
+                            attName = attName + c;
+                        }
                         i = i + 1;
                         c = string[i];
                     }
@@ -216,12 +239,12 @@
                     i++; // skip "
                     c = string[i];
 
-                    Attribute att = new Attribute(attName, attNs , attValue);
+                    Attribute att = new Attribute(attName, attNs, attValue);
                     m_elements[m_elements.length - 1].addAttribute(att);
                     break;
 
-                // End of an element    
-                case '}' : 
+                // End of an element
+                case '}':
                     Element lastElement = removeLastElement();
                     if (m_elements.length != 0) {
                         Element newQueue = m_elements[m_elements.length - 1];
@@ -232,33 +255,35 @@
                     break;
 
                 // Space
-                case ' ' : 
-                	break; // do nothing;
-                
+                case ' ':
+                    break; // do nothing;
+
                 // Default case
-                default :
+                default:
                     String name = "";
-                	String ns = "";
-                	c = string[i];
-                	while (c != ' ') {
-                		if (c == ':') {
-                			ns = name;
-                			name = "";
-                			i++;
-                			c = string[i];
-                		} else {
-                			name = name + c;
-                			i++;
-                			c = string[i];
-                		}
-                	}
-                	// Skip spaces
-                	while (string[i] == ' ') { i = i + 1; }
-                	i = i + 1; // skip {
-                	Element elem = new Element(name, ns);
-                	addElement(elem);
-                	break;
-           	}
+                    String ns = "";
+                    c = string[i];
+                    while (c != ' ') {
+                        if (c == ':') {
+                            ns = name;
+                            name = "";
+                            i++;
+                            c = string[i];
+                        } else {
+                            name = name + c;
+                            i++;
+                            c = string[i];
+                        }
+                    }
+                    // Skip spaces
+                    while (string[i] == ' ') {
+                        i = i + 1;
+                    }
+                    i = i + 1; // skip {
+                    Element elem = new Element(name, ns);
+                    addElement(elem);
+                    break;
+            }
         }
     }
 
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/parser/ParseUtils.java b/ipojo/src/main/java/org/apache/felix/ipojo/parser/ParseUtils.java
index 19294f9..98fa65c 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/parser/ParseUtils.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/parser/ParseUtils.java
@@ -20,30 +20,34 @@
 
 /**
  * Parse Utils Methods.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class ParseUtils {
-	
-	/**
-	 * Parse the string form of an array as {a, b, c}.
-	 * @param str : the string form
-	 * @return the resulting string array
-	 */
-	public static String[] parseArrays(String str) {
-		// Remove { and }
-		if (str.startsWith("{") && str.endsWith("}")) {
-			String m = str.substring(1, str.length() - 1);
-			// Check empty array
-			m = m.trim();
-			if (m.length() == 0) { return new String[0]; }
-			String[] values = m.split(",");
-			for (int i = 0; i < values.length; i++) {
-				values[i] = values[i].trim();
-			}
-			return values;
-		} else {
-			return new String[] {str};
-		}
-	}
+
+    /**
+     * Parse the string form of an array as {a, b, c}.
+     * 
+     * @param str : the string form
+     * @return the resulting string array
+     */
+    public static String[] parseArrays(String str) {
+        // Remove { and }
+        if (str.startsWith("{") && str.endsWith("}")) {
+            String m = str.substring(1, str.length() - 1);
+            // Check empty array
+            m = m.trim();
+            if (m.length() == 0) {
+                return new String[0];
+            }
+            String[] values = m.split(",");
+            for (int i = 0; i < values.length; i++) {
+                values[i] = values[i].trim();
+            }
+            return values;
+        } else {
+            return new String[] { str };
+        }
+    }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/util/Callback.java b/ipojo/src/main/java/org/apache/felix/ipojo/util/Callback.java
index 3e8f3f3..0b62ab2 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/util/Callback.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/util/Callback.java
@@ -23,10 +23,9 @@
 
 import org.apache.felix.ipojo.InstanceManager;
 
-
-
 /**
  * A callback allows calling a method on the component instances.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class Callback {
@@ -48,6 +47,7 @@
 
     /**
      * LifecycleCallback constructor.
+     * 
      * @param method : the name of the method to call
      * @param isStatic : is the method a static method
      * @param im : the instance manager of the component containing the method
@@ -60,28 +60,31 @@
 
     /**
      * Call the 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
      */
     public void call() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
-    	m_manager.getFactory().getLogger().log(Logger.INFO, "[" + m_manager.getClassName() + "] Call an callback method : " + m_method);
+        m_manager.getFactory().getLogger().log(Logger.INFO, "[" + m_manager.getClassName() + "] Call an callback method : " + m_method);
         Method method = m_manager.getClazz().getDeclaredMethod(m_method, new Class[] {});
         method.setAccessible(true);
 
-        if (m_isStatic) { 
-        	method.invoke(null, new Object[]{}); 
+        if (m_isStatic) {
+            method.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) {
-            	m_manager.getFactory().getLogger().log(Logger.INFO, "[" + m_manager.getClassName() + "] Create the first instance " + m_manager.getPojoObject());
-                method.invoke(m_manager.getPojoObject(), new Object[]{});
+                m_manager.getFactory().getLogger()
+                        .log(Logger.INFO, "[" + m_manager.getClassName() + "] Create the first instance " + m_manager.getPojoObject());
+                method.invoke(m_manager.getPojoObject(), new Object[] {});
             } else {
                 for (int i = 0; i < m_manager.getPojoObjects().length; i++) {
-                	m_manager.getFactory().getLogger().log(Logger.INFO, "[" + m_manager.getClassName() + "] Call the callback on the instance " + m_manager.getPojoObjects()[i]);
-                    method.invoke(m_manager.getPojoObjects()[i], new Object[]{});
+                    m_manager.getFactory().getLogger().log(Logger.INFO,
+                            "[" + m_manager.getClassName() + "] Call the callback on the instance " + m_manager.getPojoObjects()[i]);
+                    method.invoke(m_manager.getPojoObjects()[i], new Object[] {});
                 }
             }
         }
@@ -89,13 +92,13 @@
 
     /**
      * Call the current callback method on the instance given in parameter.
+     * 
      * @param instance : instance on which call the callbakc
      * @throws NoSuchMethodException : the method was not found
      * @throws IllegalAccessException : the method cannont be called
      * @throws InvocationTargetException : an error happens in the method
      */
-    public void call(Object instance) throws NoSuchMethodException,
-            IllegalAccessException, InvocationTargetException {
+    public void call(Object instance) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
         Method method = m_manager.getClazz().getDeclaredMethod(m_method, new Class[] {});
         method.setAccessible(true);
         method.invoke(instance, new Object[] {});
@@ -103,32 +106,35 @@
 
     /**
      * Call the callback on the method with the argument given in parameter.
+     * 
      * @param arg : the parameters
      * @throws NoSuchMethodException : the callback method is not found
      * @throws IllegalAccessException : the callbback method cannot be called
-     * @throws InvocationTargetException : an error occurs inside the called method
+     * @throws InvocationTargetException : an error occurs inside the called
+     * method
      */
     public void call(Object[] arg) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
-    	m_manager.getFactory().getLogger().log(Logger.INFO, "[" + m_manager.getClassName() + "] Call an callback method : " + m_method);
+        m_manager.getFactory().getLogger().log(Logger.INFO, "[" + m_manager.getClassName() + "] Call an callback method : " + m_method);
 
         // Build an array of call for arg :
         Class[] classes = new Class[arg.length];
         for (int i = 0; i < arg.length; i++) {
             classes[i] = arg[i].getClass();
         }
-        
+
         Method method = m_manager.getClazz().getDeclaredMethod(m_method, classes);
         method.setAccessible(true);
 
-        if (m_isStatic) { 
-        	method.invoke(null, arg); 
+        if (m_isStatic) {
+            method.invoke(null, arg);
         } else {
             // Two cases :
             // - if instances already exists : call on each instances
             // - if no instance exists : create an instance
             if (m_manager.getPojoObjects().length == 0) {
-                m_manager.getFactory().getLogger().log(Logger.INFO, "[" + m_manager.getClassName() + "] Create the first instance " + m_manager.getPojoObject());
-                method.invoke(m_manager.getPojoObject(), new Object[]{});
+                m_manager.getFactory().getLogger()
+                        .log(Logger.INFO, "[" + m_manager.getClassName() + "] Create the first instance " + m_manager.getPojoObject());
+                method.invoke(m_manager.getPojoObject(), new Object[] {});
             } else {
                 for (int i = 0; i < m_manager.getPojoObjects().length; i++) {
                     method.invoke(m_manager.getPojoObjects()[i], arg);
@@ -138,12 +144,15 @@
     }
 
     /**
-     * Call the callback on the method with the argument given in parameter and with the arguments given in parameter too.
+     * Call the callback on the method with the argument given in parameter and
+     * with the arguments given in parameter too.
+     * 
      * @param instance : instance on which call the callback
      * @param arg : the argument array
      * @throws NoSuchMethodException : the callback method is not found
      * @throws IllegalAccessException : the callbback method cannot be called
-     * @throws InvocationTargetException : an error occurs inside the called method
+     * @throws InvocationTargetException : an error occurs inside the called
+     * method
      */
     public void call(Object instance, Object[] arg) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
         // Build an array of call for arg :
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/util/Logger.java b/ipojo/src/main/java/org/apache/felix/ipojo/util/Logger.java
index b548efb..6f8c601 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/util/Logger.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/util/Logger.java
@@ -26,152 +26,178 @@
 import org.osgi.service.log.LogService;
 
 /**
- * iPOJO Logger.
- * This logger send log message to a log service if presents. 
+ * iPOJO Logger. This logger send log message to a log service if presents.
+ * 
  * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
  */
 public class Logger implements ServiceListener {
-	
-	// TODO how to stop the logging (remove listener ...)
-	
-	/**
-	 * Log Level ERROR.
-	 */
-	public static final int ERROR = 1;
-    
-	/**
-     * Log Level WARNING. 
+
+    // TODO how to stop the logging (remove listener ...)
+
+    /**
+     * Log Level ERROR.
+     */
+    public static final int ERROR = 1;
+
+    /**
+     * Log Level WARNING.
      */
     public static final int WARNING = 2;
-    
+
     /**
      * Log Level INFO.
      */
     public static final int INFO = 3;
-    
+
     /**
-     * Log Level DEBUG. 
+     * Log Level DEBUG.
      */
     public static final int DEBUG = 4;
-    
+
     /**
      * Bundle Context.
      */
     private BundleContext m_context;
-    
+
     /**
-     * Service Reference of the log service is available. 
+     * Service Reference of the log service is available.
      */
     private ServiceReference m_ref;
-    
+
     /**
-     * Log service object. 
+     * Log service object.
      */
     private LogService m_log;
-    
+
     /**
-     * Name of the logger. 
+     * Name of the logger.
      */
     private String m_name;
-    
+
     /**
-     * trace level of this logger. 
+     * trace level of this logger.
      */
     private int m_level;
-    
+
     /**
      * Constructor.
+     * 
      * @param bc : bundle context
      * @param name : name of the logger
      * @param level : trace level
      */
-    public Logger(BundleContext bc, String name, int level) { 
-    	m_name = name;
-    	m_level = level;
-    	m_context = bc;
-    	
-    	m_ref = m_context.getServiceReference(LogService.class.getName());
-    	if (m_ref != null) { m_log = (LogService) m_context.getService(m_ref); }
-    	
-    	try {
-			m_context.addServiceListener(this, "(objectClass=" + LogService.class.getName() + ")");
-		} catch (InvalidSyntaxException e) { e.printStackTrace(); }
+    public Logger(BundleContext bc, String name, int level) {
+        m_name = name;
+        m_level = level;
+        m_context = bc;
+
+        m_ref = m_context.getServiceReference(LogService.class.getName());
+        if (m_ref != null) {
+            m_log = (LogService) m_context.getService(m_ref);
+        }
+
+        try {
+            m_context.addServiceListener(this, "(objectClass=" + LogService.class.getName() + ")");
+        } catch (InvalidSyntaxException e) {
+            e.printStackTrace();
+        }
     }
-    
+
     /**
      * Log a message.
+     * 
      * @param level : level of the message
      * @param msg : the message to log
      */
     public void log(int level, String msg) {
-    	if (m_level >= level) {
-    		synchronized (this) { _log(level, msg, null); }
-    	}
+        if (m_level >= level) {
+            synchronized (this) {
+                dispatch(level, msg, null);
+            }
+        }
     }
-    
+
     /**
      * Log a message with an exception.
+     * 
      * @param level : level of the message
      * @param msg : message to log
      * @param ex : exception attached to the message
      */
     public void log(int level, String msg, Throwable ex) {
-    	if (m_level >= level) { 
-    		synchronized (this) { _log(level, msg, ex); }
-    	}
+        if (m_level >= level) {
+            synchronized (this) {
+                dispatch(level, msg, ex);
+            }
+        }
     }
-    
+
     /**
      * Internal log method.
+     * 
      * @param level : level of the message.
      * @param msg : message to log
      * @param ex : exception attached to the message
      */
-    private void _log(int level, String msg, Throwable ex) {
+    private void dispatch(int level, String msg, Throwable ex) {
         String s = msg;
-        s = (ex == null) ? s : s + " (" + ex.getMessage() + ")";
+        if (ex != null) {
+            s += " (" + ex.getMessage() + ")";
+        }
         String message;
         switch (level) {
             case DEBUG:
-            	message = "[" + m_name + "] DEBUG: " + s;
-            	if (m_log != null) { m_log.log(LogService.LOG_DEBUG, message); }
+                message = "[" + m_name + "] DEBUG: " + s;
+                if (m_log != null) {
+                    m_log.log(LogService.LOG_DEBUG, message);
+                }
                 System.err.println(message);
                 break;
             case ERROR:
-            	message = "[" + m_name + "] ERROR: " + s;
-            	if (m_log != null) { m_log.log(LogService.LOG_ERROR, message); }
+                message = "[" + m_name + "] ERROR: " + s;
+                if (m_log != null) {
+                    m_log.log(LogService.LOG_ERROR, message);
+                }
                 System.err.println(message);
                 break;
             case INFO:
                 message = "[" + m_name + "] INFO: " + s;
-                if (m_log != null) { m_log.log(LogService.LOG_INFO, message); }
-            	System.err.println(message);
+                if (m_log != null) {
+                    m_log.log(LogService.LOG_INFO, message);
+                }
+                System.err.println(message);
                 break;
             case WARNING:
-            	message = "[" + m_name + "] WARNING: " + s;
-            	if (m_log != null) { m_log.log(LogService.LOG_WARNING, message); }
+                message = "[" + m_name + "] WARNING: " + s;
+                if (m_log != null) {
+                    m_log.log(LogService.LOG_WARNING, message);
+                }
                 System.err.println(message);
                 break;
             default:
                 System.err.println("[" + m_name + "] UNKNOWN[" + level + "]: " + s);
-            	break;
+                break;
         }
     }
 
-	/**
-	 * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
-	 */
-	public void serviceChanged(ServiceEvent ev) {
-		if (ev.getType() == ServiceEvent.REGISTERED && m_ref == null) {
-			m_ref = ev.getServiceReference();
-			m_log = (LogService) m_context.getService(m_ref);
-		}
-		if (ev.getType() == ServiceEvent.UNREGISTERING && m_ref == ev.getServiceReference()) {
-			m_context.ungetService(m_ref);
-			m_log = null;
-			m_ref = m_context.getServiceReference(LogService.class.getName());
-	    	if (m_ref != null) { m_log = (LogService) m_context.getService(m_ref); }
-		}
-		
-	}
+    /**
+     * Service Listener implementation.
+     * @param ev : the service event
+     * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
+     */
+    public void serviceChanged(ServiceEvent ev) {
+        if (ev.getType() == ServiceEvent.REGISTERED && m_ref == null) {
+            m_ref = ev.getServiceReference();
+            m_log = (LogService) m_context.getService(m_ref);
+        }
+        if (ev.getType() == ServiceEvent.UNREGISTERING && m_ref == ev.getServiceReference()) {
+            m_context.ungetService(m_ref);
+            m_log = null;
+            m_ref = m_context.getServiceReference(LogService.class.getName());
+            if (m_ref != null) {
+                m_log = (LogService) m_context.getService(m_ref);
+            }
+        }
+
+    }
 }
diff --git a/ipojo/src/main/java/org/osgi/service/cm/Configuration.java b/ipojo/src/main/java/org/osgi/service/cm/Configuration.java
index a4d54cd..90a633f 100644
--- a/ipojo/src/main/java/org/osgi/service/cm/Configuration.java
+++ b/ipojo/src/main/java/org/osgi/service/cm/Configuration.java
@@ -1,19 +1,21 @@
 /*
- * $Header: /cvshome/build/org.osgi.service.cm/src/org/osgi/service/cm/Configuration.java,v 1.16 2006/03/14 01:21:09 hargrave Exp $
- *
+ * $Header:
+ * /cvshome/build/org.osgi.service.cm/src/org/osgi/service/cm/Configuration.java,v
+ * 1.16 2006/03/14 01:21:09 hargrave Exp $
+ * 
  * Copyright (c) OSGi Alliance (2001, 2005). All Rights Reserved.
- *
- * Licensed 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
- *
+ * 
+ * Licensed 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.
+ * 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.osgi.service.cm;
 
@@ -63,165 +65,165 @@
  * @version $Revision: 1.16 $
  */
 public interface Configuration {
-	/**
-	 * Get the PID for this <code>Configuration</code> object.
-	 * 
-	 * @return the PID for this <code>Configuration</code> object.
-	 * @throws IllegalStateException if this configuration has been deleted
-	 */
-	public String getPid();
+    /**
+     * Get the PID for this <code>Configuration</code> object.
+     * 
+     * @return the PID for this <code>Configuration</code> object.
+     * @throws IllegalStateException if this configuration has been deleted
+     */
+    public String getPid();
 
-	/**
-	 * Return the properties of this <code>Configuration</code> object.
-	 * 
-	 * The <code>Dictionary</code> object returned is a private copy for the
-	 * caller and may be changed without influencing the stored configuration.
-	 * The keys in the returned dictionary are case insensitive and are always
-	 * of type <code>String</code>.
-	 * 
-	 * <p>
-	 * If called just after the configuration is created and before update has
-	 * been called, this method returns <code>null</code>.
-	 * 
-	 * @return A private copy of the properties for the caller or
-	 *         <code>null</code>. These properties must not contain the
-	 *         "service.bundleLocation" property. The value of this property may
-	 *         be obtained from the <code>getBundleLocation</code> method.
-	 * @throws IllegalStateException if this configuration has been deleted
-	 */
-	public Dictionary getProperties();
+    /**
+     * Return the properties of this <code>Configuration</code> object.
+     * 
+     * The <code>Dictionary</code> object returned is a private copy for the
+     * caller and may be changed without influencing the stored configuration.
+     * The keys in the returned dictionary are case insensitive and are always
+     * of type <code>String</code>.
+     * 
+     * <p>
+     * If called just after the configuration is created and before update has
+     * been called, this method returns <code>null</code>.
+     * 
+     * @return A private copy of the properties for the caller or
+     * <code>null</code>. These properties must not contain the
+     * "service.bundleLocation" property. The value of this property may be
+     * obtained from the <code>getBundleLocation</code> method.
+     * @throws IllegalStateException if this configuration has been deleted
+     */
+    public Dictionary getProperties();
 
-	/**
-	 * Update the properties of this <code>Configuration</code> object.
-	 * 
-	 * Stores the properties in persistent storage after adding or overwriting
-	 * the following properties:
-	 * <ul>
-	 * <li>"service.pid" : is set to be the PID of this configuration.</li>
-	 * <li>"service.factoryPid" : if this is a factory configuration it is set
-	 * to the factory PID else it is not set.</li>
-	 * </ul>
-	 * These system properties are all of type <code>String</code>.
-	 * 
-	 * <p>
-	 * If the corresponding Managed Service/Managed Service Factory is
-	 * registered, its updated method must be called asynchronously. Else, this
-	 * callback is delayed until aforementioned registration occurs.
-	 * 
-	 * <p>
-	 * Also intiates an asynchronous call to all
-	 * <code>ConfigurationListener</code>s with a
-	 * <code>ConfigurationEvent.CM_UPDATED</code> event.
-	 * 
-	 * @param properties the new set of properties for this configuration
-	 * @throws IOException if update cannot be made persistent
-	 * @throws IllegalArgumentException if the <code>Dictionary</code> object
-	 *         contains invalid configuration types or contains case variants of
-	 *         the same key name.
-	 * @throws IllegalStateException if this configuration has been deleted
-	 */
-	public void update(Dictionary properties) throws IOException;
+    /**
+     * Update the properties of this <code>Configuration</code> object.
+     * 
+     * Stores the properties in persistent storage after adding or overwriting
+     * the following properties:
+     * <ul>
+     * <li>"service.pid" : is set to be the PID of this configuration.</li>
+     * <li>"service.factoryPid" : if this is a factory configuration it is set
+     * to the factory PID else it is not set.</li>
+     * </ul>
+     * These system properties are all of type <code>String</code>.
+     * 
+     * <p>
+     * If the corresponding Managed Service/Managed Service Factory is
+     * registered, its updated method must be called asynchronously. Else, this
+     * callback is delayed until aforementioned registration occurs.
+     * 
+     * <p>
+     * Also intiates an asynchronous call to all
+     * <code>ConfigurationListener</code>s with a
+     * <code>ConfigurationEvent.CM_UPDATED</code> event.
+     * 
+     * @param properties the new set of properties for this configuration
+     * @throws IOException if update cannot be made persistent
+     * @throws IllegalArgumentException if the <code>Dictionary</code> object
+     * contains invalid configuration types or contains case variants of the
+     * same key name.
+     * @throws IllegalStateException if this configuration has been deleted
+     */
+    public void update(Dictionary properties) throws IOException;
 
-	/**
-	 * Delete this <code>Configuration</code> object.
-	 * 
-	 * Removes this configuration object from the persistent store. Notify
-	 * asynchronously the corresponding Managed Service or Managed Service
-	 * Factory. A <code>ManagedService</code> object is notified by a call to
-	 * its <code>updated</code> method with a <code>null</code> properties
-	 * argument. A <code>ManagedServiceFactory</code> object is notified by a
-	 * call to its <code>deleted</code> method.
-	 * 
-	 * <p>
-	 * Also intiates an asynchronous call to all
-	 * <code>ConfigurationListener</code>s with a
-	 * <code>ConfigurationEvent.CM_DELETED</code> event.
-	 * 
-	 * @throws IOException If delete fails
-	 * @throws IllegalStateException if this configuration has been deleted
-	 */
-	public void delete() throws IOException;
+    /**
+     * Delete this <code>Configuration</code> object.
+     * 
+     * Removes this configuration object from the persistent store. Notify
+     * asynchronously the corresponding Managed Service or Managed Service
+     * Factory. A <code>ManagedService</code> object is notified by a call to
+     * its <code>updated</code> method with a <code>null</code> properties
+     * argument. A <code>ManagedServiceFactory</code> object is notified by a
+     * call to its <code>deleted</code> method.
+     * 
+     * <p>
+     * Also intiates an asynchronous call to all
+     * <code>ConfigurationListener</code>s with a
+     * <code>ConfigurationEvent.CM_DELETED</code> event.
+     * 
+     * @throws IOException If delete fails
+     * @throws IllegalStateException if this configuration has been deleted
+     */
+    public void delete() throws IOException;
 
-	/**
-	 * For a factory configuration return the PID of the corresponding Managed
-	 * Service Factory, else return <code>null</code>.
-	 * 
-	 * @return factory PID or <code>null</code>
-	 * @throws IllegalStateException if this configuration has been deleted
-	 */
-	public String getFactoryPid();
+    /**
+     * For a factory configuration return the PID of the corresponding Managed
+     * Service Factory, else return <code>null</code>.
+     * 
+     * @return factory PID or <code>null</code>
+     * @throws IllegalStateException if this configuration has been deleted
+     */
+    public String getFactoryPid();
 
-	/**
-	 * Update the <code>Configuration</code> object with the current
-	 * properties.
-	 * 
-	 * Initiate the <code>updated</code> callback to the Managed Service or
-	 * Managed Service Factory with the current properties asynchronously.
-	 * 
-	 * <p>
-	 * This is the only way for a bundle that uses a Configuration Plugin
-	 * service to initate a callback. For example, when that bundle detects a
-	 * change that requires an update of the Managed Service or Managed Service
-	 * Factory via its <code>ConfigurationPlugin</code> object.
-	 * 
-	 * @see ConfigurationPlugin
-	 * @throws IOException if update cannot access the properties in persistent
-	 *         storage
-	 * @throws IllegalStateException if this configuration has been deleted
-	 */
-	public void update() throws IOException;
+    /**
+     * Update the <code>Configuration</code> object with the current
+     * properties.
+     * 
+     * Initiate the <code>updated</code> callback to the Managed Service or
+     * Managed Service Factory with the current properties asynchronously.
+     * 
+     * <p>
+     * This is the only way for a bundle that uses a Configuration Plugin
+     * service to initate a callback. For example, when that bundle detects a
+     * change that requires an update of the Managed Service or Managed Service
+     * Factory via its <code>ConfigurationPlugin</code> object.
+     * 
+     * @see ConfigurationPlugin
+     * @throws IOException if update cannot access the properties in persistent
+     * storage
+     * @throws IllegalStateException if this configuration has been deleted
+     */
+    public void update() throws IOException;
 
-	/**
-	 * Bind this <code>Configuration</code> object to the specified bundle
-	 * location.
-	 * 
-	 * If the bundleLocation parameter is <code>null</code> then the
-	 * <code>Configuration</code> object will not be bound to a location. It
-	 * will be set to the bundle's location before the first time a Managed
-	 * Service/Managed Service Factory receives this <code>Configuration</code>
-	 * object via the updated method and before any plugins are called. The
-	 * bundle location will be set persistently.
-	 * 
-	 * @param bundleLocation a bundle location or <code>null</code>
-	 * @throws IllegalStateException If this configuration has been deleted.
-	 * @throws SecurityException If the caller does not have
-	 *         <code>ConfigurationPermission[*,CONFIGURE]</code>.
-	 */
-	public void setBundleLocation(String bundleLocation);
+    /**
+     * Bind this <code>Configuration</code> object to the specified bundle
+     * location.
+     * 
+     * If the bundleLocation parameter is <code>null</code> then the
+     * <code>Configuration</code> object will not be bound to a location. It
+     * will be set to the bundle's location before the first time a Managed
+     * Service/Managed Service Factory receives this <code>Configuration</code>
+     * object via the updated method and before any plugins are called. The
+     * bundle location will be set persistently.
+     * 
+     * @param bundleLocation a bundle location or <code>null</code>
+     * @throws IllegalStateException If this configuration has been deleted.
+     * @throws SecurityException If the caller does not have
+     * <code>ConfigurationPermission[*,CONFIGURE]</code>.
+     */
+    public void setBundleLocation(String bundleLocation);
 
-	/**
-	 * Get the bundle location.
-	 * 
-	 * Returns the bundle location to which this configuration is bound, or
-	 * <code>null</code> if it is not yet bound to a bundle location.
-	 * 
-	 * @return location to which this configuration is bound, or
-	 *         <code>null</code>.
-	 * @throws IllegalStateException If this <code>Configuration</code> object
-	 *         has been deleted.
-	 * @throws SecurityException If the caller does not have
-	 *         <code>ConfigurationPermission[*,CONFIGURE]</code>.
-	 */
-	public String getBundleLocation();
+    /**
+     * Get the bundle location.
+     * 
+     * Returns the bundle location to which this configuration is bound, or
+     * <code>null</code> if it is not yet bound to a bundle location.
+     * 
+     * @return location to which this configuration is bound, or
+     * <code>null</code>.
+     * @throws IllegalStateException If this <code>Configuration</code> object
+     * has been deleted.
+     * @throws SecurityException If the caller does not have
+     * <code>ConfigurationPermission[*,CONFIGURE]</code>.
+     */
+    public String getBundleLocation();
 
-	/**
-	 * Equality is defined to have equal PIDs
-	 * 
-	 * Two Configuration objects are equal when their PIDs are equal.
-	 * 
-	 * @param other <code>Configuration</code> object to compare against
-	 * @return <code>true</code> if equal, <code>false</code> if not a
-	 *         <code>Configuration</code> object or one with a different PID.
-	 */
-	public boolean equals(Object other);
+    /**
+     * Equality is defined to have equal PIDs
+     * 
+     * Two Configuration objects are equal when their PIDs are equal.
+     * 
+     * @param other <code>Configuration</code> object to compare against
+     * @return <code>true</code> if equal, <code>false</code> if not a
+     * <code>Configuration</code> object or one with a different PID.
+     */
+    public boolean equals(Object other);
 
-	/**
-	 * Hash code is based on PID.
-	 * 
-	 * The hashcode for two Configuration objects must be the same when the
-	 * Configuration PID's are the same.
-	 * 
-	 * @return hash code for this Configuration object
-	 */
-	public int hashCode();
+    /**
+     * Hash code is based on PID.
+     * 
+     * The hashcode for two Configuration objects must be the same when the
+     * Configuration PID's are the same.
+     * 
+     * @return hash code for this Configuration object
+     */
+    public int hashCode();
 }
diff --git a/ipojo/src/main/java/org/osgi/service/cm/ConfigurationAdmin.java b/ipojo/src/main/java/org/osgi/service/cm/ConfigurationAdmin.java
index f0f7836..0ca830c 100644
--- a/ipojo/src/main/java/org/osgi/service/cm/ConfigurationAdmin.java
+++ b/ipojo/src/main/java/org/osgi/service/cm/ConfigurationAdmin.java
@@ -1,19 +1,21 @@
 /*
- * $Header: /cvshome/build/org.osgi.service.cm/src/org/osgi/service/cm/ConfigurationAdmin.java,v 1.14 2006/03/14 01:21:09 hargrave Exp $
- *
+ * $Header:
+ * /cvshome/build/org.osgi.service.cm/src/org/osgi/service/cm/ConfigurationAdmin.java,v
+ * 1.14 2006/03/14 01:21:09 hargrave Exp $
+ * 
  * Copyright (c) OSGi Alliance (2001, 2005). All Rights Reserved.
- *
- * Licensed 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
- *
+ * 
+ * Licensed 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.
+ * 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.osgi.service.cm;
 
@@ -103,154 +105,157 @@
  * @version $Revision: 1.14 $
  */
 public interface ConfigurationAdmin {
-	/**
-	 * Service property naming the Factory PID in the configuration dictionary.
-	 * The property's value is of type <code>String</code>.
-	 * 
-	 * @since 1.1
-	 */
-	public final static String	SERVICE_FACTORYPID		= "service.factoryPid";
-	/**
-	 * Service property naming the location of the bundle that is associated
-	 * with a a <code>Configuration</code> object. This property can be
-	 * searched for but must not appear in the configuration dictionary for
-	 * security reason. The property's value is of type <code>String</code>.
-	 * 
-	 * @since 1.1
-	 */
-	public final static String	SERVICE_BUNDLELOCATION	= "service.bundleLocation";
+    /**
+     * Service property naming the Factory PID in the configuration dictionary.
+     * The property's value is of type <code>String</code>.
+     * 
+     * @since 1.1
+     */
+    public final static String SERVICE_FACTORYPID = "service.factoryPid";
 
-	/**
-	 * Create a new factory <code>Configuration</code> object with a new PID.
-	 * 
-	 * The properties of the new <code>Configuration</code> object are
-	 * <code>null</code> until the first time that its
-	 * {@link Configuration#update(Dictionary)}method is called.
-	 * 
-	 * <p>
-	 * It is not required that the <code>factoryPid</code> maps to a
-	 * registered Managed Service Factory.
-	 * <p>
-	 * The <code>Configuration</code> object is bound to the location of the
-	 * calling bundle.
-	 * 
-	 * @param factoryPid PID of factory (not <code>null</code>).
-	 * @return A new <code>Configuration</code> object.
-	 * @throws IOException if access to persistent storage fails.
-	 * @throws SecurityException if caller does not have <code>ConfigurationPermission[*,CONFIGURE]</code> and <code>factoryPid</code> is bound to another bundle.
-	 */
-	public Configuration createFactoryConfiguration(String factoryPid)
-			throws IOException;
+    /**
+     * Service property naming the location of the bundle that is associated
+     * with a a <code>Configuration</code> object. This property can be
+     * searched for but must not appear in the configuration dictionary for
+     * security reason. The property's value is of type <code>String</code>.
+     * 
+     * @since 1.1
+     */
+    public final static String SERVICE_BUNDLELOCATION = "service.bundleLocation";
 
-	/**
-	 * Create a new factory <code>Configuration</code> object with a new PID.
-	 * 
-	 * The properties of the new <code>Configuration</code> object are
-	 * <code>null</code> until the first time that its
-	 * {@link Configuration#update(Dictionary)}method is called.
-	 * 
-	 * <p>
-	 * It is not required that the <code>factoryPid</code> maps to a
-	 * registered Managed Service Factory.
-	 * 
-	 * <p>
-	 * The <code>Configuration</code> is bound to the location specified. If
-	 * this location is <code>null</code> it will be bound to the location of
-	 * the first bundle that registers a Managed Service Factory with a
-	 * corresponding PID.
-	 * 
-	 * @param factoryPid PID of factory (not <code>null</code>).
-	 * @param location A bundle location string, or <code>null</code>.
-	 * @return a new <code>Configuration</code> object.
-	 * @throws IOException if access to persistent storage fails.
-	 * @throws SecurityException if caller does not have <code>ConfigurationPermission[*,CONFIGURE]</code>.
-	 */
-	public Configuration createFactoryConfiguration(String factoryPid, String location)
-			throws IOException;
+    /**
+     * Create a new factory <code>Configuration</code> object with a new PID.
+     * 
+     * The properties of the new <code>Configuration</code> object are
+     * <code>null</code> until the first time that its
+     * {@link Configuration#update(Dictionary)}method is called.
+     * 
+     * <p>
+     * It is not required that the <code>factoryPid</code> maps to a
+     * registered Managed Service Factory.
+     * <p>
+     * The <code>Configuration</code> object is bound to the location of the
+     * calling bundle.
+     * 
+     * @param factoryPid PID of factory (not <code>null</code>).
+     * @return A new <code>Configuration</code> object.
+     * @throws IOException if access to persistent storage fails.
+     * @throws SecurityException if caller does not have
+     * <code>ConfigurationPermission[*,CONFIGURE]</code> and
+     * <code>factoryPid</code> is bound to another bundle.
+     */
+    public Configuration createFactoryConfiguration(String factoryPid) throws IOException;
 
-	/**
-	 * Get an existing <code>Configuration</code> object from the persistent
-	 * store, or create a new <code>Configuration</code> object.
-	 * 
-	 * <p>
-	 * If a <code>Configuration</code> with this PID already exists in
-	 * Configuration Admin service return it. The location parameter is ignored
-	 * in this case.
-	 * 
-	 * <p>
-	 * Else, return a new <code>Configuration</code> object. This new object
-	 * is bound to the location and the properties are set to <code>null</code>.
-	 * If the location parameter is <code>null</code>, it will be set when a
-	 * Managed Service with the corresponding PID is registered for the first
-	 * time.
-	 * 
-	 * @param pid Persistent identifier.
-	 * @param location The bundle location string, or <code>null</code>.
-	 * @return An existing or new <code>Configuration</code> object.
-	 * @throws IOException if access to persistent storage fails.
-	 * @throws SecurityException if the caller does not have <code>ConfigurationPermission[*,CONFIGURE]</code>.
-	 */
-	public Configuration getConfiguration(String pid, String location)
-			throws IOException;
+    /**
+     * Create a new factory <code>Configuration</code> object with a new PID.
+     * 
+     * The properties of the new <code>Configuration</code> object are
+     * <code>null</code> until the first time that its
+     * {@link Configuration#update(Dictionary)}method is called.
+     * 
+     * <p>
+     * It is not required that the <code>factoryPid</code> maps to a
+     * registered Managed Service Factory.
+     * 
+     * <p>
+     * The <code>Configuration</code> is bound to the location specified. If
+     * this location is <code>null</code> it will be bound to the location of
+     * the first bundle that registers a Managed Service Factory with a
+     * corresponding PID.
+     * 
+     * @param factoryPid PID of factory (not <code>null</code>).
+     * @param location A bundle location string, or <code>null</code>.
+     * @return a new <code>Configuration</code> object.
+     * @throws IOException if access to persistent storage fails.
+     * @throws SecurityException if caller does not have
+     * <code>ConfigurationPermission[*,CONFIGURE]</code>.
+     */
+    public Configuration createFactoryConfiguration(String factoryPid, String location) throws IOException;
 
-	/**
-	 * Get an existing or new <code>Configuration</code> object from the
-	 * persistent store.
-	 * 
-	 * If the <code>Configuration</code> object for this PID does not exist,
-	 * create a new <code>Configuration</code> object for that PID, where
-	 * properties are <code>null</code>. Bind its location to the calling
-	 * bundle's location.
-	 * 
-	 * <p>
-	 * Otherwise, if the location of the existing <code>Configuration</code> object
-	 * is <code>null</code>, set it to the calling bundle's location.
-	 * 
-	 * @param pid persistent identifier.
-	 * @return an existing or new <code>Configuration</code> matching the PID.
-	 * @throws IOException if access to persistent storage fails.
-	 * @throws SecurityException if the <code>Configuration</code> object is bound to a location different from that of the calling bundle and it has no <code>ConfigurationPermission[*,CONFIGURE]</code>.
-	 */
-	public Configuration getConfiguration(String pid) throws IOException;
+    /**
+     * Get an existing <code>Configuration</code> object from the persistent
+     * store, or create a new <code>Configuration</code> object.
+     * 
+     * <p>
+     * If a <code>Configuration</code> with this PID already exists in
+     * Configuration Admin service return it. The location parameter is ignored
+     * in this case.
+     * 
+     * <p>
+     * Else, return a new <code>Configuration</code> object. This new object
+     * is bound to the location and the properties are set to <code>null</code>.
+     * If the location parameter is <code>null</code>, it will be set when a
+     * Managed Service with the corresponding PID is registered for the first
+     * time.
+     * 
+     * @param pid Persistent identifier.
+     * @param location The bundle location string, or <code>null</code>.
+     * @return An existing or new <code>Configuration</code> object.
+     * @throws IOException if access to persistent storage fails.
+     * @throws SecurityException if the caller does not have
+     * <code>ConfigurationPermission[*,CONFIGURE]</code>.
+     */
+    public Configuration getConfiguration(String pid, String location) throws IOException;
 
-	/**
-	 * List the current <code>Configuration</code> objects which match the
-	 * filter.
-	 * 
-	 * <p>
-	 * Only <code>Configuration</code> objects with non- <code>null</code>
-	 * properties are considered current. That is,
-	 * <code>Configuration.getProperties()</code> is guaranteed not to return
-	 * <code>null</code> for each of the returned <code>Configuration</code>
-	 * objects.
-	 * 
-	 * <p>
-	 * Normally only <code>Configuration</code> objects that are bound to the
-	 * location of the calling bundle are returned, or all if the caller has 
-	 * <code>ConfigurationPermission[*,CONFIGURE]</code>.
-	 * 
-	 * <p>
-	 * The syntax of the filter string is as defined in the <code>Filter</code>
-	 * class. The filter can test any configuration parameters including the
-	 * following system properties:
-	 * <ul>
-	 * <li><code>service.pid</code>-<code>String</code>- the PID under
-	 * which this is registered</li>
-	 * <li><code>service.factoryPid</code>-<code>String</code>- the
-	 * factory if applicable</li>
-	 * <li><code>service.bundleLocation</code>-<code>String</code>- the
-	 * bundle location</li>
-	 * </ul>
-	 * The filter can also be <code>null</code>, meaning that all
-	 * <code>Configuration</code> objects should be returned.
-	 * 
-	 * @param filter a <code>Filter</code> object, or <code>null</code> to
-	 *        retrieve all <code>Configuration</code> objects.
-	 * @return all matching <code>Configuration</code> objects, or
-	 *         <code>null</code> if there aren't any
-	 * @throws IOException if access to persistent storage fails
-	 * @throws InvalidSyntaxException if the filter string is invalid
-	 */
-	public Configuration[] listConfigurations(String filter) throws IOException,
-			InvalidSyntaxException;
+    /**
+     * Get an existing or new <code>Configuration</code> object from the
+     * persistent store.
+     * 
+     * If the <code>Configuration</code> object for this PID does not exist,
+     * create a new <code>Configuration</code> object for that PID, where
+     * properties are <code>null</code>. Bind its location to the calling
+     * bundle's location.
+     * 
+     * <p>
+     * Otherwise, if the location of the existing <code>Configuration</code>
+     * object is <code>null</code>, set it to the calling bundle's location.
+     * 
+     * @param pid persistent identifier.
+     * @return an existing or new <code>Configuration</code> matching the PID.
+     * @throws IOException if access to persistent storage fails.
+     * @throws SecurityException if the <code>Configuration</code> object is
+     * bound to a location different from that of the calling bundle and it has
+     * no <code>ConfigurationPermission[*,CONFIGURE]</code>.
+     */
+    public Configuration getConfiguration(String pid) throws IOException;
+
+    /**
+     * List the current <code>Configuration</code> objects which match the
+     * filter.
+     * 
+     * <p>
+     * Only <code>Configuration</code> objects with non- <code>null</code>
+     * properties are considered current. That is,
+     * <code>Configuration.getProperties()</code> is guaranteed not to return
+     * <code>null</code> for each of the returned <code>Configuration</code>
+     * objects.
+     * 
+     * <p>
+     * Normally only <code>Configuration</code> objects that are bound to the
+     * location of the calling bundle are returned, or all if the caller has
+     * <code>ConfigurationPermission[*,CONFIGURE]</code>.
+     * 
+     * <p>
+     * The syntax of the filter string is as defined in the <code>Filter</code>
+     * class. The filter can test any configuration parameters including the
+     * following system properties:
+     * <ul>
+     * <li><code>service.pid</code>-<code>String</code>- the PID under
+     * which this is registered</li>
+     * <li><code>service.factoryPid</code>-<code>String</code>- the
+     * factory if applicable</li>
+     * <li><code>service.bundleLocation</code>-<code>String</code>- the
+     * bundle location</li>
+     * </ul>
+     * The filter can also be <code>null</code>, meaning that all
+     * <code>Configuration</code> objects should be returned.
+     * 
+     * @param filter a <code>Filter</code> object, or <code>null</code> to
+     * retrieve all <code>Configuration</code> objects.
+     * @return all matching <code>Configuration</code> objects, or
+     * <code>null</code> if there aren't any
+     * @throws IOException if access to persistent storage fails
+     * @throws InvalidSyntaxException if the filter string is invalid
+     */
+    public Configuration[] listConfigurations(String filter) throws IOException, InvalidSyntaxException;
 }
diff --git a/ipojo/src/main/java/org/osgi/service/cm/ConfigurationEvent.java b/ipojo/src/main/java/org/osgi/service/cm/ConfigurationEvent.java
index 28ef9e4..31683ac 100644
--- a/ipojo/src/main/java/org/osgi/service/cm/ConfigurationEvent.java
+++ b/ipojo/src/main/java/org/osgi/service/cm/ConfigurationEvent.java
@@ -1,19 +1,21 @@
 /*
- * $Header: /cvshome/build/org.osgi.service.cm/src/org/osgi/service/cm/ConfigurationEvent.java,v 1.8 2006/03/14 01:21:09 hargrave Exp $
+ * $Header:
+ * /cvshome/build/org.osgi.service.cm/src/org/osgi/service/cm/ConfigurationEvent.java,v
+ * 1.8 2006/03/14 01:21:09 hargrave Exp $
  * 
  * Copyright (c) OSGi Alliance (2004, 2005). All Rights Reserved.
  * 
- * Licensed 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
- *
+ * Licensed 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.
+ * 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.osgi.service.cm;
 
@@ -50,118 +52,122 @@
  * @since 1.2
  */
 public class ConfigurationEvent {
-	/**
-	 * A <code>Configuration</code> has been updated.
-	 * 
-	 * <p>
-	 * This <code>ConfigurationEvent</code> type that indicates that a
-	 * <code>Configuration</code> object has been updated with new properties.
-	 * 
-	 * An event is fired when a call to <code>Configuration.update</code>
-	 * successfully changes a configuration.
-	 * 
-	 * <p>
-	 * The value of <code>CM_UPDATED</code> is 1.
-	 */
-	public static final int			CM_UPDATED	= 1;
-	/**
-	 * A <code>Configuration</code> has been deleted.
-	 * 
-	 * <p>
-	 * This <code>ConfigurationEvent</code> type that indicates that a
-	 * <code>Configuration</code> object has been deleted.
-	 * 
-	 * An event is fired when a call to <code>Configuration.delete</code>
-	 * successfully deletes a configuration.
-	 * 
-	 * <p>
-	 * The value of <code>CM_DELETED</code> is 2.
-	 */
-	public static final int			CM_DELETED	= 2;
-	/**
-	 * Type of this event.
-	 * 
-	 * @see #getType
-	 */
-	private final int				type;
-	/**
-	 * The factory pid associated with this event.
-	 */
-	private final String			factoryPid;
-	/**
-	 * The pid associated with this event.
-	 */
-	private final String			pid;
-	/**
-	 * The ConfigurationAdmin service which created this event.
-	 */
-	private final ServiceReference	reference;
+    /**
+     * A <code>Configuration</code> has been updated.
+     * 
+     * <p>
+     * This <code>ConfigurationEvent</code> type that indicates that a
+     * <code>Configuration</code> object has been updated with new properties.
+     * 
+     * An event is fired when a call to <code>Configuration.update</code>
+     * successfully changes a configuration.
+     * 
+     * <p>
+     * The value of <code>CM_UPDATED</code> is 1.
+     */
+    public static final int CM_UPDATED = 1;
 
-	/**
-	 * Constructs a <code>ConfigurationEvent</code> object from the given
-	 * <code>ServiceReference</code> object, event type, and pids.
-	 * 
-	 * @param reference The <code>ServiceReference</code> object of the
-	 *        Configuration Admin service that created this event.
-	 * @param type The event type. See {@link #getType}.
-	 * @param factoryPid The factory pid of the associated configuration if the
-	 *        target of the configuration is a ManagedServiceFactory. Otherwise
-	 *        <code>null</code> if the target of the configuration is a
-	 *        ManagedService.
-	 * @param pid The pid of the associated configuration.
-	 */
-	public ConfigurationEvent(ServiceReference reference, int type,
-			String factoryPid, String pid) {
-		this.reference = reference;
-		this.type = type;
-		this.factoryPid = factoryPid;
-		this.pid = pid;
-	}
+    /**
+     * A <code>Configuration</code> has been deleted.
+     * 
+     * <p>
+     * This <code>ConfigurationEvent</code> type that indicates that a
+     * <code>Configuration</code> object has been deleted.
+     * 
+     * An event is fired when a call to <code>Configuration.delete</code>
+     * successfully deletes a configuration.
+     * 
+     * <p>
+     * The value of <code>CM_DELETED</code> is 2.
+     */
+    public static final int CM_DELETED = 2;
 
-	/**
-	 * Returns the factory pid of the associated configuration.
-	 * 
-	 * @return Returns the factory pid of the associated configuration if the
-	 *         target of the configuration is a ManagedServiceFactory. Otherwise
-	 *         <code>null</code> if the target of the configuration is a
-	 *         ManagedService.
-	 */
-	public String getFactoryPid() {
-		return factoryPid;
-	}
+    /**
+     * Type of this event.
+     * 
+     * @see #getType
+     */
+    private final int type;
 
-	/**
-	 * Returns the pid of the associated configuration.
-	 * 
-	 * @return Returns the pid of the associated configuration.
-	 */
-	public String getPid() {
-		return pid;
-	}
+    /**
+     * The factory pid associated with this event.
+     */
+    private final String factoryPid;
 
-	/**
-	 * Return the type of this event.
-	 * <p>
-	 * The type values are:
-	 * <ul>
-	 * <li>{@link #CM_UPDATED}
-	 * <li>{@link #CM_DELETED}
-	 * </ul>
-	 * 
-	 * @return The type of this event.
-	 */
-	public int getType() {
-		return type;
-	}
+    /**
+     * The pid associated with this event.
+     */
+    private final String pid;
 
-	/**
-	 * Return the <code>ServiceReference</code> object of the Configuration
-	 * Admin service that created this event.
-	 * 
-	 * @return The <code>ServiceReference</code> object for the Configuration
-	 *         Admin service that created this event.
-	 */
-	public ServiceReference getReference() {
-		return reference;
-	}
+    /**
+     * The ConfigurationAdmin service which created this event.
+     */
+    private final ServiceReference reference;
+
+    /**
+     * Constructs a <code>ConfigurationEvent</code> object from the given
+     * <code>ServiceReference</code> object, event type, and pids.
+     * 
+     * @param reference The <code>ServiceReference</code> object of the
+     * Configuration Admin service that created this event.
+     * @param type The event type. See {@link #getType}.
+     * @param factoryPid The factory pid of the associated configuration if the
+     * target of the configuration is a ManagedServiceFactory. Otherwise
+     * <code>null</code> if the target of the configuration is a
+     * ManagedService.
+     * @param pid The pid of the associated configuration.
+     */
+    public ConfigurationEvent(ServiceReference reference, int type, String factoryPid, String pid) {
+        this.reference = reference;
+        this.type = type;
+        this.factoryPid = factoryPid;
+        this.pid = pid;
+    }
+
+    /**
+     * Returns the factory pid of the associated configuration.
+     * 
+     * @return Returns the factory pid of the associated configuration if the
+     * target of the configuration is a ManagedServiceFactory. Otherwise
+     * <code>null</code> if the target of the configuration is a
+     * ManagedService.
+     */
+    public String getFactoryPid() {
+        return factoryPid;
+    }
+
+    /**
+     * Returns the pid of the associated configuration.
+     * 
+     * @return Returns the pid of the associated configuration.
+     */
+    public String getPid() {
+        return pid;
+    }
+
+    /**
+     * Return the type of this event.
+     * <p>
+     * The type values are:
+     * <ul>
+     * <li>{@link #CM_UPDATED}
+     * <li>{@link #CM_DELETED}
+     * </ul>
+     * 
+     * @return The type of this event.
+     */
+    public int getType() {
+        return type;
+    }
+
+    /**
+     * Return the <code>ServiceReference</code> object of the Configuration
+     * Admin service that created this event.
+     * 
+     * @return The <code>ServiceReference</code> object for the Configuration
+     * Admin service that created this event.
+     */
+    public ServiceReference getReference() {
+        return reference;
+    }
 }
\ No newline at end of file
diff --git a/ipojo/src/main/java/org/osgi/service/cm/ConfigurationException.java b/ipojo/src/main/java/org/osgi/service/cm/ConfigurationException.java
index 6d41dce..709d335 100644
--- a/ipojo/src/main/java/org/osgi/service/cm/ConfigurationException.java
+++ b/ipojo/src/main/java/org/osgi/service/cm/ConfigurationException.java
@@ -1,19 +1,21 @@
 /*
- * $Header: /cvshome/build/org.osgi.service.cm/src/org/osgi/service/cm/ConfigurationException.java,v 1.11 2006/03/14 01:21:09 hargrave Exp $
- *
+ * $Header:
+ * /cvshome/build/org.osgi.service.cm/src/org/osgi/service/cm/ConfigurationException.java,v
+ * 1.11 2006/03/14 01:21:09 hargrave Exp $
+ * 
  * Copyright (c) OSGi Alliance (2001, 2005). All Rights Reserved.
- *
- * Licensed 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
- *
+ * 
+ * Licensed 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.
+ * 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.osgi.service.cm;
 
@@ -24,89 +26,89 @@
  * @version $Revision: 1.11 $
  */
 public class ConfigurationException extends Exception {
-	static final long	serialVersionUID	= -1690090413441769377L;
+    static final long serialVersionUID = -1690090413441769377L;
 
-	private String		property;
-	private String		reason;
+    private String property;
 
-	/**
-	 * Nested exception.
-	 */
-	private Throwable	cause;
+    private String reason;
 
-	/**
-	 * Create a <code>ConfigurationException</code> object.
-	 * 
-	 * @param property name of the property that caused the problem,
-	 *        <code>null</code> if no specific property was the cause
-	 * @param reason reason for failure
-	 */
-	public ConfigurationException(String property, String reason) {
-		super(property + " : " + reason);
-		this.property = property;
-		this.reason = reason;
-		this.cause = null;
-	}
+    /**
+     * Nested exception.
+     */
+    private Throwable cause;
 
-	/**
-	 * Create a <code>ConfigurationException</code> object.
-	 * 
-	 * @param property name of the property that caused the problem,
-	 *        <code>null</code> if no specific property was the cause
-	 * @param reason reason for failure
-	 * @param cause The cause of this exception.
-	 * @since 1.2
-	 */
-	public ConfigurationException(String property, String reason,
-			Throwable cause) {
-		super(property + " : " + reason);
-		this.property = property;
-		this.reason = reason;
-		this.cause = cause;
-	}
+    /**
+     * Create a <code>ConfigurationException</code> object.
+     * 
+     * @param property name of the property that caused the problem,
+     * <code>null</code> if no specific property was the cause
+     * @param reason reason for failure
+     */
+    public ConfigurationException(String property, String reason) {
+        super(property + " : " + reason);
+        this.property = property;
+        this.reason = reason;
+        this.cause = null;
+    }
 
-	/**
-	 * Return the property name that caused the failure or null.
-	 * 
-	 * @return name of property or null if no specific property caused the
-	 *         problem
-	 */
-	public String getProperty() {
-		return property;
-	}
+    /**
+     * Create a <code>ConfigurationException</code> object.
+     * 
+     * @param property name of the property that caused the problem,
+     * <code>null</code> if no specific property was the cause
+     * @param reason reason for failure
+     * @param cause The cause of this exception.
+     * @since 1.2
+     */
+    public ConfigurationException(String property, String reason, Throwable cause) {
+        super(property + " : " + reason);
+        this.property = property;
+        this.reason = reason;
+        this.cause = cause;
+    }
 
-	/**
-	 * Return the reason for this exception.
-	 * 
-	 * @return reason of the failure
-	 */
-	public String getReason() {
-		return reason;
-	}
+    /**
+     * Return the property name that caused the failure or null.
+     * 
+     * @return name of property or null if no specific property caused the
+     * problem
+     */
+    public String getProperty() {
+        return property;
+    }
 
-	/**
-	 * Returns the cause of this exception or <code>null</code> if no cause
-	 * was specified when this exception was created.
-	 * 
-	 * @return The cause of this exception or <code>null</code> if no cause
-	 *         was specified.
-	 * @since 1.2
-	 */
-	public Throwable getCause() {
-		return cause;
-	}
+    /**
+     * Return the reason for this exception.
+     * 
+     * @return reason of the failure
+     */
+    public String getReason() {
+        return reason;
+    }
 
-	/**
-	 * The cause of this exception can only be set when constructed.
-	 * 
-	 * @param cause Cause of the exception.
-	 * @return This object.
-	 * @throws java.lang.IllegalStateException This method will always throw an
-	 *         <code>IllegalStateException</code> since the cause of this
-	 *         exception can only be set when constructed.
-	 * @since 1.2
-	 */
-	public Throwable initCause(Throwable cause) {
-		throw new IllegalStateException();
-	}
+    /**
+     * Returns the cause of this exception or <code>null</code> if no cause
+     * was specified when this exception was created.
+     * 
+     * @return The cause of this exception or <code>null</code> if no cause
+     * was specified.
+     * @since 1.2
+     */
+    public Throwable getCause() {
+        return cause;
+    }
+
+    /**
+     * The cause of this exception can only be set when constructed.
+     * 
+     * @param cause Cause of the exception.
+     * @return This object.
+     * @throws java.lang.IllegalStateException This method will always throw an
+     * <code>IllegalStateException</code> since the cause of this exception
+     * can only be set when constructed.
+     * @since 1.2
+     */
+    public Throwable initCause(Throwable cause) {
+        throw new IllegalStateException();
+    }
 }
diff --git a/ipojo/src/main/java/org/osgi/service/cm/ConfigurationListener.java b/ipojo/src/main/java/org/osgi/service/cm/ConfigurationListener.java
index f7fb6a6..83dd364 100644
--- a/ipojo/src/main/java/org/osgi/service/cm/ConfigurationListener.java
+++ b/ipojo/src/main/java/org/osgi/service/cm/ConfigurationListener.java
@@ -1,19 +1,21 @@
 /*
- * $Header: /cvshome/build/org.osgi.service.cm/src/org/osgi/service/cm/ConfigurationListener.java,v 1.9 2006/03/14 01:21:09 hargrave Exp $
+ * $Header:
+ * /cvshome/build/org.osgi.service.cm/src/org/osgi/service/cm/ConfigurationListener.java,v
+ * 1.9 2006/03/14 01:21:09 hargrave Exp $
  * 
  * Copyright (c) OSGi Alliance (2004, 2005). All Rights Reserved.
  * 
- * Licensed 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
- *
+ * Licensed 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.
+ * 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.osgi.service.cm;
 
@@ -41,10 +43,10 @@
  * @since 1.2
  */
 public interface ConfigurationListener {
-	/**
-	 * Receives notification of a Configuration that has changed.
-	 * 
-	 * @param event The <code>ConfigurationEvent</code>.
-	 */
-	public void configurationEvent(ConfigurationEvent event);
+    /**
+     * Receives notification of a Configuration that has changed.
+     * 
+     * @param event The <code>ConfigurationEvent</code>.
+     */
+    public void configurationEvent(ConfigurationEvent event);
 }
\ No newline at end of file
diff --git a/ipojo/src/main/java/org/osgi/service/cm/ConfigurationPermission.java b/ipojo/src/main/java/org/osgi/service/cm/ConfigurationPermission.java
index 6d5119f..33f9ab2 100644
--- a/ipojo/src/main/java/org/osgi/service/cm/ConfigurationPermission.java
+++ b/ipojo/src/main/java/org/osgi/service/cm/ConfigurationPermission.java
@@ -1,19 +1,21 @@
 /*
- * $Header: /cvshome/build/org.osgi.service.cm/src/org/osgi/service/cm/ConfigurationPermission.java,v 1.20 2006/03/14 01:21:09 hargrave Exp $
+ * $Header:
+ * /cvshome/build/org.osgi.service.cm/src/org/osgi/service/cm/ConfigurationPermission.java,v
+ * 1.20 2006/03/14 01:21:09 hargrave Exp $
  * 
  * Copyright (c) OSGi Alliance (2004, 2005). All Rights Reserved.
  * 
- * Licensed 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
- *
+ * Licensed 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.
+ * 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.osgi.service.cm;
@@ -34,93 +36,93 @@
  */
 
 public final class ConfigurationPermission extends BasicPermission {
-	static final long			serialVersionUID	= 5716868734811965383L;
-	/**
-	 * The action string <code>configure</code>.
-	 */
-	public final static String	CONFIGURE			= "configure";
+    static final long serialVersionUID = 5716868734811965383L;
 
-	/**
-	 * Create a new ConfigurationPermission.
-	 * 
-	 * @param name Name must be &quot;*&quot;.
-	 * @param actions <code>configure</code> (canonical order).
-	 */
+    /**
+     * The action string <code>configure</code>.
+     */
+    public final static String CONFIGURE = "configure";
 
-	public ConfigurationPermission(String name, String actions) {
-		super(name);
-		if (!name.equals("*")) {
-			throw new IllegalArgumentException("name must be *");
-		}
-		actions = actions.trim();
-		if (actions.equalsIgnoreCase(CONFIGURE)||actions.equals("*"))
-			return;
-		
-		throw new IllegalArgumentException("actions must be " + CONFIGURE);
-	}
+    /**
+     * Create a new ConfigurationPermission.
+     * 
+     * @param name Name must be &quot;*&quot;.
+     * @param actions <code>configure</code> (canonical order).
+     */
 
-	/**
-	 * Determines if a <code>ConfigurationPermission</code> object "implies"
-	 * the specified permission.
-	 * 
-	 * @param p The target permission to check.
-	 * @return <code>true</code> if the specified permission is implied by
-	 *         this object; <code>false</code> otherwise.
-	 */
+    public ConfigurationPermission(String name, String actions) {
+        super(name);
+        if (!name.equals("*")) {
+            throw new IllegalArgumentException("name must be *");
+        }
+        actions = actions.trim();
+        if (actions.equalsIgnoreCase(CONFIGURE) || actions.equals("*"))
+            return;
 
-	public boolean implies(Permission p) {
-		return p instanceof ConfigurationPermission;
-	}
+        throw new IllegalArgumentException("actions must be " + CONFIGURE);
+    }
 
-	/**
-	 * Determines the equality of two <code>ConfigurationPermission</code>
-	 * objects.
-	 * <p>
-	 * Two <code>ConfigurationPermission</code> objects are equal.
-	 * 
-	 * @param obj The object being compared for equality with this object.
-	 * @return <code>true</code> if <code>obj</code> is equivalent to this
-	 *         <code>ConfigurationPermission</code>; <code>false</code>
-	 *         otherwise.
-	 */
-	public boolean equals(Object obj) {
-		return obj instanceof ConfigurationPermission;
-	}
+    /**
+     * Determines if a <code>ConfigurationPermission</code> object "implies"
+     * the specified permission.
+     * 
+     * @param p The target permission to check.
+     * @return <code>true</code> if the specified permission is implied by
+     * this object; <code>false</code> otherwise.
+     */
 
-	/**
-	 * Returns the hash code value for this object.
-	 * 
-	 * @return Hash code value for this object.
-	 */
+    public boolean implies(Permission p) {
+        return p instanceof ConfigurationPermission;
+    }
 
-	public int hashCode() {
-		return getName().hashCode() ^ getActions().hashCode();
-	}
+    /**
+     * Determines the equality of two <code>ConfigurationPermission</code>
+     * objects.
+     * <p>
+     * Two <code>ConfigurationPermission</code> objects are equal.
+     * 
+     * @param obj The object being compared for equality with this object.
+     * @return <code>true</code> if <code>obj</code> is equivalent to this
+     * <code>ConfigurationPermission</code>; <code>false</code> otherwise.
+     */
+    public boolean equals(Object obj) {
+        return obj instanceof ConfigurationPermission;
+    }
 
-	/**
-	 * Returns the canonical string representation of the
-	 * <code>ConfigurationPermission</code> actions.
-	 * 
-	 * <p>
-	 * Always returns present <code>ConfigurationPermission</code> actions in
-	 * the following order: <code>CONFIGURE</code>
-	 * 
-	 * @return Canonical string representation of the
-	 *         <code>ConfigurationPermission</code> actions.
-	 */
-	public String getActions() {
-		return CONFIGURE;
-	}
+    /**
+     * Returns the hash code value for this object.
+     * 
+     * @return Hash code value for this object.
+     */
 
-	/**
-	 * Returns a new <code>PermissionCollection</code> object suitable for
-	 * storing <code>ConfigurationPermission</code>s.
-	 * 
-	 * @return A new <code>PermissionCollection</code> object.
-	 */
-	public PermissionCollection newPermissionCollection() {
-		return new ConfigurationPermissionCollection();
-	}
+    public int hashCode() {
+        return getName().hashCode() ^ getActions().hashCode();
+    }
+
+    /**
+     * Returns the canonical string representation of the
+     * <code>ConfigurationPermission</code> actions.
+     * 
+     * <p>
+     * Always returns present <code>ConfigurationPermission</code> actions in
+     * the following order: <code>CONFIGURE</code>
+     * 
+     * @return Canonical string representation of the
+     * <code>ConfigurationPermission</code> actions.
+     */
+    public String getActions() {
+        return CONFIGURE;
+    }
+
+    /**
+     * Returns a new <code>PermissionCollection</code> object suitable for
+     * storing <code>ConfigurationPermission</code>s.
+     * 
+     * @return A new <code>PermissionCollection</code> object.
+     */
+    public PermissionCollection newPermissionCollection() {
+        return new ConfigurationPermissionCollection();
+    }
 }
 
 /**
@@ -131,89 +133,86 @@
  * @see java.security.PermissionCollection
  */
 final class ConfigurationPermissionCollection extends PermissionCollection {
-	static final long	serialVersionUID	= -6917638867081695839L;
-	/**
-	 * True if collection is non-empty.
-	 * 
-	 * @serial
-	 */
-	private boolean		hasElement;
+    static final long serialVersionUID = -6917638867081695839L;
 
-	/**
-	 * Creates an empty <tt>ConfigurationPermissionCollection</tt> object.
-	 * 
-	 */
-	public ConfigurationPermissionCollection() {
-		hasElement = false;
-	}
+    /**
+     * True if collection is non-empty.
+     * 
+     * @serial
+     */
+    private boolean hasElement;
 
-	/**
-	 * Adds the specified permission to the
-	 * <tt>ConfigurationPermissionCollection</tt>. The key for the hash is
-	 * the interface name of the service.
-	 * 
-	 * @param permission The <tt>Permission</tt> object to add.
-	 * 
-	 * @exception IllegalArgumentException If the permission is not an
-	 *            <tt>ConfigurationPermission</tt>.
-	 * 
-	 * @exception SecurityException If this ConfigurationPermissionCollection
-	 *            object has been marked read-only.
-	 */
+    /**
+     * Creates an empty <tt>ConfigurationPermissionCollection</tt> object.
+     * 
+     */
+    public ConfigurationPermissionCollection() {
+        hasElement = false;
+    }
 
-	public void add(Permission permission) {
-		if (!(permission instanceof ConfigurationPermission)) {
-			throw new IllegalArgumentException("invalid permission: "
-					+ permission);
-		}
+    /**
+     * Adds the specified permission to the
+     * <tt>ConfigurationPermissionCollection</tt>. The key for the hash is
+     * the interface name of the service.
+     * 
+     * @param permission The <tt>Permission</tt> object to add.
+     * 
+     * @exception IllegalArgumentException If the permission is not an
+     * <tt>ConfigurationPermission</tt>.
+     * 
+     * @exception SecurityException If this ConfigurationPermissionCollection
+     * object has been marked read-only.
+     */
 
-		if (isReadOnly())
-			throw new SecurityException("attempt to add a Permission to a "
-					+ "readonly PermissionCollection");
+    public void add(Permission permission) {
+        if (!(permission instanceof ConfigurationPermission)) {
+            throw new IllegalArgumentException("invalid permission: " + permission);
+        }
 
-		hasElement = true;
-	}
+        if (isReadOnly())
+            throw new SecurityException("attempt to add a Permission to a " + "readonly PermissionCollection");
 
-	/**
-	 * Determines if the specified set of permissions implies the permissions
-	 * expressed in the parameter <tt>permission</tt>.
-	 * 
-	 * @param p The Permission object to compare.
-	 * 
-	 * @return true if permission is a proper subset of a permission in the set;
-	 *         false otherwise.
-	 */
+        hasElement = true;
+    }
 
-	public boolean implies(Permission p) {
-		return hasElement && (p instanceof ConfigurationPermission);
-	}
+    /**
+     * Determines if the specified set of permissions implies the permissions
+     * expressed in the parameter <tt>permission</tt>.
+     * 
+     * @param p The Permission object to compare.
+     * 
+     * @return true if permission is a proper subset of a permission in the set;
+     * false otherwise.
+     */
 
-	/**
-	 * Returns an enumeration of an <tt>ConfigurationPermission</tt> object.
-	 * 
-	 * @return Enumeration of an <tt>ConfigurationPermission</tt> object.
-	 */
+    public boolean implies(Permission p) {
+        return hasElement && (p instanceof ConfigurationPermission);
+    }
 
-	public Enumeration elements() {
-		return new Enumeration() {
-			private boolean	more	= hasElement;
+    /**
+     * Returns an enumeration of an <tt>ConfigurationPermission</tt> object.
+     * 
+     * @return Enumeration of an <tt>ConfigurationPermission</tt> object.
+     */
 
-			public boolean hasMoreElements() {
-				return more;
-			}
+    public Enumeration elements() {
+        return new Enumeration() {
+            private boolean more = hasElement;
 
-			public Object nextElement() {
-				if (more) {
-					more = false;
+            public boolean hasMoreElements() {
+                return more;
+            }
 
-					return new ConfigurationPermission("*",
-							ConfigurationPermission.CONFIGURE);
-				}
-				else {
-					throw new NoSuchElementException();
-				}
-			}
-		};
-	}
+            public Object nextElement() {
+                if (more) {
+                    more = false;
+
+                    return new ConfigurationPermission("*", ConfigurationPermission.CONFIGURE);
+                } else {
+                    throw new NoSuchElementException();
+                }
+            }
+        };
+    }
 
 }
diff --git a/ipojo/src/main/java/org/osgi/service/cm/ConfigurationPlugin.java b/ipojo/src/main/java/org/osgi/service/cm/ConfigurationPlugin.java
index 089e626..2eee326 100644
--- a/ipojo/src/main/java/org/osgi/service/cm/ConfigurationPlugin.java
+++ b/ipojo/src/main/java/org/osgi/service/cm/ConfigurationPlugin.java
@@ -1,19 +1,21 @@
 /*
- * $Header: /cvshome/build/org.osgi.service.cm/src/org/osgi/service/cm/ConfigurationPlugin.java,v 1.10 2006/03/14 01:21:09 hargrave Exp $
- *
+ * $Header:
+ * /cvshome/build/org.osgi.service.cm/src/org/osgi/service/cm/ConfigurationPlugin.java,v
+ * 1.10 2006/03/14 01:21:09 hargrave Exp $
+ * 
  * Copyright (c) OSGi Alliance (2001, 2005). All Rights Reserved.
- *
- * Licensed 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
- *
+ * 
+ * Licensed 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.
+ * 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.osgi.service.cm;
 
@@ -79,53 +81,53 @@
  * @version $Revision: 1.10 $
  */
 public interface ConfigurationPlugin {
-	/**
-	 * A service property to limit the Managed Service or Managed Service
-	 * Factory configuration dictionaries a Configuration Plugin service
-	 * receives.
-	 * 
-	 * This property contains a <code>String[]</code> of PIDs. A Configuration
-	 * Admin service must call a Configuration Plugin service only when this
-	 * property is not set, or the target service's PID is listed in this
-	 * property.
-	 */
-	public static final String	CM_TARGET	= "cm.target";
-	/**
-	 * A service property to specify the order in which plugins are invoked.
-	 * 
-	 * This property contains an <code>Integer</code> ranking of the plugin.
-	 * Not specifying this registration property, or setting it to something
-	 * other than an <code>Integer</code>, is the same as setting it to the
-	 * <code>Integer</code> zero. This property determines the order in which
-	 * plugins are invoked. Lower ranked plugins are called before higher ranked
-	 * ones.
-	 * 
-	 * @since 1.2
-	 */
-	public static final String	CM_RANKING	= "service.cmRanking";
+    /**
+     * A service property to limit the Managed Service or Managed Service
+     * Factory configuration dictionaries a Configuration Plugin service
+     * receives.
+     * 
+     * This property contains a <code>String[]</code> of PIDs. A Configuration
+     * Admin service must call a Configuration Plugin service only when this
+     * property is not set, or the target service's PID is listed in this
+     * property.
+     */
+    public static final String CM_TARGET = "cm.target";
 
-	/**
-	 * View and possibly modify the a set of configuration properties before
-	 * they are sent to the Managed Service or the Managed Service Factory. The
-	 * Configuration Plugin services are called in increasing order of their
-	 * <code>service.cmRanking</code> property. If this property is undefined
-	 * or is a non- <code>Integer</code> type, 0 is used.
-	 * 
-	 * <p>
-	 * This method should not modify the properties unless the
-	 * <code>service.cmRanking</code> of this plugin is in the range
-	 * <code>0 &lt;= service.cmRanking &lt;= 1000</code>.
-	 * <p>
-	 * If this method throws any <code>Exception</code>, the Configuration
-	 * Admin service must catch it and should log it.
-	 * 
-	 * @param reference reference to the Managed Service or Managed Service
-	 *        Factory
-	 * @param properties The configuration properties. This argument must not
-	 *        contain the "service.bundleLocation" property. The value of this
-	 *        property may be obtained from the
-	 *        <code>Configuration.getBundleLocation</code> method.
-	 */
-	public void modifyConfiguration(ServiceReference reference,
-			Dictionary properties);
+    /**
+     * A service property to specify the order in which plugins are invoked.
+     * 
+     * This property contains an <code>Integer</code> ranking of the plugin.
+     * Not specifying this registration property, or setting it to something
+     * other than an <code>Integer</code>, is the same as setting it to the
+     * <code>Integer</code> zero. This property determines the order in which
+     * plugins are invoked. Lower ranked plugins are called before higher ranked
+     * ones.
+     * 
+     * @since 1.2
+     */
+    public static final String CM_RANKING = "service.cmRanking";
+
+    /**
+     * View and possibly modify the a set of configuration properties before
+     * they are sent to the Managed Service or the Managed Service Factory. The
+     * Configuration Plugin services are called in increasing order of their
+     * <code>service.cmRanking</code> property. If this property is undefined
+     * or is a non- <code>Integer</code> type, 0 is used.
+     * 
+     * <p>
+     * This method should not modify the properties unless the
+     * <code>service.cmRanking</code> of this plugin is in the range
+     * <code>0 &lt;= service.cmRanking &lt;= 1000</code>.
+     * <p>
+     * If this method throws any <code>Exception</code>, the Configuration
+     * Admin service must catch it and should log it.
+     * 
+     * @param reference reference to the Managed Service or Managed Service
+     * Factory
+     * @param properties The configuration properties. This argument must not
+     * contain the "service.bundleLocation" property. The value of this property
+     * may be obtained from the <code>Configuration.getBundleLocation</code>
+     * method.
+     */
+    public void modifyConfiguration(ServiceReference reference, Dictionary properties);
 }
diff --git a/ipojo/src/main/java/org/osgi/service/cm/ManagedService.java b/ipojo/src/main/java/org/osgi/service/cm/ManagedService.java
index b5ccce4..e7582a2 100644
--- a/ipojo/src/main/java/org/osgi/service/cm/ManagedService.java
+++ b/ipojo/src/main/java/org/osgi/service/cm/ManagedService.java
@@ -1,19 +1,21 @@
 /*
- * $Header: /cvshome/build/org.osgi.service.cm/src/org/osgi/service/cm/ManagedService.java,v 1.11 2006/03/14 01:21:09 hargrave Exp $
- *
+ * $Header:
+ * /cvshome/build/org.osgi.service.cm/src/org/osgi/service/cm/ManagedService.java,v
+ * 1.11 2006/03/14 01:21:09 hargrave Exp $
+ * 
  * Copyright (c) OSGi Alliance (2001, 2005). All Rights Reserved.
- *
- * Licensed 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
- *
+ * 
+ * Licensed 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.
+ * 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.osgi.service.cm;
 
@@ -110,31 +112,30 @@
  * @version $Revision: 1.11 $
  */
 public interface ManagedService {
-	/**
-	 * Update the configuration for a Managed Service.
-	 * 
-	 * <p>
-	 * When the implementation of <code>updated(Dictionary)</code> detects any
-	 * kind of error in the configuration properties, it should create a new
-	 * <code>ConfigurationException</code> which describes the problem. This
-	 * can allow a management system to provide useful information to a human
-	 * administrator.
-	 * 
-	 * <p>
-	 * If this method throws any other <code>Exception</code>, the
-	 * Configuration Admin service must catch it and should log it.
-	 * <p>
-	 * The Configuration Admin service must call this method asynchronously
-	 * which initiated the callback. This implies that implementors of Managed
-	 * Service can be assured that the callback will not take place during
-	 * registration when they execute the registration in a synchronized method.
-	 * 
-	 * @param properties A copy of the Configuration properties, or
-	 *        <code>null</code>. This argument must not contain the
-	 *        "service.bundleLocation" property. The value of this property may
-	 *        be obtained from the <code>Configuration.getBundleLocation</code>
-	 *        method.
-	 * @throws ConfigurationException when the update fails
-	 */
-	public void updated(Dictionary properties) throws ConfigurationException;
+    /**
+     * Update the configuration for a Managed Service.
+     * 
+     * <p>
+     * When the implementation of <code>updated(Dictionary)</code> detects any
+     * kind of error in the configuration properties, it should create a new
+     * <code>ConfigurationException</code> which describes the problem. This
+     * can allow a management system to provide useful information to a human
+     * administrator.
+     * 
+     * <p>
+     * If this method throws any other <code>Exception</code>, the
+     * Configuration Admin service must catch it and should log it.
+     * <p>
+     * The Configuration Admin service must call this method asynchronously
+     * which initiated the callback. This implies that implementors of Managed
+     * Service can be assured that the callback will not take place during
+     * registration when they execute the registration in a synchronized method.
+     * 
+     * @param properties A copy of the Configuration properties, or
+     * <code>null</code>. This argument must not contain the
+     * "service.bundleLocation" property. The value of this property may be
+     * obtained from the <code>Configuration.getBundleLocation</code> method.
+     * @throws ConfigurationException when the update fails
+     */
+    public void updated(Dictionary properties) throws ConfigurationException;
 }
diff --git a/ipojo/src/main/java/org/osgi/service/cm/ManagedServiceFactory.java b/ipojo/src/main/java/org/osgi/service/cm/ManagedServiceFactory.java
index 001ddd8..fccaa6a 100644
--- a/ipojo/src/main/java/org/osgi/service/cm/ManagedServiceFactory.java
+++ b/ipojo/src/main/java/org/osgi/service/cm/ManagedServiceFactory.java
@@ -1,19 +1,21 @@
 /*
- * $Header: /cvshome/build/org.osgi.service.cm/src/org/osgi/service/cm/ManagedServiceFactory.java,v 1.10 2006/03/14 01:21:09 hargrave Exp $
- *
+ * $Header:
+ * /cvshome/build/org.osgi.service.cm/src/org/osgi/service/cm/ManagedServiceFactory.java,v
+ * 1.10 2006/03/14 01:21:09 hargrave Exp $
+ * 
  * Copyright (c) OSGi Alliance (2001, 2005). All Rights Reserved.
- *
- * Licensed 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
- *
+ * 
+ * Licensed 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.
+ * 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.osgi.service.cm;
 
@@ -97,66 +99,65 @@
  * @version $Revision: 1.10 $
  */
 public interface ManagedServiceFactory {
-	/**
-	 * Return a descriptive name of this factory.
-	 * 
-	 * @return the name for the factory, which might be localized
-	 */
-	public String getName();
+    /**
+     * Return a descriptive name of this factory.
+     * 
+     * @return the name for the factory, which might be localized
+     */
+    public String getName();
 
-	/**
-	 * Create a new instance, or update the configuration of an existing
-	 * instance.
-	 * 
-	 * If the PID of the <code>Configuration</code> object is new for the
-	 * Managed Service Factory, then create a new factory instance, using the
-	 * configuration <code>properties</code> provided. Else, update the
-	 * service instance with the provided <code>properties</code>.
-	 * 
-	 * <p>
-	 * If the factory instance is registered with the Framework, then the
-	 * configuration <code>properties</code> should be copied to its registry
-	 * properties. This is not mandatory and security sensitive properties
-	 * should obviously not be copied.
-	 * 
-	 * <p>
-	 * If this method throws any <code>Exception</code>, the Configuration
-	 * Admin service must catch it and should log it.
-	 * 
-	 * <p>
-	 * When the implementation of updated detects any kind of error in the
-	 * configuration properties, it should create a new
-	 * {@link ConfigurationException}which describes the problem.
-	 * 
-	 * <p>
-	 * The Configuration Admin service must call this method asynchronously.
-	 * This implies that implementors of the <code>ManagedServiceFactory</code>
-	 * class can be assured that the callback will not take place during
-	 * registration when they execute the registration in a synchronized method.
-	 * 
-	 * @param pid The PID for this configuration.
-	 * @param properties A copy of the configuration properties. This argument
-	 *        must not contain the service.bundleLocation" property. The value
-	 *        of this property may be obtained from the
-	 *        <code>Configuration.getBundleLocation</code> method.
-	 * @throws ConfigurationException when the configuration properties are
-	 *         invalid.
-	 */
-	public void updated(String pid, Dictionary properties)
-			throws ConfigurationException;
+    /**
+     * Create a new instance, or update the configuration of an existing
+     * instance.
+     * 
+     * If the PID of the <code>Configuration</code> object is new for the
+     * Managed Service Factory, then create a new factory instance, using the
+     * configuration <code>properties</code> provided. Else, update the
+     * service instance with the provided <code>properties</code>.
+     * 
+     * <p>
+     * If the factory instance is registered with the Framework, then the
+     * configuration <code>properties</code> should be copied to its registry
+     * properties. This is not mandatory and security sensitive properties
+     * should obviously not be copied.
+     * 
+     * <p>
+     * If this method throws any <code>Exception</code>, the Configuration
+     * Admin service must catch it and should log it.
+     * 
+     * <p>
+     * When the implementation of updated detects any kind of error in the
+     * configuration properties, it should create a new
+     * {@link ConfigurationException}which describes the problem.
+     * 
+     * <p>
+     * The Configuration Admin service must call this method asynchronously.
+     * This implies that implementors of the <code>ManagedServiceFactory</code>
+     * class can be assured that the callback will not take place during
+     * registration when they execute the registration in a synchronized method.
+     * 
+     * @param pid The PID for this configuration.
+     * @param properties A copy of the configuration properties. This argument
+     * must not contain the service.bundleLocation" property. The value of this
+     * property may be obtained from the
+     * <code>Configuration.getBundleLocation</code> method.
+     * @throws ConfigurationException when the configuration properties are
+     * invalid.
+     */
+    public void updated(String pid, Dictionary properties) throws ConfigurationException;
 
-	/**
-	 * Remove a factory instance.
-	 * 
-	 * Remove the factory instance associated with the PID. If the instance was
-	 * registered with the service registry, it should be unregistered.
-	 * <p>
-	 * If this method throws any <code>Exception</code>, the Configuration
-	 * Admin service must catch it and should log it.
-	 * <p>
-	 * The Configuration Admin service must call this method asynchronously.
-	 * 
-	 * @param pid the PID of the service to be removed
-	 */
-	public void deleted(String pid);
+    /**
+     * Remove a factory instance.
+     * 
+     * Remove the factory instance associated with the PID. If the instance was
+     * registered with the service registry, it should be unregistered.
+     * <p>
+     * If this method throws any <code>Exception</code>, the Configuration
+     * Admin service must catch it and should log it.
+     * <p>
+     * The Configuration Admin service must call this method asynchronously.
+     * 
+     * @param pid the PID of the service to be removed
+     */
+    public void deleted(String pid);
 }
diff --git a/ipojo/src/main/java/org/osgi/service/log/LogEntry.java b/ipojo/src/main/java/org/osgi/service/log/LogEntry.java
index 12e6c8d..c45f168 100644
--- a/ipojo/src/main/java/org/osgi/service/log/LogEntry.java
+++ b/ipojo/src/main/java/org/osgi/service/log/LogEntry.java
@@ -1,19 +1,21 @@
 /*
- * $Header: /cvshome/build/org.osgi.service.log/src/org/osgi/service/log/LogEntry.java,v 1.9 2006/06/16 16:31:49 hargrave Exp $
- *
+ * $Header:
+ * /cvshome/build/org.osgi.service.log/src/org/osgi/service/log/LogEntry.java,v
+ * 1.9 2006/06/16 16:31:49 hargrave Exp $
+ * 
  * Copyright (c) OSGi Alliance (2000, 2006). All Rights Reserved.
- *
- * Licensed 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
- *
+ * 
+ * Licensed 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.
+ * 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.osgi.service.log;
 
@@ -34,76 +36,76 @@
  * @see LogListener
  */
 public interface LogEntry {
-	/**
-	 * Returns the bundle that created this <code>LogEntry</code> object.
-	 * 
-	 * @return The bundle that created this <code>LogEntry</code> object;
-	 *         <code>null</code> if no bundle is associated with this
-	 *         <code>LogEntry</code> object.
-	 */
-	public Bundle getBundle();
+    /**
+     * Returns the bundle that created this <code>LogEntry</code> object.
+     * 
+     * @return The bundle that created this <code>LogEntry</code> object;
+     * <code>null</code> if no bundle is associated with this
+     * <code>LogEntry</code> object.
+     */
+    public Bundle getBundle();
 
-	/**
-	 * Returns the <code>ServiceReference</code> object for the service associated
-	 * with this <code>LogEntry</code> object.
-	 * 
-	 * @return <code>ServiceReference</code> object for the service associated
-	 *         with this <code>LogEntry</code> object; <code>null</code> if no
-	 *         <code>ServiceReference</code> object was provided.
-	 */
-	public ServiceReference getServiceReference();
+    /**
+     * Returns the <code>ServiceReference</code> object for the service
+     * associated with this <code>LogEntry</code> object.
+     * 
+     * @return <code>ServiceReference</code> object for the service associated
+     * with this <code>LogEntry</code> object; <code>null</code> if no
+     * <code>ServiceReference</code> object was provided.
+     */
+    public ServiceReference getServiceReference();
 
-	/**
-	 * Returns the severity level of this <code>LogEntry</code> object.
-	 * 
-	 * <p>
-	 * This is one of the severity levels defined by the <code>LogService</code>
-	 * interface.
-	 * 
-	 * @return Severity level of this <code>LogEntry</code> object.
-	 * 
-	 * @see LogService#LOG_ERROR
-	 * @see LogService#LOG_WARNING
-	 * @see LogService#LOG_INFO
-	 * @see LogService#LOG_DEBUG
-	 */
-	public int getLevel();
+    /**
+     * Returns the severity level of this <code>LogEntry</code> object.
+     * 
+     * <p>
+     * This is one of the severity levels defined by the <code>LogService</code>
+     * interface.
+     * 
+     * @return Severity level of this <code>LogEntry</code> object.
+     * 
+     * @see LogService#LOG_ERROR
+     * @see LogService#LOG_WARNING
+     * @see LogService#LOG_INFO
+     * @see LogService#LOG_DEBUG
+     */
+    public int getLevel();
 
-	/**
-	 * Returns the human readable message associated with this <code>LogEntry</code>
-	 * object.
-	 * 
-	 * @return <code>String</code> containing the message associated with this
-	 *         <code>LogEntry</code> object.
-	 */
-	public String getMessage();
+    /**
+     * Returns the human readable message associated with this
+     * <code>LogEntry</code> object.
+     * 
+     * @return <code>String</code> containing the message associated with this
+     * <code>LogEntry</code> object.
+     */
+    public String getMessage();
 
-	/**
-	 * Returns the exception object associated with this <code>LogEntry</code>
-	 * object.
-	 * 
-	 * <p>
-	 * In some implementations, the returned exception may not be the original
-	 * exception. To avoid references to a bundle defined exception class, thus
-	 * preventing an uninstalled bundle from being garbage collected, the Log
-	 * Service may return an exception object of an implementation defined
-	 * Throwable subclass. The returned object will attempt to provide as much
-	 * information as possible from the original exception object such as the
-	 * message and stack trace.
-	 * 
-	 * @return <code>Throwable</code> object of the exception associated with this
-	 *         <code>LogEntry</code>;<code>null</code> if no exception is
-	 *         associated with this <code>LogEntry</code> object.
-	 */
-	public Throwable getException();
+    /**
+     * Returns the exception object associated with this <code>LogEntry</code>
+     * object.
+     * 
+     * <p>
+     * In some implementations, the returned exception may not be the original
+     * exception. To avoid references to a bundle defined exception class, thus
+     * preventing an uninstalled bundle from being garbage collected, the Log
+     * Service may return an exception object of an implementation defined
+     * Throwable subclass. The returned object will attempt to provide as much
+     * information as possible from the original exception object such as the
+     * message and stack trace.
+     * 
+     * @return <code>Throwable</code> object of the exception associated with
+     * this <code>LogEntry</code>;<code>null</code> if no exception is
+     * associated with this <code>LogEntry</code> object.
+     */
+    public Throwable getException();
 
-	/**
-	 * Returns the value of <code>currentTimeMillis()</code> at the time this
-	 * <code>LogEntry</code> object was created.
-	 * 
-	 * @return The system time in milliseconds when this <code>LogEntry</code>
-	 *         object was created.
-	 * @see "System.currentTimeMillis()"
-	 */
-	public long getTime();
+    /**
+     * Returns the value of <code>currentTimeMillis()</code> at the time this
+     * <code>LogEntry</code> object was created.
+     * 
+     * @return The system time in milliseconds when this <code>LogEntry</code>
+     * object was created.
+     * @see "System.currentTimeMillis()"
+     */
+    public long getTime();
 }
diff --git a/ipojo/src/main/java/org/osgi/service/log/LogListener.java b/ipojo/src/main/java/org/osgi/service/log/LogListener.java
index 3731c28..3f7fd4e 100644
--- a/ipojo/src/main/java/org/osgi/service/log/LogListener.java
+++ b/ipojo/src/main/java/org/osgi/service/log/LogListener.java
@@ -1,34 +1,37 @@
 /*
- * $Header: /cvshome/build/org.osgi.service.log/src/org/osgi/service/log/LogListener.java,v 1.9 2006/06/16 16:31:49 hargrave Exp $
- *
+ * $Header:
+ * /cvshome/build/org.osgi.service.log/src/org/osgi/service/log/LogListener.java,v
+ * 1.9 2006/06/16 16:31:49 hargrave Exp $
+ * 
  * Copyright (c) OSGi Alliance (2000, 2006). All Rights Reserved.
- *
- * Licensed 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
- *
+ * 
+ * Licensed 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.
+ * 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.osgi.service.log;
 
 import java.util.EventListener;
 
 /**
- * Subscribes to <code>LogEntry</code> objects from the <code>LogReaderService</code>.
+ * Subscribes to <code>LogEntry</code> objects from the
+ * <code>LogReaderService</code>.
  * 
  * <p>
- * A <code>LogListener</code> object may be registered with the Log Reader Service
- * using the <code>LogReaderService.addLogListener</code> method. After the
- * listener is registered, the <code>logged</code> method will be called for each
- * <code>LogEntry</code> object created. The <code>LogListener</code> object may be
- * unregistered by calling the <code>LogReaderService.removeLogListener</code>
- * method.
+ * A <code>LogListener</code> object may be registered with the Log Reader
+ * Service using the <code>LogReaderService.addLogListener</code> method.
+ * After the listener is registered, the <code>logged</code> method will be
+ * called for each <code>LogEntry</code> object created. The
+ * <code>LogListener</code> object may be unregistered by calling the
+ * <code>LogReaderService.removeLogListener</code> method.
  * 
  * @version $Revision: 1.9 $
  * @see LogReaderService
@@ -37,15 +40,15 @@
  * @see LogReaderService#removeLogListener(LogListener)
  */
 public interface LogListener extends EventListener {
-	/**
-	 * Listener method called for each LogEntry object created.
-	 * 
-	 * <p>
-	 * As with all event listeners, this method should return to its caller as
-	 * soon as possible.
-	 * 
-	 * @param entry A <code>LogEntry</code> object containing log information.
-	 * @see LogEntry
-	 */
-	public void logged(LogEntry entry);
+    /**
+     * Listener method called for each LogEntry object created.
+     * 
+     * <p>
+     * As with all event listeners, this method should return to its caller as
+     * soon as possible.
+     * 
+     * @param entry A <code>LogEntry</code> object containing log information.
+     * @see LogEntry
+     */
+    public void logged(LogEntry entry);
 }
diff --git a/ipojo/src/main/java/org/osgi/service/log/LogReaderService.java b/ipojo/src/main/java/org/osgi/service/log/LogReaderService.java
index 4176ebc..43b6a9d 100644
--- a/ipojo/src/main/java/org/osgi/service/log/LogReaderService.java
+++ b/ipojo/src/main/java/org/osgi/service/log/LogReaderService.java
@@ -1,19 +1,21 @@
 /*
- * $Header: /cvshome/build/org.osgi.service.log/src/org/osgi/service/log/LogReaderService.java,v 1.10 2006/06/16 16:31:49 hargrave Exp $
- *
+ * $Header:
+ * /cvshome/build/org.osgi.service.log/src/org/osgi/service/log/LogReaderService.java,v
+ * 1.10 2006/06/16 16:31:49 hargrave Exp $
+ * 
  * Copyright (c) OSGi Alliance (2000, 2006). All Rights Reserved.
- *
- * Licensed 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
- *
+ * 
+ * Licensed 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.
+ * 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.osgi.service.log;
 
@@ -24,12 +26,13 @@
  * <p>
  * There are two ways to retrieve <code>LogEntry</code> objects:
  * <ul>
- * <li>The primary way to retrieve <code>LogEntry</code> objects is to register a
- * <code>LogListener</code> object whose <code>LogListener.logged</code> method will
- * be called for each entry added to the log.
- * <li>To retrieve past <code>LogEntry</code> objects, the <code>getLog</code>
- * method can be called which will return an <code>Enumeration</code> of all
- * <code>LogEntry</code> objects in the log.
+ * <li>The primary way to retrieve <code>LogEntry</code> objects is to
+ * register a <code>LogListener</code> object whose
+ * <code>LogListener.logged</code> method will be called for each entry added
+ * to the log.
+ * <li>To retrieve past <code>LogEntry</code> objects, the
+ * <code>getLog</code> method can be called which will return an
+ * <code>Enumeration</code> of all <code>LogEntry</code> objects in the log.
  * 
  * @version $Revision: 1.10 $
  * @see LogEntry
@@ -37,62 +40,64 @@
  * @see LogListener#logged(LogEntry)
  */
 public interface LogReaderService {
-	/**
-	 * Subscribes to <code>LogEntry</code> objects.
-	 * 
-	 * <p>
-	 * This method registers a <code>LogListener</code> object with the Log Reader
-	 * Service. The <code>LogListener.logged(LogEntry)</code> method will be
-	 * called for each <code>LogEntry</code> object placed into the log.
-	 * 
-	 * <p>
-	 * When a bundle which registers a <code>LogListener</code> object is stopped
-	 * or otherwise releases the Log Reader Service, the Log Reader Service must
-	 * remove all of the bundle's listeners.
-	 * 
-	 * <p>
-	 * If this Log Reader Service's list of listeners already contains a
-	 * listener <code>l</code> such that <code>(l==listener)</code>, this method
-	 * does nothing.
-	 * 
-	 * @param listener A <code>LogListener</code> object to register; the
-	 *        <code>LogListener</code> object is used to receive <code>LogEntry</code>
-	 *        objects.
-	 * @see LogListener
-	 * @see LogEntry
-	 * @see LogListener#logged(LogEntry)
-	 */
-	public void addLogListener(LogListener listener);
+    /**
+     * Subscribes to <code>LogEntry</code> objects.
+     * 
+     * <p>
+     * This method registers a <code>LogListener</code> object with the Log
+     * Reader Service. The <code>LogListener.logged(LogEntry)</code> method
+     * will be called for each <code>LogEntry</code> object placed into the
+     * log.
+     * 
+     * <p>
+     * When a bundle which registers a <code>LogListener</code> object is
+     * stopped or otherwise releases the Log Reader Service, the Log Reader
+     * Service must remove all of the bundle's listeners.
+     * 
+     * <p>
+     * If this Log Reader Service's list of listeners already contains a
+     * listener <code>l</code> such that <code>(l==listener)</code>, this
+     * method does nothing.
+     * 
+     * @param listener A <code>LogListener</code> object to register; the
+     * <code>LogListener</code> object is used to receive
+     * <code>LogEntry</code> objects.
+     * @see LogListener
+     * @see LogEntry
+     * @see LogListener#logged(LogEntry)
+     */
+    public void addLogListener(LogListener listener);
 
-	/**
-	 * Unsubscribes to <code>LogEntry</code> objects.
-	 * 
-	 * <p>
-	 * This method unregisters a <code>LogListener</code> object from the Log
-	 * Reader Service.
-	 * 
-	 * <p>
-	 * If <code>listener</code> is not contained in this Log Reader Service's list
-	 * of listeners, this method does nothing.
-	 * 
-	 * @param listener A <code>LogListener</code> object to unregister.
-	 * @see LogListener
-	 */
-	public void removeLogListener(LogListener listener);
+    /**
+     * Unsubscribes to <code>LogEntry</code> objects.
+     * 
+     * <p>
+     * This method unregisters a <code>LogListener</code> object from the Log
+     * Reader Service.
+     * 
+     * <p>
+     * If <code>listener</code> is not contained in this Log Reader Service's
+     * list of listeners, this method does nothing.
+     * 
+     * @param listener A <code>LogListener</code> object to unregister.
+     * @see LogListener
+     */
+    public void removeLogListener(LogListener listener);
 
-	/**
-	 * Returns an <code>Enumeration</code> of all <code>LogEntry</code> objects in
-	 * the log.
-	 * 
-	 * <p>
-	 * Each element of the enumeration is a <code>LogEntry</code> object, ordered
-	 * with the most recent entry first. Whether the enumeration is of all
-	 * <code>LogEntry</code> objects since the Log Service was started or some
-	 * recent past is implementation-specific. Also implementation-specific is
-	 * whether informational and debug <code>LogEntry</code> objects are included
-	 * in the enumeration.
-	 * @return An <code>Enumeration</code> of all <code>LogEntry</code> objects in
-	 * the log.
-	 */
-	public Enumeration getLog();
+    /**
+     * Returns an <code>Enumeration</code> of all <code>LogEntry</code>
+     * objects in the log.
+     * 
+     * <p>
+     * Each element of the enumeration is a <code>LogEntry</code> object,
+     * ordered with the most recent entry first. Whether the enumeration is of
+     * all <code>LogEntry</code> objects since the Log Service was started or
+     * some recent past is implementation-specific. Also implementation-specific
+     * is whether informational and debug <code>LogEntry</code> objects are
+     * included in the enumeration.
+     * 
+     * @return An <code>Enumeration</code> of all <code>LogEntry</code>
+     * objects in the log.
+     */
+    public Enumeration getLog();
 }
diff --git a/ipojo/src/main/java/org/osgi/service/log/LogService.java b/ipojo/src/main/java/org/osgi/service/log/LogService.java
index 4858c58..6271437 100644
--- a/ipojo/src/main/java/org/osgi/service/log/LogService.java
+++ b/ipojo/src/main/java/org/osgi/service/log/LogService.java
@@ -1,19 +1,21 @@
 /*
- * $Header: /cvshome/build/org.osgi.service.log/src/org/osgi/service/log/LogService.java,v 1.9 2006/06/16 16:31:49 hargrave Exp $
- *
+ * $Header:
+ * /cvshome/build/org.osgi.service.log/src/org/osgi/service/log/LogService.java,v
+ * 1.9 2006/06/16 16:31:49 hargrave Exp $
+ * 
  * Copyright (c) OSGi Alliance (2000, 2006). All Rights Reserved.
- *
- * Licensed 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
- *
+ * 
+ * Licensed 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.
+ * 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.osgi.service.log;
 
@@ -23,8 +25,8 @@
  * Provides methods for bundles to write messages to the log.
  * 
  * <p>
- * <code>LogService</code> methods are provided to log messages; optionally with a
- * <code>ServiceReference</code> object or an exception.
+ * <code>LogService</code> methods are provided to log messages; optionally
+ * with a <code>ServiceReference</code> object or an exception.
  * 
  * <p>
  * Bundles must log messages in the OSGi environment with a severity level
@@ -39,118 +41,121 @@
  * @version $Revision: 1.9 $
  */
 public interface LogService {
-	/**
-	 * An error message (Value 1).
-	 * 
-	 * <p>
-	 * This log entry indicates the bundle or service may not be functional.
-	 */
-	public static final int	LOG_ERROR	= 1;
-	/**
-	 * A warning message (Value 2).
-	 * 
-	 * <p>
-	 * This log entry indicates a bundle or service is still functioning but may
-	 * experience problems in the future because of the warning condition.
-	 */
-	public static final int	LOG_WARNING	= 2;
-	/**
-	 * An informational message (Value 3).
-	 * 
-	 * <p>
-	 * This log entry may be the result of any change in the bundle or service
-	 * and does not indicate a problem.
-	 */
-	public static final int	LOG_INFO	= 3;
-	/**
-	 * A debugging message (Value 4).
-	 * 
-	 * <p>
-	 * This log entry is used for problem determination and may be irrelevant to
-	 * anyone but the bundle developer.
-	 */
-	public static final int	LOG_DEBUG	= 4;
+    /**
+     * An error message (Value 1).
+     * 
+     * <p>
+     * This log entry indicates the bundle or service may not be functional.
+     */
+    public static final int LOG_ERROR = 1;
 
-	/**
-	 * Logs a message.
-	 * 
-	 * <p>
-	 * The <code>ServiceReference</code> field and the <code>Throwable</code> field
-	 * of the <code>LogEntry</code> object will be set to <code>null</code>.
-	 * 
-	 * @param level The severity of the message. This should be one of the
-	 *        defined log levels but may be any integer that is interpreted in a
-	 *        user defined way.
-	 * @param message Human readable string describing the condition or
-	 *        <code>null</code>.
-	 * @see #LOG_ERROR
-	 * @see #LOG_WARNING
-	 * @see #LOG_INFO
-	 * @see #LOG_DEBUG
-	 */
-	public void log(int level, String message);
+    /**
+     * A warning message (Value 2).
+     * 
+     * <p>
+     * This log entry indicates a bundle or service is still functioning but may
+     * experience problems in the future because of the warning condition.
+     */
+    public static final int LOG_WARNING = 2;
 
-	/**
-	 * Logs a message with an exception.
-	 * 
-	 * <p>
-	 * The <code>ServiceReference</code> field of the <code>LogEntry</code> object
-	 * will be set to <code>null</code>.
-	 * 
-	 * @param level The severity of the message. This should be one of the
-	 *        defined log levels but may be any integer that is interpreted in a
-	 *        user defined way.
-	 * @param message The human readable string describing the condition or
-	 *        <code>null</code>.
-	 * @param exception The exception that reflects the condition or
-	 *        <code>null</code>.
-	 * @see #LOG_ERROR
-	 * @see #LOG_WARNING
-	 * @see #LOG_INFO
-	 * @see #LOG_DEBUG
-	 */
-	public void log(int level, String message, Throwable exception);
+    /**
+     * An informational message (Value 3).
+     * 
+     * <p>
+     * This log entry may be the result of any change in the bundle or service
+     * and does not indicate a problem.
+     */
+    public static final int LOG_INFO = 3;
 
-	/**
-	 * Logs a message associated with a specific <code>ServiceReference</code>
-	 * object.
-	 * 
-	 * <p>
-	 * The <code>Throwable</code> field of the <code>LogEntry</code> will be set to
-	 * <code>null</code>.
-	 * 
-	 * @param sr The <code>ServiceReference</code> object of the service that this
-	 *        message is associated with or <code>null</code>.
-	 * @param level The severity of the message. This should be one of the
-	 *        defined log levels but may be any integer that is interpreted in a
-	 *        user defined way.
-	 * @param message Human readable string describing the condition or
-	 *        <code>null</code>.
-	 * @see #LOG_ERROR
-	 * @see #LOG_WARNING
-	 * @see #LOG_INFO
-	 * @see #LOG_DEBUG
-	 */
-	public void log(ServiceReference sr, int level, String message);
+    /**
+     * A debugging message (Value 4).
+     * 
+     * <p>
+     * This log entry is used for problem determination and may be irrelevant to
+     * anyone but the bundle developer.
+     */
+    public static final int LOG_DEBUG = 4;
 
-	/**
-	 * Logs a message with an exception associated and a
-	 * <code>ServiceReference</code> object.
-	 * 
-	 * @param sr The <code>ServiceReference</code> object of the service that this
-	 *        message is associated with.
-	 * @param level The severity of the message. This should be one of the
-	 *        defined log levels but may be any integer that is interpreted in a
-	 *        user defined way.
-	 * @param message Human readable string describing the condition or
-	 *        <code>null</code>.
-	 * @param exception The exception that reflects the condition or
-	 *        <code>null</code>.
-	 * @see #LOG_ERROR
-	 * @see #LOG_WARNING
-	 * @see #LOG_INFO
-	 * @see #LOG_DEBUG
-	 */
-	public void log(ServiceReference sr, int level, String message,
-			Throwable exception);
+    /**
+     * Logs a message.
+     * 
+     * <p>
+     * The <code>ServiceReference</code> field and the <code>Throwable</code>
+     * field of the <code>LogEntry</code> object will be set to
+     * <code>null</code>.
+     * 
+     * @param level The severity of the message. This should be one of the
+     * defined log levels but may be any integer that is interpreted in a user
+     * defined way.
+     * @param message Human readable string describing the condition or
+     * <code>null</code>.
+     * @see #LOG_ERROR
+     * @see #LOG_WARNING
+     * @see #LOG_INFO
+     * @see #LOG_DEBUG
+     */
+    public void log(int level, String message);
+
+    /**
+     * Logs a message with an exception.
+     * 
+     * <p>
+     * The <code>ServiceReference</code> field of the <code>LogEntry</code>
+     * object will be set to <code>null</code>.
+     * 
+     * @param level The severity of the message. This should be one of the
+     * defined log levels but may be any integer that is interpreted in a user
+     * defined way.
+     * @param message The human readable string describing the condition or
+     * <code>null</code>.
+     * @param exception The exception that reflects the condition or
+     * <code>null</code>.
+     * @see #LOG_ERROR
+     * @see #LOG_WARNING
+     * @see #LOG_INFO
+     * @see #LOG_DEBUG
+     */
+    public void log(int level, String message, Throwable exception);
+
+    /**
+     * Logs a message associated with a specific <code>ServiceReference</code>
+     * object.
+     * 
+     * <p>
+     * The <code>Throwable</code> field of the <code>LogEntry</code> will be
+     * set to <code>null</code>.
+     * 
+     * @param sr The <code>ServiceReference</code> object of the service that
+     * this message is associated with or <code>null</code>.
+     * @param level The severity of the message. This should be one of the
+     * defined log levels but may be any integer that is interpreted in a user
+     * defined way.
+     * @param message Human readable string describing the condition or
+     * <code>null</code>.
+     * @see #LOG_ERROR
+     * @see #LOG_WARNING
+     * @see #LOG_INFO
+     * @see #LOG_DEBUG
+     */
+    public void log(ServiceReference sr, int level, String message);
+
+    /**
+     * Logs a message with an exception associated and a
+     * <code>ServiceReference</code> object.
+     * 
+     * @param sr The <code>ServiceReference</code> object of the service that
+     * this message is associated with.
+     * @param level The severity of the message. This should be one of the
+     * defined log levels but may be any integer that is interpreted in a user
+     * defined way.
+     * @param message Human readable string describing the condition or
+     * <code>null</code>.
+     * @param exception The exception that reflects the condition or
+     * <code>null</code>.
+     * @see #LOG_ERROR
+     * @see #LOG_WARNING
+     * @see #LOG_INFO
+     * @see #LOG_DEBUG
+     */
+    public void log(ServiceReference sr, int level, String message, Throwable exception);
 }
diff --git a/pom.xml b/pom.xml
index f19ef57..e721f27 100644
--- a/pom.xml
+++ b/pom.xml
@@ -140,6 +140,9 @@
         <module>scr</module>
         <module>configadmin</module>
         <module>metatype</module>
+        
+        <module>ipojo</module>
+        <module>ipojo.metadata</module>
       </modules>
     </profile>
     
@@ -172,8 +175,7 @@
 
         <!--    <module>tools/mangen</module> -->
 
-        <module>ipojo</module>
-        <module>ipojo.metadata</module>
+
       </modules>
     </profile>
 
