diff --git a/ipojo/runtime/core-it/ipojo-compatibility-test/pom.xml b/ipojo/runtime/core-it/ipojo-compatibility-test/pom.xml
new file mode 100644
index 0000000..36030a6
--- /dev/null
+++ b/ipojo/runtime/core-it/ipojo-compatibility-test/pom.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>org.apache.felix.ipojo.runtime.core-it</artifactId>
+        <version>1.10.2-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>ipojo-compatibility-test</artifactId>
+    <version>1.10.2-SNAPSHOT</version>
+
+    <name>${project.artifactId}</name>
+    
+</project>
\ No newline at end of file
diff --git a/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/java/org/apache/felix/ipojo/test/compatibility/ipojo/HelloServiceConsumer.java b/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/java/org/apache/felix/ipojo/test/compatibility/ipojo/HelloServiceConsumer.java
new file mode 100644
index 0000000..a6a7b95
--- /dev/null
+++ b/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/java/org/apache/felix/ipojo/test/compatibility/ipojo/HelloServiceConsumer.java
@@ -0,0 +1,50 @@
+/*
+ * 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.test.compatibility.ipojo;
+
+import org.apache.felix.ipojo.annotations.Component;
+import org.apache.felix.ipojo.annotations.Instantiate;
+import org.apache.felix.ipojo.annotations.Provides;
+import org.apache.felix.ipojo.annotations.Requires;
+import org.apache.felix.ipojo.test.compatibility.service.CheckService;
+import org.apache.felix.ipojo.test.compatibility.service.HelloService;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Hello Service Provider with iPOJO.
+ */
+@Component
+@Provides
+@Instantiate
+public class HelloServiceConsumer implements CheckService {
+
+    @Requires
+    private HelloService hello;
+
+    @Override
+    public Map<String, Object> data() {
+        Map<String, Object> map = new LinkedHashMap<String, Object>();
+        map.put("result", hello.hello("john doe"));
+        map.put("object", hello);
+        return map;
+    }
+}
diff --git a/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/java/org/apache/felix/ipojo/test/compatibility/ipojo/HelloServiceProvider.java b/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/java/org/apache/felix/ipojo/test/compatibility/ipojo/HelloServiceProvider.java
new file mode 100644
index 0000000..11f4f49
--- /dev/null
+++ b/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/java/org/apache/felix/ipojo/test/compatibility/ipojo/HelloServiceProvider.java
@@ -0,0 +1,44 @@
+/*
+ * 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.test.compatibility.ipojo;
+
+import org.apache.felix.ipojo.annotations.Component;
+import org.apache.felix.ipojo.annotations.Instantiate;
+import org.apache.felix.ipojo.annotations.Provides;
+import org.apache.felix.ipojo.test.compatibility.service.HelloService;
+
+/**
+ * Hello Service Provider with iPOJO.
+ */
+@Component
+@Provides
+@Instantiate
+public class HelloServiceProvider implements HelloService {
+
+    /**
+     * A very original implementation.
+     * @param name the name
+     * @return hello $name
+     */
+    @Override
+    public String hello(String name) {
+        return "hello " + name;
+    }
+}
diff --git a/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/java/org/apache/felix/ipojo/test/compatibility/scr/HelloServiceConsumer.java b/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/java/org/apache/felix/ipojo/test/compatibility/scr/HelloServiceConsumer.java
new file mode 100644
index 0000000..36e05d8
--- /dev/null
+++ b/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/java/org/apache/felix/ipojo/test/compatibility/scr/HelloServiceConsumer.java
@@ -0,0 +1,67 @@
+/*
+ * 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.test.compatibility.scr;
+
+import org.apache.felix.ipojo.test.compatibility.service.CheckService;
+import org.apache.felix.ipojo.test.compatibility.service.HelloService;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Hello Service Provider with SCR.
+ */
+public class HelloServiceConsumer implements CheckService {
+
+    private HelloService hello;
+
+    @Override
+    public Map<String, Object> data() {
+        synchronized (this) {
+            Map<String, Object> map = new LinkedHashMap<String, Object>();
+            if (hello != null) {
+                map.put("result", hello.hello("john doe"));
+                map.put("object", hello);
+            }
+            return map;
+        }
+    }
+
+    public void bindHello(HelloService h) {
+        synchronized (this) {
+            hello = h;
+        }
+    }
+
+    public void unbindHello(HelloService h) {
+        synchronized (this) {
+            hello = null;
+        }
+    }
+
+    /**
+     * Used by blueprint...
+     *
+     * @param h the hello service instance.
+     */
+    public void setHello(HelloService h) {
+        hello = h;
+    }
+}
diff --git a/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/java/org/apache/felix/ipojo/test/compatibility/scr/HelloServiceProvider.java b/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/java/org/apache/felix/ipojo/test/compatibility/scr/HelloServiceProvider.java
new file mode 100644
index 0000000..93579ea
--- /dev/null
+++ b/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/java/org/apache/felix/ipojo/test/compatibility/scr/HelloServiceProvider.java
@@ -0,0 +1,41 @@
+/*
+ * 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.test.compatibility.scr;
+
+import org.apache.felix.ipojo.annotations.Component;
+import org.apache.felix.ipojo.annotations.Instantiate;
+import org.apache.felix.ipojo.annotations.Provides;
+import org.apache.felix.ipojo.test.compatibility.service.HelloService;
+
+/**
+ * Hello Service Provider with SCR.
+ */
+public class HelloServiceProvider implements HelloService {
+
+    /**
+     * A very original implementation.
+     * @param name the name
+     * @return hello $name
+     */
+    @Override
+    public String hello(String name) {
+        return "hello " + name;
+    }
+}
diff --git a/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/java/org/apache/felix/ipojo/test/compatibility/service/CheckService.java b/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/java/org/apache/felix/ipojo/test/compatibility/service/CheckService.java
new file mode 100644
index 0000000..08131ba
--- /dev/null
+++ b/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/java/org/apache/felix/ipojo/test/compatibility/service/CheckService.java
@@ -0,0 +1,31 @@
+/*
+ * 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.test.compatibility.service;
+
+import java.util.Map;
+
+/**
+ * A service used to check the correct invocation.
+ */
+public interface CheckService {
+
+    public Map<String, Object> data();
+
+}
diff --git a/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/java/org/apache/felix/ipojo/test/compatibility/service/HelloService.java b/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/java/org/apache/felix/ipojo/test/compatibility/service/HelloService.java
new file mode 100644
index 0000000..50c4781
--- /dev/null
+++ b/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/java/org/apache/felix/ipojo/test/compatibility/service/HelloService.java
@@ -0,0 +1,28 @@
+/*
+ * 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.test.compatibility.service;
+
+/**
+ * A simple service that will be implemented with several technology.
+ */
+public interface HelloService {
+
+    public String hello(String name);
+}
diff --git a/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/resources/blueprint/HelloConsumer.xml b/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/resources/blueprint/HelloConsumer.xml
new file mode 100644
index 0000000..4f86166
--- /dev/null
+++ b/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/resources/blueprint/HelloConsumer.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <!-- Reuse the same implementation as for SCR -->
+    <bean id="consumer" class="org.apache.felix.ipojo.test.compatibility.scr.HelloServiceConsumer">
+        <property name="hello" ref="helloRef"/>
+    </bean>
+
+    <service id="service" ref="consumer" interface="org.apache.felix.ipojo.test.compatibility.service.CheckService"/>
+    <reference id="helloRef" availability="mandatory"
+               interface="org.apache.felix.ipojo.test.compatibility.service.HelloService"/>
+
+</blueprint>
\ No newline at end of file
diff --git a/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/resources/blueprint/HelloProvider.xml b/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/resources/blueprint/HelloProvider.xml
new file mode 100644
index 0000000..9aa5be9
--- /dev/null
+++ b/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/resources/blueprint/HelloProvider.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <!-- Reuse the same implementation as for SCR -->
+    <bean id="provider" class="org.apache.felix.ipojo.test.compatibility.scr.HelloServiceProvider">
+    </bean>
+
+    <service id="service" ref="provider" interface="org.apache.felix.ipojo.test.compatibility.service.HelloService"/>
+
+</blueprint>
\ No newline at end of file
diff --git a/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/resources/scr/HelloConsumer.xml b/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/resources/scr/HelloConsumer.xml
new file mode 100644
index 0000000..d71b6ab
--- /dev/null
+++ b/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/resources/scr/HelloConsumer.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<component name="org.apache.felix.ipojo.test.compatibility.scr.HelloServiceConsumer" immediate="true">
+    <implementation class="org.apache.felix.ipojo.test.compatibility.scr.HelloServiceConsumer"/>
+    <service>
+        <provide interface="org.apache.felix.ipojo.test.compatibility.service.CheckService"/>
+    </service>
+    <reference name="hello"
+               interface="org.apache.felix.ipojo.test.compatibility.service.HelloService"
+               cardinality="1..1"
+               policy="dynamic"
+               bind="bindHello"
+               unbind="unbindHello"
+            />
+</component>
\ No newline at end of file
diff --git a/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/resources/scr/HelloProvider.xml b/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/resources/scr/HelloProvider.xml
new file mode 100644
index 0000000..a8e048a
--- /dev/null
+++ b/ipojo/runtime/core-it/ipojo-compatibility-test/src/main/resources/scr/HelloProvider.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<component name="org.apache.felix.ipojo.test.compatibility.scr.HelloServiceProvider" immediate="true">
+    <implementation class="org.apache.felix.ipojo.test.compatibility.scr.HelloServiceProvider" />
+    <service>
+        <provide interface="org.apache.felix.ipojo.test.compatibility.service.HelloService" />
+    </service>
+</component>
\ No newline at end of file
diff --git a/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/Common.java b/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/Common.java
new file mode 100644
index 0000000..c51f593
--- /dev/null
+++ b/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/Common.java
@@ -0,0 +1,297 @@
+/*
+ * 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.test.compatibility;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.felix.ipojo.test.compatibility.ipojo.HelloServiceConsumer;
+import org.apache.felix.ipojo.test.compatibility.ipojo.HelloServiceProvider;
+import org.apache.felix.ipojo.test.compatibility.service.CheckService;
+import org.apache.felix.ipojo.test.compatibility.service.HelloService;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.OptionUtils;
+import org.ops4j.pax.tinybundles.core.TinyBundle;
+import org.ops4j.pax.tinybundles.core.TinyBundles;
+import org.osgi.framework.Constants;
+import org.ow2.chameleon.testing.helpers.BaseTest;
+import org.ow2.chameleon.testing.tinybundles.ipojo.IPOJOStrategy;
+
+import java.io.*;
+import java.net.MalformedURLException;
+
+import static org.ops4j.pax.exam.CoreOptions.*;
+import static org.ops4j.pax.tinybundles.core.TinyBundles.withBnd;
+
+/**
+ * Configure the tests.
+ */
+public abstract class Common extends BaseTest {
+
+    @Override
+    public boolean deployTestBundle() {
+        return false;
+    }
+
+    @Override
+    protected Option[] getCustomOptions() {
+        Option[] options = new Option[] {
+                service(),
+                wrappedBundle(maven("org.easytesting", "fest-assert").versionAsInProject()),
+                wrappedBundle(maven("org.easytesting", "fest-util").versionAsInProject())
+        };
+
+        return OptionUtils.combine(options, bundles());
+    }
+
+    public abstract Option[] bundles();
+
+    /**
+     * Package the service interfaces.
+     */
+    public Option service() {
+        File out = new File("target/bundles/service.jar");
+        if (out.exists()) {
+            try {
+                return bundle(out.toURI().toURL().toExternalForm());
+            } catch (MalformedURLException e) {
+                // Ignore it.
+            }
+        }
+
+        TinyBundle bundle = TinyBundles.bundle();
+        bundle.add(CheckService.class);
+        bundle.add(HelloService.class);
+        InputStream inputStream = bundle
+                .set(Constants.BUNDLE_SYMBOLICNAME, "services")
+                .set(Constants.EXPORT_PACKAGE, "org.apache.felix.ipojo.test.compatibility.service")
+                .build(withBnd());
+
+        try {
+            FileUtils.copyInputStreamToFile(inputStream, out);
+            return bundle(out.toURI().toURL().toExternalForm());
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * iPOJO Hello Service Provider.
+     */
+    public Option iPOJOHelloProvider() {
+        File out = new File("target/bundles/hello-provider-ipojo.jar");
+        if (out.exists()) {
+            try {
+                return bundle(out.toURI().toURL().toExternalForm());
+            } catch (MalformedURLException e) {
+                // Ignore it.
+            }
+        }
+
+        TinyBundle bundle = TinyBundles.bundle();
+        bundle.add(HelloServiceProvider.class);
+        InputStream inputStream = bundle
+                .set(Constants.BUNDLE_SYMBOLICNAME, "iPOJO-Hello-Provider")
+                .set(Constants.IMPORT_PACKAGE, "*")
+                .build(IPOJOStrategy.withiPOJO());
+
+        try {
+            FileUtils.copyInputStreamToFile(inputStream, out);
+            return bundle(out.toURI().toURL().toExternalForm());
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * iPOJO Hello Service Provider.
+     */
+    public Option iPOJOHelloConsumer() {
+        File out = new File("target/bundles/hello-consumer-ipojo.jar");
+        if (out.exists()) {
+            try {
+                return bundle(out.toURI().toURL().toExternalForm());
+            } catch (MalformedURLException e) {
+                // Ignore it.
+            }
+        }
+
+        TinyBundle bundle = TinyBundles.bundle();
+        bundle.add(HelloServiceConsumer.class);
+        InputStream inputStream = bundle
+                .set(Constants.BUNDLE_SYMBOLICNAME, "iPOJO-Hello-Consumer")
+                .set(Constants.IMPORT_PACKAGE, "*")
+                .build(IPOJOStrategy.withiPOJO());
+
+        try {
+            FileUtils.copyInputStreamToFile(inputStream, out);
+            return bundle(out.toURI().toURL().toExternalForm());
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * Package the SCR Hello Service Provider.
+     */
+    public Option SCRHelloProvider() {
+        File out = new File("target/bundles/hello-provider-scr.jar");
+        if (out.exists()) {
+            try {
+                return bundle(out.toURI().toURL().toExternalForm());
+            } catch (MalformedURLException e) {
+                // Ignore it.
+            }
+        }
+
+        File metadata = new File("src/main/resources/scr", "HelloProvider.xml");
+
+        TinyBundle bundle = TinyBundles.bundle();
+        bundle.add(org.apache.felix.ipojo.test.compatibility.scr.HelloServiceProvider.class);
+        try {
+            bundle.add("scr/provider.xml", new FileInputStream(metadata));
+        } catch (FileNotFoundException e) {
+            throw new IllegalArgumentException("Cannot find XML metadata : " + metadata.getAbsolutePath());
+        }
+
+        InputStream inputStream = bundle
+                .set(Constants.BUNDLE_SYMBOLICNAME, "hello-provider-scr")
+                .set(Constants.IMPORT_PACKAGE, "*")
+                .set("Service-Component", "scr/provider.xml")
+                .build(withBnd());
+
+        try {
+            FileUtils.copyInputStreamToFile(inputStream, out);
+            return bundle(out.toURI().toURL().toExternalForm());
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    public Option SCRHelloConsumer() {
+        File out = new File("target/bundles/hello-consumer-scr.jar");
+        if (out.exists()) {
+            try {
+                return bundle(out.toURI().toURL().toExternalForm());
+            } catch (MalformedURLException e) {
+                // Ignore it.
+            }
+        }
+
+        File metadata = new File("src/main/resources/scr", "HelloConsumer.xml");
+
+        TinyBundle bundle = TinyBundles.bundle();
+        bundle.add(org.apache.felix.ipojo.test.compatibility.scr.HelloServiceConsumer.class);
+        try {
+            bundle.add("scr/consumer.xml", new FileInputStream(metadata));
+        } catch (FileNotFoundException e) {
+            throw new IllegalArgumentException("Cannot find XML metadata : " + metadata.getAbsolutePath());
+        }
+
+        InputStream inputStream = bundle
+                .set(Constants.BUNDLE_SYMBOLICNAME, "hello-consumer-scr")
+                .set(Constants.IMPORT_PACKAGE, "*")
+                .set("Service-Component", "scr/consumer.xml")
+                .build(withBnd());
+
+        try {
+            FileUtils.copyInputStreamToFile(inputStream, out);
+            return bundle(out.toURI().toURL().toExternalForm());
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * Package the Blueprint Hello Service Provider.
+     */
+    public Option BPHelloProvider() {
+        File out = new File("target/bundles/hello-provider-blueprint.jar");
+        if (out.exists()) {
+            try {
+                return bundle(out.toURI().toURL().toExternalForm());
+            } catch (MalformedURLException e) {
+                // Ignore it.
+            }
+        }
+
+        File metadata = new File("src/main/resources/blueprint", "HelloProvider.xml");
+
+        TinyBundle bundle = TinyBundles.bundle();
+        bundle.add(org.apache.felix.ipojo.test.compatibility.scr.HelloServiceProvider.class);
+        try {
+            bundle.add("blueprint/provider.xml", new FileInputStream(metadata));
+        } catch (FileNotFoundException e) {
+            throw new IllegalArgumentException("Cannot find XML metadata : " + metadata.getAbsolutePath());
+        }
+
+        InputStream inputStream = bundle
+                .set(Constants.BUNDLE_SYMBOLICNAME, "hello-provider-blueprint")
+                .set(Constants.IMPORT_PACKAGE, "*")
+                .set("Bundle-Blueprint", "blueprint/provider.xml")
+                .build(withBnd());
+
+        try {
+            FileUtils.copyInputStreamToFile(inputStream, out);
+            return bundle(out.toURI().toURL().toExternalForm());
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    public Option BPHelloConsumer() {
+        File out = new File("target/bundles/hello-consumer-blueprint.jar");
+        if (out.exists()) {
+            try {
+                return bundle(out.toURI().toURL().toExternalForm());
+            } catch (MalformedURLException e) {
+                // Ignore it.
+            }
+        }
+
+        File metadata = new File("src/main/resources/blueprint", "HelloConsumer.xml");
+
+        TinyBundle bundle = TinyBundles.bundle();
+        bundle.add(org.apache.felix.ipojo.test.compatibility.scr.HelloServiceConsumer.class);
+        try {
+            bundle.add("blueprint/consumer.xml", new FileInputStream(metadata));
+        } catch (FileNotFoundException e) {
+            throw new IllegalArgumentException("Cannot find XML metadata : " + metadata.getAbsolutePath());
+        }
+
+        InputStream inputStream = bundle
+                .set(Constants.BUNDLE_SYMBOLICNAME, "hello-consumer-blueprint")
+                .set(Constants.IMPORT_PACKAGE, "*")
+                .set("Bundle-Blueprint", "blueprint/consumer.xml")
+                .build(withBnd());
+
+        try {
+            FileUtils.copyInputStreamToFile(inputStream, out);
+            return bundle(out.toURI().toURL().toExternalForm());
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+}
diff --git a/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestBeingConsumedByAriesBlueprint1_1_0.java b/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestBeingConsumedByAriesBlueprint1_1_0.java
new file mode 100644
index 0000000..41ba3bc
--- /dev/null
+++ b/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestBeingConsumedByAriesBlueprint1_1_0.java
@@ -0,0 +1,60 @@
+/*
+ * 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.test.compatibility;
+
+import org.apache.felix.ipojo.test.compatibility.service.CheckService;
+import org.junit.Test;
+import org.ops4j.pax.exam.Option;
+
+import static org.fest.assertions.Assertions.assertThat;
+import static org.ops4j.pax.exam.CoreOptions.bundle;
+import static org.ops4j.pax.exam.CoreOptions.maven;
+
+/**
+ * Check a configuration using Aries Blueprint 1.0.1
+ * iPOJO provider is consumed by a component using Blueprint.
+ *
+ * This test is intended to pass on Felix, KF and Equinox
+ */
+public class TestBeingConsumedByAriesBlueprint1_1_0 extends Common {
+
+    public static final String BP_ARTIFACTID = "org.apache.aries.blueprint";
+    public static final String BP_VERSION = "1.1.0";
+    public static final String BP_GROUPID = "org.apache.aries.blueprint";
+
+
+    @Override
+    public Option[] bundles() {
+        return new Option[] {
+                bundle(maven(BP_GROUPID, BP_ARTIFACTID, BP_VERSION).getURL()),
+                bundle(maven("org.apache.aries.proxy", "org.apache.aries.proxy", "1.0.1").getURL()),
+                bundle(maven("org.apache.aries", "org.apache.aries.util", "1.1.0").getURL()),
+                BPHelloConsumer(),
+                iPOJOHelloProvider()
+        };
+    }
+
+    @Test
+    public void test() {
+        CheckService checker = osgiHelper.getServiceObject(CheckService.class);
+        assertThat(checker).isNotNull();
+        assertThat(checker.data().get("result")).isEqualTo("hello john doe");
+    }
+}
diff --git a/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestBeingConsumedByFelixSCR1_6_2.java b/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestBeingConsumedByFelixSCR1_6_2.java
new file mode 100644
index 0000000..b9ed818
--- /dev/null
+++ b/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestBeingConsumedByFelixSCR1_6_2.java
@@ -0,0 +1,57 @@
+/*
+ * 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.test.compatibility;
+
+import org.apache.felix.ipojo.test.compatibility.service.CheckService;
+import org.junit.Test;
+import org.ops4j.pax.exam.Option;
+
+import static org.fest.assertions.Assertions.assertThat;
+import static org.ops4j.pax.exam.CoreOptions.bundle;
+import static org.ops4j.pax.exam.CoreOptions.maven;
+
+/**
+ * Check a configuration using Felix SCR 1.6.2.
+ * iPOJO provider is consumed by a component using SCR.
+ *
+ * This test is intended to pass on Felix, KF and Equinox
+ */
+public class TestBeingConsumedByFelixSCR1_6_2 extends Common {
+
+    public static final String SCR_ARTIFACTID = "org.apache.felix.scr";
+    public static final String SCR_VERSION = "1.6.2";
+    public static final String SCR_GROUPID = "org.apache.felix";
+
+    @Override
+    public Option[] bundles() {
+        return new Option[] {
+                bundle(maven(SCR_GROUPID, SCR_ARTIFACTID, SCR_VERSION).getURL()),
+                SCRHelloConsumer(),
+                iPOJOHelloProvider()
+        };
+    }
+
+    @Test
+    public void test() {
+        CheckService checker = osgiHelper.getServiceObject(CheckService.class);
+        assertThat(checker).isNotNull();
+        assertThat(checker.data().get("result")).isEqualTo("hello john doe");
+    }
+}
diff --git a/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestBeingConsumedByKnopflerfishSCR4_0_2.java b/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestBeingConsumedByKnopflerfishSCR4_0_2.java
new file mode 100644
index 0000000..90befb6
--- /dev/null
+++ b/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestBeingConsumedByKnopflerfishSCR4_0_2.java
@@ -0,0 +1,65 @@
+/*
+ * 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.test.compatibility;
+
+import org.apache.felix.ipojo.test.compatibility.service.CheckService;
+import org.junit.Test;
+import org.ops4j.pax.exam.Option;
+
+import static org.fest.assertions.Assertions.assertThat;
+import static org.ops4j.pax.exam.CoreOptions.bundle;
+import static org.ops4j.pax.exam.CoreOptions.maven;
+
+/**
+ * Check a configuration using Knopflerfish SCR 4.0.2
+ * iPOJO provider is consumed by a component using SCR.
+ *
+ * This test is intended to pass on KF only
+ */
+public class TestBeingConsumedByKnopflerfishSCR4_0_2 extends Common {
+
+    public static final String SCR_URL = "http://www.knopflerfish.org/releases/4.0" +
+            ".0/maven2/org/knopflerfish/bundle/component/4.0.2/component-4.0.2.jar";
+
+    @Override
+    public Option[] bundles() {
+        return new Option[] {
+                bundle(SCR_URL),
+                bundle("http://www.knopflerfish.org/releases/4.0.0/maven2/org/knopflerfish/bundle/cm-API/4.0" +
+                        ".1/cm-API-4.0.1.jar"),
+                bundle("http://www.knopflerfish.org/releases/4.0.0/maven2/org/knopflerfish/bundle/kxml-LIB/2.3.0" +
+                        ".kf4-001/kxml-LIB-2.3.0.kf4-001.jar"),
+                SCRHelloConsumer(),
+                iPOJOHelloProvider()
+        };
+    }
+
+    @Test
+    public void test() {
+        if (! isKnopflerfish()) {
+            System.out.println("Test ignored - running only on Knopflerfish");
+            return;
+        }
+
+        CheckService checker = osgiHelper.getServiceObject(CheckService.class);
+        assertThat(checker).isNotNull();
+        assertThat(checker.data().get("result")).isEqualTo("hello john doe");
+    }
+}
diff --git a/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestConsumingProviderUsingAriesBlueprint1_1_0.java b/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestConsumingProviderUsingAriesBlueprint1_1_0.java
new file mode 100644
index 0000000..ab683fd
--- /dev/null
+++ b/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestConsumingProviderUsingAriesBlueprint1_1_0.java
@@ -0,0 +1,60 @@
+/*
+ * 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.test.compatibility;
+
+import org.apache.felix.ipojo.test.compatibility.service.CheckService;
+import org.junit.Test;
+import org.ops4j.pax.exam.Option;
+
+import static org.fest.assertions.Assertions.assertThat;
+import static org.ops4j.pax.exam.CoreOptions.bundle;
+import static org.ops4j.pax.exam.CoreOptions.maven;
+
+/**
+ * Check a configuration using Aries Blueprint 1.1.0
+ * iPOJO consumer is bound to a Hello Service implementation using Blueprint.
+ *
+ * This test is intended to pass on Felix, KF and Equinox
+ */
+public class TestConsumingProviderUsingAriesBlueprint1_1_0 extends Common {
+
+    public static final String BP_ARTIFACTID = "org.apache.aries.blueprint";
+    public static final String BP_VERSION = "1.1.0";
+    public static final String BP_GROUPID = "org.apache.aries.blueprint";
+
+
+    @Override
+    public Option[] bundles() {
+        return new Option[] {
+                bundle(maven(BP_GROUPID, BP_ARTIFACTID, BP_VERSION).getURL()),
+                bundle(maven("org.apache.aries.proxy", "org.apache.aries.proxy", "1.0.1").getURL()),
+                bundle(maven("org.apache.aries", "org.apache.aries.util", "1.1.0").getURL()),
+                BPHelloProvider(),
+                iPOJOHelloConsumer()
+        };
+    }
+
+    @Test
+    public void test() {
+        CheckService checker = osgiHelper.getServiceObject(CheckService.class);
+        assertThat(checker).isNotNull();
+        assertThat(checker.data().get("result")).isEqualTo("hello john doe");
+    }
+}
diff --git a/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestConsumingProviderUsingFelixSCR1_6_2.java b/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestConsumingProviderUsingFelixSCR1_6_2.java
new file mode 100644
index 0000000..639c06f
--- /dev/null
+++ b/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestConsumingProviderUsingFelixSCR1_6_2.java
@@ -0,0 +1,58 @@
+/*
+ * 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.test.compatibility;
+
+import org.apache.felix.ipojo.test.compatibility.service.CheckService;
+import org.junit.Test;
+import org.ops4j.pax.exam.Option;
+
+import static org.fest.assertions.Assertions.assertThat;
+import static org.ops4j.pax.exam.CoreOptions.bundle;
+import static org.ops4j.pax.exam.CoreOptions.maven;
+
+/**
+ * Check a configuration using Felix SCR 1.6.2.
+ * iPOJO consumer is bound to a Hello Service implementation using SCR.
+ *
+ *
+ * This test is intended to pass on Felix, KF and Equinox
+ */
+public class TestConsumingProviderUsingFelixSCR1_6_2 extends Common {
+
+    public static final String SCR_ARTIFACTID = "org.apache.felix.scr";
+    public static final String SCR_VERSION = "1.6.2";
+    public static final String SCR_GROUPID = "org.apache.felix";
+
+    @Override
+    public Option[] bundles() {
+        return new Option[] {
+                bundle(maven(SCR_GROUPID, SCR_ARTIFACTID, SCR_VERSION).getURL()),
+                SCRHelloProvider(),
+                iPOJOHelloConsumer()
+        };
+    }
+
+    @Test
+    public void test() {
+        CheckService checker = osgiHelper.getServiceObject(CheckService.class);
+        assertThat(checker).isNotNull();
+        assertThat(checker.data().get("result")).isEqualTo("hello john doe");
+    }
+}
diff --git a/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestConsumingProviderUsingKnopflerfishSCR4_0_2.java b/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestConsumingProviderUsingKnopflerfishSCR4_0_2.java
new file mode 100644
index 0000000..1932415
--- /dev/null
+++ b/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestConsumingProviderUsingKnopflerfishSCR4_0_2.java
@@ -0,0 +1,64 @@
+/*
+ * 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.test.compatibility;
+
+import org.apache.felix.ipojo.test.compatibility.service.CheckService;
+import org.junit.Test;
+import org.ops4j.pax.exam.Option;
+
+import static org.fest.assertions.Assertions.assertThat;
+import static org.ops4j.pax.exam.CoreOptions.bundle;
+
+/**
+ * Check a configuration using Knopflerfish SCR 4.0.2
+ * iPOJO consumer is bound to a Hello Service implementation using SCR.
+ *
+ *
+ * This test is intended to pass on KF only
+ */
+public class TestConsumingProviderUsingKnopflerfishSCR4_0_2 extends Common {
+
+    public static final String SCR_URL = "http://www.knopflerfish.org/releases/4.0" +
+            ".0/maven2/org/knopflerfish/bundle/component/4.0.2/component-4.0.2.jar";
+
+    @Override
+    public Option[] bundles() {
+        return new Option[] {
+                bundle(SCR_URL),
+                bundle("http://www.knopflerfish.org/releases/4.0.0/maven2/org/knopflerfish/bundle/cm-API/4.0" +
+                        ".1/cm-API-4.0.1.jar"),
+                bundle("http://www.knopflerfish.org/releases/4.0.0/maven2/org/knopflerfish/bundle/kxml-LIB/2.3.0" +
+                        ".kf4-001/kxml-LIB-2.3.0.kf4-001.jar"),
+                SCRHelloProvider(),
+                iPOJOHelloConsumer()
+        };
+    }
+
+    @Test
+    public void test() {
+        if (! isKnopflerfish()) {
+            System.out.println("Test ignored - running only on Knopflerfish");
+            return;
+        }
+        CheckService checker = osgiHelper.getServiceObject(CheckService.class);
+        assertThat(checker).isNotNull();
+        assertThat(checker.data().get("result")).isEqualTo("hello john doe");
+    }
+}
diff --git a/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestiPOJOOnly.java b/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestiPOJOOnly.java
new file mode 100644
index 0000000..beb3623
--- /dev/null
+++ b/ipojo/runtime/core-it/ipojo-compatibility-test/src/test/java/org/apache/felix/ipojo/test/compatibility/TestiPOJOOnly.java
@@ -0,0 +1,49 @@
+/*
+ * 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.test.compatibility;
+
+import org.apache.felix.ipojo.test.compatibility.service.CheckService;
+import org.junit.Test;
+import org.ops4j.pax.exam.Option;
+
+import static org.fest.assertions.Assertions.assertThat;
+
+/**
+ * Check a configuration with iPOJO used for the provider and consumer.
+ *
+ * This test is intended to pass on Felix, KF and Equinox
+ */
+public class TestiPOJOOnly extends Common {
+
+    @Override
+    public Option[] bundles() {
+        return new Option[] {
+                iPOJOHelloConsumer(),
+                iPOJOHelloProvider(),
+        };
+    }
+
+    @Test
+    public void test() {
+        CheckService checker = osgiHelper.getServiceObject(CheckService.class);
+        assertThat(checker).isNotNull();
+        assertThat(checker.data().get("result")).isEqualTo("hello john doe");
+    }
+}
diff --git a/ipojo/runtime/core-it/pom.xml b/ipojo/runtime/core-it/pom.xml
index 6b1ce55..e2bf613 100644
--- a/ipojo/runtime/core-it/pom.xml
+++ b/ipojo/runtime/core-it/pom.xml
@@ -40,8 +40,8 @@
         <url.version>1.5.1</url.version>
 
         <felix.version>4.2.0</felix.version>
-        <equinox.version>3.8.1.v20120830-144521</equinox.version>
-        <knoperflerfish.version>5.3.3</knoperflerfish.version>
+        <equinox.version>3.9.0.v20130529-1710</equinox.version>
+        <knoperflerfish.version>6.0.2</knoperflerfish.version>
 
         <manipulator.version>1.10.2-SNAPSHOT</manipulator.version>
     </properties>
@@ -66,6 +66,7 @@
         <module>ipojo-core-service-dependency-interceptor-test</module>
         <module>ipojo-core-service-providing-test</module>
         <module>ipojo-api-test</module>
+        <module>ipojo-compatibility-test</module>
     </modules>
 
     <build>
@@ -227,6 +228,10 @@
                     <groupId>org.osgi</groupId>
                     <artifactId>org.osgi.core</artifactId>
                 </exclusion>
+                <exclusion>
+                    <groupId>org.osgi</groupId>
+                    <artifactId>org.osgi.compendium</artifactId>
+                </exclusion>
             </exclusions>
         </dependency>
 
@@ -302,15 +307,28 @@
             <version>1.4</version>
         </dependency>
 
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.framework</artifactId>
-            <version>${felix.version}</version>
-        </dependency>
     </dependencies>
 
     <profiles>
         <profile>
+            <id>default</id>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>org.osgi</groupId>
+                    <artifactId>org.osgi.compendium</artifactId>
+                    <version>4.3.0</version>
+                </dependency>
+                <dependency>
+                    <groupId>org.osgi</groupId>
+                    <artifactId>org.osgi.core</artifactId>
+                    <version>4.3.1</version>
+                </dependency>
+            </dependencies>
+        </profile>
+        <profile>
             <id>knopflerfish</id>
             <activation>
                 <activeByDefault>false</activeByDefault>
@@ -352,6 +370,11 @@
             </properties>
             <dependencies>
                 <dependency>
+                    <groupId>org.osgi</groupId>
+                    <artifactId>org.osgi.compendium</artifactId>
+                    <version>4.3.0</version>
+                </dependency>
+                <dependency>
                     <groupId>org.eclipse.tycho</groupId>
                     <artifactId>org.eclipse.osgi</artifactId>
                     <version>${equinox.version}</version>
