diff --git a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeInstanceDescription.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeInstanceDescription.java
new file mode 100644
index 0000000..ef085be
--- /dev/null
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeInstanceDescription.java
@@ -0,0 +1,91 @@
+/* 
+ * 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.composite;
+
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.metadata.Element;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Composite Instance Description.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class CompositeInstanceDescription extends InstanceDescription {
+    
+    /**
+     * Creates a Primitive Instance Description.
+     * @param type the component type description
+     * @param instance the instance description
+     */
+    public CompositeInstanceDescription(ComponentTypeDescription type, CompositeManager instance) {
+        super(type, instance);
+    }
+
+
+    /**
+     * Gets 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() {
+        // Get instances description of internal instance
+        ServiceContext internal = ((CompositeManager) m_instance).getServiceContext();
+        try {
+            ServiceReference[]refs = internal.getServiceReferences(Architecture.class.getName(), null);
+            if (refs != null) {
+                InstanceDescription[] descs = new InstanceDescription[refs.length];
+                for (int i = 0; i < refs.length; i++) {
+                    Architecture arch = (Architecture) internal.getService(refs[i]);
+                    descs[i] = arch.getInstanceDescription();
+                    internal.ungetService(refs[i]);
+                }
+                return descs;
+            }
+        } catch (InvalidSyntaxException e) {
+            // Cannot happen
+        }
+        return new InstanceDescription[0];
+    }
+
+    
+    /**
+     * Gets the instance description.
+     * Overridden to add created objects.
+     * @return the instance description
+     */
+    public Element getDescription() {
+        Element elem = super.getDescription();
+        // Contained instance (exposing architecture) (empty if primitive)
+        InstanceDescription[] descs = getContainedInstances();
+        if (descs.length > 0) {
+            Element inst = new Element("ContainedInstances", "");
+            for (int i = 0; i < descs.length; i++) {
+                inst.addElement(descs[i].getDescription());
+            }
+            elem.addElement(inst);
+        }
+        return elem;
+    }
+
+}
diff --git a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeManager.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeManager.java
index 7d5fd84..890855d 100644
--- a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeManager.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeManager.java
@@ -25,17 +25,15 @@
 import org.apache.felix.ipojo.ComponentFactory;
 import org.apache.felix.ipojo.ComponentInstance;
 import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.Handler;
 import org.apache.felix.ipojo.HandlerFactory;
 import org.apache.felix.ipojo.HandlerManager;
 import org.apache.felix.ipojo.IPojoContext;
 import org.apache.felix.ipojo.InstanceStateListener;
 import org.apache.felix.ipojo.ServiceContext;
-import org.apache.felix.ipojo.architecture.Architecture;
 import org.apache.felix.ipojo.architecture.InstanceDescription;
 import org.apache.felix.ipojo.metadata.Element;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
 
 /**
  * iPOJO Composite manager. The composite manager class manages one instance of
@@ -72,6 +70,11 @@
     private CompositeServiceContext m_internalContext;
     
     /**
+     * The instance description.
+     */
+    private final CompositeInstanceDescription m_description;
+    
+    /**
      * Name of the component instance.
      */
     private String m_name;
@@ -93,6 +96,8 @@
         // Initialize the service context.
         m_internalContext = new CompositeServiceContext(m_context, this);
         m_handlers = handlers;
+        m_description = new CompositeInstanceDescription(m_factory.getComponentDescription(), this);
+
     }
 
     /**
@@ -209,27 +214,7 @@
      * @see org.apache.felix.ipojo.ComponentInstance#getInstanceDescription()
      */
     public InstanceDescription getInstanceDescription() {
-        InstanceDescription desc = new InstanceDescription(m_name, m_state, getContext().getBundle().getBundleId(), m_factory.getComponentDescription());
-        CompositeHandler[] handlers = getRegistredCompositeHandlers();
-        for (int i = 0; i < handlers.length; i++) {
-            desc.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]);
-                    desc.addInstance(arch.getInstanceDescription());
-                    m_internalContext.ungetService(refs[i]);
-                }
-            }
-        } catch (InvalidSyntaxException e) {
-            // Cannot happen
-        }
-        return desc;
+        return m_description;
     }
 
     /**
@@ -350,6 +335,12 @@
         m_state = INVALID;
 
         m_internalContext.start(); // Turn on the factory tracking
+        
+        // Plug handler descriptions
+        Handler[] handlers = getRegistredCompositeHandlers();
+        for (int i = 0; i < handlers.length; i++) {
+            m_description.addHandler(handlers[i].getDescription());
+        }
 
         for (int i = 0; i < m_handlers.length; i++) {
             m_handlers[i].start();
diff --git a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandler.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandler.java
index 3443073..7f686d9 100644
--- a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandler.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandler.java
@@ -54,6 +54,11 @@
      */
     private Factory[] m_factories;
     
+    /**
+     * Handler description.
+     */
+    private InstanceHandlerDescription m_description;
+    
 
     /**
      * This structure aims to manage a configuration. It stores all necessary
@@ -238,6 +243,8 @@
             }
             m_configurations[i] = new ManagedConfiguration(conf);
         }
+        
+        m_description = new InstanceHandlerDescription(this, m_configurations);
     }
 
     /**
@@ -380,11 +387,7 @@
      * @see org.apache.felix.ipojo.CompositeHandler#getDescription()
      */
     public HandlerDescription getDescription() {
-        List list = new ArrayList();
-        for (int i = 0; i < m_configurations.length; i++) {
-            list.add(m_configurations[i]);
-        }
-        return new InstanceHandlerDescription(this, list);
+        return m_description;
     }
 
     /**
diff --git a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandlerDescription.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandlerDescription.java
index 3481ff5..a7fc53e 100644
--- a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandlerDescription.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandlerDescription.java
@@ -18,8 +18,6 @@
  */
 package org.apache.felix.ipojo.composite.instance;
 
-import java.util.List;
-
 import org.apache.felix.ipojo.ComponentInstance;
 import org.apache.felix.ipojo.architecture.HandlerDescription;
 import org.apache.felix.ipojo.composite.CompositeHandler;
@@ -34,10 +32,11 @@
  */
 public class InstanceHandlerDescription extends HandlerDescription {
 
+  
     /**
      * List of managed instances.
      */
-    private List m_instances;
+    private ManagedConfiguration[] m_configurations; 
 
     /**
      * Constructor.
@@ -45,9 +44,9 @@
      * @param handler : handler
      * @param insts : list of component instances
      */
-    public InstanceHandlerDescription(CompositeHandler handler, List insts) {
+    public InstanceHandlerDescription(CompositeHandler handler, ManagedConfiguration[] insts) {
         super(handler);
-        m_instances = insts;
+        m_configurations = insts;
     }
 
     /**
@@ -57,8 +56,8 @@
      */
     public Element getHandlerInfo() {
         Element instances = super.getHandlerInfo();
-        for (int i = 0; i < m_instances.size(); i++) {
-            ManagedConfiguration inst = (ManagedConfiguration) m_instances.get(i);
+        for (int i = 0; i < m_configurations.length; i++) {
+            ManagedConfiguration inst = m_configurations[i];
             Element instance = new Element("Instance", "");
             if (inst.getInstance() == null) { 
                 instance.addAttribute(new Attribute("Factory", inst.getConfiguration().get("component").toString()));
diff --git a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceDependencyHandler.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceDependencyHandler.java
index c33fda1..4cbf2f1 100644
--- a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceDependencyHandler.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceDependencyHandler.java
@@ -61,6 +61,11 @@
      * Flag indicating if the handler has already finished the start method.
      */
     private boolean m_isStarted;
+    
+    /**
+     * The handler description.
+     */
+    private ServiceInstantiatorDescription m_description;
 
     /**
      * Source Managers.
@@ -228,10 +233,9 @@
             } else {
                 throw new ConfigurationException("Unknown action : " + action);
             }
-            
-            
-
         }
+        
+        m_description = new ServiceInstantiatorDescription(this, m_instances, m_importers);
     }
 
     /**
@@ -358,7 +362,7 @@
      * @see org.apache.felix.ipojo.CompositeHandler#getDescription()
      */
     public HandlerDescription getDescription() {
-        return new ServiceInstantiatorDescription(this, m_instances, m_importers);
+        return m_description;
     }
     
     public List getInstances() {
diff --git a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedServiceHandler.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedServiceHandler.java
index 017919e..2c63301 100644
--- a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedServiceHandler.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedServiceHandler.java
@@ -80,6 +80,11 @@
      * List of component type.
      */
     private List m_types;
+    
+    /**
+     * Handler description.
+     */
+    private ProvidedServiceHandlerDescription m_description;
 
     /**
      * Initialize the component type.
@@ -163,6 +168,8 @@
                 m_exporters.add(imp);
             } // Others case cannot happen. The test was already made during the factory initialization.
         }
+        
+        m_description = new ProvidedServiceHandlerDescription(this, m_services, m_exporters);
 
     }
 
@@ -474,7 +481,7 @@
     }
 
     public HandlerDescription getDescription() {
-        return new ProvidedServiceHandlerDescription(this, m_managedServices, m_exporters);
+        return m_description;
     }
 
     /**
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java
index 892b6ea..56f6d6b 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java
@@ -77,6 +77,11 @@
      * The instance factory.
      */
     private final ComponentFactory m_factory;
+    
+    /**
+     * The instance description.
+     */
+    private final PrimitiveInstanceDescription m_description;
 
     /**
      * The bundle context of the instance.
@@ -146,6 +151,7 @@
         m_factory = factory;
         m_context = context;
         m_handlers = handlers;
+        m_description = new PrimitiveInstanceDescription(m_factory.getComponentDescription(), this);
     }
 
     /**
@@ -177,25 +183,7 @@
      * @see org.apache.felix.ipojo.ComponentInstance#getInstanceDescription()
      */
     public InstanceDescription getInstanceDescription() {
-        int componentState = getState();
-        InstanceDescription desc =
-                new InstanceDescription(m_name, componentState, getContext().getBundle().getBundleId(), m_factory.getComponentDescription());
-
-        synchronized (this) { // Must be synchronized, it access to the m_pojoObjects list.
-            if (m_pojoObjects != null) {
-                String[] objects = new String[m_pojoObjects.size()];
-                for (int i = 0; i < m_pojoObjects.size(); i++) {
-                    objects[i] = m_pojoObjects.get(i).toString();
-                }
-                desc.setCreatedObjects(objects);
-            }
-        }
-
-        Handler[] handlers = getRegistredHandlers();
-        for (int i = 0; i < handlers.length; i++) {
-            desc.addHandler(handlers[i].getDescription());
-        }
-        return desc;
+        return m_description;
     }
 
     /**
@@ -295,6 +283,12 @@
             }
         }
         
+        // Plug handler descriptions
+        Handler[] handlers = getRegistredHandlers();
+        for (int i = 0; i < handlers.length; i++) {
+            m_description.addHandler(handlers[i].getDescription());
+        }
+        
         for (int i = 0; i < m_handlers.length; i++) {
             m_handlers[i].addInstanceStateListener(this);
             try {
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/PrimitiveInstanceDescription.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/PrimitiveInstanceDescription.java
new file mode 100644
index 0000000..b7d135d
--- /dev/null
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/PrimitiveInstanceDescription.java
@@ -0,0 +1,79 @@
+/* 
+ * 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;
+
+import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
+
+/**
+ * Primitive Instance Description.
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class PrimitiveInstanceDescription extends InstanceDescription {
+    
+    /**
+     * Creates a Primitive Instance Description.
+     * @param type the component type description
+     * @param instance the instance description
+     */
+    public PrimitiveInstanceDescription(ComponentTypeDescription type, InstanceManager instance) {
+        super(type, instance);
+    }
+
+    /**
+     * Gets the list of object created by the described instance.
+     * @return the created objects.
+     */
+    public String[] getCreatedObjects() {
+        // TODO should get a copy
+        Object [] objs = ((InstanceManager) m_instance).getPojoObjects();
+        if (objs != null) {
+            String[] result = new String[objs.length];
+            for (int i = 0; i < objs.length; i++) {
+                result[i] = objs[i].toString();
+            }
+            return result;
+        } else {
+            return new String[0];
+        }
+    }
+    
+    /**
+     * Gets the instance description.
+     * Overridden to add created objects.
+     * @return the instance description
+     */
+    public Element getDescription() {
+        Element elem = super.getDescription();
+        // Created Object (empty is composite)
+        String[] objs = getCreatedObjects();
+        for (int i = 0; i < objs.length; i++) {
+            Element obj = new Element("Object", "");
+            obj.addAttribute(new Attribute("name", ((Object) objs[i]).toString()));
+            elem.addElement(obj);
+        }
+        return elem;
+    }
+    
+    
+
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/Architecture.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/Architecture.java
index 223c51e..db23941 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/Architecture.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/Architecture.java
@@ -28,7 +28,7 @@
 
     /**
      * Returns the description of the instance.
-     * @return the current component instance description
+     * @return the component instance description
      */
     InstanceDescription getInstanceDescription();
 
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/HandlerDescription.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/HandlerDescription.java
index 2cd3a5a..ffc64c8 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/HandlerDescription.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/HandlerDescription.java
@@ -19,6 +19,7 @@
 package org.apache.felix.ipojo.architecture;
 
 import org.apache.felix.ipojo.Handler;
+import org.apache.felix.ipojo.HandlerFactory;
 import org.apache.felix.ipojo.metadata.Attribute;
 import org.apache.felix.ipojo.metadata.Element;
 
@@ -30,49 +31,51 @@
 public class HandlerDescription {
 
     /**
-     * Handler Class Name (i.e namespace).
+     * The Handler Qualified Name.
      */
     private String m_handlerName;
 
-    /**
-     * Is the handler valid.
-     */
-    private boolean m_isValid;
 
     /**
-     * Constructor.
-     * 
-     * @param handler : handler.
+     * The described handler instance.
+     */
+    private Handler m_handler;
+
+    /**
+     * Creates a handler description.
+     * @param handler the handler.
      */
     public HandlerDescription(Handler handler) {
-        m_handlerName = handler.getClass().getName();
-        m_isValid = handler.isValid();
+        HandlerFactory factory = (HandlerFactory) handler.getHandlerManager().getFactory();
+        m_handlerName = factory.getHandlerName();
+        m_handler = handler;
     }
 
     /**
-     * Check if the handler is valid.
+     * Checks if the handler is valid.
      * @return true if the handler is valid.
      */
     public boolean isValid() {
-        return m_isValid;
+        return m_handler.isValid();
     }
 
     /**
-     * Get the handler name.
-     * @return the handler name (i.e. namespace).
+     * Gets the handler name.
+     * @return the handler qualified name (i.e. namespace:name).
      */
     public String getHandlerName() {
         return m_handlerName;
     }
 
     /**
-     * Get handler information.
+     * Gets handler information.
+     * This represent the actual state of the handler.
      * @return the handler information.
      */
     public Element getHandlerInfo() {
         Element elem = new Element("Handler", "");
         elem.addAttribute(new Attribute("name", m_handlerName));
-        if (m_isValid) {
+        if (isValid()) {
             elem.addAttribute(new Attribute("state", "valid"));
         } else {
             elem.addAttribute(new Attribute("state", "invalid"));
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/InstanceDescription.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/InstanceDescription.java
index e7b0c59..347d4c7 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/InstanceDescription.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/InstanceDescription.java
@@ -19,6 +19,7 @@
 package org.apache.felix.ipojo.architecture;
 
 import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.InstanceStateListener;
 import org.apache.felix.ipojo.metadata.Attribute;
 import org.apache.felix.ipojo.metadata.Element;
 
@@ -27,87 +28,45 @@
  * 
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
-public class InstanceDescription {
-
+public class InstanceDescription implements InstanceStateListener {
+   
     /**
-     * The name of the component (instance).
+     * The list of handlers plugged on the component instance.
      */
-    private String m_name;
-
+    protected HandlerDescription[] m_handlers = new HandlerDescription[0];
+    
     /**
-     * Handlers of the component instance.
+     * The Underlying component instance.
      */
-    private HandlerDescription[] m_handlers = new HandlerDescription[0];
-
-    /**
-     * Created Instances of the components.
-     */
-    private String[] m_createdObjects = new String[0];
-
-    /**
-     * State of the component (VALID / UNRESOLVED).
-     */
-    private int m_state;
-
-    /**
-     * BundleId who create the instance.
-     */
-    private long m_bundleId;
+    protected ComponentInstance m_instance;
 
     /**
      * Component Type of the instance.
      */
-    private ComponentTypeDescription m_type;
+    protected ComponentTypeDescription m_type;
 
     /**
-     * Contained instance list.
+     * Creates the instance description.
+     * @param ci  the state of the instance.
+     * @param desc  the component type description of this instance.
      */
-    private InstanceDescription[] m_containedInstances = new InstanceDescription[0];
-
-    /**
-     * Constructor.
-     * 
-     * @param name : the name of the component instance.
-     * @param state : the state of the instance.
-     * @param bundleId : bundle id owning this instance.
-     * @param desc : the component type description of this instance.
-     */
-    public InstanceDescription(String name, int state, long bundleId, ComponentTypeDescription desc) {
-        m_name = name;
-        m_state = state;
-        m_createdObjects = new String[0];
+    public InstanceDescription(ComponentTypeDescription desc, ComponentInstance ci) {
         m_handlers = new HandlerDescription[0];
-        m_containedInstances = new InstanceDescription[0];
-        m_bundleId = bundleId;
         m_type = desc;
+        m_instance = ci;
+        m_instance.addInstanceStateListener(this);
     }
 
     /**
-     * Get the instance name.
+     * Gets the instance name.
      * @return the name of the instance.
      */
     public String getName() {
-        return m_name;
+        return m_instance.getInstanceName();
     }
 
     /**
-     * Get the list of object created by the described instance.
-     * @return the created instances
-     */
-    public String[] getCreatedObjects() {
-        return m_createdObjects;
-    }
-
-    /**
-     * 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;
-    }
-
-    /**
-     * Get the component type description of the described instance.
+     * Gets the component type description of the described instance.
      * @return : the component type description of this instance.
      */
     public ComponentTypeDescription getComponentDescription() {
@@ -115,7 +74,7 @@
     }
 
     /**
-     * Get the plugged handler list.
+     * Gets the plugged handler list.
      * @return the live handler list
      */
     public HandlerDescription[] getHandlers() {
@@ -123,7 +82,7 @@
     }
 
     /**
-     * Add an handler description to the list.
+     * Adds an handler description to the list.
      * @param desc : the handler description to add
      */
     public void addHandler(HandlerDescription desc) {
@@ -140,82 +99,61 @@
         newHd[m_handlers.length] = desc;
         m_handlers = newHd;
     }
-
+    
     /**
-     * Add an instance description to the contained instance list.
-     * 
-     * @param inst : the handler description to add
+     * Gets a handler description by specifying the handler qualified name.
+     * @param handler the handler name
+     * @return the handler description or <code>null</code> if not found
      */
-    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++) {
-            if (m_containedInstances[i].getName().equals(inst.getName())) {
-                return; // NOTHING TO DO, the description is already in the array
+    public HandlerDescription getHandlerDescription(String handler) {
+        for (int i = 0; i < m_handlers.length; i++) {
+            if (m_handlers[i].getHandlerName().equals(handler)) {
+                return m_handlers[i];
             }
         }
-        // The component Description is not in the array, add it
-        InstanceDescription[] newCi = new InstanceDescription[m_containedInstances.length + 1];
-        System.arraycopy(m_containedInstances, 0, newCi, 0, m_containedInstances.length);
-        newCi[m_containedInstances.length] = inst;
-        m_containedInstances = newCi;
+        return null;
     }
 
     /**
-     * Set the state of the component.
-     * 
-     * @param state : the state
-     */
-    public void setState(int state) {
-        m_state = state;
-    }
-
-    /**
-     * Get the state of the described instance.
+     * Gets the state of the described instance.
      * @return the state of the instance.
      */
     public int getState() {
-        return m_state;
+        waitForStability();
+        return m_instance.getState();
     }
 
     /**
-     * Get the bundle id of the bundle containing the described instance.
+     * Gets the bundle id of the bundle containing the component type of the instance.
      * @return the bundle id owning the component implementation class.
      */
     public long getBundleId() {
-        return m_bundleId;
+        return m_instance.getFactory().getBundleContext().getBundle().getBundleId();
     }
 
     /**
-     * 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;
-    }
-
-    /**
-     * Get the instance description.
+     * Gets 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) {
+        
+        int state = getState();
+        if (state == ComponentInstance.STOPPED) {
             instance.addAttribute(new Attribute("state", "stopped"));
         }
-        if (m_state == ComponentInstance.VALID) {
+        if (state == ComponentInstance.VALID) {
             instance.addAttribute(new Attribute("state", "valid"));
         }
-        if (m_state == ComponentInstance.INVALID) {
+        if (state == ComponentInstance.INVALID) {
             instance.addAttribute(new Attribute("state", "invalid"));
         }
-        if (m_state == ComponentInstance.DISPOSED) {
+        if (state == ComponentInstance.DISPOSED) {
             instance.addAttribute(new Attribute("state", "disposed"));
         }
         // Bundle
-        instance.addAttribute(new Attribute("bundle", Long.toString(m_bundleId)));
+        instance.addAttribute(new Attribute("bundle", Long.toString(getBundleId())));
 
         // Component Type
         instance.addAttribute(new Attribute("component.type", m_type.getName()));
@@ -224,22 +162,33 @@
         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)
-        if (m_containedInstances.length > 0) {
-            Element inst = new Element("ContainedInstances", "");
-            for (int i = 0; i < m_containedInstances.length; i++) {
-                inst.addElement(m_containedInstances[i].getDescription());
-            }
-            instance.addElement(inst);
-        }
+
         return instance;
 
     }
 
+    /**
+     * Waits for state stability before returning results.
+     */
+    private synchronized void waitForStability() {
+        while (m_instance.getState() == -2) { // Transition
+            try {
+                wait();
+            } catch (InterruptedException e) {
+               // We're interrupted, will re-check the condition.
+            }
+        }
+        
+    }
+
+    /**
+     * The underlying instance state changes.
+     * @param instance the instance
+     * @param newState the new state
+     * @see org.apache.felix.ipojo.InstanceStateListener#stateChanged(org.apache.felix.ipojo.ComponentInstance, int)
+     */
+    public synchronized void stateChanged(ComponentInstance instance, int newState) {
+        notifyAll(); // if we was in a transition, the transition is now done.
+    }
+
 }
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java
index b79f41f..483ae0e 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java
@@ -27,134 +27,51 @@
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public class DependencyDescription {
-
     /**
-     * Required Service Interface.
+     * The described dependency.
      */
-    private String m_interface;
-    
-    /**
-     * Dependency Id.
-     */
-    private String m_id;
-
-    /**
-     * Is the dependency aggregate?
-     */
-    private boolean m_aggregate;
-
-    /**
-     * Is the dependency optional ?
-     */
-    private boolean m_optional;
-    
-    /**
-     * Binding policy used by this service dependency.
-     */
-    private int m_bindingPolicy;
-    
-    /**
-     * Does the dependency use a nullable object?
-     */
-    private boolean m_useNullable;
-    
-    /**
-     * Does the dependency use a default-implementation? 
-     */
-    private String m_defaultImplementation;
-
-    /**
-     * State (VALID | INVALID).
-     */
-    private int m_state;
-
-    /**
-     * Dependency Filter.
-     */
-    private String m_filter;
-    
-    /**
-     * Is the provider set frozen ?
-     */
-    private boolean m_isFrozen;
-    
-    /**
-     * Comparator used by the dependency.
-     * Null means OSGi default comparator.
-     */
-    private String m_comparator;
-
-    /**
-     * List of used service references.
-     */
-    private List m_usedServices;
-
-    /**
-     * List of matching service references.
-     */
-    private List m_serviceReferences;
+    private Dependency m_dependency;
 
     /**
      * Creates a dependency description.
-     * @param itf the needed interface
-     * @param id the dependency id.
-     * @param multiple is the dependency a multiple dependency ?
-     * @param optional is the dependency optional ?
-     * @param filter the filter
-     * @param policy binding policy
-     * @param nullable does the dependency support nullable object
-     * @param defaultImpl does the dependency use a default implementation
-     * @param comparator does the dependency use a special comparator
-     * @param frozen is the provider set frozen
-     * @param state the state
+     * @param dep the described dependency
      */
-    public DependencyDescription(String itf, String id, boolean multiple, boolean optional, String filter, int policy, boolean nullable, String defaultImpl, String comparator, boolean frozen, int state) {
-        super();
-        m_interface = itf;
-        m_id = id;
-        m_aggregate = multiple;
-        m_optional = optional;
-        m_filter = filter;
-        m_state = state;
-        m_bindingPolicy = policy;
-        m_useNullable = nullable;
-        m_defaultImplementation = defaultImpl;
-        m_comparator = comparator;
-        m_isFrozen = frozen;
+    public DependencyDescription(Dependency dep) {
+        m_dependency = dep;
     }
 
-    public boolean isMultiple() { return m_aggregate; }
+    public boolean isMultiple() { return m_dependency.isAggregate(); }
 
-    public boolean isOptional() { return m_optional; }
+    public boolean isOptional() { return m_dependency.isOptional(); }
 
-    public String getFilter() { return m_filter; }
+    public String getFilter() { return m_dependency.getFilter(); }
 
-    public String getInterface() { return m_interface; }
+    public String getInterface() { return m_dependency.getSpecification().getName(); }
 
-    public int getState() { return m_state; }
+    public int getState() { return m_dependency.getState(); }
     
-    public String getId() { return m_id; }
+    public String getId() { return m_dependency.getId(); }
     
     /**
-     * Gets true if the dependency uses Nullable objects.
+     * Gets <code>true</code> if the dependency uses Nullable objects.
      * @return true if the dependency is optional and supports nullable object.
      */
-    public boolean supportsNullable() { return m_useNullable; }
+    public boolean supportsNullable() { return m_dependency.supportsNullable(); }
     
-    public String getDefaultImplementation() { return m_defaultImplementation; }
+    public String getDefaultImplementation() { return m_dependency.getDefaultImplementation(); }
     
-    public int getPolicy() { return m_bindingPolicy; }
+    public int getPolicy() { return m_dependency.getBindingPolicy(); }
     
-    public String getComparator() { return m_comparator; }
+    public String getComparator() { return m_dependency.getComparator(); }
     
-    public boolean isFrozen() { return m_isFrozen; }
+    public boolean isFrozen() { return m_dependency.isFrozen(); }
 
     /**
      * Gets the service reference list.
      * @return the list of matching service reference,
      * null if no service reference.
      */
-    public List getServiceReferences() { return m_serviceReferences; }
+    public List getServiceReferences() { return m_dependency.getServiceReferencesAsList(); }
 
     /**
      * Gets the service reference if only one service reference is used.
@@ -162,34 +79,19 @@
      * or null if no service reference.
      */
     public ServiceReference getServiceReference() { 
-        if (m_serviceReferences == null) {
+        List list = getServiceReferences();
+        if (list == null) {
             return null;
         } else {
-            return (ServiceReference) m_serviceReferences.get(0);
+            return (ServiceReference) list.get(0);
         }
     }
 
     /**
-     * Sets the service reference array.
-     * @param refs : the list of service reference
-     */
-    public void setServiceReferences(List refs) { m_serviceReferences = refs; }
-
-    /**
      * Gets the used service set.
      * @return the list [service reference] containing the used services,
      * null if no providers are used
      */
-    public List getUsedServices() { return m_usedServices; }
-
-    /**
-     * Sets the usedServices.
-     * @param usages : the list of used service reference.
-     */
-    public void setUsedServices(List usages) {
-        m_usedServices = usages;
-    }
-
-
+    public List getUsedServices() { return m_dependency.getUsedServiceReferences(); }
 
 }
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java
index 601238a..89ff46d 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java
@@ -75,6 +75,11 @@
      * Is the handler started.
      */
     private boolean m_started;
+    
+    /**
+     * The handler description.
+     */
+    private DependencyHandlerDescription m_description;
 
     /**
      * Add a dependency.
@@ -435,6 +440,8 @@
                 }
             }
         }
+        
+        m_description = new DependencyHandlerDescription(this, m_dependencies); // Initialize the description.
     }
 
     /**
@@ -445,6 +452,7 @@
         // Start the dependencies
         for (int i = 0; i < m_dependencies.length; i++) {
             Dependency dep = m_dependencies[i];
+           
             dep.start();
         }
         // Check the state
@@ -481,17 +489,7 @@
      * @see org.apache.felix.ipojo.Handler#getDescription()
      */
     public HandlerDescription getDescription() {
-        DependencyHandlerDescription dhd = new DependencyHandlerDescription(this);
-        for (int j = 0; j < getDependencies().length; j++) {
-            Dependency dep = getDependencies()[j];
-            // Create & add the dependency description
-            DependencyDescription desc =
-                    new DependencyDescription(dep.getSpecification().getName(), dep.getId(), dep.isAggregate(), dep.isOptional(), dep.getFilter(), dep.getBindingPolicy(), dep.supportsNullable(), dep.getDefaultImplementation(), dep.getComparator(), dep.isFrozen(), dep.getState());
-            desc.setServiceReferences(dep.getServiceReferencesAsList());
-            desc.setUsedServices(dep.getUsedServiceReferences());
-            dhd.addDependency(desc);
-        }
-        return dhd;
+        return m_description;
     }
 
 }
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java
index 4da77ad..786ec33 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java
@@ -21,7 +21,6 @@
 import java.util.Iterator;
 import java.util.List;
 
-import org.apache.felix.ipojo.Handler;
 import org.apache.felix.ipojo.architecture.HandlerDescription;
 import org.apache.felix.ipojo.metadata.Attribute;
 import org.apache.felix.ipojo.metadata.Element;
@@ -42,11 +41,16 @@
     private DependencyDescription[] m_dependencies = new DependencyDescription[0];
 
     /**
-     * Constructor.
-     * @param handler : Handler.
+     * Creates the Dependency Handler description.
+     * @param handler the Dependency Handler.
+     * @param deps the Dependencies
      */
-    public DependencyHandlerDescription(Handler handler) {
+    public DependencyHandlerDescription(DependencyHandler handler, Dependency[] deps) {
         super(handler);
+        m_dependencies = new DependencyDescription[deps.length];
+        for (int i = 0; i < m_dependencies.length; i++) {
+            m_dependencies[i] = new DependencyDescription(deps[i]);
+        }
     }
 
     /**
@@ -58,27 +62,7 @@
     }
 
     /**
-     * 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++) {
-            if (m_dependencies[i] == dep) {
-                return; // NOTHING TO DO, the description is already in the
-                        // array
-            }
-        }
-        // The component Description is not in the array, add it
-        DependencyDescription[] newDep = new DependencyDescription[m_dependencies.length + 1];
-        System.arraycopy(m_dependencies, 0, newDep, 0, m_dependencies.length);
-        newDep[m_dependencies.length] = dep;
-        m_dependencies = newDep;
-    }
-
-    /**
-     * Build Dependency Handler description.
+     * Builds the Dependency Handler description.
      * @return the handler description.
      * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
      */
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java
index d8fe68a..c1cc148 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java
@@ -20,6 +20,7 @@
 
 import java.util.Properties;
 
+import org.apache.felix.ipojo.util.Property;
 import org.osgi.framework.ServiceReference;
 
 /**
@@ -32,51 +33,24 @@
     /**
      * State : the service is unregistered.
      */
-    public static final int UNREGISTERED = 0;
+    public static final int UNREGISTERED = ProvidedService.UNREGISTERED;
 
     /**
      * State : the service is registered.
      */
-    public static final int REGISTERED = 1;
-
+    public static final int REGISTERED = ProvidedService.REGISTERED;
+    
     /**
-     * Provided Service Specification.
+     * The describe provided service.
      */
-    private String[] m_serviceSpecification;
-
-    /**
-     * State.
-     */
-    private int m_state;
-
-    /**
-     * The service reference.
-     */
-    private ServiceReference m_serviceReference;
-
-    // /**
-    // * Handler on the component description who contains this description.
-    // */
-    // private InstanceDescription m_parent;
-
-    /**
-     * Properties of the provided service.
-     */
-    private Properties m_properties = new Properties();
+    private ProvidedService m_ps;
 
     /**
      * Constructor.
-     * 
-     * @param serviceSpecification : the provided contract
-     * @param state : state (UNREGITRED | REGISTRED)
-     * @param ref : Service Registration (to obtain the reference), or null if
-     * state is UNREGISTRED
+     * @param ps the described provided service.
      */
-    public ProvidedServiceDescription(String[] serviceSpecification, int state, ServiceReference ref) {
-        m_serviceSpecification = serviceSpecification;
-        m_state = state;
-        m_serviceReference = ref;
-        // m_parent = parent;
+    public ProvidedServiceDescription(ProvidedService ps) {
+        m_ps = ps;
     }
 
     /**
@@ -84,34 +58,23 @@
      * @return the provided contract name.
      */
     public String[] getServiceSpecification() {
-        return m_serviceSpecification;
+        return m_ps.getServiceSpecifications();
     }
 
     /**
-     * Add a property to the current provided service description.
-     * 
-     * @param key : the key of the property
-     * @param value : the value of the property
-     */
-    public void addProperty(String key, String value) {
-        m_properties.put(key, value);
-    }
-
-    /**
-     * Set the set of properties. This function create a clone of the argument.
-     * 
-     * @param props : the properties
-     */
-    public void setProperty(Properties props) {
-        m_properties = props;
-    }
-
-    /**
-     * Get the list of properties.
+     * Gets the list of properties.
+     * A copy of the actual property set is returned.
      * @return the properties.
      */
     public Properties getProperties() {
-        return m_properties;
+        Properties props = new Properties();
+        org.apache.felix.ipojo.util.Property[] ps = m_ps.getProperties();
+        for (int i = 0; i < ps.length; i++) {
+            if (ps[i].getValue() != Property.NO_VALUE) {
+                props.put(ps[i].getName(), ps[i].getValue());
+            }
+        }
+        return props;
     }
 
     /**
@@ -119,15 +82,15 @@
      * @return the state of the provided service (UNREGISTERED | REGISTRED).
      */
     public int getState() {
-        return m_state;
+        return m_ps.getState();
     }
 
     /**
      * Get the service reference.
-     * @return the service reference (null if the service is unregistred).
+     * @return the service reference (null if the service is unregistered).
      */
     public ServiceReference getServiceReference() {
-        return m_serviceReference;
+        return m_ps.getServiceReference();
     }
 
 }
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
index 587701d..db8bbe5 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
@@ -23,7 +23,6 @@
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Properties;
 import java.util.Set;
 
 import org.apache.felix.ipojo.ConfigurationException;
@@ -56,6 +55,11 @@
      * The list of the provided service.
      */
     private ProvidedService[] m_providedServices = new ProvidedService[0];
+    
+    /**
+     * The handler description.
+     */
+    private ProvidedServiceHandlerDescription m_description;
 
     /**
      * Add a provided service to the list .
@@ -173,6 +177,9 @@
                 }
                 throw new ConfigurationException("The provided service" + itfs + " is not valid");                
             }
+            
+            // Initialize the description.
+            m_description = new ProvidedServiceHandlerDescription(this, m_providedServices);
 
         }
     }
@@ -466,23 +473,7 @@
      * @see org.apache.felix.ipojo.Handler#getDescription()
      */
     public HandlerDescription getDescription() {
-        ProvidedServiceHandlerDescription pshd = new ProvidedServiceHandlerDescription(this);
-
-        for (int j = 0; j < getProvidedServices().length; j++) {
-            ProvidedService svc = getProvidedServices()[j];
-            ProvidedServiceDescription psd = new ProvidedServiceDescription(svc.getServiceSpecifications(), svc.getState(), svc.getServiceReference());
-
-            Properties props = new Properties();
-            for (int k = 0; k < svc.getProperties().length; k++) {
-                Property prop = svc.getProperties()[k];
-                if (prop.getValue() != null  && prop.getValue() != Property.NO_VALUE) {
-                    props.put(prop.getName(), prop.getValue().toString());
-                }
-            }
-            psd.setProperty(props);
-            pshd.addProvidedService(psd);
-        }
-        return pshd;
+        return m_description;
     }
 
     /**
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java
index eb32da6..71a846b 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java
@@ -20,7 +20,6 @@
 
 import java.util.Iterator;
 
-import org.apache.felix.ipojo.Handler;
 import org.apache.felix.ipojo.architecture.HandlerDescription;
 import org.apache.felix.ipojo.metadata.Attribute;
 import org.apache.felix.ipojo.metadata.Element;
@@ -37,13 +36,18 @@
      * Provided Service Description list.
      */
     private ProvidedServiceDescription[] m_providedServices = new ProvidedServiceDescription[0];
-
+   
     /**
      * Constructor.
-     * @param handler : handler.
+     * @param handler the handler.
+     * @param pss the list of provided service
      */
-    public ProvidedServiceHandlerDescription(Handler handler) {
+    public ProvidedServiceHandlerDescription(ProvidedServiceHandler handler, ProvidedService[] pss) {
         super(handler);
+        m_providedServices = new ProvidedServiceDescription[pss.length];
+        for (int i = 0; i < pss.length; i++) {
+            m_providedServices[i] = new ProvidedServiceDescription(pss[i]);
+        }
     }
 
     /**
@@ -55,27 +59,6 @@
     }
 
     /**
-     * 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++) {
-            if (m_providedServices[i] == pds) {
-                return; // NOTHING DO DO, the description is already in the
-                        // array
-            }
-        }
-        // The component Description is not in the array, add it
-        ProvidedServiceDescription[] newPSD = new ProvidedServiceDescription[m_providedServices.length + 1];
-        System.arraycopy(m_providedServices, 0, newPSD, 0, m_providedServices.length);
-        newPSD[m_providedServices.length] = pds;
-        m_providedServices = newPSD;
-    }
-
-    /**
      * Build the provided service handler description.
      * @return the handler description.
      * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
diff --git a/ipojo/examples/junit4osgi/pom.xml b/ipojo/examples/junit4osgi/pom.xml
index 5166221..e0ad2d3 100644
--- a/ipojo/examples/junit4osgi/pom.xml
+++ b/ipojo/examples/junit4osgi/pom.xml
@@ -28,6 +28,7 @@
 		<module>junit4osgi</module>
 		<module>felix-command</module>
 		<module>maven-junit4osgi-plugin</module>
+		<module>immediate-launcher</module>
   </modules>
 
   <profiles>
@@ -38,7 +39,6 @@
 		</activation>
 		<modules>
 			<module>swing-runner</module>
-			<module>immediate-launcher</module>
 		</modules>
 	</profile>
 	<profile>
@@ -48,7 +48,6 @@
 		</activation>
 		<modules>
 			<module>swing-runner</module>
-			<module>immediate-launcher</module>
 		</modules>
 	</profile>
   </profiles>
diff --git a/ipojo/examples/pom.xml b/ipojo/examples/pom.xml
index 0a910dc..412d598 100644
--- a/ipojo/examples/pom.xml
+++ b/ipojo/examples/pom.xml
@@ -34,7 +34,6 @@
 			<jdk>1.5</jdk>
 		</activation>
 		<modules>
-			<module>junit4osgi</module>
 			<module>property-handler</module>
 		</modules>
 	</profile>
@@ -44,7 +43,6 @@
 			<jdk>1.6</jdk>
 		</activation>
 		<modules>
-			<module>junit4osgi</module>
 			<module>property-handler</module>
 		</modules>
 	</profile>
diff --git a/ipojo/tests/composite/composite-runtime/src/main/java/org/apache/felix/ipojo/test/composite/infrastructure/EmptyCompositeTest.java b/ipojo/tests/composite/composite-runtime/src/main/java/org/apache/felix/ipojo/test/composite/infrastructure/EmptyCompositeTest.java
index 3a02f60..ea761db 100644
--- a/ipojo/tests/composite/composite-runtime/src/main/java/org/apache/felix/ipojo/test/composite/infrastructure/EmptyCompositeTest.java
+++ b/ipojo/tests/composite/composite-runtime/src/main/java/org/apache/felix/ipojo/test/composite/infrastructure/EmptyCompositeTest.java
@@ -24,7 +24,7 @@
 import org.apache.felix.ipojo.Factory;
 import org.apache.felix.ipojo.ServiceContext;
 import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
-import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.composite.CompositeInstanceDescription;
 import org.apache.felix.ipojo.composite.CompositeManager;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
 import org.apache.felix.ipojo.test.composite.util.Utils;
@@ -51,7 +51,7 @@
 		assertEquals("Check offered service", cd.getprovidedServiceSpecification().length, 0);
 		assertEquals("Check configurable properties", cd.getProperties().length, 0);
 		
-		InstanceDescription id = ci.getInstanceDescription();
+		CompositeInstanceDescription id = (CompositeInstanceDescription) ci.getInstanceDescription();
 		assertEquals("Check composite instance name", id.getName(), "empty");
 		assertEquals("Check composite instance state (" + id.getState() + ")", id.getState(), ComponentInstance.VALID);
 		
@@ -100,17 +100,17 @@
 			fail("Unacceptable configuration : " + e.getMessage());
 		}
 		
-		InstanceDescription id = ci.getInstanceDescription();
+		CompositeInstanceDescription id = (CompositeInstanceDescription) ci.getInstanceDescription();
 		assertEquals("Check composite instance name", id.getName(), "empty");
 		assertEquals("Check composite instance state", id.getState(), ComponentInstance.VALID);
 		assertEquals("Check contained instance", id.getContainedInstances().length, 1);
-		InstanceDescription id2 = id.getContainedInstances()[0];
+		CompositeInstanceDescription id2 = (CompositeInstanceDescription) id.getContainedInstances()[0];
 		assertEquals("Check composite instance name", id2.getName(), "empty2");
 		assertEquals("Check composite instance state", id2.getState(), ComponentInstance.VALID);
 		assertEquals("Check contained instance", id2.getContainedInstances().length, 0);
 		
 		ci2.dispose();
-		id = ci.getInstanceDescription();
+		//id = ci.getInstanceDescription();
 		assertEquals("Check composite instance name", id.getName(), "empty");
 		assertEquals("Check composite instance state", id.getState(), ComponentInstance.VALID);
 		assertEquals("Check contained instance", id.getContainedInstances().length, 0);
@@ -150,17 +150,17 @@
 			fail("Unacceptable configuration : " + e.getMessage());
 		}
 		
-		InstanceDescription id = ci.getInstanceDescription();
+		CompositeInstanceDescription id = (CompositeInstanceDescription) ci.getInstanceDescription();
 		assertEquals("Check composite instance name", id.getName(), "empty");
 		assertEquals("Check composite instance state", id.getState(), ComponentInstance.VALID);
 		assertEquals("Check contained instance", id.getContainedInstances().length, 1);
-		InstanceDescription id2 = id.getContainedInstances()[0];
+		CompositeInstanceDescription id2 = (CompositeInstanceDescription) id.getContainedInstances()[0];
 		assertEquals("Check composite instance name", id2.getName(), "empty2");
 		assertEquals("Check composite instance state", id2.getState(), ComponentInstance.VALID);
 		assertEquals("Check contained instance", id2.getContainedInstances().length, 0);
 		
 		ci2.dispose();
-		id = ci.getInstanceDescription();
+		//id = ci.getInstanceDescription();
 		assertEquals("Check composite instance name", id.getName(), "empty");
 		assertEquals("Check composite instance state", id.getState(), ComponentInstance.VALID);
 		assertEquals("Check contained instance", id.getContainedInstances().length, 0);
@@ -200,17 +200,17 @@
 			fail("Unacceptable configuration : " + e.getMessage());
 		}
 		
-		InstanceDescription id = ci.getInstanceDescription();
+		CompositeInstanceDescription id = (CompositeInstanceDescription) ci.getInstanceDescription();
 		assertEquals("Check composite instance name", id.getName(), "empty");
 		assertEquals("Check composite instance state", id.getState(), ComponentInstance.VALID);
 		assertEquals("Check contained instance", id.getContainedInstances().length, 1);
-		InstanceDescription id2 = id.getContainedInstances()[0];
+		CompositeInstanceDescription id2 = (CompositeInstanceDescription) id.getContainedInstances()[0];
 		assertEquals("Check composite instance name", id2.getName(), "empty2");
 		assertEquals("Check composite instance state", id2.getState(), ComponentInstance.VALID);
 		assertEquals("Check contained instance", id2.getContainedInstances().length, 0);
 		
 		ci2.dispose();
-		id = ci.getInstanceDescription();
+		//id = ci.getInstanceDescription();
 		assertEquals("Check composite instance name", id.getName(), "empty");
 		assertEquals("Check composite instance state", id.getState(), ComponentInstance.VALID);
 		assertEquals("Check contained instance", id.getContainedInstances().length, 0);
diff --git a/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instance/SimpleInstance.java b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instance/SimpleInstance.java
index f7e2cff..5b41d74 100644
--- a/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instance/SimpleInstance.java
+++ b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instance/SimpleInstance.java
@@ -26,6 +26,7 @@
 import org.apache.felix.ipojo.ServiceContext;
 import org.apache.felix.ipojo.architecture.Architecture;
 import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.composite.CompositeInstanceDescription;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
 import org.apache.felix.ipojo.test.composite.service.FooService;
 import org.apache.felix.ipojo.test.composite.util.Utils;
@@ -195,12 +196,11 @@
 		ServiceReference ref = Utils.getServiceReference(getContext(), Architecture.class.getName(), "(architecture.instance=under)");
 		assertNotNull("Check architecture availability", ref);
 		Architecture arch = (Architecture) getContext().getService(ref);
-		InstanceDescription id = arch.getInstanceDescription();
+		CompositeInstanceDescription id = (CompositeInstanceDescription) arch.getInstanceDescription();
 		
 		assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
 		InstanceDescription[] contained = id.getContainedInstances();
 		assertEquals("Check contained instances count (" + contained.length + ")", contained.length, 1);
-		assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
 		assertEquals("Check instance name" , id.getName(), "under");
 		assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.1");
 		
@@ -213,11 +213,10 @@
 		ref = Utils.getServiceReference(getContext(), Architecture.class.getName(), "(architecture.instance=under)");
 		assertNotNull("Check architecture availability", ref);
 		arch = (Architecture) getContext().getService(ref);
-		id = arch.getInstanceDescription();
+		//id = arch.getInstanceDescription();
 		assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
 		contained = id.getContainedInstances();
 		assertEquals("Check contained instances count", contained.length, 1);
-		assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
 		assertEquals("Check instance name" , id.getName(), "under");
 		assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.1");
 		
@@ -226,11 +225,10 @@
 		ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), "under");
 		assertNotNull("Check architecture availability", ref);
 		arch = (Architecture) getContext().getService(ref);
-		id = arch.getInstanceDescription();
+		//id = arch.getInstanceDescription();
 		assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
 		contained = id.getContainedInstances();
 		assertEquals("Check contained instances count", contained.length, 1);
-		assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
 		assertEquals("Check instance name" , id.getName(), "under");
 		assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.1");
 
@@ -239,11 +237,10 @@
 		ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), "under");
 		assertNotNull("Check architecture availability", ref);
 		arch = (Architecture) getContext().getService(ref);
-		id = arch.getInstanceDescription();
+		//id = arch.getInstanceDescription();
 		assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.INVALID);
 		contained = id.getContainedInstances();
 		assertEquals("Check contained instances count", contained.length, 0);
-		assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
 		assertEquals("Check instance name" , id.getName(), "under");
 		assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.1");
 
@@ -252,11 +249,10 @@
 		ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), "under");
 		assertNotNull("Check architecture availability", ref);
 		arch = (Architecture) getContext().getService(ref);
-		id = arch.getInstanceDescription();
+		//id = arch.getInstanceDescription();
 		assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
 		contained = id.getContainedInstances();
 		assertEquals("Check contained instances count", contained.length, 1);
-		assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
 		assertEquals("Check instance name" , id.getName(), "under");
 		assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.1");
 
diff --git a/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/MultipleInstantiation.java b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/MultipleInstantiation.java
index 8b999e8..2201507 100644
--- a/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/MultipleInstantiation.java
+++ b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/MultipleInstantiation.java
@@ -26,6 +26,7 @@
 import org.apache.felix.ipojo.ServiceContext;
 import org.apache.felix.ipojo.architecture.Architecture;
 import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.composite.CompositeInstanceDescription;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
 import org.apache.felix.ipojo.test.composite.service.BarService;
 import org.apache.felix.ipojo.test.composite.util.Utils;
@@ -202,12 +203,11 @@
 		ServiceReference ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), "under");
 		assertNotNull("Check architecture availability", ref);
 		Architecture arch = (Architecture) getContext().getService(ref);
-		InstanceDescription id = arch.getInstanceDescription();
+        CompositeInstanceDescription id = (CompositeInstanceDescription) arch.getInstanceDescription();
 		
 		assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
 		InstanceDescription[] contained = id.getContainedInstances();
 		assertEquals("Check contained instances count", contained.length, 3);
-		assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
 		assertEquals("Check instance name" , id.getName(), "under");
 		assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.2");
 		
@@ -220,11 +220,10 @@
 		ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), "under");
 		assertNotNull("Check architecture availability", ref);
 		arch = (Architecture) getContext().getService(ref);
-		id = arch.getInstanceDescription();
+		//id = arch.getInstanceDescription();
 		assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
 		contained = id.getContainedInstances();
 		assertEquals("Check contained instances count", contained.length, 2);
-		assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
 		assertEquals("Check instance name" , id.getName(), "under");
 		assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.2");
 		
@@ -233,11 +232,10 @@
 		ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), "under");
 		assertNotNull("Check architecture availability", ref);
 		arch = (Architecture) getContext().getService(ref);
-		id = arch.getInstanceDescription();
+		//id = arch.getInstanceDescription();
 		assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
 		contained = id.getContainedInstances();
 		assertEquals("Check contained instances count", contained.length, 1);
-		assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
 		assertEquals("Check instance name" , id.getName(), "under");
 		assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.2");
 
@@ -246,11 +244,10 @@
 		ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), "under");
 		assertNotNull("Check architecture availability", ref);
 		arch = (Architecture) getContext().getService(ref);
-		id = arch.getInstanceDescription();
+		//id = arch.getInstanceDescription();
 		assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.INVALID);
 		contained = id.getContainedInstances();
 		assertEquals("Check contained instances count", contained.length, 0);
-		assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
 		assertEquals("Check instance name" , id.getName(), "under");
 		assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.2");
 
@@ -259,11 +256,10 @@
 		ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), "under");
 		assertNotNull("Check architecture availability", ref);
 		arch = (Architecture) getContext().getService(ref);
-		id = arch.getInstanceDescription();
+		//id = arch.getInstanceDescription();
 		assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
 		contained = id.getContainedInstances();
 		assertEquals("Check contained instances count", contained.length, 1);
-		assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
 		assertEquals("Check instance name" , id.getName(), "under");
 		assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.2");
 
diff --git a/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/OptionalInstantiation.java b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/OptionalInstantiation.java
index 09cbd4b..398c34c 100644
--- a/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/OptionalInstantiation.java
+++ b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/OptionalInstantiation.java
@@ -26,6 +26,7 @@
 import org.apache.felix.ipojo.ServiceContext;
 import org.apache.felix.ipojo.architecture.Architecture;
 import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.composite.CompositeInstanceDescription;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
 import org.apache.felix.ipojo.test.composite.service.BarService;
 import org.apache.felix.ipojo.test.composite.util.Utils;
@@ -194,12 +195,11 @@
 		assertNotNull("Check architecture availability", ref);
 		Architecture arch = (Architecture) getContext().getService(ref);
 		assertNotNull("Check architecture", arch);
-		InstanceDescription id = arch.getInstanceDescription();
+        CompositeInstanceDescription id = (CompositeInstanceDescription) arch.getInstanceDescription();
 		assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
 		InstanceDescription[] contained = id.getContainedInstances();
 		assertNotNull("Check contained not null", contained);
 		assertEquals("Check contained instances count ("+contained.length+") - 1", contained.length, 1);
-		assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
 		assertEquals("Check instance name" , id.getName(), "under");
 		assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.3");
 		
@@ -213,11 +213,10 @@
 		ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), "under");
 		assertNotNull("Check architecture availability", ref);
 		arch = (Architecture) getContext().getService(ref);
-		id = arch.getInstanceDescription();
+		//id = arch.getInstanceDescription();
 		assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
 		contained = id.getContainedInstances();
 		assertEquals("Check contained instances count", contained.length, 1);
-		assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
 		assertEquals("Check instance name" , id.getName(), "under");
 		assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.3");
 		
@@ -226,11 +225,10 @@
 		ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), "under");
 		assertNotNull("Check architecture availability", ref);
 		arch = (Architecture) getContext().getService(ref);
-		id = arch.getInstanceDescription();
+		//id = arch.getInstanceDescription();
 		assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
 		contained = id.getContainedInstances();
 		assertEquals("Check contained instances count", contained.length, 1);
-		assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
 		assertEquals("Check instance name" , id.getName(), "under");
 		assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.3");
 
@@ -239,11 +237,10 @@
 		ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), "under");
 		assertNotNull("Check architecture availability", ref);
 		arch = (Architecture) getContext().getService(ref);
-		id = arch.getInstanceDescription();
+		//id = arch.getInstanceDescription();
 		assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
 		contained = id.getContainedInstances();
 		assertEquals("Check contained instances count", contained.length, 0);
-		assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
 		assertEquals("Check instance name" , id.getName(), "under");
 		assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.3");
 
@@ -252,11 +249,10 @@
 		ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), "under");
 		assertNotNull("Check architecture availability", ref);
 		arch = (Architecture) getContext().getService(ref);
-		id = arch.getInstanceDescription();
+		//id = arch.getInstanceDescription();
 		assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
 		contained = id.getContainedInstances();
 		assertEquals("Check contained instances count", contained.length, 1);
-		assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
 		assertEquals("Check instance name" , id.getName(), "under");
 		assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.3");
 
@@ -265,15 +261,6 @@
 		fact2.start();
 		fact3.start();
 	}
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
+
 
 }
diff --git a/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/SimpleInstantiation.java b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/SimpleInstantiation.java
index 193adaf..04f81c4 100644
--- a/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/SimpleInstantiation.java
+++ b/ipojo/tests/composite/service-instance/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/SimpleInstantiation.java
@@ -26,6 +26,7 @@
 import org.apache.felix.ipojo.ServiceContext;
 import org.apache.felix.ipojo.architecture.Architecture;
 import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.composite.CompositeInstanceDescription;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
 import org.apache.felix.ipojo.test.composite.service.BarService;
 import org.apache.felix.ipojo.test.composite.util.Utils;
@@ -192,12 +193,11 @@
 		ServiceReference ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), "under");
 		assertNotNull("Check architecture availability", ref);
 		Architecture arch = (Architecture) getContext().getService(ref);
-		InstanceDescription id = arch.getInstanceDescription();
+        CompositeInstanceDescription id = (CompositeInstanceDescription) arch.getInstanceDescription();
 		
 		assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
 		InstanceDescription[] contained = id.getContainedInstances();
 		assertEquals("Check contained instances count", contained.length, 1);
-		assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
 		assertEquals("Check instance name" , id.getName(), "under");
 		assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.1");
 		
@@ -210,11 +210,10 @@
 		ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), "under");
 		assertNotNull("Check architecture availability", ref);
 		arch = (Architecture) getContext().getService(ref);
-		id = arch.getInstanceDescription();
+		//id = arch.getInstanceDescription();
 		assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
 		contained = id.getContainedInstances();
 		assertEquals("Check contained instances count", contained.length, 1);
-		assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
 		assertEquals("Check instance name" , id.getName(), "under");
 		assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.1");
 		
@@ -223,11 +222,10 @@
 		ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), "under");
 		assertNotNull("Check architecture availability", ref);
 		arch = (Architecture) getContext().getService(ref);
-		id = arch.getInstanceDescription();
+		//id = arch.getInstanceDescription();
 		assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
 		contained = id.getContainedInstances();
 		assertEquals("Check contained instances count", contained.length, 1);
-		assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
 		assertEquals("Check instance name" , id.getName(), "under");
 		assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.1");
 
@@ -236,11 +234,10 @@
 		ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), "under");
 		assertNotNull("Check architecture availability", ref);
 		arch = (Architecture) getContext().getService(ref);
-		id = arch.getInstanceDescription();
+		//id = arch.getInstanceDescription();
 		assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.INVALID);
 		contained = id.getContainedInstances();
 		assertEquals("Check contained instances count", contained.length, 0);
-		assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
 		assertEquals("Check instance name" , id.getName(), "under");
 		assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.1");
 
@@ -249,11 +246,10 @@
 		ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), "under");
 		assertNotNull("Check architecture availability", ref);
 		arch = (Architecture) getContext().getService(ref);
-		id = arch.getInstanceDescription();
+		//id = arch.getInstanceDescription();
 		assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
 		contained = id.getContainedInstances();
 		assertEquals("Check contained instances count", contained.length, 1);
-		assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
 		assertEquals("Check instance name" , id.getName(), "under");
 		assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.1");
 
diff --git a/ipojo/tests/core/configadmin/src/main/java/org/apache/felix/ipojo/test/scenarios/component/ConfigurableFooProvider.java b/ipojo/tests/core/configadmin/src/main/java/org/apache/felix/ipojo/test/scenarios/component/ConfigurableFooProvider.java
index e4bfcb4..693ff1b 100644
--- a/ipojo/tests/core/configadmin/src/main/java/org/apache/felix/ipojo/test/scenarios/component/ConfigurableFooProvider.java
+++ b/ipojo/tests/core/configadmin/src/main/java/org/apache/felix/ipojo/test/scenarios/component/ConfigurableFooProvider.java
@@ -10,7 +10,7 @@
     private int invokeCount = 0;
     
     public void setMessage(String message) {
-        System.out.println("Set message to " + message);
+        System.err.println("=== Set message to " + message);
         this.message = message;
         invokeCount++;
     }
diff --git a/ipojo/tests/core/configadmin/src/main/java/org/apache/felix/ipojo/test/scenarios/configadmin/ManagedServiceFactoryTestForImmediate.java b/ipojo/tests/core/configadmin/src/main/java/org/apache/felix/ipojo/test/scenarios/configadmin/ManagedServiceFactoryTestForImmediate.java
index d912e17..01f9590 100644
--- a/ipojo/tests/core/configadmin/src/main/java/org/apache/felix/ipojo/test/scenarios/configadmin/ManagedServiceFactoryTestForImmediate.java
+++ b/ipojo/tests/core/configadmin/src/main/java/org/apache/felix/ipojo/test/scenarios/configadmin/ManagedServiceFactoryTestForImmediate.java
@@ -5,6 +5,7 @@
 import java.util.Properties;
 
 import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.PrimitiveInstanceDescription;
 import org.apache.felix.ipojo.architecture.Architecture;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
 import org.apache.felix.ipojo.test.scenarios.configadmin.service.FooService;
@@ -76,21 +77,28 @@
         
         String pid = configuration.getPid();
         
+        // Wait for the processing of the first configuration.
+        try {
+            Thread.sleep(ConfigurationTestSuite.UPDATE_WAIT_TIME);
+        } catch (InterruptedException e1) {
+            fail(e1.getMessage());
+        }
+        
         //  The instance should be created, wait for the architecture service
         Utils.waitForService(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         Architecture architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
-        assertEquals("Check object", 1, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check object", 1, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
         
         FooService fs = (FooService) Utils.getServiceObject(getContext(), FooService.class.getName(), "(instance.name=" + pid + ")");
         Properties p = fs.fooProps();
         String mes = p.getProperty("message");
         int count = ((Integer) p.get("count")).intValue();
-        architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
+        //architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
         assertEquals("Assert Message", "message", mes);
         assertEquals("Assert count", 1, count);
-        assertEquals("Check 1 object", 1, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
         
         props.put("message", "message2");
         try {
@@ -105,11 +113,11 @@
         p = fs.fooProps();
         mes = p.getProperty("message");
         count = ((Integer) p.get("count")).intValue();
-        architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
+        //architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
         assertEquals("Assert Message", "message2", mes);
         assertEquals("Assert count", 2, count);
-        assertEquals("Check 1 object", 1, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
         
         try {
             configuration.delete();
@@ -145,11 +153,18 @@
         String pid = configuration.getPid();
         System.out.println("PID : " + pid);
         
+        // Wait for the processing of the first configuration.
+        try {
+            Thread.sleep(ConfigurationTestSuite.UPDATE_WAIT_TIME);
+        } catch (InterruptedException e1) {
+            fail(e1.getMessage());
+        }
+        
         //  The instance should be created, wait for the architecture service
         Utils.waitForService(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         Architecture architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
-        assertEquals("Check object", 1, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check object", 1, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
         
         props.put("message", "message2");
         try {
@@ -160,20 +175,20 @@
             fail(e.getMessage());
         }
         
-        architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
+        //architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
-        assertEquals("Check object -2", 1, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check object -2", 1, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
         
         //Invoke
         FooService fs = (FooService) Utils.getServiceObject(getContext(), FooService.class.getName(), "(instance.name=" + pid + ")");
         Properties p = fs.fooProps();
         String mes = p.getProperty("message");
         int count = ((Integer) p.get("count")).intValue();
-        architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
+       // architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
         assertEquals("Assert Message", "message2", mes);
         assertEquals("Assert count", 2, count);
-        assertEquals("Check 1 object", 1, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
                 
         try {
             configuration.delete();
@@ -208,26 +223,41 @@
         
         String pid = configuration.getPid();
         
+        // Wait for the processing of the first configuration.
+        try {
+            Thread.sleep(ConfigurationTestSuite.UPDATE_WAIT_TIME);
+        } catch (InterruptedException e1) {
+            fail(e1.getMessage());
+        }
+        
         assertNull("check no instance", Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")"));
         
         factory.start();
+
         
+        // Wait for the processing of the first configuration.
+        try {
+            Thread.sleep(ConfigurationTestSuite.UPDATE_WAIT_TIME);
+        } catch (InterruptedException e1) {
+            fail(e1.getMessage());
+        }
+
         
         //  The instance should be created, wait for the architecture service
         Utils.waitForService(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         Architecture architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
-        assertEquals("Check object", 1, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check object", 1, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
         
         FooService fs = (FooService) Utils.getServiceObject(getContext(), FooService.class.getName(), "(instance.name=" + pid + ")");
         Properties p = fs.fooProps();
         String mes = p.getProperty("message");
         int count = ((Integer) p.get("count")).intValue();
-        architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
+        //architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
         assertEquals("Assert Message", "message", mes);
         assertEquals("Assert count", 1, count);
-        assertEquals("Check 1 object", 1, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
         
         props.put("message", "message2");
         try {
@@ -242,12 +272,12 @@
         p = fs.fooProps();
         mes = p.getProperty("message");
         count = ((Integer) p.get("count")).intValue();
-        architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
+       // architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
         assertEquals("Assert Message", "message2", mes);
         //assertEquals("Assert count", 2, count);
         // This test was removed as the result can be 3. 
-        assertEquals("Check 1 object", 1, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
         
         try {
             configuration.delete();
@@ -283,16 +313,30 @@
         
         String pid = configuration.getPid();
         
+        // Wait for the processing of the first configuration.
+        try {
+            Thread.sleep(ConfigurationTestSuite.UPDATE_WAIT_TIME);
+        } catch (InterruptedException e1) {
+            fail(e1.getMessage());
+        }
+        
         assertNull("check no instance", Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")"));
         
         factory.start();
         
+        // Wait for the processing of the first configuration.
+        try {
+            Thread.sleep(ConfigurationTestSuite.UPDATE_WAIT_TIME);
+        } catch (InterruptedException e1) {
+            fail(e1.getMessage());
+        }
+
         
         //  The instance should be created, wait for the architecture service
         Utils.waitForService(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         Architecture architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
-        assertEquals("Check object", 1, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check object", 1, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
         
         props.put("message", "message2");
         try {
@@ -303,20 +347,20 @@
             fail(e.getMessage());
         }
         
-        architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
+        //architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
-        assertEquals("Check object -1", 1, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check object -1", 1, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
         
         //Invoke
         FooService fs = (FooService) Utils.getServiceObject(getContext(), FooService.class.getName(), "(instance.name=" + pid + ")");
         Properties p = fs.fooProps();
         String mes = p.getProperty("message");
         int count = ((Integer) p.get("count")).intValue();
-        architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
+       // architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
         assertEquals("Assert Message", "message2", mes);
         assertEquals("Assert count", 2, count);
-        assertEquals("Check 1 object", 1, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
                 
         try {
             configuration.delete();
diff --git a/ipojo/tests/core/configadmin/src/main/java/org/apache/felix/ipojo/test/scenarios/configadmin/ManagedServiceFactoryTestForServices.java b/ipojo/tests/core/configadmin/src/main/java/org/apache/felix/ipojo/test/scenarios/configadmin/ManagedServiceFactoryTestForServices.java
index 4ad16d7..3429f96 100644
--- a/ipojo/tests/core/configadmin/src/main/java/org/apache/felix/ipojo/test/scenarios/configadmin/ManagedServiceFactoryTestForServices.java
+++ b/ipojo/tests/core/configadmin/src/main/java/org/apache/felix/ipojo/test/scenarios/configadmin/ManagedServiceFactoryTestForServices.java
@@ -5,6 +5,7 @@
 import java.util.Properties;
 
 import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.PrimitiveInstanceDescription;
 import org.apache.felix.ipojo.architecture.Architecture;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
 import org.apache.felix.ipojo.test.scenarios.configadmin.service.FooService;
@@ -81,36 +82,56 @@
         Utils.waitForService(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         Architecture architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
-        assertEquals("Check no object", 0, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check no object", 0, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);        
         
+        Utils.waitForService(getContext(), FooService.class.getName(), "(instance.name="+pid+")");       
+        
+        ServiceReference refx = Utils.getServiceReference(getContext(), FooService.class.getName(), "(instance.name=" + pid + ")");
+        assertNotNull("Check refx", refx);
         FooService fs = (FooService) Utils.getServiceObject(getContext(), FooService.class.getName(), "(instance.name=" + pid + ")");
+        assertNotNull("Check fs", fs);
+        
         Properties p = fs.fooProps();
         String mes = p.getProperty("message");
         int count = ((Integer) p.get("count")).intValue();
-        architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
+        //architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
         assertEquals("Assert Message", "message", mes);
         assertEquals("Assert count", 1, count);
-        assertEquals("Check 1 object", 1, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
         
-        props.put("message", "message2");
+        
+        // Wait for the processing of the first configuration.
         try {
-            configuration.update(props);
+            Thread.sleep(ConfigurationTestSuite.UPDATE_WAIT_TIME);
+        } catch (InterruptedException e1) {
+            fail(e1.getMessage());
+        }
+        
+        
+        Dictionary p2 = configuration.getProperties();
+        p2.put("message", "message2");
+        try {
+            System.err.println("The configuration will be updated with message2");
+
+            configuration.update(p2);
             // Update the configuration ...
             Thread.sleep(ConfigurationTestSuite.UPDATE_WAIT_TIME);
         } catch (Exception e) {
             fail(e.getMessage());
         }
         
+        System.err.println("The configuration should be updated with message2");
+        
         fs = (FooService) Utils.getServiceObject(getContext(), FooService.class.getName(), "(instance.name=" + pid + ")");
         p = fs.fooProps();
         mes = p.getProperty("message");
         count = ((Integer) p.get("count")).intValue();
-        architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
+        //architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
         assertEquals("Assert Message", "message2", mes);
         assertEquals("Assert count", 2, count);
-        assertEquals("Check 1 object", 1, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
         
         try {
             configuration.delete();
@@ -149,7 +170,14 @@
         Utils.waitForService(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         Architecture architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
-        assertEquals("Check no object", 0, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check no object", 0, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
+        
+        // Wait for the processing of the first configuration.
+        try {
+            Thread.sleep(ConfigurationTestSuite.UPDATE_WAIT_TIME);
+        } catch (InterruptedException e1) {
+            fail(e1.getMessage());
+        }
         
         props.put("message", "message2");
         try {
@@ -160,20 +188,20 @@
             fail(e.getMessage());
         }
         
-        architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
+       // architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
-        assertEquals("Check no object -2", 0, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check no object -2", 0, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
         
         //Invoke
         FooService fs = (FooService) Utils.getServiceObject(getContext(), FooService.class.getName(), "(instance.name=" + pid + ")");
         Properties p = fs.fooProps();
         String mes = p.getProperty("message");
         int count = ((Integer) p.get("count")).intValue();
-        architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
+        //architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
         assertEquals("Assert Message", "message2", mes);
         assertEquals("Assert count", 1, count);
-        assertEquals("Check 1 object", 1, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
                 
         try {
             configuration.delete();
@@ -217,17 +245,26 @@
         Utils.waitForService(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         Architecture architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
-        assertEquals("Check no object", 0, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check no object", 0, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
         
+        Utils.waitForService(getContext(), FooService.class.getName(), "(instance.name="+pid+")");       
         FooService fs = (FooService) Utils.getServiceObject(getContext(), FooService.class.getName(), "(instance.name=" + pid + ")");
+        
         Properties p = fs.fooProps();
         String mes = p.getProperty("message");
         int count = ((Integer) p.get("count")).intValue();
-        architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
+       // architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
         assertEquals("Assert Message", "message", mes);
         assertEquals("Assert count", 1, count);
-        assertEquals("Check 1 object", 1, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
+        
+     // Wait for the processing of the first configuration.
+        try {
+            Thread.sleep(ConfigurationTestSuite.UPDATE_WAIT_TIME);
+        } catch (InterruptedException e1) {
+            fail(e1.getMessage());
+        }
         
         System.out.println("===");
         
@@ -246,11 +283,11 @@
         p = fs.fooProps();
         mes = p.getProperty("message");
         count = ((Integer) p.get("count")).intValue();
-        architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
+       // architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
         assertEquals("Assert Message", "message2", mes);
         assertEquals("Assert count", 2, count);
-        assertEquals("Check 1 object", 1, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
         
         try {
             configuration.delete();
@@ -296,7 +333,14 @@
         Utils.waitForService(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         Architecture architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
-        assertEquals("Check no object", 0, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check no object", 0, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
+        
+     // Wait for the processing of the first configuration.
+        try {
+            Thread.sleep(ConfigurationTestSuite.UPDATE_WAIT_TIME);
+        } catch (InterruptedException e1) {
+            fail(e1.getMessage());
+        }
         
         props.put("message", "message2");
         try {
@@ -307,20 +351,20 @@
             fail(e.getMessage());
         }
         
-        architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
+        //architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
-        assertEquals("Check no object -2", 0, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check no object -2", 0, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
         
         //Invoke
         FooService fs = (FooService) Utils.getServiceObject(getContext(), FooService.class.getName(), "(instance.name=" + pid + ")");
         Properties p = fs.fooProps();
         String mes = p.getProperty("message");
         int count = ((Integer) p.get("count")).intValue();
-        architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
+       // architecture = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
         
         assertEquals("Assert Message", "message2", mes);
         assertEquals("Assert count", 1, count);
-        assertEquals("Check 1 object", 1, architecture.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) architecture.getInstanceDescription()).getCreatedObjects().length);
                 
         try {
             configuration.delete();
diff --git a/ipojo/tests/core/configadmin/src/main/java/org/apache/felix/ipojo/test/scenarios/configadmin/ManagedServiceTestForImmediate.java b/ipojo/tests/core/configadmin/src/main/java/org/apache/felix/ipojo/test/scenarios/configadmin/ManagedServiceTestForImmediate.java
index c050b16..655f288 100644
--- a/ipojo/tests/core/configadmin/src/main/java/org/apache/felix/ipojo/test/scenarios/configadmin/ManagedServiceTestForImmediate.java
+++ b/ipojo/tests/core/configadmin/src/main/java/org/apache/felix/ipojo/test/scenarios/configadmin/ManagedServiceTestForImmediate.java
@@ -6,6 +6,7 @@
 
 import org.apache.felix.ipojo.ComponentFactory;
 import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.PrimitiveInstanceDescription;
 import org.apache.felix.ipojo.architecture.Architecture;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
 import org.apache.felix.ipojo.test.scenarios.configadmin.service.FooService;
@@ -68,14 +69,14 @@
         }
         
         ServiceReference ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance.getInstanceName());
-        assertEquals("Check 1 object", 1, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertNotNull("FS availability", ref);
         
         FooService fs = (FooService) getContext().getService(ref);
         Properties p = fs.fooProps();
         String mes = p.getProperty("message");
         int count = ((Integer) p.get("count")).intValue();
-        assertEquals("Check 1 object", 1, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertEquals("Check message", "message", mes);
         assertEquals("Check count", 1, count);
         
@@ -96,14 +97,14 @@
         }
         
         ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance.getInstanceName());
-        assertEquals("Check 1 object", 1, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertNotNull("FS availability", ref);
         
         fs = (FooService) getContext().getService(ref);
         p = fs.fooProps();
         mes = p.getProperty("message");
         count = ((Integer) p.get("count")).intValue();
-        assertEquals("Check 1 object", 1, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertEquals("Check message", "message2", mes);
         assertEquals("Check count", 2, count);
         
@@ -131,15 +132,15 @@
         Architecture arch = (Architecture) Utils.getServiceObject(getContext(), org.apache.felix.ipojo.architecture.Architecture.class.getName(), "(architecture.instance=" + conf.getPid() + ")");
         
         ServiceReference ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), conf.getPid());
-        assertEquals("Check 1 object", 1, arch.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) arch.getInstanceDescription()).getCreatedObjects().length);
         assertNotNull("FS availability", ref);
         
-        arch = (Architecture) Utils.getServiceObject(getContext(), org.apache.felix.ipojo.architecture.Architecture.class.getName(), "(architecture.instance=" + conf.getPid() + ")");
+       // arch = (Architecture) Utils.getServiceObject(getContext(), org.apache.felix.ipojo.architecture.Architecture.class.getName(), "(architecture.instance=" + conf.getPid() + ")");
         FooService fs = (FooService) getContext().getService(ref);
         Properties p = fs.fooProps();
         String mes = p.getProperty("message");
         int count = ((Integer) p.get("count")).intValue();
-        assertEquals("Check 1 object", 1, arch.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) arch.getInstanceDescription()).getCreatedObjects().length);
         assertEquals("Check message", "message", mes);
         assertEquals("Check count", 1, count);
         
@@ -159,17 +160,17 @@
             fail(e.getMessage());
         }
         
-        arch = (Architecture) Utils.getServiceObject(getContext(), org.apache.felix.ipojo.architecture.Architecture.class.getName(), "(architecture.instance=" + conf.getPid() + ")");
+      //  arch = (Architecture) Utils.getServiceObject(getContext(), org.apache.felix.ipojo.architecture.Architecture.class.getName(), "(architecture.instance=" + conf.getPid() + ")");
         ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), conf.getPid());
-        assertEquals("Check 1 object", 1, arch.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) arch.getInstanceDescription()).getCreatedObjects().length);
         assertNotNull("FS availability", ref);
 
-        arch = (Architecture) Utils.getServiceObject(getContext(), org.apache.felix.ipojo.architecture.Architecture.class.getName(), "(architecture.instance=" + conf.getPid() + ")");
+       // arch = (Architecture) Utils.getServiceObject(getContext(), org.apache.felix.ipojo.architecture.Architecture.class.getName(), "(architecture.instance=" + conf.getPid() + ")");
         fs = (FooService) getContext().getService(ref);
         p = fs.fooProps();
         mes = p.getProperty("message");
         count = ((Integer) p.get("count")).intValue();
-        assertEquals("Check 1 object", 1, arch.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) arch.getInstanceDescription()).getCreatedObjects().length);
         assertEquals("Check message", "message2", mes);
         assertEquals("Check count", 2, count);
         
@@ -211,14 +212,14 @@
         }
         
         ServiceReference ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance.getInstanceName());
-        assertEquals("Check 1 object", 1, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertNotNull("FS availability", ref);
         
         FooService fs = (FooService) getContext().getService(ref);
         Properties p = fs.fooProps();
         String mes = p.getProperty("message");
       //  int count1 = ((Integer) p.get("count")).intValue();
-        assertEquals("Check 1 object", 1, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertEquals("Check message - 1 (" + mes +")", "message2", mes); // Already reconfigured.
        // assertEquals("Check count", 2, count); // Two : 1) "message" on immediate, "message2" on the reconfiguration, 
                                                 // not necessary as the property can be set before the immediate instance creation
@@ -251,14 +252,14 @@
            fail(e.getMessage());
         }
         ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance.getInstanceName());
-        assertEquals("Check 1 object", 1, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertNotNull("FS availability", ref);
         
         fs = (FooService) getContext().getService(ref);
         p = fs.fooProps();
         mes = p.getProperty("message");
        // int count = ((Integer) p.get("count")).intValue();
-        assertEquals("Check 1 object", 1, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertEquals("Check message already reconfigured", "message3", mes); // Already reconfigured.
         //assertEquals("Check count", count1 + 1, count); // message before the reconfiguration, message3 after the reconfiguration
         
@@ -297,14 +298,14 @@
         }
         
         ServiceReference ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance.getInstanceName());
-        assertEquals("Check 1 object", 1, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertNotNull("FS availability", ref);
         
         FooService fs = (FooService) getContext().getService(ref);
         Properties p = fs.fooProps();
         String mes = p.getProperty("message");
       // int count = ((Integer) p.get("count")).intValue();
-        assertEquals("Check 1 object", 1, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertEquals("Check message", "message2", mes); // Already reconfigured.
         //assertEquals("Check count", 1, count);
         
@@ -337,14 +338,14 @@
         }
         
         ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance.getInstanceName());
-        assertEquals("Check 1 object", 1, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertNotNull("FS availability", ref);
         
         fs = (FooService) getContext().getService(ref);
         p = fs.fooProps();
         mes = p.getProperty("message");
       //  count = ((Integer) p.get("count")).intValue();
-        assertEquals("Check 1 object", 1, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertEquals("Check message", "message3", mes); // Already reconfigured.
        // assertEquals("Check count", 1, count);
         
diff --git a/ipojo/tests/core/configadmin/src/main/java/org/apache/felix/ipojo/test/scenarios/configadmin/ManagedServiceTestForService.java b/ipojo/tests/core/configadmin/src/main/java/org/apache/felix/ipojo/test/scenarios/configadmin/ManagedServiceTestForService.java
index 043c84d..047b488 100644
--- a/ipojo/tests/core/configadmin/src/main/java/org/apache/felix/ipojo/test/scenarios/configadmin/ManagedServiceTestForService.java
+++ b/ipojo/tests/core/configadmin/src/main/java/org/apache/felix/ipojo/test/scenarios/configadmin/ManagedServiceTestForService.java
@@ -6,6 +6,7 @@
 
 import org.apache.felix.ipojo.ComponentFactory;
 import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.PrimitiveInstanceDescription;
 import org.apache.felix.ipojo.architecture.Architecture;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
 import org.apache.felix.ipojo.test.scenarios.configadmin.service.FooService;
@@ -68,14 +69,14 @@
         }
         
         ServiceReference ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance.getInstanceName());
-        assertEquals("Check no object", 0, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check no object", 0, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertNotNull("FS availability", ref);
         
         FooService fs = (FooService) getContext().getService(ref);
         Properties p = fs.fooProps();
         String mes = p.getProperty("message");
         int count = ((Integer) p.get("count")).intValue();
-        assertEquals("Check 1 object", 1, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertEquals("Check message", "message", mes);
         assertEquals("Check count", 1, count);
         
@@ -95,14 +96,14 @@
         }
         
         ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance.getInstanceName());
-        assertEquals("Check 1 object", 1, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertNotNull("FS availability", ref);
         
         fs = (FooService) getContext().getService(ref);
         p = fs.fooProps();
         mes = p.getProperty("message");
         count = ((Integer) p.get("count")).intValue();
-        assertEquals("Check 1 object", 1, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertEquals("Check message", "message2", mes);
         assertEquals("Check count", 2, count);
         
@@ -130,15 +131,15 @@
         Architecture arch = (Architecture) Utils.getServiceObject(getContext(), org.apache.felix.ipojo.architecture.Architecture.class.getName(), "(architecture.instance=" + conf.getPid() + ")");
         
         ServiceReference ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), conf.getPid());
-        assertEquals("Check no object", 0, arch.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check no object", 0, ((PrimitiveInstanceDescription) arch.getInstanceDescription()).getCreatedObjects().length);
         assertNotNull("FS availability", ref);
         
-        arch = (Architecture) Utils.getServiceObject(getContext(), org.apache.felix.ipojo.architecture.Architecture.class.getName(), "(architecture.instance=" + conf.getPid() + ")");
+        // arch = (Architecture) Utils.getServiceObject(getContext(), org.apache.felix.ipojo.architecture.Architecture.class.getName(), "(architecture.instance=" + conf.getPid() + ")");
         FooService fs = (FooService) getContext().getService(ref);
         Properties p = fs.fooProps();
         String mes = p.getProperty("message");
         int count = ((Integer) p.get("count")).intValue();
-        assertEquals("Check 1 object", 1, arch.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) arch.getInstanceDescription()).getCreatedObjects().length);
         assertEquals("Check message", "message", mes);
         assertEquals("Check count", 1, count);
         
@@ -157,17 +158,17 @@
             fail(e.getMessage());
         }
         
-        arch = (Architecture) Utils.getServiceObject(getContext(), org.apache.felix.ipojo.architecture.Architecture.class.getName(), "(architecture.instance=" + conf.getPid() + ")");
+        // arch = (Architecture) Utils.getServiceObject(getContext(), org.apache.felix.ipojo.architecture.Architecture.class.getName(), "(architecture.instance=" + conf.getPid() + ")");
         ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), conf.getPid());
-        assertEquals("Check 1 object", 1, arch.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) arch.getInstanceDescription()).getCreatedObjects().length);
         assertNotNull("FS availability", ref);
 
-        arch = (Architecture) Utils.getServiceObject(getContext(), org.apache.felix.ipojo.architecture.Architecture.class.getName(), "(architecture.instance=" + conf.getPid() + ")");
+        // arch = (Architecture) Utils.getServiceObject(getContext(), org.apache.felix.ipojo.architecture.Architecture.class.getName(), "(architecture.instance=" + conf.getPid() + ")");
         fs = (FooService) getContext().getService(ref);
         p = fs.fooProps();
         mes = p.getProperty("message");
         count = ((Integer) p.get("count")).intValue();
-        assertEquals("Check 1 object", 1, arch.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) arch.getInstanceDescription()).getCreatedObjects().length);
         assertEquals("Check message", "message2", mes);
         assertEquals("Check count", 2, count);
         
@@ -209,14 +210,14 @@
         }
         
         ServiceReference ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance.getInstanceName());
-        assertEquals("Check no object", 0, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check no object", 0, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertNotNull("FS availability", ref);
         
         FooService fs = (FooService) getContext().getService(ref);
         Properties p = fs.fooProps();
         String mes = p.getProperty("message");
         int count = ((Integer) p.get("count")).intValue();
-        assertEquals("Check 1 object", 1, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertEquals("Check message", "message2", mes); // Already reconfigured.
         assertEquals("Check count", 1, count);
         
@@ -249,14 +250,14 @@
         }
         
         ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance.getInstanceName());
-        assertEquals("Check no object", 0, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check no object", 0, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertNotNull("FS availability", ref);
         
         fs = (FooService) getContext().getService(ref);
         p = fs.fooProps();
         mes = p.getProperty("message");
         count = ((Integer) p.get("count")).intValue();
-        assertEquals("Check 1 object", 1, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertEquals("Check message", "message3", mes); // Already reconfigured.
         assertEquals("Check count", 1, count);
         
@@ -295,14 +296,14 @@
         }
         
         ServiceReference ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance.getInstanceName());
-        assertEquals("Check no object", 0, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check no object", 0, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertNotNull("FS availability", ref);
         
         FooService fs = (FooService) getContext().getService(ref);
         Properties p = fs.fooProps();
         String mes = p.getProperty("message");
         int count = ((Integer) p.get("count")).intValue();
-        assertEquals("Check 1 object", 1, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertEquals("Check message", "message2", mes); // Already reconfigured.
         assertEquals("Check count", 1, count);
         
@@ -335,14 +336,14 @@
         }
         
         ref = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance.getInstanceName());
-        assertEquals("Check no object", 0, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check no object", 0, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertNotNull("FS availability", ref);
         
         fs = (FooService) getContext().getService(ref);
         p = fs.fooProps();
         mes = p.getProperty("message");
         count = ((Integer) p.get("count")).intValue();
-        assertEquals("Check 1 object", 1, instance.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check 1 object", 1, ((PrimitiveInstanceDescription) instance.getInstanceDescription()).getCreatedObjects().length);
         assertEquals("Check message", "message3", mes); // Already reconfigured.
         assertEquals("Check count", 1, count);
         
diff --git a/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/CallbackTestCase.java b/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/CallbackTestCase.java
index d26e61a..2c1bed2 100644
--- a/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/CallbackTestCase.java
+++ b/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/CallbackTestCase.java
@@ -21,8 +21,8 @@
 import java.util.Properties;
 
 import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.PrimitiveInstanceDescription;
 import org.apache.felix.ipojo.architecture.Architecture;
-import org.apache.felix.ipojo.architecture.InstanceDescription;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
 import org.apache.felix.ipojo.test.scenarios.lifecycle.callback.service.CheckService;
 import org.apache.felix.ipojo.test.scenarios.util.Utils;
@@ -56,7 +56,7 @@
 		// Check instance is invalid
 		ServiceReference arch_ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), instance.getInstanceName());
 		assertNotNull("Check architecture availability", arch_ref);
-		InstanceDescription id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
+		PrimitiveInstanceDescription id_dep = (PrimitiveInstanceDescription) ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 1", id_dep.getState() == ComponentInstance.INVALID);
 		assertEquals("Check pojo count - 1", id_dep.getCreatedObjects().length, 0);
 		
@@ -64,7 +64,7 @@
 		fooProvider.start();
 		
 		// Check instance validity
-		id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
 		assertTrue("Check instance validity - 1", id_dep.getState() == ComponentInstance.VALID);
 		
 		// Check service providing
@@ -81,7 +81,7 @@
 		
 		fooProvider.stop();
 		
-		id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.INVALID);
 		
 		assertEquals("Check pojo count - 3", id_dep.getCreatedObjects().length, 1);
@@ -89,7 +89,7 @@
 		fooProvider.start();
 		
 		// Check instance validity
-		id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
 		assertTrue("Check instance validity - 2", id_dep.getState() == ComponentInstance.VALID);
 		
 		// Check service providing
diff --git a/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ImmediateCallbackSeveralFactoryTest.java b/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ImmediateCallbackSeveralFactoryTest.java
index 1fe3f1e..c39f7ed 100644
--- a/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ImmediateCallbackSeveralFactoryTest.java
+++ b/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ImmediateCallbackSeveralFactoryTest.java
@@ -21,8 +21,8 @@
 import java.util.Properties;
 
 import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.PrimitiveInstanceDescription;
 import org.apache.felix.ipojo.architecture.Architecture;
-import org.apache.felix.ipojo.architecture.InstanceDescription;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
 import org.apache.felix.ipojo.test.scenarios.component.CallbackCheckService;
 import org.apache.felix.ipojo.test.scenarios.lifecycle.callback.service.CheckService;
@@ -58,7 +58,7 @@
         // Check instance is invalid
         ServiceReference arch_ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), instance.getInstanceName());
         assertNotNull("Check architecture availability", arch_ref);
-        InstanceDescription id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
+        PrimitiveInstanceDescription id_dep = (PrimitiveInstanceDescription) ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
         assertTrue("Check instance invalidity - 1", id_dep.getState() == ComponentInstance.INVALID);
         assertEquals("Check pojo count - 1", id_dep.getCreatedObjects().length, 0);
         
@@ -66,7 +66,7 @@
         fooProvider.start();
         
         // Check instance validity
-        id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
+        //id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
         assertTrue("Check instance validity - 1", id_dep.getState() == ComponentInstance.VALID);
         
         // Check service providing
@@ -84,7 +84,7 @@
         
         fooProvider.stop();
         
-        id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
+        //id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
         assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.INVALID);
         
         assertEquals("Check pojo count - 3", id_dep.getCreatedObjects().length, 1);
@@ -92,7 +92,7 @@
         fooProvider.start();
         
         // Check instance validity
-        id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
+        //id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
         assertTrue("Check instance validity - 2", id_dep.getState() == ComponentInstance.VALID);
         
         // Check service providing
diff --git a/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ImmediateCallbackSingletonFactoryTest.java b/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ImmediateCallbackSingletonFactoryTest.java
index ec55c3e..07eb5a3 100644
--- a/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ImmediateCallbackSingletonFactoryTest.java
+++ b/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ImmediateCallbackSingletonFactoryTest.java
@@ -21,6 +21,7 @@
 import java.util.Properties;
 
 import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.PrimitiveInstanceDescription;
 import org.apache.felix.ipojo.architecture.Architecture;
 import org.apache.felix.ipojo.architecture.InstanceDescription;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
@@ -59,7 +60,7 @@
         // Check instance is invalid
         ServiceReference arch_ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), instance.getInstanceName());
         assertNotNull("Check architecture availability", arch_ref);
-        InstanceDescription id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
+        PrimitiveInstanceDescription id_dep = (PrimitiveInstanceDescription) ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
         assertTrue("Check instance invalidity - 1", id_dep.getState() == ComponentInstance.INVALID);
         assertEquals("Check pojo count - 1", id_dep.getCreatedObjects().length, 0);
         
@@ -67,7 +68,7 @@
         fooProvider.start();
         
         // Check instance validity
-        id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
+       // id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
         assertTrue("Check instance validity - 1", id_dep.getState() == ComponentInstance.VALID);
         
         // Check service providing
@@ -83,7 +84,7 @@
         
         fooProvider.stop();
         
-        id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
+        //id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
         assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.INVALID);
         
         assertEquals("Check pojo count - 3", id_dep.getCreatedObjects().length, 1);
@@ -91,7 +92,7 @@
         fooProvider.start();
         
         // Check instance validity
-        id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
+       // id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
         assertTrue("Check instance validity - 2", id_dep.getState() == ComponentInstance.VALID);
         
         // Check service providing
diff --git a/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ImmediateCallbackTest.java b/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ImmediateCallbackTest.java
index f700aed..dae2876 100644
--- a/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ImmediateCallbackTest.java
+++ b/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ImmediateCallbackTest.java
@@ -21,6 +21,7 @@
 import java.util.Properties;
 
 import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.PrimitiveInstanceDescription;
 import org.apache.felix.ipojo.architecture.Architecture;
 import org.apache.felix.ipojo.architecture.InstanceDescription;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
@@ -56,7 +57,7 @@
         // Check instance is invalid
         ServiceReference arch_ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), instance.getInstanceName());
         assertNotNull("Check architecture availability", arch_ref);
-        InstanceDescription id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
+        PrimitiveInstanceDescription id_dep = (PrimitiveInstanceDescription)((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
         assertTrue("Check instance invalidity - 1", id_dep.getState() == ComponentInstance.INVALID);
         assertEquals("Check pojo count - 1", id_dep.getCreatedObjects().length, 0);
         
@@ -64,7 +65,7 @@
         fooProvider.start();
         
         // Check instance validity
-        id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
+        //id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
         assertTrue("Check instance validity - 1", id_dep.getState() == ComponentInstance.VALID);
         
         // Check service providing
@@ -80,7 +81,7 @@
         
         fooProvider.stop();
         
-        id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
+        //id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
         assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.INVALID);
         
         assertEquals("Check pojo count - 3", id_dep.getCreatedObjects().length, 1);
@@ -88,7 +89,7 @@
         fooProvider.start();
         
         // Check instance validity
-        id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
+        //id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
         assertTrue("Check instance validity - 2", id_dep.getState() == ComponentInstance.VALID);
         
         // Check service providing
diff --git a/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ParentCallbackTestCase.java b/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ParentCallbackTestCase.java
index 569493b..94145c9 100644
--- a/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ParentCallbackTestCase.java
+++ b/ipojo/tests/core/lifecycle-callback/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/callback/ParentCallbackTestCase.java
@@ -21,8 +21,8 @@
 import java.util.Properties;
 
 import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.PrimitiveInstanceDescription;
 import org.apache.felix.ipojo.architecture.Architecture;
-import org.apache.felix.ipojo.architecture.InstanceDescription;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
 import org.apache.felix.ipojo.test.scenarios.lifecycle.callback.service.CheckService;
 import org.apache.felix.ipojo.test.scenarios.util.Utils;
@@ -56,14 +56,14 @@
 		// Check instance is invalid
 		ServiceReference arch_ref = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), instance.getInstanceName());
 		assertNotNull("Check architecture availability", arch_ref);
-		InstanceDescription id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
+		PrimitiveInstanceDescription id_dep = (PrimitiveInstanceDescription) ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 1", id_dep.getState() == ComponentInstance.INVALID);
 		
 		// Start fooprovider
 		fooProvider.start();
 		
 		// Check instance validity
-		id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
 		assertTrue("Check instance validity - 1", id_dep.getState() == ComponentInstance.VALID);
 		
 		// Check service providing
@@ -76,13 +76,13 @@
 		
 		fooProvider.stop();
 		
-		id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.INVALID);
 		
 		fooProvider.start();
 		
 		// Check instance validity
-		id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_ref)).getInstanceDescription();
 		assertTrue("Check instance validity - 2", id_dep.getState() == ComponentInstance.VALID);
 		
 		// Check service providing
diff --git a/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/DependencyArchitectureTest.java b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/DependencyArchitectureTest.java
index 175205a..c025168 100644
--- a/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/DependencyArchitectureTest.java
+++ b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/DependencyArchitectureTest.java
@@ -21,16 +21,16 @@
 import java.util.Properties;
 
 import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.PrimitiveInstanceDescription;
 import org.apache.felix.ipojo.architecture.Architecture;
 import org.apache.felix.ipojo.architecture.InstanceDescription;
 import org.apache.felix.ipojo.handlers.dependency.DependencyHandlerDescription;
 import org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandlerDescription;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
-import org.apache.felix.ipojo.test.scenarios.util.Utils;
-import org.osgi.framework.ServiceReference;
-
 import org.apache.felix.ipojo.test.scenarios.service.dependency.service.CheckService;
 import org.apache.felix.ipojo.test.scenarios.service.dependency.service.FooService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
 
 public class DependencyArchitectureTest extends OSGiTestCase {
 	
@@ -86,29 +86,29 @@
 	}
 	
 	private DependencyHandlerDescription getDependencyDesc(InstanceDescription id) {
-		for(int i = 0; i < id.getHandlers().length; i++) {
-			if(id.getHandlers()[i].getHandlerName().equals("org.apache.felix.ipojo.handlers.dependency.DependencyHandler")) {
-				return (DependencyHandlerDescription) id.getHandlers()[i];
-			}
+	    DependencyHandlerDescription handler = (DependencyHandlerDescription) id.getHandlerDescription("org.apache.felix.ipojo:requires");
+		if (handler == null) {
+		    fail("Dependency Handler not found");
+		    return null;
+		} else {
+		    return handler;
 		}
-		fail("Dependency Handler not found");
-		return null;
 	}
 	
 	private ProvidedServiceHandlerDescription getPSDesc(InstanceDescription id) {
-		for(int i = 0; i < id.getHandlers().length; i++) {
-			if(id.getHandlers()[i].getHandlerName().equals("org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler")) {
-				return (ProvidedServiceHandlerDescription) id.getHandlers()[i];
-			}
-		}
-		fail("Provided Service Handler not found");
-		return null;
+	    ProvidedServiceHandlerDescription handler = (ProvidedServiceHandlerDescription) id.getHandlerDescription("org.apache.felix.ipojo:provides");
+        if (handler == null) {
+            fail("Provided Service Handler not found");
+            return null;
+        } else {
+            return handler;
+        }
 	}
 	
 	public void testSimpleDependency() {
 		ServiceReference arch_dep = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), instance1.getInstanceName());
 		assertNotNull("Check architecture availability", arch_dep);
-		InstanceDescription id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		PrimitiveInstanceDescription id_dep = (PrimitiveInstanceDescription) ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 1", id_dep.getState() == ComponentInstance.INVALID);
 		
 		// Check dependency handler invalidity
@@ -126,10 +126,10 @@
 		
 		ServiceReference arch_ps = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), fooProvider1.getInstanceName());
 		assertNotNull("Check architecture availability", arch_ps);
-		InstanceDescription id_ps = ((Architecture) getContext().getService(arch_ps)).getInstanceDescription();
+		PrimitiveInstanceDescription id_ps = (PrimitiveInstanceDescription) ((Architecture) getContext().getService(arch_ps)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 1", id_ps.getState() == ComponentInstance.VALID);				
 		
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
 		dhd = getDependencyDesc(id_dep);
 		assertTrue("Check dependency handler validity", dhd.isValid());
@@ -141,9 +141,9 @@
 		assertTrue("check CheckService invocation", cs.check());
 		
 		// Check object graph
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		dhd = getDependencyDesc(id_dep);
-		id_ps = ((Architecture) getContext().getService(arch_ps)).getInstanceDescription();
+		//id_ps = ((Architecture) getContext().getService(arch_ps)).getInstanceDescription();
 		ProvidedServiceHandlerDescription psh = getPSDesc(id_ps);
 		assertEquals("Check Service Reference equality", psh.getProvidedServices()[0].getServiceReference(), dhd.getDependencies()[0].getServiceReference());
 		assertEquals("Check POJO creation", id_ps.getCreatedObjects().length, 1);
@@ -151,18 +151,18 @@
 		
 		fooProvider1.stop();
 		
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.INVALID);
 		dhd = getDependencyDesc(id_dep);
 		assertFalse("Check dependency handler invalidity", dhd.isValid());
 		
 		fooProvider1.start();
 		
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		dhd = getDependencyDesc(id_dep);
 		arch_ps = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), fooProvider1.getInstanceName());
 		assertNotNull("Check architecture availability", arch_ps);
-		id_ps = ((Architecture) getContext().getService(arch_ps)).getInstanceDescription();
+		//id_ps = ((Architecture) getContext().getService(arch_ps)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 1", id_ps.getState() == ComponentInstance.VALID);
 		psh = getPSDesc(id_ps);
 		assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
@@ -176,16 +176,16 @@
 		assertTrue("check CheckService invocation", cs.check());
 		
 		// Check object graph 
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		dhd = getDependencyDesc(id_dep);
-		id_ps = ((Architecture) getContext().getService(arch_ps)).getInstanceDescription();
+		//id_ps = ((Architecture) getContext().getService(arch_ps)).getInstanceDescription();
 		psh = getPSDesc(id_ps);
 		assertEquals("Check Service Reference equality", psh.getProvidedServices()[0].getServiceReference(), dhd.getDependencies()[0].getServiceReference());
 		assertTrue("Check service reference - 1", dhd.getDependencies()[0].getUsedServices().contains(psh.getProvidedServices()[0].getServiceReference()));
 		
 		fooProvider1.stop();
 		
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.INVALID);
 		dhd = getDependencyDesc(id_dep);
 		assertFalse("Check dependency handler invalidity", dhd.isValid());
@@ -199,7 +199,7 @@
 	public void testOptionalDependency() {
 		ServiceReference arch_dep = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), instance2.getInstanceName());
 		assertNotNull("Check architecture availability", arch_dep);
-		InstanceDescription id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		PrimitiveInstanceDescription id_dep = (PrimitiveInstanceDescription) ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 1", id_dep.getState() == ComponentInstance.VALID);
 		
 		// Check dependency handler invalidity
@@ -217,10 +217,10 @@
 		
 		ServiceReference arch_ps = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), fooProvider1.getInstanceName());
 		assertNotNull("Check architecture availability", arch_ps);
-		InstanceDescription id_ps = ((Architecture) getContext().getService(arch_ps)).getInstanceDescription();
+		PrimitiveInstanceDescription id_ps = (PrimitiveInstanceDescription) ((Architecture) getContext().getService(arch_ps)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 1", id_ps.getState() == ComponentInstance.VALID);				
 		
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
 		dhd = getDependencyDesc(id_dep);
 		assertTrue("Check dependency handler validity", dhd.isValid());
@@ -232,9 +232,9 @@
 		assertTrue("check CheckService invocation", cs.check());
 		
 		// Check object graph
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		dhd = getDependencyDesc(id_dep);
-		id_ps = ((Architecture) getContext().getService(arch_ps)).getInstanceDescription();
+		//id_ps = ((Architecture) getContext().getService(arch_ps)).getInstanceDescription();
 		ProvidedServiceHandlerDescription psh = getPSDesc(id_ps);
 		assertEquals("Check Service Reference equality", psh.getProvidedServices()[0].getServiceReference(), dhd.getDependencies()[0].getServiceReference());
 		assertEquals("Check POJO creation", id_ps.getCreatedObjects().length, 1);
@@ -242,18 +242,18 @@
 		
 		fooProvider1.stop();
 		
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.VALID);
 		dhd = getDependencyDesc(id_dep);
 		assertTrue("Check dependency handler invalidity", dhd.isValid());
 		
 		fooProvider1.start();
 		
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		dhd = getDependencyDesc(id_dep);
 		arch_ps = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), fooProvider1.getInstanceName());
 		assertNotNull("Check architecture availability", arch_ps);
-		id_ps = ((Architecture) getContext().getService(arch_ps)).getInstanceDescription();
+		//id_ps = ((Architecture) getContext().getService(arch_ps)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 1", id_ps.getState() == ComponentInstance.VALID);
 		psh = getPSDesc(id_ps);
 		assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
@@ -267,16 +267,16 @@
 		assertTrue("check CheckService invocation", cs.check());
 		
 		// Check object graph 
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		dhd = getDependencyDesc(id_dep);
-		id_ps = ((Architecture) getContext().getService(arch_ps)).getInstanceDescription();
+		//id_ps = ((Architecture) getContext().getService(arch_ps)).getInstanceDescription();
 		psh = getPSDesc(id_ps);
 		assertEquals("Check Service Reference equality", psh.getProvidedServices()[0].getServiceReference(), dhd.getDependencies()[0].getServiceReference());
 		assertTrue("Check service reference - 1", dhd.getDependencies()[0].getUsedServices().contains(psh.getProvidedServices()[0].getServiceReference()));
 		
 		fooProvider1.stop();
 		
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.VALID);
 		dhd = getDependencyDesc(id_dep);
 		assertTrue("Check dependency handler invalidity", dhd.isValid());
@@ -290,7 +290,7 @@
 	public void testMultipleDependency() {
 		ServiceReference arch_dep = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), instance3.getInstanceName());
 		assertNotNull("Check architecture availability", arch_dep);
-		InstanceDescription id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		PrimitiveInstanceDescription id_dep = (PrimitiveInstanceDescription) ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 1", id_dep.getState() == ComponentInstance.INVALID);
 		
 		// Check dependency handler invalidity
@@ -307,10 +307,10 @@
 		
 		ServiceReference arch_ps1 = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), fooProvider1.getInstanceName());
 		assertNotNull("Check architecture availability", arch_ps1);
-		InstanceDescription id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
+		PrimitiveInstanceDescription id_ps1 = (PrimitiveInstanceDescription) ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
 		assertTrue("Check instance validity - 1", id_ps1.getState() == ComponentInstance.VALID);				
 		
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
 		dhd = getDependencyDesc(id_dep);
 		assertTrue("Check dependency handler validity", dhd.isValid());
@@ -323,9 +323,9 @@
 		assertTrue("check CheckService invocation", cs.check());
 		
 		// Check object graph
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		dhd = getDependencyDesc(id_dep);
-		id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
+		//id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
 		ProvidedServiceHandlerDescription psh = getPSDesc(id_ps1);
 		assertEquals("Check Service Reference equality", psh.getProvidedServices()[0].getServiceReference(), dhd.getDependencies()[0].getServiceReference());
 		assertEquals("Check POJO creation", id_ps1.getCreatedObjects().length, 1);
@@ -338,12 +338,12 @@
 		ServiceReference arch_ps2 = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), fooProvider2.getInstanceName());
 		assertNotNull("Check architecture availability", arch_ps1);
 		assertNotNull("Check architecture 2 availability", arch_ps2);
-		id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
-		InstanceDescription id_ps2 = ((Architecture) getContext().getService(arch_ps2)).getInstanceDescription();
+		//id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
+		PrimitiveInstanceDescription id_ps2 = (PrimitiveInstanceDescription) ((Architecture) getContext().getService(arch_ps2)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 1", id_ps1.getState() == ComponentInstance.VALID);
 		assertTrue("Check instance 2 invalidity - 1", id_ps2.getState() == ComponentInstance.VALID);
 		
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
 		dhd = getDependencyDesc(id_dep);
 		assertTrue("Check dependency handler validity", dhd.isValid());
@@ -356,10 +356,10 @@
 		assertTrue("check CheckService invocation", cs.check());
 		
 		// Check object graph
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		dhd = getDependencyDesc(id_dep);
-		id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
-		id_ps2 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
+		//id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
+		//id_ps2 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
 		ProvidedServiceHandlerDescription psh1 = getPSDesc(id_ps1);
 		ProvidedServiceHandlerDescription psh2 = getPSDesc(id_ps2);
 		assertEquals("Check POJO creation", id_ps1.getCreatedObjects().length, 1);
@@ -372,10 +372,10 @@
 		
 		arch_ps1 = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), fooProvider1.getInstanceName());
 		assertNotNull("Check architecture availability", arch_ps1);
-		id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
+		//id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
 		assertTrue("Check instance validity - 1", id_ps1.getState() == ComponentInstance.VALID);				
 		
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
 		dhd = getDependencyDesc(id_dep);
 		assertTrue("Check dependency handler validity", dhd.isValid());
@@ -388,9 +388,9 @@
 		assertTrue("check CheckService invocation", cs.check());
 		
 		// Check object graph
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		dhd = getDependencyDesc(id_dep);
-		id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
+		//id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
 		psh = getPSDesc(id_ps1);
 		assertEquals("Check Service Reference equality", psh.getProvidedServices()[0].getServiceReference(), dhd.getDependencies()[0].getServiceReference());
 		assertEquals("Check POJO creation", id_ps1.getCreatedObjects().length, 1);
@@ -399,20 +399,22 @@
 		
 		fooProvider1.stop();
 		
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		assertFalse("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.VALID);
 		dhd = getDependencyDesc(id_dep);
 		assertFalse("Check dependency handler invalidity", dhd.isValid());
 		
 		fooProvider2.start();
 		
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		dhd = getDependencyDesc(id_dep);
-		arch_ps1 = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), fooProvider2.getInstanceName());
+		arch_ps2 = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), fooProvider2.getInstanceName());
 		assertNotNull("Check architecture availability", arch_ps1);
-		id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
-		assertTrue("Check instance invalidity - 1", id_ps1.getState() == ComponentInstance.VALID);
-		psh = getPSDesc(id_ps1);
+		//id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
+		
+		assertTrue("Check instance invalidity - 1", id_ps2.getState() == ComponentInstance.VALID);
+		
+		psh = getPSDesc(id_ps2);
 		assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
 		assertTrue("Check dependency handler validity", dhd.isValid());
 		
@@ -425,17 +427,17 @@
 		assertTrue("check CheckService invocation", cs.check());
 		
 		// Check object graph 
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		dhd = getDependencyDesc(id_dep);
-		id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
-		psh = getPSDesc(id_ps1);
+		//id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
+		psh = getPSDesc(id_ps2);
 		assertEquals("Check Service Reference equality", psh.getProvidedServices()[0].getServiceReference(), dhd.getDependencies()[0].getServiceReference());
 		assertTrue("Check service reference - 4", dhd.getDependencies()[0].getUsedServices().contains(psh.getProvidedServices()[0].getServiceReference()));
 		assertEquals("Check used ref - 7 ", dhd.getDependencies()[0].getUsedServices().size(), 1);
 		
 		fooProvider2.stop();
 		
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		assertFalse("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.VALID);
 		dhd = getDependencyDesc(id_dep);
 		assertFalse("Check dependency handler invalidity", dhd.isValid());
@@ -449,7 +451,7 @@
 	public void testMultipleOptionalDependency() {
 		ServiceReference arch_dep = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), instance4.getInstanceName());
 		assertNotNull("Check architecture availability", arch_dep);
-		InstanceDescription id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		PrimitiveInstanceDescription id_dep = (PrimitiveInstanceDescription) ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 1", id_dep.getState() == ComponentInstance.VALID);
 		
 		// Check dependency handler invalidity
@@ -466,10 +468,10 @@
 		
 		ServiceReference arch_ps1 = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), fooProvider1.getInstanceName());
 		assertNotNull("Check architecture availability", arch_ps1);
-		InstanceDescription id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
+		PrimitiveInstanceDescription id_ps1 = (PrimitiveInstanceDescription) ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 1", id_ps1.getState() == ComponentInstance.VALID);				
 		
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
 		dhd = getDependencyDesc(id_dep);
 		assertTrue("Check dependency handler validity", dhd.isValid());
@@ -481,9 +483,9 @@
 		assertTrue("check CheckService invocation", cs.check());
 		
 		// Check object graph
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		dhd = getDependencyDesc(id_dep);
-		id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
+		//id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
 		ProvidedServiceHandlerDescription psh = getPSDesc(id_ps1);
 		assertEquals("Check Service Reference equality", psh.getProvidedServices()[0].getServiceReference(), dhd.getDependencies()[0].getServiceReference());
 		assertEquals("Check POJO creation", id_ps1.getCreatedObjects().length, 1);
@@ -496,12 +498,12 @@
 		ServiceReference arch_ps2 = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), fooProvider2.getInstanceName());
 		assertNotNull("Check architecture availability", arch_ps1);
 		assertNotNull("Check architecture 2 availability", arch_ps2);
-		id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
-		InstanceDescription id_ps2 = ((Architecture) getContext().getService(arch_ps2)).getInstanceDescription();
+		//id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
+		PrimitiveInstanceDescription id_ps2 = (PrimitiveInstanceDescription) ((Architecture) getContext().getService(arch_ps2)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 1", id_ps1.getState() == ComponentInstance.VALID);
 		assertTrue("Check instance 2 invalidity - 1", id_ps2.getState() == ComponentInstance.VALID);
 		
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
 		dhd = getDependencyDesc(id_dep);
 		assertTrue("Check dependency handler validity", dhd.isValid());
@@ -513,10 +515,10 @@
 		assertTrue("check CheckService invocation", cs.check());
 		
 		// Check object graph
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		dhd = getDependencyDesc(id_dep);
-		id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
-		id_ps2 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
+		//id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
+		//id_ps2 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
 		ProvidedServiceHandlerDescription psh1 = getPSDesc(id_ps1);
 		ProvidedServiceHandlerDescription psh2 = getPSDesc(id_ps2);
 		assertEquals("Check POJO creation", id_ps1.getCreatedObjects().length, 1);
@@ -528,10 +530,10 @@
 		
 		arch_ps1 = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), fooProvider1.getInstanceName());
 		assertNotNull("Check architecture availability", arch_ps1);
-		id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
+		//id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 1", id_ps1.getState() == ComponentInstance.VALID);				
 		
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
 		dhd = getDependencyDesc(id_dep);
 		assertTrue("Check dependency handler validity", dhd.isValid());
@@ -543,9 +545,9 @@
 		assertTrue("check CheckService invocation", cs.check());
 		
 		// Check object graph
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		dhd = getDependencyDesc(id_dep);
-		id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
+		//id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
 		psh = getPSDesc(id_ps1);
 		assertEquals("Check Service Reference equality", psh.getProvidedServices()[0].getServiceReference(), dhd.getDependencies()[0].getServiceReference());
 		assertEquals("Check POJO creation", id_ps1.getCreatedObjects().length, 1);
@@ -553,20 +555,20 @@
 
 		fooProvider1.stop();
 		
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.VALID);
 		dhd = getDependencyDesc(id_dep);
 		assertTrue("Check dependency handler invalidity", dhd.isValid());
 		
 		fooProvider2.start();
 		
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		dhd = getDependencyDesc(id_dep);
-		arch_ps1 = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), fooProvider2.getInstanceName());
-		assertNotNull("Check architecture availability", arch_ps1);
-		id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
-		assertTrue("Check instance invalidity - 1", id_ps1.getState() == ComponentInstance.VALID);
-		psh = getPSDesc(id_ps1);
+		arch_ps2 = Utils.getServiceReferenceByName(getContext(), Architecture.class.getName(), fooProvider2.getInstanceName());
+		assertNotNull("Check architecture availability", arch_ps2);
+		//id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
+		assertTrue("Check instance invalidity - 1", id_ps2.getState() == ComponentInstance.VALID);
+		psh = getPSDesc(id_ps2);
 		assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
 		assertTrue("Check dependency handler validity", dhd.isValid());
 		
@@ -578,16 +580,16 @@
 		assertTrue("check CheckService invocation", cs.check());
 		
 		// Check object graph 
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		dhd = getDependencyDesc(id_dep);
-		id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
-		psh = getPSDesc(id_ps1);
+		//id_ps1 = ((Architecture) getContext().getService(arch_ps1)).getInstanceDescription();
+		psh = getPSDesc(id_ps2);
 		assertEquals("Check Service Reference equality", psh.getProvidedServices()[0].getServiceReference(), dhd.getDependencies()[0].getServiceReference());
 		assertTrue("Check service reference - 4", dhd.getDependencies()[0].getUsedServices().contains(psh.getProvidedServices()[0].getServiceReference()));
 
 		fooProvider2.stop();
 		
-		id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
+		//id_dep = ((Architecture) getContext().getService(arch_dep)).getInstanceDescription();
 		assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.VALID);
 		dhd = getDependencyDesc(id_dep);
 		assertTrue("Check dependency handler invalidity", dhd.isValid());
diff --git a/ipojo/tests/core/service-providing-strategies/src/main/java/org/apache/felix/ipojo/test/scenarios/ps/strategies/CustomStrategyTest.java b/ipojo/tests/core/service-providing-strategies/src/main/java/org/apache/felix/ipojo/test/scenarios/ps/strategies/CustomStrategyTest.java
index f5635f4..ec1a58c 100644
--- a/ipojo/tests/core/service-providing-strategies/src/main/java/org/apache/felix/ipojo/test/scenarios/ps/strategies/CustomStrategyTest.java
+++ b/ipojo/tests/core/service-providing-strategies/src/main/java/org/apache/felix/ipojo/test/scenarios/ps/strategies/CustomStrategyTest.java
@@ -3,6 +3,7 @@
 import java.util.Properties;
 
 import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.PrimitiveInstanceDescription;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
 import org.apache.felix.ipojo.junit4osgi.helpers.IPOJOHelper;
 import org.apache.felix.ipojo.test.scenarios.component.strategies.FooBarProviderType1;
@@ -43,7 +44,7 @@
     }
     
     private void checkCreatedObjects(ComponentInstance ci, int expected) {
-        assertEquals("Number of created objects", expected, ci.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Number of created objects", expected, ((PrimitiveInstanceDescription) ci.getInstanceDescription()).getCreatedObjects().length);
     }
     
     public void testOneService() {
diff --git a/ipojo/tests/core/service-providing-strategies/src/main/java/org/apache/felix/ipojo/test/scenarios/ps/strategies/PerInstanceStrategyTest.java b/ipojo/tests/core/service-providing-strategies/src/main/java/org/apache/felix/ipojo/test/scenarios/ps/strategies/PerInstanceStrategyTest.java
index e59b2ce..5343ca9 100644
--- a/ipojo/tests/core/service-providing-strategies/src/main/java/org/apache/felix/ipojo/test/scenarios/ps/strategies/PerInstanceStrategyTest.java
+++ b/ipojo/tests/core/service-providing-strategies/src/main/java/org/apache/felix/ipojo/test/scenarios/ps/strategies/PerInstanceStrategyTest.java
@@ -3,6 +3,7 @@
 import java.util.Properties;
 
 import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.PrimitiveInstanceDescription;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
 import org.apache.felix.ipojo.junit4osgi.helpers.IPOJOHelper;
 import org.apache.felix.ipojo.test.scenarios.component.strategies.FooBarProviderType1;
@@ -43,7 +44,7 @@
     }
     
     private void checkCreatedObjects(ComponentInstance ci, int expected) {
-        assertEquals("Number of created objects", expected, ci.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Number of created objects", expected, ((PrimitiveInstanceDescription) ci.getInstanceDescription()).getCreatedObjects().length);
     }
     
     public void testOneService() {
diff --git a/ipojo/tests/core/service-providing/src/main/java/org/apache/felix/ipojo/test/scenarios/ps/ProvidedServiceArchitectureTest.java b/ipojo/tests/core/service-providing/src/main/java/org/apache/felix/ipojo/test/scenarios/ps/ProvidedServiceArchitectureTest.java
index 15ac19d..bcb3a4c 100644
--- a/ipojo/tests/core/service-providing/src/main/java/org/apache/felix/ipojo/test/scenarios/ps/ProvidedServiceArchitectureTest.java
+++ b/ipojo/tests/core/service-providing/src/main/java/org/apache/felix/ipojo/test/scenarios/ps/ProvidedServiceArchitectureTest.java
@@ -68,12 +68,14 @@
 		
 		//Look for the ProvidedService Handler
 		ProvidedServiceHandlerDescription pshd = null;
-		for(int i = 0; i < handlers.length; i++) {
-			if(handlers[i].getHandlerName().equals("org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler")) {
-				pshd = (ProvidedServiceHandlerDescription) handlers[i];
-			}
-		}
-		
+        pshd = (ProvidedServiceHandlerDescription) id.getHandlerDescription("org.apache.felix.ipojo:provides");
+
+//		for(int i = 0; i < handlers.length; i++) {
+//			if(handlers[i].getHandlerName().equals("org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler")) {
+//				pshd = (ProvidedServiceHandlerDescription) handlers[i];
+//			}
+//		}
+//		
 		assertNotNull("Check ProvidedServiceHandlerDescription", pshd);
 		ProvidedServiceDescription[] ps = pshd.getProvidedServices();
 		
@@ -117,11 +119,8 @@
 		
 		//Look for the ProvidedService Handler
 		ProvidedServiceHandlerDescription pshd = null;
-		for(int i = 0; i < handlers.length; i++) {
-			if(handlers[i].getHandlerName().equals("org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler")) {
-				pshd = (ProvidedServiceHandlerDescription) handlers[i];
-			}
-		}
+		pshd = (ProvidedServiceHandlerDescription) id.getHandlerDescription("org.apache.felix.ipojo:provides");
+
 		
 		assertNotNull("Check ProvidedServiceHandlerDescription", pshd);
 		ProvidedServiceDescription[] ps = pshd.getProvidedServices();
@@ -136,9 +135,9 @@
 		assertEquals("Check service properties number (#" + prop + "?=5)" , prop.size(), 5);
 		assertEquals("Check instance.name property", prop.getProperty("instance.name"), compName);
 		assertEquals("Check factory.name property", prop.getProperty("factory.name"), factName);
-		assertEquals("Check foo property", prop.getProperty("foo"), "foo");
-		assertEquals("Check bar property", prop.getProperty("bar"), "2");
-		assertEquals("Check baz property", prop.getProperty("baz"), "baz");
+		assertEquals("Check foo property", prop.get("foo"), "foo");
+		assertEquals("Check bar property", prop.get("bar"), new Integer(2));
+		assertEquals("Check baz property", prop.get("baz"), "baz");
 		
 	}
 	
@@ -166,11 +165,13 @@
 		
 		//Look for the ProvidedService Handler
 		ProvidedServiceHandlerDescription pshd = null;
-		for(int i = 0; i < handlers.length; i++) {
-			if(handlers[i].getHandlerName().equals("org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler")) {
-				pshd = (ProvidedServiceHandlerDescription) handlers[i];
-			}
-		}
+        pshd = (ProvidedServiceHandlerDescription) id.getHandlerDescription("org.apache.felix.ipojo:provides");
+
+//		for(int i = 0; i < handlers.length; i++) {
+//			if(handlers[i].getHandlerName().equals("org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler")) {
+//				pshd = (ProvidedServiceHandlerDescription) handlers[i];
+//			}
+//		}
 		
 		assertNotNull("Check ProvidedServiceHandlerDescription", pshd);
 		ProvidedServiceDescription[] ps = pshd.getProvidedServices();
@@ -207,11 +208,13 @@
     	
     	//Look for the ProvidedService Handler
     	ProvidedServiceHandlerDescription pshd = null;
-    	for(int i = 0; i < handlers.length; i++) {
-    		if(handlers[i].getHandlerName().equals("org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler")) {
-    			pshd = (ProvidedServiceHandlerDescription) handlers[i];
-    		}
-    	}
+        pshd = (ProvidedServiceHandlerDescription) id.getHandlerDescription("org.apache.felix.ipojo:provides");
+
+//    	for(int i = 0; i < handlers.length; i++) {
+//    		if(handlers[i].getHandlerName().equals("org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler")) {
+//    			pshd = (ProvidedServiceHandlerDescription) handlers[i];
+//    		}
+//    	}
     	
     	assertNotNull("Check ProvidedServiceHandlerDescription", pshd);
     	ProvidedServiceDescription[] ps = pshd.getProvidedServices();
diff --git a/ipojo/tests/manipulator/creation/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/POJOCreation.java b/ipojo/tests/manipulator/creation/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/POJOCreation.java
index 165d1e1..605e339 100644
--- a/ipojo/tests/manipulator/creation/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/POJOCreation.java
+++ b/ipojo/tests/manipulator/creation/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/POJOCreation.java
@@ -21,6 +21,7 @@
 import java.util.Properties;
 
 import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.PrimitiveInstanceDescription;
 import org.apache.felix.ipojo.architecture.Architecture;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
 import org.apache.felix.ipojo.junit4osgi.helpers.IPOJOHelper;
@@ -110,50 +111,50 @@
 	 * Check lazy creation.
 	 */
 	public void testLazyCreation() {
-		assertEquals("Check that no objects are created ", 0, lazzyArch.getInstanceDescription().getCreatedObjects().length);
+		assertEquals("Check that no objects are created ", 0, ((PrimitiveInstanceDescription) lazzyArch.getInstanceDescription()).getCreatedObjects().length);
 		ServiceReference ref = helper.getServiceReferenceByName(FooService.class.getName(), ci_lazzy.getInstanceName());
 		assertNotNull("Check that a FooService from " + ci_lazzy.getInstanceName() + " is available",ref);
 		FooService fs = (FooService) getServiceObject(ref);
 		assertTrue("Check the FooService invocation", fs.foo());
-		assertEquals("Check the creation of 1 object",1, lazzyArch.getInstanceDescription().getCreatedObjects().length);
+		assertEquals("Check the creation of 1 object",1,  ((PrimitiveInstanceDescription) lazzyArch.getInstanceDescription()).getCreatedObjects().length);
 	}
 	
 	/**
 	 * Check lazy and singleton creation.
 	 */
 	public void testLazyCreationSingleton() {
-        assertEquals("Check that no objects are created ", 0, lazzyArchSing.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check that no objects are created ", 0,  ((PrimitiveInstanceDescription) lazzyArchSing.getInstanceDescription()).getCreatedObjects().length);
         ServiceReference ref = helper.getServiceReferenceByName(FooService.class.getName(), ci_lazzy_sing.getInstanceName());
         assertNotNull("Check that a FooService from " + ci_lazzy_sing.getInstanceName() + " is available",ref);
         FooService fs = (FooService) getServiceObject(ref);
         assertTrue("Check the FooService invocation", fs.foo());
-        assertEquals("Check the creation of 1 object",1, lazzyArchSing.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check the creation of 1 object",1,  ((PrimitiveInstanceDescription) lazzyArchSing.getInstanceDescription()).getCreatedObjects().length);
     }
 	
 	/**
 	 * Check lazy and "several" creation.
 	 */
 	public void testLazyCreationSeveral() {
-        assertEquals("Check that no objects are created ", 0, lazzyArchSev.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check that no objects are created ", 0,  ((PrimitiveInstanceDescription) lazzyArchSev.getInstanceDescription()).getCreatedObjects().length);
         ServiceReference ref = helper.getServiceReferenceByName(FooService.class.getName(), ci_lazzy_sev.getInstanceName());
         assertNotNull("Check that a FooService from " + ci_lazzy_sev.getInstanceName() + " is available", ref);
         FooService fs = (FooService) getServiceObject(ref);
         FooService fs2 = (FooService) getServiceObject(ref);
         assertTrue("Check the FooService invocation", fs.foo());
         assertTrue("Check the FooService invocation-2", fs2.foo());
-        assertEquals("Check the creation of 1 object",1, lazzyArchSev.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check the creation of 1 object",1, ((PrimitiveInstanceDescription) lazzyArchSev.getInstanceDescription()).getCreatedObjects().length);
     }
 	
 	/**
 	 * Check immediate creation.
 	 */
 	public void testImmediateCreation() {
-		assertEquals("Check that one object is created ", 1, immeArch.getInstanceDescription().getCreatedObjects().length);
+		assertEquals("Check that one object is created ", 1, ((PrimitiveInstanceDescription) immeArch.getInstanceDescription()).getCreatedObjects().length);
 		ServiceReference ref = helper.getServiceReferenceByName(FooService.class.getName(), ci_immediate.getInstanceName());
 		assertNotNull("Check that a FooService from " + ci_immediate.getInstanceName() + " is available", ref);
 		FooService fs = (FooService) getServiceObject(ref);
 		assertTrue("Check the FooService invocation", fs.foo());
-		assertEquals("Check the creation of 1 object", 1, immeArch.getInstanceDescription().getCreatedObjects().length);
+		assertEquals("Check the creation of 1 object", 1, ((PrimitiveInstanceDescription) immeArch.getInstanceDescription()).getCreatedObjects().length);
 	}
     
     /**
@@ -165,19 +166,19 @@
         FooService fs = (FooService) getServiceObject(ref);
         Properties p = fs.fooProps();
         assertNotNull("Check the bundle context", p.get("context"));
-        assertEquals("Check the creation of 1 object",1, lazzyArch.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check the creation of 1 object",1, ((PrimitiveInstanceDescription) lazzyArch.getInstanceDescription()).getCreatedObjects().length);
     }
 
     /**
      * Test immediate singleton creation.
      */
     public void testImmediateSingletonCreation() {
-    	assertEquals("Check that one object is created ", 1, immeArchSing.getInstanceDescription().getCreatedObjects().length);
+    	assertEquals("Check that one object is created ", 1, ((PrimitiveInstanceDescription) immeArchSing.getInstanceDescription()).getCreatedObjects().length);
     	ServiceReference ref = helper.getServiceReferenceByName(FooService.class.getName(), ci_immediate_singleton.getInstanceName());
     	assertNotNull("Check that a FooService from " + ci_immediate_singleton.getInstanceName() + " is available",ref);
     	FooService fs = (FooService) getServiceObject(ref);
     	assertTrue("Check the FooService invocation", fs.foo());
-    	assertEquals("Check the creation of 1 object", 1, immeArchSing.getInstanceDescription().getCreatedObjects().length);
+    	assertEquals("Check the creation of 1 object", 1, ((PrimitiveInstanceDescription) immeArchSing.getInstanceDescription()).getCreatedObjects().length);
     }
 
     /**
@@ -185,14 +186,14 @@
      * (lazy & singleton creation)
      */
     public void testLazyCreationSingletonM() {
-        assertEquals("Check that no objects are created ", 0, lazzyArchSingM.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check that no objects are created ", 0, ((PrimitiveInstanceDescription) lazzyArchSingM.getInstanceDescription()).getCreatedObjects().length);
         ServiceReference ref = helper.getServiceReferenceByName(FooService.class.getName(), ci_lazzy_singM.getInstanceName());
         assertNotNull("Check that a FooService from " + ci_lazzy_singM.getInstanceName() + " is available",ref);
         FooService fs = (FooService) getServiceObject(ref);
         FooService fs2 = (FooService) getServiceObject(ref);
         assertTrue("Check the FooService invocation", fs.foo());
         assertTrue("Check the FooService invocation", fs2.foo());
-        assertEquals("Check the creation of 1 object",1, lazzyArchSingM.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check the creation of 1 object",1, ((PrimitiveInstanceDescription) lazzyArchSingM.getInstanceDescription()).getCreatedObjects().length);
     }
 
     /**
@@ -200,16 +201,16 @@
      * (lazy & several creation)
      */
     public void testLazyCreationSeveralM() {
-        assertEquals("Check that no objects are created ", 0, lazzyArchSevM.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check that no objects are created ", 0, ((PrimitiveInstanceDescription) lazzyArchSevM.getInstanceDescription()).getCreatedObjects().length);
         ServiceReference ref= helper.getServiceReferenceByName(FooService.class.getName(), ci_lazzy_sevM.getInstanceName());
         assertNotNull("Check that a FooService from " + ci_lazzy_sevM.getInstanceName() + " is available",ref);
         FooService fs = (FooService) getServiceObject(ref);
         assertTrue("Check the FooService invocation", fs.foo());
-        assertEquals("Check the creation of 1 object",1, lazzyArchSevM.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check the creation of 1 object",1, ((PrimitiveInstanceDescription) lazzyArchSevM.getInstanceDescription()).getCreatedObjects().length);
         FooService fs2 = (FooService) getServiceObject(ref);
         assertTrue("Check the FooService invocation-2", fs2.foo());
         // Only one object as the getService method is called only once (service factory) despite the policy="method".
-        assertEquals("Check the creation of 1 object",1, lazzyArchSevM.getInstanceDescription().getCreatedObjects().length);
+        assertEquals("Check the creation of 1 object",1, ((PrimitiveInstanceDescription) lazzyArchSevM.getInstanceDescription()).getCreatedObjects().length);
     }
     
     /**
diff --git a/ipojo/tests/manipulator/manipulation/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/GetComponentInstanceTest.java b/ipojo/tests/manipulator/manipulation/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/GetComponentInstanceTest.java
index 04efa5d..88144c0 100644
--- a/ipojo/tests/manipulator/manipulation/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/GetComponentInstanceTest.java
+++ b/ipojo/tests/manipulator/manipulation/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/GetComponentInstanceTest.java
@@ -23,6 +23,7 @@
 import org.apache.felix.ipojo.ComponentInstance;
 import org.apache.felix.ipojo.Factory;
 import org.apache.felix.ipojo.Pojo;
+import org.apache.felix.ipojo.PrimitiveInstanceDescription;
 import org.apache.felix.ipojo.architecture.InstanceDescription;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
 import org.apache.felix.ipojo.junit4osgi.helpers.IPOJOHelper;
@@ -82,7 +83,7 @@
 		assertEquals("Check component instance name", instance.getInstanceName(), compName);
 		assertEquals("Check component factory name", instance.getFactory().getName(), factName);
 		assertNotNull("Instance description not null", instance.getInstanceDescription());
-		InstanceDescription id = instance.getInstanceDescription();
+		PrimitiveInstanceDescription id = (PrimitiveInstanceDescription) instance.getInstanceDescription();
 		assertTrue("Check instance state", id.getState() == ComponentInstance.VALID);
 		assertEquals("Check created pojo count", id.getCreatedObjects().length, 1);
 		assertEquals("Check instance description name", id.getName(), compName); 
