diff --git a/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/Common.java b/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/Common.java
index a39d105..22c0ddf 100644
--- a/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/Common.java
+++ b/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/Common.java
@@ -181,9 +181,9 @@
         // Wait for bundle initialization.
         boolean bundleStability = getBundleStability(context);
         int count = 0;
-        while (!bundleStability && count < 500) {
+        while (!bundleStability && count < 1000) {
             try {
-                Thread.sleep(5);
+                Thread.sleep(100);
             } catch (InterruptedException e) {
                 // Interrupted
             }
@@ -191,11 +191,11 @@
             bundleStability = getBundleStability(context);
         }
 
-        if (count == 500) {
+        if (count == 1000) {
             for (Bundle bundle : bc.getBundles()) {
                 System.out.println("Bundle " + bundle.getSymbolicName() + " - " + bundle.getState());
             }
-            System.err.println("Bundle stability isn't reached after 500 tries");
+            System.err.println("Bundle stability isn't reached after 1000 tries");
             throw new IllegalStateException("Cannot reach the bundle stability");
         }
 
@@ -203,11 +203,11 @@
         count = 0;
         int count1 = 0;
         int count2 = 0;
-        while (! serviceStability && count < 500) {
+        while (! serviceStability && count < 1000) {
             try {
                 ServiceReference[] refs = context.getServiceReferences((String) null, null);
                 count1 = refs.length;
-                Thread.sleep(500);
+                Thread.sleep(1000);
                 refs = context.getServiceReferences((String) null, null);
                 count2 = refs.length;
                 serviceStability = count1 == count2;
@@ -219,8 +219,8 @@
             count++;
         }
 
-        if (count == 500) {
-            System.err.println("Service stability isn't reached after 500 tries (" + count1 + " != " + count2);
+        if (count == 1000) {
+            System.err.println("Service stability isn't reached after 1000 tries (" + count1 + " != " + count2);
             throw new IllegalStateException("Cannot reach the service stability");
         }
     }
diff --git a/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestDynamicallyConfigurablePropertiesUsingConfigAdmin.java b/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestDynamicallyConfigurablePropertiesUsingConfigAdmin.java
index 7b9b8d1..9c04b4a 100644
--- a/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestDynamicallyConfigurablePropertiesUsingConfigAdmin.java
+++ b/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestDynamicallyConfigurablePropertiesUsingConfigAdmin.java
@@ -24,7 +24,8 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
-import org.ops4j.pax.exam.spi.reactors.PerMethod;
+import org.ops4j.pax.exam.spi.reactors.PerClass;
+import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.cm.Configuration;
 import org.osgi.service.cm.ConfigurationAdmin;
@@ -41,17 +42,19 @@
  * iPOJO does not expose the ManagedServiceFactory anymore, we must use the configuration admin.
  * To avoid conflicts with persisted configuration, we run one framework per tests
  */
-@ExamReactorStrategy(PerMethod.class)
+@ExamReactorStrategy(PerClass.class)
 public class TestDynamicallyConfigurablePropertiesUsingConfigAdmin extends Common {
 
     ComponentInstance instance, instance2;
 
     @Before
     public void setUp() {
+        cleanupConfigurationAdmin();
+
         String type = "CONFIG-FooProviderType-3";
 
         Hashtable<String, String> p1 = new Hashtable<String, String>();
-        p1.put("instance.name", "instance");
+        p1.put("instance.name", "instance-r");
         p1.put("foo", "foo");
         p1.put("bar", "2");
         p1.put("baz", "baz");
@@ -63,6 +66,31 @@
         instance2 = ipojoHelper.createComponentInstance(type, p2);
     }
 
+    private void cleanupConfigurationAdmin() {
+        ConfigurationAdmin admin = (ConfigurationAdmin) osgiHelper.getServiceObject(ConfigurationAdmin.class.getName
+                (), null);
+        assertNotNull("Check configuration admin availability", admin);
+        try {
+            int found = 0;
+            Configuration[] configurations = admin.listConfigurations(null);
+            for (int i = 0; configurations != null && i < configurations.length; i++) {
+                System.out.println("Deleting configuration " + configurations[i].getPid());
+                configurations[i].delete();
+                found++;
+            }
+
+            // Wait the dispatching.
+            Thread.sleep(found * 500);
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (InvalidSyntaxException e) {
+            e.printStackTrace();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+    }
+
     @After
     public void tearDown() {
         instance.dispose();
@@ -91,14 +119,14 @@
         // Configuration of baz
         Properties conf = new Properties();
         conf.put("baz", "zab");
-        conf.put("bar", new Integer(2));
+        conf.put("bar", 2);
         conf.put("foo", "foo");
         conf.put("instance.name", instance.getInstanceName());
 
         configuration.update(conf);
 
         // Asynchronous dispatching of the configuration
-        Thread.sleep(200);
+        Thread.sleep(1000);
 
         // Recheck props
         fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), instance.getInstanceName());
@@ -131,7 +159,7 @@
         // Configuration of baz
         Properties conf = new Properties();
         conf.put("baz", "zab");
-        conf.put("bar", new Integer(2));
+        conf.put("bar", 2);
         conf.put("foo", "foo");
 
         // Asynchronous dispatching of the configuration
@@ -144,7 +172,7 @@
         barP = (Integer) fooRef.getProperty("bar");
         bazP = (String) fooRef.getProperty("baz");
         assertEquals("Check foo equality -2", fooP, "foo");
-        assertEquals("Check bar equality -2", barP, new Integer(2));
+        assertEquals("Check bar equality -2", barP, 2);
         assertEquals("Check baz equality -2", bazP, "zab");
     }
 
@@ -171,7 +199,7 @@
         Properties conf = new Properties();
         conf.put("baz", "zab");
         conf.put("foo", "oof");
-        conf.put("bar", new Integer(0));
+        conf.put("bar", 0);
 
         // Asynchronous dispatching of the configuration
         configuration.update(conf);
@@ -221,11 +249,11 @@
         Properties conf = new Properties();
         conf.put("baz", "zab");
         conf.put("foo", "oof");
-        conf.put("bar", new Integer(0));
+        conf.put("bar", 0);
 
         // Asynchronous dispatching of the configuration
         configuration.update(conf);
-        Thread.sleep(200);
+        Thread.sleep(1000);
 
         // Recheck props
         fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), instance2.getInstanceName());
@@ -234,7 +262,7 @@
         bazP = (String) fooRef.getProperty("baz");
 
         assertEquals("Check foo equality", fooP, "oof");
-        assertEquals("Check bar equality", barP, new Integer(0));
+        assertEquals("Check bar equality", barP, 0);
         assertEquals("Check baz equality", bazP, "zab");
 
         // Check field value
@@ -244,7 +272,7 @@
         barP = (Integer) p.get("bar");
 
         assertEquals("Check foo field equality", fooP, "oof");
-        assertEquals("Check bar field equality", barP, new Integer(0));
+        assertEquals("Check bar field equality", barP, 0);
 
         osgiHelper.getContext().ungetService(fooRef);
     }
@@ -324,14 +352,16 @@
         Properties conf = new Properties();
         conf.put("baz", "zab");
         conf.put("foo", "foo");
-        conf.put("bar", new Integer(2));
+        conf.put("bar", 2);
         conf.put("propagated1", "propagated");
-        conf.put("propagated2", new Integer(1));
+        conf.put("propagated2", 1);
         conf.put(".notpropagated", "xxx");
 
         // Asynchronous dispatching of the configuration
         configuration.update(conf);
-        Thread.sleep(200);
+        Thread.sleep(1000);
+
+        System.out.println(instance.getInstanceDescription().getDescription());
 
         // Recheck props
         fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), instance.getInstanceName());
@@ -379,7 +409,7 @@
 
         // Asynchronous dispatching of the configuration
         configuration.update(conf);
-        Thread.sleep(200);
+        Thread.sleep(1000);
 
         // Recheck props
         fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), instance2.getInstanceName());
diff --git a/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestManagedServiceConfigurableProperties.java b/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestManagedServiceConfigurableProperties.java
index 961a0de..7bb4b7f 100644
--- a/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestManagedServiceConfigurableProperties.java
+++ b/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestManagedServiceConfigurableProperties.java
@@ -24,12 +24,16 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
 import org.osgi.service.cm.ConfigurationException;
 import org.osgi.service.cm.ManagedService;
 import org.ow2.chameleon.testing.helpers.IPOJOHelper;
 import org.ow2.chameleon.testing.helpers.OSGiHelper;
 
+import java.io.IOException;
 import java.util.Hashtable;
 import java.util.Properties;
 
@@ -61,6 +65,8 @@
         osgiHelper = new OSGiHelper(bc);
         ipojoHelper = new IPOJOHelper(bc);
 
+        cleanupConfigurationAdmin();
+
         String type = "CONFIG-FooProviderType-4";
         Hashtable<String, String> p = new Hashtable<String, String>();
         p.put("instance.name", "instance");
@@ -96,6 +102,22 @@
         instance3 = null;
     }
 
+    private void cleanupConfigurationAdmin() {
+        ConfigurationAdmin admin = (ConfigurationAdmin) osgiHelper.getServiceObject(ConfigurationAdmin.class.getName
+                (), null);
+        assertNotNull("Check configuration admin availability", admin);
+        try {
+            Configuration[] configurations = admin.listConfigurations(null);
+            for (int i = 0; configurations != null && i < configurations.length; i++) {
+                configurations[i].delete();
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (InvalidSyntaxException e) {
+            e.printStackTrace();
+        }
+    }
+
     @Test
     public void testStaticInstance1() {
         ServiceReference fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), instance1.getInstanceName());
diff --git a/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestUpdatedMethodAndConfigAdmin.java b/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestUpdatedMethodAndConfigAdmin.java
index b0e3d0e..fcee2a7 100644
--- a/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestUpdatedMethodAndConfigAdmin.java
+++ b/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestUpdatedMethodAndConfigAdmin.java
@@ -26,6 +26,7 @@
 import org.junit.Test;
 import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
 import org.ops4j.pax.exam.spi.reactors.PerMethod;
+import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.cm.Configuration;
 import org.osgi.service.cm.ConfigurationAdmin;
@@ -40,6 +41,7 @@
 import java.util.Properties;
 
 import static junit.framework.Assert.*;
+import static org.junit.Assert.assertNotNull;
 
 
 @ExamReactorStrategy(PerMethod.class)
@@ -51,6 +53,9 @@
     public void setUp() {
         osgiHelper = new OSGiHelper(bc);
         ipojoHelper = new IPOJOHelper(bc);
+
+        cleanupConfigurationAdmin();
+
         String type = "CONFIG-FooProviderType-3Updated";
 
         Hashtable<String, String> p1 = new Hashtable<String, String>();
@@ -75,6 +80,22 @@
         instance = null;
     }
 
+    private void cleanupConfigurationAdmin() {
+        ConfigurationAdmin admin = (ConfigurationAdmin) osgiHelper.getServiceObject(ConfigurationAdmin.class.getName
+                (), null);
+        assertNotNull("Check configuration admin availability", admin);
+        try {
+            Configuration[] configurations = admin.listConfigurations(null);
+            for (int i = 0; configurations != null && i < configurations.length; i++) {
+                configurations[i].delete();
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (InvalidSyntaxException e) {
+            e.printStackTrace();
+        }
+    }
+
     @Test
     public void testStatic() throws IOException, InterruptedException {
 
diff --git a/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestUpdatedMethodAndManagedService.java b/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestUpdatedMethodAndManagedService.java
index 617d053..17bfdc9 100644
--- a/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestUpdatedMethodAndManagedService.java
+++ b/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestUpdatedMethodAndManagedService.java
@@ -20,23 +20,41 @@
 package org.apache.felix.ipojo.runtime.core;
 
 import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.HandlerFactory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.extender.InstanceDeclaration;
 import org.apache.felix.ipojo.runtime.core.services.FooService;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
+import org.ops4j.pax.exam.spi.reactors.PerClass;
+import org.ops4j.pax.exam.spi.reactors.PerMethod;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
 import org.osgi.service.cm.ConfigurationException;
 import org.osgi.service.cm.ManagedService;
 import org.ow2.chameleon.testing.helpers.IPOJOHelper;
 import org.ow2.chameleon.testing.helpers.OSGiHelper;
 
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
 import java.util.Dictionary;
 import java.util.Hashtable;
 import java.util.Properties;
 
 import static junit.framework.Assert.*;
+import static org.junit.Assert.assertNotNull;
 
 
+@ExamReactorStrategy(PerMethod.class)
 public class TestUpdatedMethodAndManagedService extends Common {
 
 
@@ -55,12 +73,43 @@
      */
     ComponentInstance instance3;
 
+    private void cleanupConfigurationAdmin() {
+        ConfigurationAdmin admin = (ConfigurationAdmin) osgiHelper.getServiceObject(ConfigurationAdmin.class.getName
+                (), null);
+        assertNotNull("Check configuration admin availability", admin);
+        try {
+            int found = 0;
+            Configuration[] configurations = admin.listConfigurations(null);
+            for (int i = 0; configurations != null && i < configurations.length; i++) {
+                System.out.println("Deleting configuration " + configurations[i].getPid());
+                configurations[i].delete();
+                found++;
+            }
 
+            // Wait the dispatching.
+            Thread.sleep(found * 500);
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (InvalidSyntaxException e) {
+            e.printStackTrace();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+    }
 
     @Before
-    public void setUp() {
+    public void setUp() throws IOException {
         osgiHelper = new OSGiHelper(bc);
         ipojoHelper = new IPOJOHelper(bc);
+
+        for (HandlerFactory handler : osgiHelper.getServiceObjects(HandlerFactory.class)) {
+            System.out.println("handler : " + handler.getHandlerName() + " - " + handler.getState() + " - " + handler
+                    .getMissingHandlers());
+        }
+
+        cleanupConfigurationAdmin();
+
         String type = "CONFIG-FooProviderType-4Updated";
         Hashtable<String, String> p = new Hashtable<String, String>();
         p.put("instance.name", "instance");
@@ -68,8 +117,12 @@
         p.put("bar", "2");
         p.put("baz", "baz");
         instance1 = ipojoHelper.createComponentInstance(type, p);
+        System.out.println(instance1.getInstanceDescription().getDescription());
+
         assertEquals("instance1 created", ComponentInstance.VALID, instance1.getState());
 
+        System.out.println(instance1.getInstanceDescription().getDescription());
+
         type = "CONFIG-FooProviderType-3Updated";
         Hashtable<String, String> p1 = new Hashtable<String, String>();
         p1.put("instance.name", "instance-2");
@@ -89,7 +142,6 @@
 
     @After
     public void tearDown() {
-
         instance1.dispose();
         instance2.dispose();
         instance3.dispose();
@@ -98,8 +150,14 @@
         instance3 = null;
     }
 
+
+
     @Test
-    public void testStaticInstance1() {
+    public void testStaticInstance1() throws IOException {
+        for (Architecture architecture : osgiHelper.getServiceObjects(Architecture.class)) {
+            System.out.println(architecture.getInstanceDescription().getName() + " " + architecture
+                    .getInstanceDescription().getState());
+        }
         ServiceReference fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), instance1.getInstanceName());
         assertNotNull("Check FS availability", fooRef);
         String fooP = (String) fooRef.getProperty("foo");
@@ -347,4 +405,38 @@
         assertEquals("Check last updated", 3, dict.size());
 
     }
+
+    public static void dump(BundleContext bc, File output) throws IOException {
+        if (!output.exists()) {
+            output.mkdirs();
+        }
+
+        for (Bundle bundle : bc.getBundles()) {
+            if (bundle.getBundleId() == 0) {
+                continue;
+            }
+            System.out.println("Location : " + bundle.getLocation());
+            if ("local".equals(bundle.getLocation())) {
+                continue; // Pax Exam, when you hug me, I feel so...
+            }
+            URL location = new URL(bundle.getLocation());
+            FileOutputStream outputStream = null;
+            if (bundle.getVersion() != null) {
+                outputStream = new FileOutputStream(new File(output,
+                        bundle.getSymbolicName() + "-" + bundle.getVersion().toString() + ".jar"));
+            } else {
+                outputStream = new FileOutputStream(new File(output, bundle.getSymbolicName() + ".jar"));
+            }
+
+            int read = 0;
+            byte[] bytes = new byte[1024];
+
+            InputStream inputStream = location.openStream();
+            while ((read = inputStream.read(bytes)) != -1) {
+                outputStream.write(bytes, 0, read);
+            }
+            inputStream.close();
+            outputStream.close();
+        }
+    }
 }
diff --git a/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestUpdatedNoArgMethodAndConfigAdmin.java b/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestUpdatedNoArgMethodAndConfigAdmin.java
index dcb4d12..9b4bd8f 100644
--- a/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestUpdatedNoArgMethodAndConfigAdmin.java
+++ b/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestUpdatedNoArgMethodAndConfigAdmin.java
@@ -22,10 +22,12 @@
 import org.apache.felix.ipojo.ComponentInstance;
 import org.apache.felix.ipojo.runtime.core.services.FooService;
 import org.junit.After;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
 import org.ops4j.pax.exam.spi.reactors.PerMethod;
+import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.cm.Configuration;
 import org.osgi.service.cm.ConfigurationAdmin;
@@ -53,6 +55,7 @@
     public void setUp() {
         osgiHelper = new OSGiHelper(bc);
         ipojoHelper = new IPOJOHelper(bc);
+        cleanupConfigurationAdmin();
         String type = "CONFIG-FooProviderType-3Updated2";
 
         Hashtable<String, String> p1 = new Hashtable<String, String>();
@@ -76,6 +79,22 @@
         instance = null;
     }
 
+    private void cleanupConfigurationAdmin() {
+        ConfigurationAdmin admin = (ConfigurationAdmin) osgiHelper.getServiceObject(ConfigurationAdmin.class.getName
+                (), null);
+        Assert.assertNotNull("Check configuration admin availability", admin);
+        try {
+            Configuration[] configurations = admin.listConfigurations(null);
+            for (int i = 0; configurations != null && i < configurations.length; i++) {
+                configurations[i].delete();
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (InvalidSyntaxException e) {
+            e.printStackTrace();
+        }
+    }
+
     @Test
     public void testStatic() throws IOException, InterruptedException {
 
diff --git a/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestUpdatedNoArgMethodAndManagedService.java b/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestUpdatedNoArgMethodAndManagedService.java
index 70cf4af..2bb65e5 100644
--- a/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestUpdatedNoArgMethodAndManagedService.java
+++ b/ipojo/runtime/core-it/src/it/ipojo-core-configuration-test/src/test/java/org/apache/felix/ipojo/runtime/core/TestUpdatedNoArgMethodAndManagedService.java
@@ -24,22 +24,25 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
 import org.osgi.service.cm.ConfigurationException;
 import org.osgi.service.cm.ManagedService;
 import org.ow2.chameleon.testing.helpers.IPOJOHelper;
 import org.ow2.chameleon.testing.helpers.OSGiHelper;
 
+import java.io.IOException;
 import java.util.Hashtable;
 import java.util.Properties;
 
 import static junit.framework.Assert.*;
+import static org.junit.Assert.assertNotNull;
 
 
 public class TestUpdatedNoArgMethodAndManagedService extends Common {
 
-
-
     /**
      * Instance where the ManagedServicePID is provided by the component type.
      */
@@ -60,9 +63,12 @@
     public void setUp() {
         osgiHelper = new OSGiHelper(bc);
         ipojoHelper = new IPOJOHelper(bc);
+
+        cleanupConfigurationAdmin();
+
         String type = "CONFIG-FooProviderType-4Updated2";
         Hashtable<String, String> p = new Hashtable<String, String>();
-        p.put("instance.name", "instance");
+        p.put("instance.name", "any-instance");
         p.put("foo", "foo");
         p.put("bar", "2");
         p.put("baz", "baz");
@@ -75,7 +81,7 @@
         p1.put("foo", "foo");
         p1.put("bar", "2");
         p1.put("baz", "baz");
-        p1.put("managed.service.pid", "instance");
+        p1.put("managed.service.pid", "instanceMSP");
         instance2 = ipojoHelper.createComponentInstance(type, p1);
 
         type = "CONFIG-FooProviderType-3Updated2";
@@ -95,9 +101,27 @@
         instance3 = null;
     }
 
+    private void cleanupConfigurationAdmin() {
+        ConfigurationAdmin admin = (ConfigurationAdmin) osgiHelper.getServiceObject(ConfigurationAdmin.class.getName
+                (), null);
+        assertNotNull("Check configuration admin availability", admin);
+        try {
+            Configuration[] configurations = admin.listConfigurations(null);
+            for (int i = 0; configurations != null && i < configurations.length; i++) {
+                configurations[i].delete();
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (InvalidSyntaxException e) {
+            e.printStackTrace();
+        }
+    }
+
     @Test
     public void testStaticInstance1() {
-        ServiceReference fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), instance1.getInstanceName());
+        ServiceReference fooRef = osgiHelper.waitForService(FooService.class.getName(),
+                "(instance.name=" + instance1.getInstanceName() + ")",
+                5000);
         assertNotNull("Check FS availability", fooRef);
         String fooP = (String) fooRef.getProperty("foo");
         Integer barP = (Integer) fooRef.getProperty("bar");
@@ -147,7 +171,7 @@
         assertEquals("Check bar equality -1", barP, new Integer(2));
         assertEquals("Check baz equality -1", bazP, "baz");
 
-        ServiceReference msRef = osgiHelper.getServiceReferenceByPID(ManagedService.class.getName(), "instance");
+        ServiceReference msRef = osgiHelper.getServiceReferenceByPID(ManagedService.class.getName(), "instanceMSP");
         assertNotNull("Check ManagedService availability", msRef);
 
 
@@ -273,7 +297,7 @@
         assertEquals("Check bar equality", barP, new Integer(2));
         assertEquals("Check baz equality", bazP, "baz");
 
-        ServiceReference msRef = osgiHelper.getServiceReferenceByPID(ManagedService.class.getName(), "instance");
+        ServiceReference msRef = osgiHelper.getServiceReferenceByPID(ManagedService.class.getName(), "instanceMSP");
         assertNotNull("Check ManagedServiceFactory availability", msRef);
 
         // Configuration of baz
