diff --git a/ipojo/tests/tests.whiteboard.pattern.handler/pom.xml b/ipojo/tests/tests.whiteboard.pattern.handler/pom.xml
new file mode 100644
index 0000000..b38c6a9
--- /dev/null
+++ b/ipojo/tests/tests.whiteboard.pattern.handler/pom.xml
@@ -0,0 +1,61 @@
+<project>
+  <groupId>ipojo.test</groupId>
+  <version>0.9.0-SNAPSHOT</version>
+  <modelVersion>4.0.0</modelVersion>
+  <packaging>bundle</packaging>
+  <name>iPOJO White Board Pattern Handler Test Suite</name>
+  <artifactId>tests.whiteboard.pattern.handler</artifactId>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.felix</groupId>
+      <artifactId>org.apache.felix.ipojo</artifactId>
+      <version>0.9.0-SNAPSHOT</version>
+    </dependency>
+	<dependency>
+		<groupId>org.apache.felix</groupId>
+		<artifactId>org.osgi.core</artifactId>
+		<version>1.0.0</version>
+	</dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+    </dependency>
+	<dependency>
+		<groupId>ipojo.examples</groupId>
+		<artifactId>org.apache.felix.ipojo.junit4osgi</artifactId>
+		<version>0.9.0-SNAPSHOT</version>
+	</dependency>
+  </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <version>1.4.0</version>
+        <extensions>true</extensions>
+        <configuration>
+          <instructions>
+            <Private-Package>org.apache.felix.ipojo.test, org.apache.felix.ipojo.test.scenarios.util</Private-Package>
+            <Test-Suite>org.apache.felix.ipojo.test.WbpTests</Test-Suite>
+          </instructions>
+        </configuration>
+      </plugin>
+      <plugin>
+	      <groupId>org.apache.felix</groupId>
+	      <artifactId>maven-ipojo-plugin</artifactId>
+	      <version>0.9.0-SNAPSHOT</version>
+		  <executions>
+          	<execution>
+            	<goals>
+	              <goal>ipojo-bundle</goal>
+               </goals>
+                <configuration>
+   					<ignoreAnnotations>true</ignoreAnnotations>
+            	</configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/ipojo/tests/tests.whiteboard.pattern.handler/src/main/java/org/apache/felix/ipojo/test/FooProvider.java b/ipojo/tests/tests.whiteboard.pattern.handler/src/main/java/org/apache/felix/ipojo/test/FooProvider.java
new file mode 100644
index 0000000..5a996cd
--- /dev/null
+++ b/ipojo/tests/tests.whiteboard.pattern.handler/src/main/java/org/apache/felix/ipojo/test/FooProvider.java
@@ -0,0 +1,15 @@
+package org.apache.felix.ipojo.test;
+
+public class FooProvider implements FooService {
+    
+    public String foo;
+
+    public void foo() { 
+        if (foo.equals("foo")) {
+            foo = "bar";
+        } else {
+            foo = "foo";
+        }
+    }
+    
+}
diff --git a/ipojo/tests/tests.whiteboard.pattern.handler/src/main/java/org/apache/felix/ipojo/test/FooService.java b/ipojo/tests/tests.whiteboard.pattern.handler/src/main/java/org/apache/felix/ipojo/test/FooService.java
new file mode 100644
index 0000000..0040354
--- /dev/null
+++ b/ipojo/tests/tests.whiteboard.pattern.handler/src/main/java/org/apache/felix/ipojo/test/FooService.java
@@ -0,0 +1,7 @@
+package org.apache.felix.ipojo.test;
+
+public interface FooService {
+    
+    public void foo();
+
+}
diff --git a/ipojo/tests/tests.whiteboard.pattern.handler/src/main/java/org/apache/felix/ipojo/test/FooWhiteBoardPattern.java b/ipojo/tests/tests.whiteboard.pattern.handler/src/main/java/org/apache/felix/ipojo/test/FooWhiteBoardPattern.java
new file mode 100644
index 0000000..787748e
--- /dev/null
+++ b/ipojo/tests/tests.whiteboard.pattern.handler/src/main/java/org/apache/felix/ipojo/test/FooWhiteBoardPattern.java
@@ -0,0 +1,36 @@
+package org.apache.felix.ipojo.test;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.osgi.framework.ServiceReference;
+
+public class FooWhiteBoardPattern implements Observable {
+    
+    List list = new ArrayList();
+    int modifications = 0;
+    
+    public void onArrival(ServiceReference ref) {
+        list.add(ref);
+    }
+    
+    public void onDeparture(ServiceReference ref) {
+        list.remove(ref);
+    }
+    
+    public void onModification(ServiceReference ref) {
+        modifications = modifications + 1;
+    }
+
+    public Map getObservations() {
+        Map map = new HashMap();
+        map.put("list", list);
+        map.put("modifications", new Integer(modifications));
+        return map;
+    }
+    
+    
+
+}
diff --git a/ipojo/tests/tests.whiteboard.pattern.handler/src/main/java/org/apache/felix/ipojo/test/Observable.java b/ipojo/tests/tests.whiteboard.pattern.handler/src/main/java/org/apache/felix/ipojo/test/Observable.java
new file mode 100644
index 0000000..94d7787
--- /dev/null
+++ b/ipojo/tests/tests.whiteboard.pattern.handler/src/main/java/org/apache/felix/ipojo/test/Observable.java
@@ -0,0 +1,9 @@
+package org.apache.felix.ipojo.test;
+
+import java.util.Map;
+
+public interface Observable {
+    
+    public Map getObservations();
+
+}
diff --git a/ipojo/tests/tests.whiteboard.pattern.handler/src/main/java/org/apache/felix/ipojo/test/WbpTests.java b/ipojo/tests/tests.whiteboard.pattern.handler/src/main/java/org/apache/felix/ipojo/test/WbpTests.java
new file mode 100644
index 0000000..d25c1e1
--- /dev/null
+++ b/ipojo/tests/tests.whiteboard.pattern.handler/src/main/java/org/apache/felix/ipojo/test/WbpTests.java
@@ -0,0 +1,196 @@
+package org.apache.felix.ipojo.test;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.MissingHandlerException;
+import org.apache.felix.ipojo.UnacceptableConfiguration;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class WbpTests extends OSGiTestCase {
+    
+    Factory provFactory;
+    Factory factory, factory2;
+
+    public void setUp() {
+        provFactory = Utils.getFactoryByName(context, "fooprovider");
+        factory = Utils.getFactoryByName(context, "under-providers");
+        factory2 = Utils.getFactoryByName(context, "under-properties");
+    }
+    
+    public void tearDown() {
+        
+    }
+    
+    public void testServiceProviders() throws UnacceptableConfiguration, MissingHandlerException, ConfigurationException {
+        ComponentInstance ci = factory.createComponentInstance(new Properties());
+        
+        ServiceReference ref = Utils.getServiceReferenceByName(context, Observable.class.getName(), ci.getInstanceName());
+        assertNotNull("Check Observable availability", ref);
+        Observable obs = (Observable) context.getService(ref);
+        
+        Map map = obs.getObservations();
+        assertEquals("Check empty list" , ((List) map.get("list")).size(), 0);
+        
+        Properties p1 = new Properties();
+        p1.put("foo", "foo");
+        ComponentInstance prov1 = provFactory.createComponentInstance(p1);
+        
+        map = obs.getObservations();
+        assertEquals("Check list #1" , ((List) map.get("list")).size(), 1);
+       
+        Properties p2 = new Properties();
+        p2.put("foo", "foo");
+        ComponentInstance prov2 = provFactory.createComponentInstance(p2);
+        
+        map = obs.getObservations();
+        assertEquals("Check list #2" , ((List) map.get("list")).size(), 2);
+        
+        prov1.stop();
+        
+        map = obs.getObservations();
+        assertEquals("(1) Check list #1" , ((List) map.get("list")).size(), 1);
+        
+        prov2.stop();
+        
+        map = obs.getObservations();
+        assertEquals("(2) Check list #0" , ((List) map.get("list")).size(), 0);
+        
+        prov2.start();
+        
+        map = obs.getObservations();
+        assertEquals("(3) Check list #1" , ((List) map.get("list")).size(), 1);
+        
+        prov1.start();
+        
+        map = obs.getObservations();
+        assertEquals("(4) Check list #2" , ((List) map.get("list")).size(), 2);
+        
+        prov1.dispose();
+        
+        map = obs.getObservations();
+        assertEquals("(5) Check list #1" , ((List) map.get("list")).size(), 1);
+        
+        prov2.dispose();
+        
+        map = obs.getObservations();
+        assertEquals("(6) Check list #0" , ((List) map.get("list")).size(), 0);
+        
+        context.ungetService(ref);
+        ci.dispose();
+    }
+    
+    public void testPropertiesProviders() throws UnacceptableConfiguration, MissingHandlerException, ConfigurationException {
+        ComponentInstance ci = factory2.createComponentInstance(new Properties());
+        
+        ServiceReference ref = Utils.getServiceReferenceByName(context, Observable.class.getName(), ci.getInstanceName());
+        assertNotNull("Check Observable availability", ref);
+        Observable obs = (Observable) context.getService(ref);
+        
+        Map map = obs.getObservations();
+        assertEquals("Check empty list" , ((List) map.get("list")).size(), 0);
+        
+        Properties p1 = new Properties();
+        p1.put("foo", "foo");
+        ComponentInstance prov1 = provFactory.createComponentInstance(p1);
+        ServiceReference ref1 = Utils.getServiceReferenceByName(context, FooService.class.getName(), prov1.getInstanceName());
+        FooService fs1 = (FooService) context.getService(ref1);
+        
+        map = obs.getObservations();
+        assertEquals("Check list #1" , ((List) map.get("list")).size(), 1);
+       
+        Properties p2 = new Properties();
+        p2.put("foo", "foo");
+        ComponentInstance prov2 = provFactory.createComponentInstance(p2);
+        ServiceReference ref2 = Utils.getServiceReferenceByName(context, FooService.class.getName(), prov2.getInstanceName());
+        FooService fs2 = (FooService) context.getService(ref2);
+        
+        map = obs.getObservations();
+        assertEquals("Check list #2" , ((List) map.get("list")).size(), 2);
+        
+        fs1.foo();
+        
+        map = obs.getObservations();
+        assertEquals("(1) Check list #1" , ((List) map.get("list")).size(), 1);
+        
+        fs2.foo();
+        
+        map = obs.getObservations();
+        assertEquals("(2) Check list #0" , ((List) map.get("list")).size(), 0);
+        
+        fs2.foo();
+        
+        map = obs.getObservations();
+        assertEquals("(3) Check list #1" , ((List) map.get("list")).size(), 1);
+        
+        fs1.foo();
+        
+        map = obs.getObservations();
+        assertEquals("(4) Check list #2" , ((List) map.get("list")).size(), 2);
+        
+        prov1.dispose();
+        
+        map = obs.getObservations();
+        assertEquals("(5) Check list #1" , ((List) map.get("list")).size(), 1);
+        
+        prov2.dispose();
+        
+        map = obs.getObservations();
+        assertEquals("(6) Check list #0" , ((List) map.get("list")).size(), 0);
+        
+        context.ungetService(ref1);
+        context.ungetService(ref2);
+        context.ungetService(ref);
+        ci.dispose();
+    }
+    
+    public void testModifications() throws UnacceptableConfiguration, MissingHandlerException, ConfigurationException {
+        ComponentInstance ci = factory.createComponentInstance(new Properties());
+        
+        ServiceReference ref = Utils.getServiceReferenceByName(context, Observable.class.getName(), ci.getInstanceName());
+        assertNotNull("Check Observable availability", ref);
+        Observable obs = (Observable) context.getService(ref);
+        
+        Map map = obs.getObservations();
+        assertEquals("Check empty list" , ((List) map.get("list")).size(), 0);
+        
+        Properties p1 = new Properties();
+        p1.put("foo", "foo");
+        ComponentInstance prov1 = provFactory.createComponentInstance(p1);
+        
+        map = obs.getObservations();
+        assertEquals("Check list #1" , ((List) map.get("list")).size(), 1);
+        assertEquals("Check modification #0" , ((Integer) map.get("modifications")).intValue(), 0);
+        
+        ServiceReference ref2 = Utils.getServiceReference(context, FooService.class.getName(), null);
+        assertNotNull("Check FooService availability", ref2);
+        
+        FooService fs = (FooService) context.getService(ref2);
+        fs.foo();
+        
+        map = obs.getObservations();
+        assertEquals("Check list #1" , ((List) map.get("list")).size(), 1);
+        assertEquals("Check modification #1 (" + map.get("modifications")+")" , ((Integer) map.get("modifications")).intValue(), 1);
+        
+        fs.foo();
+        
+        map = obs.getObservations();
+        assertEquals("Check list #1" , ((List) map.get("list")).size(), 1);
+        assertEquals("Check modification #2" , ((Integer) map.get("modifications")).intValue(), 2);
+        
+        prov1.dispose();
+        map = obs.getObservations();
+        assertEquals("Check list #0" , ((List) map.get("list")).size(), 0);
+        assertEquals("Check modification #2" , ((Integer) map.get("modifications")).intValue(), 2);
+        
+        context.ungetService(ref);
+        context.ungetService(ref2);
+        ci.dispose();
+    }
+}
diff --git a/ipojo/tests/tests.whiteboard.pattern.handler/src/main/java/org/apache/felix/ipojo/test/scenarios/util/Utils.java b/ipojo/tests/tests.whiteboard.pattern.handler/src/main/java/org/apache/felix/ipojo/test/scenarios/util/Utils.java
new file mode 100644
index 0000000..e453bed
--- /dev/null
+++ b/ipojo/tests/tests.whiteboard.pattern.handler/src/main/java/org/apache/felix/ipojo/test/scenarios/util/Utils.java
@@ -0,0 +1,261 @@
+package org.apache.felix.ipojo.test.scenarios.util;
+
+import java.util.Dictionary;
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.Handler;
+import org.apache.felix.ipojo.HandlerFactory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.ManagedServiceFactory;
+
+public class Utils {
+
+    public static Factory getFactoryByName(BundleContext bc, String factoryName) {
+        ServiceReference[] refs;
+        try {
+            refs = bc.getServiceReferences(Factory.class.getName(), "(factory.name=" + factoryName + ")");
+            if (refs == null) {
+                System.err.println("Cannot get the factory " + factoryName);
+                return null;
+            }
+            return ((Factory) bc.getService(refs[0]));
+        } catch (InvalidSyntaxException e) {
+            System.err.println("Cannot get the factory " + factoryName + " : " + e.getMessage());
+            return null;
+        }
+    }
+
+    public static HandlerFactory getHandlerFactoryByName(BundleContext bc, String factoryName) {
+        ServiceReference[] refs;
+        try {
+            refs = bc.getServiceReferences(Factory.class.getName(), "(" + Handler.HANDLER_NAME_PROPERTY + "=" + factoryName + ")");
+            if (refs == null) {
+                System.err.println("Cannot get the factory " + factoryName);
+                return null;
+            }
+            return (HandlerFactory) bc.getService(refs[0]);
+        } catch (InvalidSyntaxException e) {
+            System.err.println("Cannot get the factory " + factoryName + " : " + e.getMessage());
+            return null;
+        }
+    }
+
+    public static ComponentInstance getComponentInstance(BundleContext bc, String factoryName, Dictionary configuration) {
+        Factory fact = getFactoryByName(bc, factoryName);
+
+        if (fact == null) {
+            System.err.println("Factory " + factoryName + " not found");
+            return null;
+        }
+
+        // if(fact.isAcceptable(configuration)) {
+        try {
+            return fact.createComponentInstance(configuration);
+        } catch (Exception e) {
+            System.err.println("Cannot create the instance from " + factoryName + " : " + e.getMessage());
+            e.printStackTrace();
+            return null;
+        }
+        // }
+        // else {
+        // System.err.println("Configuration not accepted by : " + factoryName);
+        // return null;
+        // }
+    }
+
+    public static ComponentInstance getComponentInstanceByName(BundleContext bc, String factoryName, String name) {
+        Factory fact = getFactoryByName(bc, factoryName);
+
+        if (fact == null) {
+            System.err.println("Factory " + factoryName + " not found");
+            return null;
+        }
+
+        try {
+            Properties props = new Properties();
+            props.put("name", name);
+            return fact.createComponentInstance(props);
+        } catch (Exception e) {
+            System.err.println("Cannot create the instance from " + factoryName + " : " + e.getMessage());
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    public static ServiceReference[] getServiceReferences(BundleContext bc, String itf, String filter) {
+        ServiceReference[] refs = null;
+        try {
+            refs = bc.getServiceReferences(itf, filter);
+        } catch (InvalidSyntaxException e) {
+            System.err.println("Invalid Filter : " + filter);
+        }
+        if (refs == null) {
+            return new ServiceReference[0];
+        } else {
+            return refs;
+        }
+    }
+
+    public static ServiceReference getServiceReference(BundleContext bc, String itf, String filter) {
+        ServiceReference[] refs = null;
+        try {
+            refs = bc.getServiceReferences(itf, filter);
+        } catch (InvalidSyntaxException e) {
+            System.err.println("Invalid Filter : " + filter);
+        }
+        if (refs == null) {
+            return null;
+        } else {
+            return refs[0];
+        }
+    }
+
+    public static ServiceReference getServiceReferenceByName(BundleContext bc, String itf, String name) {
+        ServiceReference[] refs = null;
+        String filter = null;
+        if (itf.equals(Factory.class.getName()) || itf.equals(ManagedServiceFactory.class.getName())) {
+            filter = "(" + "factory.name" + "=" + name + ")";
+        } else {
+            filter = "(" + "instance.name" + "=" + name + ")";
+        }
+        try {
+            refs = bc.getServiceReferences(itf, filter);
+        } catch (InvalidSyntaxException e) {
+            System.err.println("Invalid Filter : " + filter);
+        }
+        if (refs == null) {
+            return null;
+        } else {
+            return refs[0];
+        }
+    }
+
+    public static Object getServiceObject(BundleContext bc, String itf, String filter) {
+        ServiceReference ref = getServiceReference(bc, itf, filter);
+        if (ref != null) {
+            return bc.getService(ref);
+        } else {
+            return null;
+        }
+    }
+
+    public static Object[] getServiceObjects(BundleContext bc, String itf, String filter) {
+        ServiceReference[] refs = getServiceReferences(bc, itf, filter);
+        if (refs != null) {
+            Object[] list = new Object[refs.length];
+            for (int i = 0; i < refs.length; i++) {
+                list[i] = bc.getService(refs[i]);
+            }
+            return list;
+        } else {
+            return new Object[0];
+        }
+    }
+
+    public static Factory getFactoryByName(ServiceContext bc, String factoryName) {
+        ServiceReference[] refs;
+        try {
+            refs = bc.getServiceReferences(Factory.class.getName(), "(factory.name=" + factoryName + ")");
+            if (refs == null) { return null; }
+            return ((Factory) bc.getService(refs[0]));
+        } catch (InvalidSyntaxException e) {
+            System.err.println("Cannot get the factory " + factoryName + " : " + e.getMessage());
+            return null;
+        }
+    }
+
+    public static ComponentInstance getComponentInstance(ServiceContext bc, String factoryName, Dictionary configuration) {
+        Factory fact = getFactoryByName(bc, factoryName);
+
+        if (fact == null) { return null; }
+
+        if (fact.isAcceptable(configuration)) {
+            try {
+                return fact.createComponentInstance(configuration);
+            } catch (Exception e) {
+                System.err.println(e.getMessage());
+                e.printStackTrace();
+                return null;
+            }
+        } else {
+            System.err.println("Configuration not accepted by : " + factoryName);
+            return null;
+        }
+    }
+
+    public static ServiceReference[] getServiceReferences(ServiceContext bc, String itf, String filter) {
+        ServiceReference[] refs = null;
+        try {
+            refs = bc.getServiceReferences(itf, filter);
+        } catch (InvalidSyntaxException e) {
+            System.err.println("Invalid Filter : " + filter);
+        }
+        if (refs == null) {
+            return new ServiceReference[0];
+        } else {
+            return refs;
+        }
+    }
+
+    public static ServiceReference getServiceReference(ServiceContext bc, String itf, String filter) {
+        ServiceReference[] refs = null;
+        try {
+            refs = bc.getServiceReferences(itf, filter);
+        } catch (InvalidSyntaxException e) {
+            System.err.println("Invalid Filter : " + filter);
+        }
+        if (refs == null) {
+            return null;
+        } else {
+            return refs[0];
+        }
+    }
+
+    public static ServiceReference getServiceReferenceByName(ServiceContext bc, String itf, String name) {
+        ServiceReference[] refs = null;
+        String filter = null;
+        if (itf.equals(Factory.class.getName()) || itf.equals(ManagedServiceFactory.class.getName())) {
+            filter = "(" + "factory.name" + "=" + name + ")";
+        } else {
+            filter = "(" + "instance.name" + "=" + name + ")";
+        }
+        try {
+            refs = bc.getServiceReferences(itf, filter);
+        } catch (InvalidSyntaxException e) {
+            System.err.println("Invalid Filter : " + filter);
+        }
+        if (refs == null) {
+            return null;
+        } else {
+            return refs[0];
+        }
+    }
+
+    public static Object getServiceObject(ServiceContext bc, String itf, String filter) {
+        ServiceReference ref = getServiceReference(bc, itf, filter);
+        if (ref != null) {
+            return bc.getService(ref);
+        } else {
+            return null;
+        }
+    }
+
+    public static Object[] getServiceObjects(ServiceContext bc, String itf, String filter) {
+        ServiceReference[] refs = getServiceReferences(bc, itf, filter);
+        if (refs != null) {
+            Object[] list = new Object[refs.length];
+            for (int i = 0; i < refs.length; i++) {
+                list[i] = bc.getService(refs[i]);
+            }
+            return list;
+        } else {
+            return new Object[0];
+        }
+    }
+
+}
diff --git a/ipojo/tests/tests.whiteboard.pattern.handler/src/main/resources/metadata.xml b/ipojo/tests/tests.whiteboard.pattern.handler/src/main/resources/metadata.xml
new file mode 100644
index 0000000..0f1da91
--- /dev/null
+++ b/ipojo/tests/tests.whiteboard.pattern.handler/src/main/resources/metadata.xml
@@ -0,0 +1,17 @@
+<ipojo xmlns:wbp="org.apache.felix.ipojo.white-board-pattern">
+	<component className="org.apache.felix.ipojo.test.FooProvider" name="fooprovider">
+		<provides>
+			<property field="foo" value="foo"/>
+		</provides>
+	</component>
+	
+	<component className="org.apache.felix.ipojo.test.FooWhiteBoardPattern" name="under-providers">
+		<wbp:wbp filter="(objectclass=org.apache.felix.ipojo.test.FooService)" onArrival="onArrival" onDeparture="onDeparture" onModification="onModification"/>
+		<provides/>
+	</component>
+	
+	<component className="org.apache.felix.ipojo.test.FooWhiteBoardPattern" name="under-properties">
+		<wbp:wbp filter="(foo=foo)" onArrival="onArrival" onDeparture="onDeparture" onModification="onModification"/>
+		<provides/>
+	</component>
+</ipojo>
