diff --git a/ipojo/pom.xml b/ipojo/pom.xml
index bd63032..08adf4d 100644
--- a/ipojo/pom.xml
+++ b/ipojo/pom.xml
@@ -49,7 +49,9 @@
               org.apache.felix.ipojo.metadata, 
               org.apache.felix.ipojo.architecture, 
               org.apache.felix.ipojo.parser,
-              org.apache.felix.ipojo.util, 
+              org.apache.felix.ipojo.util,
+              org.apache.felix.ipojo.handlers.dependency,
+              org.apache.felix.ipojo.handlers.providedservice, 
               org.osgi.service.cm; specification-version="1.2",
               org.osgi.service.log; specification-version="1.3"
             </exportPackage>
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 54a63bb..1861f5d 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/ComponentInstance.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/ComponentInstance.java
@@ -82,7 +82,7 @@
     String getInstanceName();
     
     /**
-     * @return true if getState return 1 or 2.
+     * @return true if getState returns INVALID or VALID.
      */
     boolean isStarted();
 
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 bc4081d..14542c1 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/Handler.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/Handler.java
@@ -20,6 +20,7 @@
 
 import java.util.Dictionary;
 
+import org.apache.felix.ipojo.architecture.HandlerDescription;
 import org.apache.felix.ipojo.metadata.Element;
 
 /**
@@ -78,4 +79,9 @@
      * @param instance : the created instance
      */
     public void createInstance(Object instance) { }
+    
+    /**
+     * @return the description of the handler..
+     */
+    public HandlerDescription getDescription() { return new HandlerDescription(this.getClass().getName(), isValid()); }
 }
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 7164eea..45e6038 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/InstanceManager.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/InstanceManager.java
@@ -24,6 +24,7 @@
 import java.util.HashMap;
 
 import org.apache.felix.ipojo.architecture.ComponentDescription;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
 import org.apache.felix.ipojo.metadata.Element;
 import org.apache.felix.ipojo.util.Logger;
 import org.osgi.framework.BundleContext;
@@ -51,11 +52,6 @@
     private String m_className;
 
     /**
-     * Is the component an immediate component ?
-     */
-    private boolean m_isImmediate = false;
-
-    /**
      * The context of the component.
      */
     private BundleContext m_context;
@@ -118,7 +114,6 @@
         if (m_className == null) {
             m_factory.getLogger().log(Logger.ERROR, "The class name of the component cannot be setted, it does not exist in the metadata");
         }
-        if (cm.containsAttribute("immediate") && cm.getAttribute("immediate").equalsIgnoreCase("true")) { m_isImmediate = true; }
 
         // ComponentInfo initialization
         m_componentDesc = new ComponentDescription();
@@ -134,9 +129,9 @@
                 Handler h = (Handler) IPojoConfiguration.INTERNAL_HANDLERS[i].newInstance();
                 h.configure(this, cm, configuration);
             } catch (InstantiationException e) {
-                m_factory.getLogger().log(Logger.ERROR, "[" + m_className + "] 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_className + "] 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());
             }
         }
 
@@ -149,11 +144,11 @@
                     Handler h = (Handler) c.newInstance();
                     h.configure(this, cm, configuration);
                 } catch (ClassNotFoundException e) {
-                    m_factory.getLogger().log(Logger.ERROR, "[" + m_className + "] 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_className + "] 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_className + "] 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());
                 }
 
             }
@@ -165,6 +160,23 @@
      * @return the component type information.
      */
     public ComponentDescription getComponentDescription() { return m_componentDesc; }
+    
+    public InstanceDescription getInstanceDescription() {
+    	int componentState = getState();
+        InstanceDescription instanceDescription = new InstanceDescription(m_name, m_className, componentState, getContext().getBundle().getBundleId());
+
+        String[] objects = new String[getPojoObjects().length];
+        for (int i = 0; i < getPojoObjects().length; i++) {
+        	objects[i] = getPojoObjects()[i].toString();
+        }
+        instanceDescription.setCreatedObjects(objects);
+
+        Handler[] handlers = getRegistredHandlers();
+        for (int i = 0; i < handlers.length; i++) {
+        	instanceDescription.addHandler(handlers[i].getDescription());
+        }
+        return instanceDescription;
+    }
 
     /**
      * @return the list of the registred handlers.
@@ -199,7 +211,7 @@
     	if(m_state != STOPPED) { return; } // Instance already started
     	
         // Start all the handlers
-        m_factory.getLogger().log(Logger.INFO, "[" + m_className + "] Start the instance manager with " + m_handlers.length + " 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;
@@ -236,8 +248,8 @@
         if (m_state != state) {
 
             // Log the state change
-            if (state == INVALID) { m_factory.getLogger().log(Logger.INFO, "[" + m_className + "]  State -> INVALID"); }
-            if (state == VALID) { m_factory.getLogger().log(Logger.INFO, "[" + m_className + "] 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;
@@ -273,7 +285,7 @@
         try {
             m_clazz = m_factory.loadClass(m_className);
         } catch (ClassNotFoundException  e) {
-            m_factory.getLogger().log(Logger.ERROR, "[" + m_className + "] Class not found during the loading phase : " + e.getMessage());
+            m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] Class not found during the loading phase : " + e.getMessage());
             return;
         }
     }
@@ -348,7 +360,6 @@
         if (!isLoaded()) { load(); }
         Object instance = null;
         try {
-            m_factory.getLogger().log(Logger.INFO, "[" + m_className + "] createInstance -> Try to find the constructor");
 
             // Try to find if there is a constructor with a bundle context as parameter :
             try {
@@ -366,23 +377,23 @@
             }
 
         } catch (InstantiationException e) {
-            m_factory.getLogger().log(Logger.ERROR, "[" + m_className + "] createInstance -> The Component Instance cannot be instancied : " + e.getMessage());
+            m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> The Component Instance cannot be instancied : " + e.getMessage());
             e.printStackTrace();
         } catch (IllegalAccessException e) {
-            m_factory.getLogger().log(Logger.ERROR, "[" + m_className + "] createInstance -> The Component Instance is not accessible : " + e.getMessage());
+            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_className + "] 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_className + "] 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_className + "] createInstance -> Cannot invoke the constructor (method not found) : " + e.getMessage());
+            m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> Cannot invoke the constructor (method not found) : " + e.getMessage());
             e.printStackTrace();
         }
 
-        m_factory.getLogger().log(Logger.INFO, "[" + m_className + "] createInstance -> Return the instance " + instance);
+        m_factory.getLogger().log(Logger.INFO, "[" + m_name + "] createInstance -> Return the instance " + instance);
 
         // Register the new instance
         addInstance(instance);
@@ -567,7 +578,7 @@
      * Check the state of all handlers.
      */
     public void checkInstanceState() {
-        m_factory.getLogger().log(Logger.INFO, "[" + m_className + "] Check the component state");
+        m_factory.getLogger().log(Logger.INFO, "[" + m_name + "] Check the instance state");
         boolean isValid = true;
         for (int i = 0; i < m_handlers.length; i++) {
             boolean b = m_handlers[i].isValid();
@@ -581,12 +592,7 @@
             m_pojoObjects = new Object[0];
             return;
         }
-        if (isValid && m_state == INVALID) {
-            setState(VALID);
-            if (m_isImmediate && m_pojoObjects.length == 0) { createPojoObject(); }
-        }
-
-        m_factory.getLogger().log(Logger.INFO, "[" + m_className + "] Component Manager : " + m_state);
+        if (isValid && m_state == INVALID) { setState(VALID); }
     }
 
 	public String getInstanceName() { return m_name; }
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 0fd1684..684d258 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
@@ -24,17 +24,7 @@
 import org.apache.felix.ipojo.Handler;
 import org.apache.felix.ipojo.InstanceManager;
 import org.apache.felix.ipojo.architecture.Architecture;
-import org.apache.felix.ipojo.architecture.DependencyDescription;
-import org.apache.felix.ipojo.architecture.DependencyHandlerDescription;
-import org.apache.felix.ipojo.architecture.HandlerDescription;
 import org.apache.felix.ipojo.architecture.InstanceDescription;
-import org.apache.felix.ipojo.architecture.ProvidedServiceDescription;
-import org.apache.felix.ipojo.architecture.ProvidedServiceHandlerDescription;
-import org.apache.felix.ipojo.handlers.dependency.Dependency;
-import org.apache.felix.ipojo.handlers.dependency.DependencyHandler;
-import org.apache.felix.ipojo.handlers.providedservice.Property;
-import org.apache.felix.ipojo.handlers.providedservice.ProvidedService;
-import org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler;
 import org.apache.felix.ipojo.metadata.Element;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
@@ -62,11 +52,6 @@
     private String m_name;
 
     /**
-     * Component Type.
-     */
-    private String m_className;
-
-    /**
      * @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) {
@@ -75,8 +60,6 @@
             if (isArchitectureEnabled.equalsIgnoreCase("true")) { im.register(this); }
         }
 
-        m_className = metadata.getAttribute("className");
-
         m_name = (String) configuration.get("name");
 
         m_manager = im;
@@ -112,55 +95,7 @@
      * @see org.apache.felix.ipojo.architecture.Architecture#getComponentDescription()
      */
     public InstanceDescription getInstanceDescription() {
-        int componentState = m_manager.getState();
-        InstanceDescription instanceDescription = new InstanceDescription(m_name, m_className, componentState, m_manager.getContext().getBundle().getBundleId());
-
-        String[] objects = new String[m_manager.getPojoObjects().length];
-        for (int i = 0; i < m_manager.getPojoObjects().length; i++) {
-        	objects[i] = m_manager.getPojoObjects()[i].toString();
-        }
-        instanceDescription.setCreatedObjects(objects);
-
-        Handler[] handlers = m_manager.getRegistredHandlers();
-        for (int i = 0; i < handlers.length; i++) {
-            if (handlers[i] instanceof DependencyHandler) {
-                DependencyHandler dh = (DependencyHandler) handlers[i];
-                DependencyHandlerDescription dhd = new DependencyHandlerDescription(dh.isValid());
-                for (int j = 0; j < dh.getDependencies().length; j++) {
-                    Dependency dep = dh.getDependencies()[j];
-                    // Create & add the dependency description
-                    DependencyDescription dd = new DependencyDescription(dep.getSpecification(), dep.isMultiple(), dep.isOptional(), dep.getFilter(), dep.getState(), instanceDescription);
-                    dd.setServiceReferences(dep.getServiceReferences());
-                    dd.setUsedServices(dep.getUsedServices());
-                    dhd.addDependency(dd);
-                }
-                instanceDescription.addHandler(dhd);
-            } else { 
-            	if (handlers[i] instanceof ProvidedServiceHandler) {
-            		ProvidedServiceHandler psh = (ProvidedServiceHandler) handlers[i];
-            		ProvidedServiceHandlerDescription pshd = new ProvidedServiceHandlerDescription(psh.isValid());
-
-            		for (int j = 0; j < psh.getProvidedService().length; j++) {
-            			ProvidedService ps = psh.getProvidedService()[j];
-            			ProvidedServiceDescription psd = new ProvidedServiceDescription(ps.getServiceSpecification(), ps.getState(), ps.getServiceReference(), instanceDescription);
-
-            			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);
-            		}
-            		instanceDescription.addHandler(pshd);
-            	}
-            	else { 
-            		// Else add a generic handler to the description
-            		instanceDescription.addHandler(new HandlerDescription(handlers[i].getClass().getName(), handlers[i].isValid()));
-            	}
-            }
-        }
-        return instanceDescription;
+        return m_manager.getInstanceDescription();
     }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/architecture/DependencyDescription.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java
similarity index 93%
rename from ipojo/src/main/java/org/apache/felix/ipojo/architecture/DependencyDescription.java
rename to ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java
index e7652e9..6919911 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/architecture/DependencyDescription.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.ipojo.architecture;
+package org.apache.felix.ipojo.handlers.dependency;
 
 import java.util.HashMap;
 
@@ -95,9 +95,8 @@
      * @param optional : is the depdendency optional ?
      * @param filter : the filter
      * @param state : the state
-     * @param parent : the description of the parent (either a ProvidedServiceDescription, either a ComponentDescription)
      */
-    public DependencyDescription(String itf, boolean multiple, boolean optional, String filter, int state, Object parent) {
+    public DependencyDescription(String itf, boolean multiple, boolean optional, String filter, int state) {
         super();
         m_interface = itf;
         m_multiple = multiple;
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 6d60a16..55d758d 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
@@ -23,6 +23,7 @@
 
 import org.apache.felix.ipojo.Handler;
 import org.apache.felix.ipojo.InstanceManager;
+import org.apache.felix.ipojo.architecture.HandlerDescription;
 import org.apache.felix.ipojo.handlers.dependency.nullable.NullableObjectWriter;
 import org.apache.felix.ipojo.metadata.Element;
 import org.apache.felix.ipojo.util.Logger;
@@ -355,5 +356,18 @@
         m_manager.getFactory().getLogger().log(Logger.INFO, "[DependencyHandler on " + m_manager.getClassName() + "] Component Dependencies are valid");
         return valide;
     }
+    
+    public HandlerDescription getDescription() {
+        DependencyHandlerDescription dhd = new DependencyHandlerDescription(isValid());
+        for (int j = 0; j < getDependencies().length; j++) {
+            Dependency dep = getDependencies()[j];
+            // Create & add the dependency description
+            DependencyDescription dd = new DependencyDescription(dep.getSpecification(), dep.isMultiple(), dep.isOptional(), dep.getFilter(), dep.getState());
+            dd.setServiceReferences(dep.getServiceReferences());
+            dd.setUsedServices(dep.getUsedServices());
+            dhd.addDependency(dd);
+        }
+        return dhd;
+    }
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/architecture/DependencyHandlerDescription.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java
similarity index 96%
rename from ipojo/src/main/java/org/apache/felix/ipojo/architecture/DependencyHandlerDescription.java
rename to ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java
index 66b6e7b..a67109d 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/architecture/DependencyHandlerDescription.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java
@@ -16,10 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.ipojo.architecture;
+package org.apache.felix.ipojo.handlers.dependency;
 
 import java.util.Iterator;
-import org.apache.felix.ipojo.handlers.dependency.DependencyHandler;
+
+import org.apache.felix.ipojo.architecture.HandlerDescription;
 
 /**
  * Dependency Handler Description.
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 60779d9..3c85db7 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
@@ -21,6 +21,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Dictionary;
 
+import org.apache.felix.ipojo.ComponentInstance;
 import org.apache.felix.ipojo.Handler;
 import org.apache.felix.ipojo.InstanceManager;
 import org.apache.felix.ipojo.metadata.Element;
@@ -47,6 +48,11 @@
      */
     private InstanceManager m_manager;
 
+	/**
+	 * 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
@@ -74,6 +80,8 @@
     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; }
 
         Element[] hooksMetadata = metadata.getElements("callback");
         for (int i = 0; i < hooksMetadata.length; i++) {
@@ -87,7 +95,7 @@
             LifecycleCallback hk = new LifecycleCallback(this, initialState, finalState, method, isStatic);
             addCallback(hk);
         }
-        if (m_callbacks.length > 0) { m_manager.register(this); }
+        if (m_callbacks.length > 0 || m_immediate) { m_manager.register(this); }
     }
 
     /**
@@ -112,6 +120,11 @@
      * @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();
+    	}
+    	
         for (int i = 0; i < m_callbacks.length; i++) {
             if (m_callbacks[i].getInitialState() == m_state && m_callbacks[i].getFinalState() == state) {
                 try {
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 a47e82e..f1638c6 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
@@ -26,8 +26,6 @@
 import org.apache.felix.ipojo.parser.ParseUtils;
 import org.apache.felix.ipojo.util.Logger;
 
-import sun.net.www.ParseUtil;
-
 /**
  * Represent a property i.e. a set : [name, type, value].
  * A property can be attached to a field.
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/architecture/ProvidedServiceDescription.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java
similarity index 89%
rename from ipojo/src/main/java/org/apache/felix/ipojo/architecture/ProvidedServiceDescription.java
rename to ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java
index 5d5ab3f..0c15af2 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/architecture/ProvidedServiceDescription.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java
@@ -16,10 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.ipojo.architecture;
+package org.apache.felix.ipojo.handlers.providedservice;
 
 import java.util.Properties;
 
+import org.apache.felix.ipojo.handlers.dependency.DependencyDescription;
 import org.osgi.framework.ServiceReference;
 
 /**
@@ -58,10 +59,10 @@
      */
     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.
@@ -76,11 +77,11 @@
      * @param sr : Service Registration (to obtain the reference), or null if state is UNREGISTRED
      * @param parent : the component description declaring this proided service
      */
-    public ProvidedServiceDescription(String[] serviceSpecification, int state, ServiceReference sr, InstanceDescription parent) {
+    public ProvidedServiceDescription(String[] serviceSpecification, int state, ServiceReference sr/*, InstanceDescription parent*/) {
         m_serviceSpecification = serviceSpecification;
         m_state = state;
         m_serviceReference = sr;
-        m_parent = parent;
+       // m_parent = parent;
     }
 
     /**
@@ -135,11 +136,4 @@
         return m_serviceReference;
     }
 
-    /**
-     * @return the parent description.
-     */
-    public InstanceDescription getInstanceDescription() {
-        return m_parent;
-    }
-
 }
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 0ae43ec..25f3884 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
@@ -19,10 +19,12 @@
 package org.apache.felix.ipojo.handlers.providedservice;
 
 import java.util.Dictionary;
+import java.util.Properties;
 
 import org.apache.felix.ipojo.Handler;
 import org.apache.felix.ipojo.InstanceManager;
 import org.apache.felix.ipojo.architecture.ComponentDescription;
+import org.apache.felix.ipojo.architecture.HandlerDescription;
 import org.apache.felix.ipojo.architecture.PropertyDescription;
 import org.apache.felix.ipojo.metadata.Element;
 import org.apache.felix.ipojo.parser.ParseUtils;
@@ -320,5 +322,27 @@
             m_providedServices[i].deleteProperties(dict);
         }
     }
+	
+	/**
+	 * @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());
+
+			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;
+	}
 
 }
diff --git a/ipojo/src/main/java/org/apache/felix/ipojo/architecture/ProvidedServiceHandlerDescription.java b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java
similarity index 94%
rename from ipojo/src/main/java/org/apache/felix/ipojo/architecture/ProvidedServiceHandlerDescription.java
rename to ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java
index a838d86..90acdc6 100644
--- a/ipojo/src/main/java/org/apache/felix/ipojo/architecture/ProvidedServiceHandlerDescription.java
+++ b/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java
@@ -16,12 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.ipojo.architecture;
+package org.apache.felix.ipojo.handlers.providedservice;
 
 import java.util.Iterator;
 
-import org.apache.felix.ipojo.handlers.providedservice.ProvidedService;
-import org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler;
+import org.apache.felix.ipojo.architecture.HandlerDescription;
 
 /**
  * Provided Service Handler Description.
