diff --git a/ipojo/tests/core/factories/pom.xml b/ipojo/tests/core/factories/pom.xml
index afd45fe..18688d5 100644
--- a/ipojo/tests/core/factories/pom.xml
+++ b/ipojo/tests/core/factories/pom.xml
@@ -51,6 +51,12 @@
 			<artifactId>org.osgi.compendium</artifactId>
 			<version>4.0.0</version>
 		</dependency>
+		<dependency>
+			<groupId>org.apache.felix</groupId>
+			<artifactId>org.apache.felix.configadmin</artifactId>
+			<version>1.2.0</version>
+			<scope>test</scope>
+		</dependency>
 	</dependencies>
 	<build>
 		<plugins>
diff --git a/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/component/ReconfigurableSimpleType.java b/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/component/ReconfigurableSimpleType.java
index 81ebd04..33a01bd 100644
--- a/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/component/ReconfigurableSimpleType.java
+++ b/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/component/ReconfigurableSimpleType.java
@@ -5,6 +5,9 @@
 
 	private String prop; // Property.
 
+
+	boolean controller;
+
 	public void start () {
 		if (prop == null || prop.equals("KO")) {
 			throw new IllegalStateException("Bad Configuration : " + prop);
@@ -12,6 +15,14 @@
 		System.out.println("OK !!!!");
 	}
 
-
+	public void setProp(String p) {
+		prop = p;
+		if (prop == null || prop.equals("KO")) {
+			controller = false;
+		} else {
+			controller = true;
+			System.out.println("OK !!!!");
+		}
+	}
 
 }
diff --git a/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/factories/ReconfigurationTest.java b/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/factories/ReconfigurationTest.java
index 5628b4b..cbd3938 100644
--- a/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/factories/ReconfigurationTest.java
+++ b/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/factories/ReconfigurationTest.java
@@ -1,19 +1,65 @@
 package org.apache.felix.ipojo.test.scenarios.factories;
 
+import java.io.IOException;
+import java.util.Dictionary;
 import java.util.Properties;
 
+import junit.framework.Assert;
+
 import org.apache.felix.ipojo.ComponentFactory;
 import org.apache.felix.ipojo.ComponentInstance;
 import org.apache.felix.ipojo.ConfigurationException;
 import org.apache.felix.ipojo.MissingHandlerException;
 import org.apache.felix.ipojo.UnacceptableConfiguration;
+import org.apache.felix.ipojo.architecture.Architecture;
 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
 import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
 
 public class ReconfigurationTest extends OSGiTestCase {
 
+	 private ConfigurationAdmin admin;
 
-	public void testRevalidationOnREconfiguration() {
+	 public void setUp() {
+	        admin = (ConfigurationAdmin) Utils.getServiceObject(getContext(), ConfigurationAdmin.class.getName(), null);
+	        assertNotNull("Check configuration admin availability", admin);
+	        try {
+	            Configuration[] configurations = admin.listConfigurations(
+	            		"(service.factoryPid=org.apache.felix.ipojo.test.scenarios.component.ReconfigurableSimpleType)");
+	            for (int i = 0; configurations != null && i < configurations.length; i++) {
+	                configurations[i].delete();
+	            }
+	        } catch (IOException e) {
+	            // TODO Auto-generated catch block
+	            e.printStackTrace();
+	        } catch (InvalidSyntaxException e) {
+	            // TODO Auto-generated catch block
+	            e.printStackTrace();
+	        }
+	    }
+
+	    public void tearDown() {
+	        try {
+	            Configuration[] configurations = admin.listConfigurations(
+	            		"(service.factoryPid=org.apache.felix.ipojo.test.scenarios.component.ReconfigurableSimpleType)");
+	            for (int i = 0; configurations != null && i < configurations.length; i++) {
+	                configurations[i].delete();
+	            }
+	        } catch (IOException e) {
+	            // TODO Auto-generated catch block
+	            e.printStackTrace();
+	        } catch (InvalidSyntaxException e) {
+	            // TODO Auto-generated catch block
+	            e.printStackTrace();
+	        }
+	        admin = null;
+
+
+	    }
+
+	public void testRevalidationOnReconfiguration() {
 		ComponentFactory factory = (ComponentFactory) Utils.getFactoryByName(getContext(),
 				"org.apache.felix.ipojo.test.scenarios.component.ReconfigurableSimpleType");
 
@@ -44,6 +90,154 @@
 		assertEquals("instance valid", ComponentInstance.VALID, ci.getState());
 	}
 
+	public static long UPDATE_WAIT_TIME = 2000;
+
+	public void testRevalidationOnReconfigurationUsingConfigAdmin() throws InvalidSyntaxException {
+		Configuration configuration = null;
+        try {
+            configuration = admin.createFactoryConfiguration("org.apache.felix.ipojo.test.scenarios.component.ReconfigurableSimpleType", null);
+        } catch (IOException e) {
+            fail(e.getMessage());
+        }
+        Dictionary props = configuration.getProperties();
+        if(props == null) {
+            props = new Properties();
+        }
+		// First inject a configuration triggering an exception of the validate method.
+		props.put("prop", "KO");
+
+		try {
+            configuration.update(props);
+        } catch (IOException e) {
+            fail(e.getMessage());
+        }
+
+        String pid = configuration.getPid();
+
+        // Wait for the processing of the first configuration.
+        try {
+            Thread.sleep(UPDATE_WAIT_TIME);
+        } catch (InterruptedException e1) {
+            fail(e1.getMessage());
+        }
+
+        Assert.assertNull("No architecture", getContext().getServiceReferences(Architecture.class.getName(), "(architecture.instance="+pid+")"));
 
 
+		// Reconfigure
+		props = new Properties();
+		props.put("prop", "OK");
+
+		try {
+            configuration.update(props);
+        } catch (IOException e) {
+            fail(e.getMessage());
+        }
+
+        pid = configuration.getPid();
+
+        // Wait for the processing of the first configuration.
+        try {
+            Thread.sleep(UPDATE_WAIT_TIME);
+        } catch (InterruptedException e1) {
+            fail(e1.getMessage());
+        }
+
+        Assert.assertNotNull("architecture", getContext().getServiceReferences(Architecture.class.getName(), "(architecture.instance="+pid+")"));
+        Architecture arch = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
+
+        Assert.assertEquals("Is valid ?", ComponentInstance.VALID, arch.getInstanceDescription().getState());
+	}
+
+	public void testRevalidationOnReconfigurationWithController() {
+		ComponentFactory factory = (ComponentFactory) Utils.getFactoryByName(getContext(),
+				"org.apache.felix.ipojo.test.scenarios.component.ReconfigurableSimpleType2");
+
+		// First inject a configuration triggering an exception of the validate method.
+		Properties props = new Properties();
+		props.put("prop", "KO");
+		ComponentInstance ci = null;
+		try {
+			ci = factory.createComponentInstance(props);
+		} catch (UnacceptableConfiguration e) {
+			e.printStackTrace();
+		} catch (MissingHandlerException e) {
+			e.printStackTrace();
+		} catch (ConfigurationException e) {
+			e.printStackTrace();
+		}
+
+		assertNotNull(ci);
+		assertEquals("instance invalid", ComponentInstance.INVALID, ci.getState()); // Controller effect.
+
+		// Reconfigure
+		props = new Properties();
+		props.put("prop", "OK");
+
+		ci.reconfigure(props);
+
+		assertNotNull(ci);
+		assertEquals("instance valid", ComponentInstance.VALID, ci.getState());
+	}
+
+	public void testRevalidationOnReconfigurationUsingConfigAdminAndController() throws InvalidSyntaxException {
+		Configuration configuration = null;
+        try {
+            configuration = admin.createFactoryConfiguration("org.apache.felix.ipojo.test.scenarios.component.ReconfigurableSimpleType2",
+            		null);
+        } catch (IOException e) {
+            fail(e.getMessage());
+        }
+        Dictionary props = configuration.getProperties();
+        if(props == null) {
+            props = new Properties();
+        }
+		// First inject a configuration triggering an exception of the validate method.
+		props.put("prop", "KO");
+
+		try {
+            configuration.update(props);
+        } catch (IOException e) {
+            fail(e.getMessage());
+        }
+
+        String pid = configuration.getPid();
+
+        // Wait for the processing of the first configuration.
+        try {
+            Thread.sleep(UPDATE_WAIT_TIME);
+        } catch (InterruptedException e1) {
+            fail(e1.getMessage());
+        }
+
+        // Invalid ... controller effect
+        Assert.assertNotNull("architecture", getContext().getServiceReferences(Architecture.class.getName(), "(architecture.instance="+pid+")"));
+        Architecture arch = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
+
+        Assert.assertEquals("Is invalid ?", ComponentInstance.INVALID, arch.getInstanceDescription().getState());
+
+		// Reconfigure
+		props = new Properties();
+		props.put("prop", "OK");
+
+		try {
+            configuration.update(props);
+        } catch (IOException e) {
+            fail(e.getMessage());
+        }
+
+        pid = configuration.getPid();
+
+        // Wait for the processing of the first configuration.
+        try {
+            Thread.sleep(UPDATE_WAIT_TIME);
+        } catch (InterruptedException e1) {
+            fail(e1.getMessage());
+        }
+
+        Assert.assertNotNull("architecture", getContext().getServiceReferences(Architecture.class.getName(), "(architecture.instance="+pid+")"));
+        arch = (Architecture) Utils.getServiceObject(getContext(), Architecture.class.getName(), "(architecture.instance="+pid+")");
+
+        Assert.assertEquals("Is valid ?", ComponentInstance.VALID, arch.getInstanceDescription().getState());
+	}
 }
diff --git a/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/util/Utils.java b/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/util/Utils.java
index 25d599e..8fa2fda 100644
--- a/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/util/Utils.java
+++ b/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/util/Utils.java
@@ -1,4 +1,4 @@
-/* 
+/*
  * 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
@@ -158,7 +158,7 @@
             return refs[0];
         }
     }
-    
+
     public static ServiceReference getServiceReferenceByPID(BundleContext bc, String itf, String pid) {
         ServiceReference[] refs = null;
         String filter = "(" + "service.pid" + "=" + pid + ")";
@@ -307,7 +307,7 @@
             return new Object[0];
         }
     }
-    
+
     public static boolean contains(String string, String[] array) {
         for (int i = 0; array != null && i < array.length; i++) {
             if (array[i] != null  && array[i].equals(string)) {
@@ -316,7 +316,7 @@
         }
         return false;
     }
-    
+
     public static boolean contains(int value, int[] array) {
         for (int i = 0; array != null && i < array.length; i++) {
             if (array[i] == value) {
@@ -326,4 +326,25 @@
         return false;
     }
 
+    public static void waitForService(BundleContext context, String itf, String filter) {
+        ServiceReference[] refs = getServiceReferences(context, itf, filter);
+        int count = 0;
+        if (refs.length != 0) {
+            return;
+        } else {
+            while(refs.length == 0) {
+                try {
+                    Thread.sleep(5);
+                } catch (InterruptedException e) {
+                    // Interrupted
+                }
+                count++;
+                if (count == 100) {
+                    throw new RuntimeException("Timeout ... no services match with " + filter);
+                }
+                refs = getServiceReferences(context, itf, filter);
+            }
+        }
+    }
+
 }
diff --git a/ipojo/tests/core/factories/src/main/resources/metadata.xml b/ipojo/tests/core/factories/src/main/resources/metadata.xml
index 24be561..b59bd95 100644
--- a/ipojo/tests/core/factories/src/main/resources/metadata.xml
+++ b/ipojo/tests/core/factories/src/main/resources/metadata.xml
@@ -135,4 +135,12 @@
 		</properties>
 		<callback transition="validate" method="start"/>
 	</component>
+	<component classname="org.apache.felix.ipojo.test.scenarios.component.ReconfigurableSimpleType"
+		name="org.apache.felix.ipojo.test.scenarios.component.ReconfigurableSimpleType2"
+		architecture="true" immediate="true">
+		<properties>
+			<property name="prop" method="setProp"/>
+		</properties>
+		<controller field="controller"/>
+	</component>
 </ipojo>
