diff --git a/ipojo/tests/api/pom.xml b/ipojo/tests/api/pom.xml
index 2417d4e..ba01660 100644
--- a/ipojo/tests/api/pom.xml
+++ b/ipojo/tests/api/pom.xml
@@ -6,7 +6,7 @@
   <packaging>jar</packaging>
   <version>1.3.0-SNAPSHOT</version>
   <name>org.apache.felix.ipojo.tests.api</name>
-  
+
 	<build>
 		<plugins>
 			<plugin>
@@ -29,7 +29,7 @@
 					</execution>
 				</executions>
 			</plugin>
-			
+
 			<!--  <plugin>
 				<groupId>org.ops4j.pax.exam</groupId>
 				<artifactId>maven-paxexam-plugin</artifactId>
@@ -48,8 +48,8 @@
 				</configuration>
 			</plugin> -->
 		</plugins>
-	</build>	
-	
+	</build>
+
 	<dependencies>
 		<dependency>
 			<groupId>org.apache.felix</groupId>
@@ -71,21 +71,21 @@
 			<artifactId>org.apache.felix.ipojo.manipulator</artifactId>
 			<version>1.3.0-SNAPSHOT</version>
 		</dependency>
-		
+
 		<!-- For external handlermanagement -->
 		<dependency>
 			<groupId>org.apache.felix</groupId>
 			<artifactId>org.apache.felix.ipojo.handler.whiteboard</artifactId>
 			<version>1.3.0-SNAPSHOT</version>
-		</dependency>	
-		
+		</dependency>
+
 	<!--
 		Pax Exam API:
 	-->
 	<dependency>
 		<groupId>org.ops4j.pax.exam</groupId>
 		<artifactId>pax-exam</artifactId>
-		<version>0.4.0</version>
+		<version>0.6.0</version>
 	</dependency>
 	<!--
 		During runtime Pax Exam will discover the OSGi container to use by
@@ -97,7 +97,7 @@
 		<groupId>org.ops4j.pax.exam</groupId>
 		<artifactId>pax-exam-container-default
 		</artifactId>
-		<version>0.4.0</version>
+		<version>0.6.0</version>
 	</dependency>
 	<!--
 		If your test code is based on JUnit you will have to have the Junit
@@ -106,7 +106,7 @@
 	<dependency>
 		<groupId>org.ops4j.pax.exam</groupId>
 		<artifactId>pax-exam-junit</artifactId>
-		<version>0.4.0</version>
+		<version>0.6.0</version>
 	</dependency>
 	<dependency>
 		<groupId>junit</groupId>
@@ -116,7 +116,7 @@
 		<scope>test</scope>
 	</dependency>
 	</dependencies>
-	
+
 	<repositories>
 		<repository>
 			<id>ops4j.releases</id>
diff --git a/ipojo/tests/bundleAsiPOJO/bundleAsiPOJO/pom.xml b/ipojo/tests/bundleAsiPOJO/bundleAsiPOJO/pom.xml
new file mode 100644
index 0000000..4629898
--- /dev/null
+++ b/ipojo/tests/bundleAsiPOJO/bundleAsiPOJO/pom.xml
@@ -0,0 +1,47 @@
+<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/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.felix</groupId>
+  <artifactId>org.apache.felix.ipojo.tinybundles.bundleAsiPOJO</artifactId>
+  <packaging>jar</packaging>
+  <version>1.3.0-SNAPSHOT</version>
+  <name>BundleAsiPOJO</name>
+
+
+	<dependencies>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>3.8.1</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+  			<groupId>org.ops4j.pax.swissbox</groupId>
+  			<artifactId>pax-swissbox-tinybundles</artifactId>
+  			<version>1.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.felix</groupId>
+			<artifactId>org.apache.felix.ipojo.manipulator</artifactId>
+			<version>1.3.0-SNAPSHOT</version>
+		</dependency>
+		<dependency>
+			<groupId>xerces</groupId>
+			<artifactId>xercesImpl</artifactId>
+			<version>2.4.0</version>
+		</dependency>
+	</dependencies>
+
+  <build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<configuration>
+					<source>1.5</source>
+					<target>1.5</target>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+</project>
diff --git a/ipojo/tests/bundleAsiPOJO/bundleAsiPOJO/src/main/java/org/apache/felix/ipojo/tinybundles/BundleAsiPOJO.java b/ipojo/tests/bundleAsiPOJO/bundleAsiPOJO/src/main/java/org/apache/felix/ipojo/tinybundles/BundleAsiPOJO.java
new file mode 100644
index 0000000..ee37e3d
--- /dev/null
+++ b/ipojo/tests/bundleAsiPOJO/bundleAsiPOJO/src/main/java/org/apache/felix/ipojo/tinybundles/BundleAsiPOJO.java
@@ -0,0 +1,68 @@
+package org.apache.felix.ipojo.tinybundles;
+
+import java.io.File;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.List;
+
+import org.apache.felix.ipojo.manipulator.Pojoization;
+import org.ops4j.pax.swissbox.tinybundles.core.BundleAs;
+import org.ops4j.pax.swissbox.tinybundles.core.targets.BundleAsFile;
+
+
+public class BundleAsiPOJO implements BundleAs<URL> {
+
+    private File m_metadata;
+    private File m_file;
+
+
+    public static BundleAs<URL> asiPOJOBundle(File file, File metadata) {
+        return (new BundleAsiPOJO(file, metadata));
+    }
+
+    public BundleAsiPOJO (File file, File metadata) {
+        m_metadata = metadata;
+        m_file = file;
+        if (! metadata.exists()) {
+            throw new RuntimeException("METADATA NOT FOUND");
+        }
+    }
+
+    public URL make(InputStream arg0) {
+        Pojoization pojoizator = new Pojoization();
+        try {
+            File fout = File.createTempFile( "tinybundle_", ".jar" );
+            fout.deleteOnExit();
+            File out = new BundleAsFile(fout).make(arg0);
+            pojoizator.pojoization(out, m_file, m_metadata);
+
+
+            List<String> list = (List<String>) pojoizator.getErrors();
+            if (list != null  && ! list.isEmpty()) {
+                for (String s : list) {
+                    System.err.println("[ERROR]" + s);
+                }
+                throw new RuntimeException("Errors occurs during pojoization " + list);
+            }
+
+            list = (List<String>) pojoizator.getWarnings();
+            if (list != null  && ! list.isEmpty()) {
+                for (String s : list) {
+                    System.err.println("[WARNING]" + s);
+                }
+            }
+            return m_file.toURL();
+        } catch (Exception e) {
+            List<String> list = (List<String>) pojoizator.getErrors();
+            if (list != null) {
+                for (String s : list) {
+                    System.err.println(s);
+                }
+            }
+            e.printStackTrace();
+            throw new RuntimeException(e.getMessage());
+        }
+
+    }
+
+}
diff --git a/ipojo/tests/bundleAsiPOJO/pom.xml b/ipojo/tests/bundleAsiPOJO/pom.xml
new file mode 100644
index 0000000..7b4384b
--- /dev/null
+++ b/ipojo/tests/bundleAsiPOJO/pom.xml
@@ -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.
+-->
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>ipojo.tests</groupId>
+  <artifactId>BundleAsiPOJO</artifactId>
+  <version>1.3.0-SNAPSHOT</version>
+  <name>Apache Felix iPOJO TinyBundles Extension</name>
+  <packaging>pom</packaging>
+  
+   <profiles>
+	<profile>
+		<id>java5</id>
+		<activation>
+			<jdk>1.5</jdk>
+		</activation>
+		<modules>
+			<module>bundleAsiPOJO</module>
+    		<module>tests</module>
+		</modules>
+	</profile>
+	<profile>
+		<id>java6</id>
+		<activation>
+			<jdk>1.6</jdk>
+		</activation>
+		<modules>
+			<module>bundleAsiPOJO</module>
+    		<module>tests</module>
+		</modules>
+	</profile>
+  </profiles>
+  
+</project>
\ No newline at end of file
diff --git a/ipojo/tests/bundleAsiPOJO/tests/consumer.xml b/ipojo/tests/bundleAsiPOJO/tests/consumer.xml
new file mode 100644
index 0000000..c7f6d94
--- /dev/null
+++ b/ipojo/tests/bundleAsiPOJO/tests/consumer.xml
@@ -0,0 +1,3 @@
+<ipojo>
+<instance component="org.apache.felix.ipojo.pax.tinybundles.tests.impl.Consumer"/>
+</ipojo>
\ No newline at end of file
diff --git a/ipojo/tests/bundleAsiPOJO/tests/pom.xml b/ipojo/tests/bundleAsiPOJO/tests/pom.xml
new file mode 100644
index 0000000..5b86599
--- /dev/null
+++ b/ipojo/tests/bundleAsiPOJO/tests/pom.xml
@@ -0,0 +1,127 @@
+<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/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>ipojo.tests</groupId>
+  <artifactId>org.apache.felix.ipojo.tinybundle.bundleAsiPOJO.test</artifactId>
+  <packaging>jar</packaging>
+  <version>0.9.0-SNAPSHOT</version>
+  <name>bundleAsiPOJO Tests</name>
+  <build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<configuration>
+					<source>1.5</source>
+					<target>1.5</target>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.servicemix.tooling</groupId>
+				<artifactId>depends-maven-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>generate-depends-file</id>
+						<goals>
+							<goal>generate-depends-file</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+
+			<!--  <plugin>
+				<groupId>org.ops4j.pax.exam</groupId>
+				<artifactId>maven-paxexam-plugin</artifactId>
+				<executions>
+					<execution>
+					<id>generate-paxexam-config</id>
+					<goals>
+						<goal>generate-paxexam-config</goal>
+					</goals>
+					</execution>
+				</executions>
+				<configuration>
+				<settings>
+					<platform>felix</platform>
+				</settings>
+				</configuration>
+			</plugin> -->
+		</plugins>
+	</build>
+
+	<dependencies>
+
+	<!--
+		Pax Exam API:
+	-->
+	<dependency>
+		<groupId>org.ops4j.pax.exam</groupId>
+		<artifactId>pax-exam</artifactId>
+		<version>0.6.0</version>
+	</dependency>
+	<!--
+		During runtime Pax Exam will discover the OSGi container to use by
+		searching metadata available into classpath. Pax Exam comes with a
+		default container that uses [Pax Runner] for implementing the
+		container requirements:
+	-->
+	<dependency>
+		<groupId>org.ops4j.pax.exam</groupId>
+		<artifactId>pax-exam-container-default
+		</artifactId>
+		<version>0.6.0</version>
+	</dependency>
+	<!--
+		If your test code is based on JUnit you will have to have the Junit
+		support artifact:
+	-->
+	<dependency>
+		<groupId>org.ops4j.pax.exam</groupId>
+		<artifactId>pax-exam-junit</artifactId>
+		<version>0.6.0</version>
+	</dependency>
+	<dependency>
+		<groupId>junit</groupId>
+		<artifactId>junit</artifactId>
+		<version>4.5</version>
+		<type>jar</type>
+		<scope>test</scope>
+	</dependency>
+
+
+	<!-- TinyBundle -->
+	<dependency>
+		<groupId>org.ops4j.pax.swissbox</groupId>
+		<artifactId>pax-swissbox-tinybundles</artifactId>
+		<version>1.0.0</version>
+	</dependency>
+	<dependency>
+		<groupId>org.apache.felix</groupId>
+		<artifactId>org.apache.felix.ipojo.tinybundles.bundleAsiPOJO</artifactId>
+		<version>1.3.0-SNAPSHOT</version>
+	</dependency>
+	<dependency>
+		<groupId>org.apache.felix</groupId>
+		<artifactId>org.apache.felix.ipojo.annotations</artifactId>
+		<version>1.2.0</version>
+	</dependency>
+
+	</dependencies>
+
+
+
+
+	<repositories>
+		<repository>
+			<id>ops4j.releases</id>
+			<name>OPS4J Release</name>
+			<url> http://repository.ops4j.org/maven2/</url>
+			<releases>
+				<enabled>true</enabled>
+			</releases>
+			<snapshots>
+				<enabled>false</enabled>
+			</snapshots>
+		</repository>
+	</repositories>
+</project>
diff --git a/ipojo/tests/bundleAsiPOJO/tests/provider.xml b/ipojo/tests/bundleAsiPOJO/tests/provider.xml
new file mode 100644
index 0000000..a76b7cb
--- /dev/null
+++ b/ipojo/tests/bundleAsiPOJO/tests/provider.xml
@@ -0,0 +1,6 @@
+<ipojo>
+<component classname="org.apache.felix.ipojo.pax.tinybundles.tests.impl.MyProvider">
+	<provides/>
+</component>
+<instance component="org.apache.felix.ipojo.pax.tinybundles.tests.impl.MyProvider"/>
+</ipojo>
\ No newline at end of file
diff --git a/ipojo/tests/bundleAsiPOJO/tests/src/main/java/org/apache/felix/ipojo/pax/tinybundles/tests/impl/Consumer.java b/ipojo/tests/bundleAsiPOJO/tests/src/main/java/org/apache/felix/ipojo/pax/tinybundles/tests/impl/Consumer.java
new file mode 100644
index 0000000..d8380bc
--- /dev/null
+++ b/ipojo/tests/bundleAsiPOJO/tests/src/main/java/org/apache/felix/ipojo/pax/tinybundles/tests/impl/Consumer.java
@@ -0,0 +1,17 @@
+package org.apache.felix.ipojo.pax.tinybundles.tests.impl;
+
+import org.apache.felix.ipojo.annotations.Component;
+import org.apache.felix.ipojo.annotations.Requires;
+import org.apache.felix.ipojo.tinybundles.tests.service.Hello;
+
+@Component
+public class Consumer {
+    
+    @Requires
+    private Hello hello;
+    
+    public Consumer() {
+        System.out.println(hello.sayHello());
+    }
+
+}
diff --git a/ipojo/tests/bundleAsiPOJO/tests/src/main/java/org/apache/felix/ipojo/pax/tinybundles/tests/impl/MyProvider.java b/ipojo/tests/bundleAsiPOJO/tests/src/main/java/org/apache/felix/ipojo/pax/tinybundles/tests/impl/MyProvider.java
new file mode 100644
index 0000000..cd79dee
--- /dev/null
+++ b/ipojo/tests/bundleAsiPOJO/tests/src/main/java/org/apache/felix/ipojo/pax/tinybundles/tests/impl/MyProvider.java
@@ -0,0 +1,11 @@
+package org.apache.felix.ipojo.pax.tinybundles.tests.impl;
+
+import org.apache.felix.ipojo.tinybundles.tests.service.Hello;
+
+public class MyProvider implements Hello {
+    
+    public String sayHello() {
+        return "Hello";
+    }
+
+}
diff --git a/ipojo/tests/bundleAsiPOJO/tests/src/main/java/org/apache/felix/ipojo/tinybundles/tests/service/Hello.java b/ipojo/tests/bundleAsiPOJO/tests/src/main/java/org/apache/felix/ipojo/tinybundles/tests/service/Hello.java
new file mode 100644
index 0000000..2fbe424
--- /dev/null
+++ b/ipojo/tests/bundleAsiPOJO/tests/src/main/java/org/apache/felix/ipojo/tinybundles/tests/service/Hello.java
@@ -0,0 +1,7 @@
+package org.apache.felix.ipojo.tinybundles.tests.service;
+
+public interface Hello {
+    
+    public String sayHello();
+
+}
diff --git a/ipojo/tests/bundleAsiPOJO/tests/src/test/java/org/apache/felix/ipojo/tinybundles/tests/BundleCreationTest.java b/ipojo/tests/bundleAsiPOJO/tests/src/test/java/org/apache/felix/ipojo/tinybundles/tests/BundleCreationTest.java
new file mode 100644
index 0000000..2584125
--- /dev/null
+++ b/ipojo/tests/bundleAsiPOJO/tests/src/test/java/org/apache/felix/ipojo/tinybundles/tests/BundleCreationTest.java
@@ -0,0 +1,142 @@
+package org.apache.felix.ipojo.tinybundles.tests;
+
+import static org.apache.felix.ipojo.tinybundles.BundleAsiPOJO.asiPOJOBundle;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.provision;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.asURL;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.newBundle;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.with;
+
+import java.io.File;
+import java.net.MalformedURLException;
+
+import org.apache.felix.ipojo.pax.tinybundles.tests.impl.Consumer;
+import org.apache.felix.ipojo.pax.tinybundles.tests.impl.MyProvider;
+import org.apache.felix.ipojo.tinybundles.tests.service.Hello;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Inject;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.Configuration;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Constants;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+
+@RunWith( JUnit4TestRunner.class )
+public class BundleCreationTest {
+
+
+    @Inject
+    BundleContext context;
+
+    @Configuration
+    public static Option[] configure()
+    {
+
+
+        File metaProv = new File("provider.xml");
+        if (! metaProv.exists()) {
+            Assert.fail("No provider file");
+        }
+
+        return options(
+            provision(
+                mavenBundle()
+                    .groupId( "org.ops4j.pax.tinybundles" )
+                    .artifactId( "pax-tinybundles-core" )
+                    .version( "0.5.0-SNAPSHOT" )),
+            provision(
+                    mavenBundle()
+                    .groupId("org.apache.felix")
+                    .artifactId("org.apache.felix.ipojo")
+                    .version("1.3.0-SNAPSHOT")
+            ),
+            provision(
+                            newBundle()
+                                .addClass( Hello.class )
+                                .prepare()
+                               .set(Constants.BUNDLE_SYMBOLICNAME,"ServiceInterface")
+                               .set(Constants.EXPORT_PACKAGE, "org.apache.felix.ipojo.tinybundles.tests.service")
+                                .build( asURL() ).toExternalForm()
+                        ),
+            provision(
+                    newBundle()
+                    .addClass(MyProvider.class)
+                    .prepare(
+                        with()
+                            .set(Constants.BUNDLE_SYMBOLICNAME,"Provider")
+                            .set(Constants.IMPORT_PACKAGE, "org.apache.felix.ipojo.tinybundles.tests.service")
+                        )
+                        .build( asiPOJOBundle(new File("provider.jar"), new File("provider.xml"))  ).toExternalForm()
+                        ),
+                provision(newBundle()
+                        .addClass(Consumer.class)
+                        .prepare(
+                                with()
+                                        .set(Constants.BUNDLE_SYMBOLICNAME, "Consumer")
+                                        .set(Constants.IMPORT_PACKAGE,
+                                                "org.apache.felix.ipojo.tinybundles.tests.service"))
+                        .build(
+                                asiPOJOBundle(new File("cons.jar"),
+                                        new File("consumer.xml")))
+                        .toExternalForm())
+
+        );
+    }
+
+    @Test
+    public void creation() throws MalformedURLException, BundleException, InvalidSyntaxException {
+        assertBundle("ServiceInterface");
+//        createServiceProvider();
+        assertBundle("Provider");
+        assertBundle("Consumer");
+
+        dumpBundles();
+        dumpServices();
+        // Check service
+        Assert.assertNotNull(context.getAllServiceReferences(Hello.class.getName(), null));
+
+    }
+
+
+    private void dumpServices() throws InvalidSyntaxException {
+        ServiceReference[] refs = context.getAllServiceReferences(null, null);
+        System.out.println(" === Services === ");
+        for (ServiceReference ref : refs) {
+            String[] itf = (String[]) ref.getProperty(Constants.OBJECTCLASS);
+            System.out.println(itf[0]);
+        }
+        System.out.println("====");
+    }
+
+    private void dumpBundles() throws InvalidSyntaxException {
+        Bundle[] bundles = context.getBundles();
+        System.out.println(" === Bundles === ");
+        for (Bundle bundle : bundles) {
+            String sn  =  bundle.getSymbolicName();
+            System.out.println(sn);
+        }
+        System.out.println("====");
+    }
+
+    private void assertBundle(String sn) {
+        for (Bundle bundle :context.getBundles()) {
+            if (bundle.getSymbolicName().equals(sn)
+                    && bundle.getState() == Bundle.ACTIVE) {
+                return;
+            }
+
+        }
+        Assert.fail("Cannot find the bundle " + sn);
+    }
+
+
+
+}
diff --git a/ipojo/tests/core/factory-version/cons.xml b/ipojo/tests/core/factory-version/cons.xml
new file mode 100644
index 0000000..8d63da4
--- /dev/null
+++ b/ipojo/tests/core/factory-version/cons.xml
@@ -0,0 +1,6 @@
+<ipojo>
+	<component name="cons" classname="org.apache.felix.ipojo.tests.core.component.MyCons">
+		<requires field="services"/>
+	</component>
+	<instance component="cons" name="mycons"/>
+</ipojo>
\ No newline at end of file
diff --git a/ipojo/tests/core/factory-version/pom.xml b/ipojo/tests/core/factory-version/pom.xml
index af28557..40390e0 100644
--- a/ipojo/tests/core/factory-version/pom.xml
+++ b/ipojo/tests/core/factory-version/pom.xml
@@ -62,7 +62,7 @@
 	<dependency>
 		<groupId>org.ops4j.pax.exam</groupId>
 		<artifactId>pax-exam</artifactId>
-		<version>0.4.0</version>
+		<version>0.6.0</version>
 	</dependency>
 	<!--
 		During runtime Pax Exam will discover the OSGi container to use by
@@ -74,7 +74,7 @@
 		<groupId>org.ops4j.pax.exam</groupId>
 		<artifactId>pax-exam-container-default
 		</artifactId>
-		<version>0.4.0</version>
+		<version>0.6.0</version>
 	</dependency>
 	<!--
 		If your test code is based on JUnit you will have to have the Junit
@@ -83,7 +83,7 @@
 	<dependency>
 		<groupId>org.ops4j.pax.exam</groupId>
 		<artifactId>pax-exam-junit</artifactId>
-		<version>0.4.0</version>
+		<version>0.6.0</version>
 	</dependency>
 	<dependency>
 		<groupId>junit</groupId>
@@ -93,16 +93,16 @@
 		<scope>test</scope>
 	</dependency>
 	<!--  Tinybundles -->
-		<dependency>
-		 <groupId>org.ops4j.pax.tinybundles</groupId>
-  		 <artifactId>pax-tinybundles-core</artifactId>
-  		 <version>0.5.0-SNAPSHOT</version>
-  	</dependency>
-  	<dependency>
-  		<groupId>org.apache.felix</groupId>
-  		<artifactId>org.apache.felix.ipojo.pax.exam.target</artifactId>
-  		<version>0.9.0-SNAPSHOT</version>
- 	 </dependency>
+	<dependency>
+		<groupId>org.ops4j.pax.swissbox</groupId>
+		<artifactId>pax-swissbox-tinybundles</artifactId>
+		<version>1.0.0</version>
+	</dependency>
+	<dependency>
+		<groupId>org.apache.felix</groupId>
+		<artifactId>org.apache.felix.ipojo.tinybundles.bundleAsiPOJO</artifactId>
+		<version>1.3.0-SNAPSHOT</version>
+	</dependency>
 	</dependencies>
 
 	<repositories>
diff --git a/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/FactoryVersionTest.java b/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/FactoryVersionTest.java
index 0148684..f5432c4 100644
--- a/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/FactoryVersionTest.java
+++ b/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/FactoryVersionTest.java
@@ -1,13 +1,13 @@
 package org.apache.felix.ipojo.tests.core;
 
-import static org.apache.felix.ipojo.pax.exam.target.BundleAsiPOJO.asiPOJOBundle;
+import static org.apache.felix.ipojo.tinybundles.BundleAsiPOJO.asiPOJOBundle;
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
 import static org.ops4j.pax.exam.CoreOptions.provision;
 import static org.ops4j.pax.exam.MavenUtils.asInProject;
-import static org.ops4j.pax.tinybundles.core.TinyBundles.asURL;
-import static org.ops4j.pax.tinybundles.core.TinyBundles.newBundle;
-import static org.ops4j.pax.tinybundles.core.TinyBundles.with;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.asURL;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.newBundle;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.with;
 
 import java.io.File;
 
@@ -60,7 +60,7 @@
                 provision(
                         // Runtime.
                         mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.ipojo").version(asInProject()),
-                        mavenBundle().groupId( "org.ops4j.pax.tinybundles" ).artifactId( "pax-tinybundles-core" ).version(asInProject())
+                        mavenBundle().groupId( "org.ops4j.pax.swissbox" ).artifactId( "pax-swissbox-tinybundles" ).version(asInProject())
                         ),
                 provision(
                         newBundle()
diff --git a/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/VersionConflictTest.java b/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/VersionConflictTest.java
new file mode 100644
index 0000000..c2461dc
--- /dev/null
+++ b/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/VersionConflictTest.java
@@ -0,0 +1,300 @@
+package org.apache.felix.ipojo.tests.core;
+
+import static org.apache.felix.ipojo.tinybundles.BundleAsiPOJO.asiPOJOBundle;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.provision;
+import static org.ops4j.pax.exam.CoreOptions.systemProperty;
+import static org.ops4j.pax.exam.MavenUtils.asInProject;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.asFile;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.newBundle;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.with;
+
+import java.io.File;
+import java.net.MalformedURLException;
+
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.HandlerDescription;
+import org.apache.felix.ipojo.handlers.dependency.Dependency;
+import org.apache.felix.ipojo.handlers.dependency.DependencyDescription;
+import org.apache.felix.ipojo.handlers.dependency.DependencyHandlerDescription;
+import org.apache.felix.ipojo.tests.core.component.MyComponent;
+import org.apache.felix.ipojo.tests.core.component.MyCons;
+import org.apache.felix.ipojo.tests.core.service.MyService;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Inject;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.Configuration;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Constants;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.ExportedPackage;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+@RunWith( JUnit4TestRunner.class )
+public class VersionConflictTest {
+
+    @Inject
+    private BundleContext context;
+
+    private OSGiHelper osgi;
+
+    private IPOJOHelper ipojo;
+
+    @Before
+    public void init() {
+        osgi = new OSGiHelper(context);
+        ipojo = new IPOJOHelper(context);
+    }
+
+    @After
+    public void stop() {
+        ipojo.dispose();
+        osgi.dispose();
+    }
+
+
+    @Configuration
+    public static Option[] configure() throws MalformedURLException {
+
+        File tmp = new File("target/tmp");
+        tmp.mkdirs();
+
+        String url1 =  // Version 1
+            newBundle()
+            .addClass( MyService.class )
+            .prepare()
+           .set(Constants.BUNDLE_SYMBOLICNAME,"ServiceInterfaceV1")
+           .set(Constants.BUNDLE_VERSION, "1.0.0")
+           .set(Constants.EXPORT_PACKAGE, "org.apache.felix.ipojo.tests.core.service; version=\"1.0.0\"")
+            .build( asFile(new File(tmp, "ServiceInterfaceV1.jar"))).toURL().toExternalForm();
+
+        String url2 = // Version 2
+                newBundle()
+                    .addClass( MyService.class )
+                    .prepare()
+                   .set(Constants.BUNDLE_SYMBOLICNAME,"ServiceInterfaceV2")
+                   .set(Constants.BUNDLE_VERSION, "2.0.0")
+                   .set(Constants.EXPORT_PACKAGE, "org.apache.felix.ipojo.tests.core.service; version=\"2.0.0\"")
+            .build( asFile(new File(tmp, "ServiceInterfaceV2.jar"))).toURL().toExternalForm();
+
+
+        String c1 = newBundle()
+            .addClass(MyComponent.class)
+            .prepare(
+              with()
+                  .set(Constants.BUNDLE_SYMBOLICNAME,"ProviderV1")
+                  .set(Constants.IMPORT_PACKAGE, "org.apache.felix.ipojo.tests.core.service; version=\"[1.0.0, 1.0.0]\"")
+              )
+              .build( asiPOJOBundle(new File(tmp, "vprovider-v1.jar"), new File("vprovider-v1.xml"))).toExternalForm();
+
+      String c2 = newBundle()
+          .addClass(MyComponent.class)
+          .prepare(
+              with()
+                  .set(Constants.BUNDLE_SYMBOLICNAME,"ProviderV2")
+                  .set(Constants.IMPORT_PACKAGE, "org.apache.felix.ipojo.tests.core.service; version=\"[2.0.0, 2.0.0]\"")
+                  .set(Constants.BUNDLE_VERSION, "2.0")
+              )
+              .build( asiPOJOBundle(new File(tmp, "vprovider-v2.0.jar"), new File("vprovider-v2.xml"))).toExternalForm();
+
+      String cons =   newBundle()
+        .addClass(MyCons.class)
+        .prepare(
+            with()
+                .set(Constants.BUNDLE_SYMBOLICNAME,"MyCons")
+                .set(Constants.IMPORT_PACKAGE, "org.apache.felix.ipojo.tests.core.service; version=\"[2.0.0, 2.0.0]\"")
+                .set(Constants.BUNDLE_VERSION, "2.0")
+            )
+        .build( asiPOJOBundle(new File(tmp, "cons.jar"), new File("cons.xml"))).toExternalForm();
+
+
+      String consV1 =   newBundle()
+      .addClass(MyCons.class)
+      .prepare(
+          with()
+              .set(Constants.BUNDLE_SYMBOLICNAME,"MyCons")
+              .set(Constants.IMPORT_PACKAGE, "org.apache.felix.ipojo.tests.core.service; version=\"[1.0.0, 1.0.0]\"")
+              .set(Constants.BUNDLE_VERSION, "1.0")
+          )
+      .build( asiPOJOBundle(new File(tmp, "consv1.jar"), new File("cons.xml"))).toExternalForm();
+
+        Option[] opt =  options(
+                provision(
+                        // Runtime.
+                        mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.ipojo").version(asInProject()),
+                        mavenBundle().groupId( "org.ops4j.pax.swissbox" ).artifactId( "pax-swissbox-tinybundles" ).version(asInProject())
+                        ),
+                        systemProperty( "url1" ).value( url1 ),
+                        systemProperty( "url2" ).value( url2 ),
+
+                        systemProperty( "c1" ).value( c1 ),
+                        systemProperty( "c2" ).value( c2 ),
+                        systemProperty( "cons" ).value( cons ),
+                        systemProperty( "consV1" ).value( consV1 )
+
+
+
+                );
+        return opt;
+    }
+
+    @Test
+    public void deployBundlesAtRuntime() throws MalformedURLException, BundleException, InvalidSyntaxException {
+
+       Bundle b1 = context.installBundle(context.getProperty("url1"));
+       b1.start();
+
+
+       Bundle b3 = context.installBundle(context.getProperty("c1"));
+       b3.start();
+
+        Bundle b2 = context.installBundle(context.getProperty("url2"));
+        b2.start();
+
+        Bundle b4 = context.installBundle(context.getProperty("c2"));
+        b4.start();
+
+        Bundle b5 = context.installBundle(context.getProperty("cons"));
+        b5.start();
+
+
+        Bundle[] bundles = context.getBundles();
+        for (int i = 0; i < bundles.length; i++) {
+            System.out.println("bundle " + bundles[i].getSymbolicName() + " : " + (bundles[i].getState() == Bundle.ACTIVE));
+            //Assert.assertEquals(bundles[i].getSymbolicName() + " is not active", Bundle.ACTIVE, bundles[i].getState());
+        }
+
+
+        PackageAdmin pa = osgi.getPackageAdmin();
+        Bundle b = pa.getBundles("ServiceInterfaceV1", null)[0];
+        ExportedPackage[] packages = pa.getExportedPackages(b);
+        if (packages == null) {
+            System.out.println("Packages  ServiceInterfaceV1 : " + 0);
+        } else {
+            System.out.println("Packages  ServiceInterfaceV1 : " + packages.length);
+            for (ExportedPackage p : packages) {
+                System.out.println("Package : " + p.getName() + " - " + p.getVersion().toString());
+            }
+        }
+        b = pa.getBundles("ServiceInterfaceV2", null)[0];
+        packages = pa.getExportedPackages(b);
+        System.out.println("Packages  ServiceInterfaceV2 : " + packages.length);
+        for (ExportedPackage p : packages) {
+            System.out.println("Package : " + p.getName() + " - " + p.getVersion().toString());
+        }
+
+        osgi.waitForService(Architecture.class.getName(), "(architecture.instance=mycons)", 2000);
+
+        // Check that the two services are provided.
+        ServiceReference[] refs = context.getAllServiceReferences(MyService.class.getName(), null);
+        Assert.assertNotNull(refs);
+        Assert.assertEquals(2, refs.length);
+
+        ServiceReference refv1 = ipojo.getServiceReferenceByName(Architecture.class.getName(), "mycons");
+        Assert.assertNotNull(refv1);
+        Architecture arch = (Architecture) osgi.getServiceObject(refv1);
+
+        HandlerDescription desc = arch.getInstanceDescription().getHandlerDescription("org.apache.felix.ipojo:requires");
+        Assert.assertNotNull(desc);
+
+        DependencyHandlerDescription d = (DependencyHandlerDescription) desc;
+        Assert.assertNotNull(d.getDependencies());
+        Assert.assertEquals(1, d.getDependencies().length);
+
+        DependencyDescription dep = d.getDependencies()[0];
+        Assert.assertEquals(Dependency.RESOLVED, dep.getState());
+
+        Assert.assertEquals(1, dep.getServiceReferences().size());
+        ServiceReference r = (ServiceReference) dep.getServiceReferences().get(0);
+        Assert.assertEquals("provider", r.getProperty("factory.name"));
+        Assert.assertEquals("2.0", r.getProperty("factory.version"));
+    }
+
+    @Test
+    public void deployBundlesAtRuntimeV1() throws MalformedURLException, BundleException, InvalidSyntaxException {
+
+       Bundle b1 = context.installBundle(context.getProperty("url1"));
+       b1.start();
+
+
+       Bundle b3 = context.installBundle(context.getProperty("c1"));
+       b3.start();
+
+        Bundle b2 = context.installBundle(context.getProperty("url2"));
+        b2.start();
+
+        Bundle b4 = context.installBundle(context.getProperty("c2"));
+        b4.start();
+
+        Bundle b5 = context.installBundle(context.getProperty("consV1"));
+        b5.start();
+
+
+        Bundle[] bundles = context.getBundles();
+        for (int i = 0; i < bundles.length; i++) {
+            System.out.println("bundle " + bundles[i].getSymbolicName() + " : " + (bundles[i].getState() == Bundle.ACTIVE));
+            //Assert.assertEquals(bundles[i].getSymbolicName() + " is not active", Bundle.ACTIVE, bundles[i].getState());
+        }
+
+
+        PackageAdmin pa = osgi.getPackageAdmin();
+        Bundle b = pa.getBundles("ServiceInterfaceV1", null)[0];
+        ExportedPackage[] packages = pa.getExportedPackages(b);
+        if (packages == null) {
+            System.out.println("Packages  ServiceInterfaceV1 : " + 0);
+        } else {
+            System.out.println("Packages  ServiceInterfaceV1 : " + packages.length);
+            for (ExportedPackage p : packages) {
+                System.out.println("Package : " + p.getName() + " - " + p.getVersion().toString());
+            }
+        }
+        b = pa.getBundles("ServiceInterfaceV2", null)[0];
+        packages = pa.getExportedPackages(b);
+        System.out.println("Packages  ServiceInterfaceV2 : " + packages.length);
+        for (ExportedPackage p : packages) {
+            System.out.println("Package : " + p.getName() + " - " + p.getVersion().toString());
+        }
+
+        osgi.waitForService(Architecture.class.getName(), "(architecture.instance=mycons)", 2000);
+
+        // Check that the two services are provided.
+        ServiceReference[] refs = context.getAllServiceReferences(MyService.class.getName(), null);
+        Assert.assertNotNull(refs);
+        Assert.assertEquals(2, refs.length);
+
+        ServiceReference refv1 = ipojo.getServiceReferenceByName(Architecture.class.getName(), "mycons");
+        Assert.assertNotNull(refv1);
+        Architecture arch = (Architecture) osgi.getServiceObject(refv1);
+
+        HandlerDescription desc = arch.getInstanceDescription().getHandlerDescription("org.apache.felix.ipojo:requires");
+        Assert.assertNotNull(desc);
+
+        DependencyHandlerDescription d = (DependencyHandlerDescription) desc;
+        Assert.assertNotNull(d.getDependencies());
+        Assert.assertEquals(1, d.getDependencies().length);
+
+        DependencyDescription dep = d.getDependencies()[0];
+        Assert.assertEquals(Dependency.RESOLVED, dep.getState());
+
+        Assert.assertEquals(1, dep.getServiceReferences().size());
+        ServiceReference r = (ServiceReference) dep.getServiceReferences().get(0);
+
+        Assert.assertEquals("provider", r.getProperty("factory.name"));
+        Assert.assertEquals("1.0", r.getProperty("factory.version"));
+    }
+
+
+
+
+
+
+}
diff --git a/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/component/MyCons.java b/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/component/MyCons.java
new file mode 100644
index 0000000..e15d422
--- /dev/null
+++ b/ipojo/tests/core/factory-version/src/test/java/org/apache/felix/ipojo/tests/core/component/MyCons.java
@@ -0,0 +1,13 @@
+package org.apache.felix.ipojo.tests.core.component;
+
+import org.apache.felix.ipojo.tests.core.service.MyService;
+
+public class MyCons {
+
+    private MyService[] services;
+
+    public MyCons() {
+        System.out.println("Bound to " + services.length);
+    }
+
+}
diff --git a/ipojo/tests/core/factory-version/vprovider-v1.xml b/ipojo/tests/core/factory-version/vprovider-v1.xml
new file mode 100644
index 0000000..283beba
--- /dev/null
+++ b/ipojo/tests/core/factory-version/vprovider-v1.xml
@@ -0,0 +1,6 @@
+<ipojo>
+	<component name="provider" classname="org.apache.felix.ipojo.tests.core.component.MyComponent" version="1.0">
+		<provides/>
+	</component>
+	<instance component="provider" version="1.0"/>
+</ipojo>
\ No newline at end of file
diff --git a/ipojo/tests/core/factory-version/vprovider-v2.xml b/ipojo/tests/core/factory-version/vprovider-v2.xml
new file mode 100644
index 0000000..599a32b
--- /dev/null
+++ b/ipojo/tests/core/factory-version/vprovider-v2.xml
@@ -0,0 +1,7 @@
+<ipojo>
+	<component name="provider" classname="org.apache.felix.ipojo.tests.core.component.MyComponent" version="2.0">
+		<provides/>
+	</component>
+	<instance component="provider" version="2.0"/>
+
+</ipojo>
\ No newline at end of file
diff --git a/ipojo/tests/handler/transaction/pom.xml b/ipojo/tests/handler/transaction/pom.xml
index 5f49bb0..d2c75d8 100644
--- a/ipojo/tests/handler/transaction/pom.xml
+++ b/ipojo/tests/handler/transaction/pom.xml
@@ -6,7 +6,6 @@
   <packaging>jar</packaging>
   <version>1.3.0-SNAPSHOT</version>
   <name>iPOJO Transaction Handler Test Suite</name>
-  <url>http://maven.apache.org</url>
   <dependencies>
     <dependency>
   		<groupId>org.apache.felix</groupId>
@@ -39,7 +38,7 @@
 	<dependency>
 		<groupId>org.ops4j.pax.exam</groupId>
 		<artifactId>pax-exam</artifactId>
-		<version>0.4.0</version>
+		<version>0.6.0</version>
 	</dependency>
 	<!--
 		During runtime Pax Exam will discover the OSGi container to use by
@@ -51,7 +50,7 @@
 		<groupId>org.ops4j.pax.exam</groupId>
 		<artifactId>pax-exam-container-default
 		</artifactId>
-		<version>0.4.0</version>
+		<version>0.6.0</version>
 	</dependency>
 	<!--
 		If your test code is based on JUnit you will have to have the Junit
@@ -60,7 +59,7 @@
 	<dependency>
 		<groupId>org.ops4j.pax.exam</groupId>
 		<artifactId>pax-exam-junit</artifactId>
-		<version>0.4.0</version>
+		<version>0.6.0</version>
 	</dependency>
 	<dependency>
 		<groupId>junit</groupId>
@@ -71,14 +70,14 @@
 	</dependency>
 
 	<dependency>
-	  <groupId>org.apache.felix</groupId>
-  	  <artifactId>org.apache.felix.ipojo.pax.exam.target</artifactId>
-	  <version>0.9.0-SNAPSHOT</version>
+		<groupId>org.ops4j.pax.swissbox</groupId>
+		<artifactId>pax-swissbox-tinybundles</artifactId>
+		<version>1.0.0</version>
 	</dependency>
 	<dependency>
-		<groupId>org.ops4j.pax.tinybundles</groupId>
-  		<artifactId>pax-tinybundles-core</artifactId>
-  		<version>0.5.0-SNAPSHOT</version>
+		<groupId>org.apache.felix</groupId>
+		<artifactId>org.apache.felix.ipojo.tinybundles.bundleAsiPOJO</artifactId>
+		<version>1.3.0-SNAPSHOT</version>
 	</dependency>
 	 <dependency>
 			<groupId>xerces</groupId>
diff --git a/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestAnnotations.java b/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestAnnotations.java
index 30aa3e7..a7a9658 100644
--- a/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestAnnotations.java
+++ b/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestAnnotations.java
@@ -5,13 +5,13 @@
 import static org.ops4j.pax.exam.CoreOptions.options;
 import static org.ops4j.pax.exam.CoreOptions.provision;
 import static org.ops4j.pax.exam.MavenUtils.asInProject;
-import static org.ops4j.pax.tinybundles.core.TinyBundles.with;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.with;
 
 import java.io.File;
 import java.net.URL;
 
 import org.apache.felix.ipojo.metadata.Element;
-import org.apache.felix.ipojo.pax.exam.target.BundleAsiPOJO;
+import org.apache.felix.ipojo.tinybundles.BundleAsiPOJO;
 import org.apache.felix.ipojo.transaction.test.component.ComponentUsingAnnotations;
 import org.apache.felix.ipojo.transaction.test.component.FooImpl;
 import org.apache.felix.ipojo.transaction.test.service.CheckService;
@@ -25,7 +25,7 @@
 import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.junit.Configuration;
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.tinybundles.core.TinyBundles;
+import org.ops4j.pax.swissbox.tinybundles.core.TinyBundles;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
@@ -97,9 +97,9 @@
                         mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.ipojo.handler.transaction").version(asInProject()),
                         mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.transaction").version(asInProject()),
                         mavenBundle()
-                        .groupId( "org.ops4j.pax.tinybundles" )
-                        .artifactId( "pax-tinybundles-core" )
-                        .version( "0.5.0-SNAPSHOT" ),
+                            .groupId( "org.ops4j.pax.swissbox" )
+                            .artifactId( "pax-swissbox-tinybundles" )
+                            .version(asInProject()),
                         bundle(service.toExternalForm()),
                         bundle(fooimpl),
                         bundle(test)
diff --git a/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestInstallation.java b/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestInstallation.java
index e1b3a8d..b957c7c 100644
--- a/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestInstallation.java
+++ b/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestInstallation.java
@@ -5,7 +5,7 @@
 import static org.ops4j.pax.exam.CoreOptions.options;
 import static org.ops4j.pax.exam.CoreOptions.provision;
 import static org.ops4j.pax.exam.MavenUtils.asInProject;
-import static org.ops4j.pax.tinybundles.core.TinyBundles.with;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.with;
 
 import java.io.File;
 import java.net.URL;
@@ -19,7 +19,7 @@
 
 import org.apache.felix.ipojo.ComponentInstance;
 import org.apache.felix.ipojo.HandlerFactory;
-import org.apache.felix.ipojo.pax.exam.target.BundleAsiPOJO;
+import org.apache.felix.ipojo.tinybundles.BundleAsiPOJO;
 import org.apache.felix.ipojo.transaction.test.component.FooDelegator;
 import org.apache.felix.ipojo.transaction.test.component.FooImpl;
 import org.apache.felix.ipojo.transaction.test.service.CheckService;
@@ -33,7 +33,7 @@
 import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.junit.Configuration;
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.tinybundles.core.TinyBundles;
+import org.ops4j.pax.swissbox.tinybundles.core.TinyBundles;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
@@ -41,74 +41,74 @@
 
 @RunWith( JUnit4TestRunner.class )
 public class TestInstallation {
-    
+
     @Inject
     private BundleContext context;
-    
+
     private OSGiHelper osgi;
-    
+
     private IPOJOHelper ipojo;
-    
+
     public static final File ROOT = new File("target/tmp");
     public static final File TEST = new File("src/test/resources");
 
-    
+
     @Before
     public void init() {
         osgi = new OSGiHelper(context);
         ipojo = new IPOJOHelper(context);
     }
-    
+
     @After
     public void stop() {
         ipojo.dispose();
         osgi.dispose();
     }
-    
+
     @Configuration
-    public static Option[] configure() {    
+    public static Option[] configure() {
         ROOT.mkdirs();
 
         URL service = TinyBundles.newBundle()
             .addClass(CheckService.class)
             .addClass(Foo.class)
-           .prepare( 
+           .prepare(
                 with()
                 .set(Constants.BUNDLE_SYMBOLICNAME,"Service")
                 .set(Constants.EXPORT_PACKAGE, "org.apache.felix.ipojo.transaction.test.service")
                 )
             .build( TinyBundles.asURL());
-            
+
         String fooimpl = TinyBundles.newBundle()
             .addClass(FooImpl.class)
-            .prepare( 
+            .prepare(
                     with()
                     .set(Constants.BUNDLE_SYMBOLICNAME,"Foo Provider")
                     .set(Constants.IMPORT_PACKAGE, "org.apache.felix.ipojo.transaction.test.service")
                 )
                 .build( new BundleAsiPOJO(new File(ROOT, "FooImpl.jar"), new File(TEST, "foo.xml"))  ).toExternalForm();
-        
+
         String test = TinyBundles.newBundle()
         .addClass(FooDelegator.class)
-        .prepare( 
+        .prepare(
                 with()
                 .set(Constants.BUNDLE_SYMBOLICNAME,"Required Transaction Propgatation")
                 .set(Constants.IMPORT_PACKAGE, "org.apache.felix.ipojo.transaction.test.service, javax.transaction")
             )
             .build( new BundleAsiPOJO(new File(ROOT, "requires.jar"), new File(TEST, "requires.xml"))  ).toExternalForm();
-    
-        
+
+
         Option[] opt =  options(
- 
+
                 provision(
                         mavenBundle().groupId("org.ops4j.pax.logging").artifactId("pax-logging-api").version(asInProject()),
                         mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.ipojo").version(asInProject()),
                         mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.ipojo.handler.transaction").version(asInProject()),
                         mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.transaction").version(asInProject()),
                         mavenBundle()
-                        .groupId( "org.ops4j.pax.tinybundles" )
-                        .artifactId( "pax-tinybundles-core" )
-                        .version( "0.5.0-SNAPSHOT" ),
+                            .groupId( "org.ops4j.pax.swissbox" )
+                            .artifactId( "pax-swissbox-tinybundles" )
+                            .version(asInProject()),
                         bundle(service.toExternalForm()),
                         bundle(fooimpl),
                         bundle(test)
@@ -118,36 +118,36 @@
                 ;
         return opt;
     }
-    
+
     @Test
     public void install() throws NotSupportedException, SystemException, IllegalStateException, SecurityException, HeuristicMixedException, HeuristicRollbackException, RollbackException {
         Bundle[] bundles = context.getBundles();
         for (Bundle b : bundles) {
             Assert.assertTrue(b.getSymbolicName(), b.getState() == Bundle.ACTIVE);
         }
-        
+
         // Transaction Service available
         osgi.isServiceAvailable(TransactionManager.class.getName());
         TransactionManager tm = (TransactionManager) osgi.getServiceObject(TransactionManager.class.getName(), null);
         tm.begin();
         Assert.assertNotNull(tm.getTransaction());
         tm.commit();
-        
+
         tm.begin();
         Assert.assertNotNull(tm.getTransaction());
         tm.rollback();
-        
+
         // Handler exposed
         ServiceReference ref = osgi.getServiceReference(HandlerFactory.class.getName(), "(&(handler.name=transaction)(handler.namespace=org.apache.felix.ipojo.transaction))");
         Assert.assertNotNull(ref);
-        
+
         // Create an install of the components
         ComponentInstance prov = ipojo.createComponentInstance("org.apache.felix.ipojo.transaction.test.component.FooImpl");
         ComponentInstance under = ipojo.createComponentInstance("requires-ok");
-        
+
         Assert.assertEquals(ComponentInstance.VALID, prov.getState());
         Assert.assertEquals(ComponentInstance.VALID, under.getState());
-        
+
         ref = ipojo.getServiceReferenceByName(CheckService.class.getName(), under.getInstanceName());
         Assert.assertNotNull(ref);
 
diff --git a/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestInvalidation.java b/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestInvalidation.java
index 490fc9b..548df24 100644
--- a/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestInvalidation.java
+++ b/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestInvalidation.java
@@ -5,7 +5,7 @@
 import static org.ops4j.pax.exam.CoreOptions.options;
 import static org.ops4j.pax.exam.CoreOptions.provision;
 import static org.ops4j.pax.exam.MavenUtils.asInProject;
-import static org.ops4j.pax.tinybundles.core.TinyBundles.with;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.with;
 
 import java.io.File;
 import java.net.URL;
@@ -20,7 +20,7 @@
 import javax.transaction.TransactionManager;
 
 import org.apache.felix.ipojo.ComponentInstance;
-import org.apache.felix.ipojo.pax.exam.target.BundleAsiPOJO;
+import org.apache.felix.ipojo.tinybundles.BundleAsiPOJO;
 import org.apache.felix.ipojo.transaction.test.component.FooDelegator;
 import org.apache.felix.ipojo.transaction.test.component.FooImpl;
 import org.apache.felix.ipojo.transaction.test.service.CheckService;
@@ -34,7 +34,7 @@
 import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.junit.Configuration;
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.tinybundles.core.TinyBundles;
+import org.ops4j.pax.swissbox.tinybundles.core.TinyBundles;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
@@ -108,9 +108,9 @@
                         mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.ipojo.handler.transaction").version(asInProject()),
                         mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.transaction").version(asInProject()),
                         mavenBundle()
-                        .groupId( "org.ops4j.pax.tinybundles" )
-                        .artifactId( "pax-tinybundles-core" )
-                        .version( "0.5.0-SNAPSHOT" ),
+                            .groupId( "org.ops4j.pax.swissbox" )
+                            .artifactId( "pax-swissbox-tinybundles" )
+                            .version(asInProject()),
                         bundle(service.toExternalForm()),
                         bundle(fooimpl),
                         bundle(test)
diff --git a/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestMandatory.java b/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestMandatory.java
index bc5eef1..03d2e43 100644
--- a/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestMandatory.java
+++ b/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestMandatory.java
@@ -5,7 +5,7 @@
 import static org.ops4j.pax.exam.CoreOptions.options;
 import static org.ops4j.pax.exam.CoreOptions.provision;
 import static org.ops4j.pax.exam.MavenUtils.asInProject;
-import static org.ops4j.pax.tinybundles.core.TinyBundles.with;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.with;
 
 import java.io.File;
 import java.net.URL;
@@ -20,7 +20,7 @@
 import javax.transaction.TransactionManager;
 
 import org.apache.felix.ipojo.ComponentInstance;
-import org.apache.felix.ipojo.pax.exam.target.BundleAsiPOJO;
+import org.apache.felix.ipojo.tinybundles.BundleAsiPOJO;
 import org.apache.felix.ipojo.transaction.test.component.FooDelegator;
 import org.apache.felix.ipojo.transaction.test.component.FooImpl;
 import org.apache.felix.ipojo.transaction.test.service.CheckService;
@@ -34,7 +34,7 @@
 import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.junit.Configuration;
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.tinybundles.core.TinyBundles;
+import org.ops4j.pax.swissbox.tinybundles.core.TinyBundles;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
@@ -107,9 +107,9 @@
                         mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.ipojo.handler.transaction").version(asInProject()),
                         mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.transaction").version(asInProject()),
                         mavenBundle()
-                        .groupId( "org.ops4j.pax.tinybundles" )
-                        .artifactId( "pax-tinybundles-core" )
-                        .version( "0.5.0-SNAPSHOT" ),
+                            .groupId( "org.ops4j.pax.swissbox" )
+                            .artifactId( "pax-swissbox-tinybundles" )
+                            .version(asInProject()),
                         bundle(service.toExternalForm()),
                         bundle(fooimpl),
                         bundle(test)
diff --git a/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestNever.java b/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestNever.java
index 3e38b54..609f9f5 100644
--- a/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestNever.java
+++ b/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestNever.java
@@ -5,7 +5,7 @@
 import static org.ops4j.pax.exam.CoreOptions.options;
 import static org.ops4j.pax.exam.CoreOptions.provision;
 import static org.ops4j.pax.exam.MavenUtils.asInProject;
-import static org.ops4j.pax.tinybundles.core.TinyBundles.with;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.with;
 
 import java.io.File;
 import java.net.URL;
@@ -20,7 +20,7 @@
 import javax.transaction.TransactionManager;
 
 import org.apache.felix.ipojo.ComponentInstance;
-import org.apache.felix.ipojo.pax.exam.target.BundleAsiPOJO;
+import org.apache.felix.ipojo.tinybundles.BundleAsiPOJO;
 import org.apache.felix.ipojo.transaction.test.component.FooDelegator;
 import org.apache.felix.ipojo.transaction.test.component.FooImpl;
 import org.apache.felix.ipojo.transaction.test.service.CheckService;
@@ -34,7 +34,7 @@
 import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.junit.Configuration;
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.tinybundles.core.TinyBundles;
+import org.ops4j.pax.swissbox.tinybundles.core.TinyBundles;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
@@ -106,9 +106,9 @@
                         mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.ipojo.handler.transaction").version(asInProject()),
                         mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.transaction").version(asInProject()),
                         mavenBundle()
-                        .groupId( "org.ops4j.pax.tinybundles" )
-                        .artifactId( "pax-tinybundles-core" )
-                        .version( "0.5.0-SNAPSHOT" ),
+                            .groupId( "org.ops4j.pax.swissbox" )
+                            .artifactId( "pax-swissbox-tinybundles" )
+                            .version(asInProject()),
                         bundle(service.toExternalForm()),
                         bundle(fooimpl),
                         bundle(test)
diff --git a/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestNotSupported.java b/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestNotSupported.java
index 7c98681..bd07984 100644
--- a/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestNotSupported.java
+++ b/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestNotSupported.java
@@ -5,7 +5,7 @@
 import static org.ops4j.pax.exam.CoreOptions.options;
 import static org.ops4j.pax.exam.CoreOptions.provision;
 import static org.ops4j.pax.exam.MavenUtils.asInProject;
-import static org.ops4j.pax.tinybundles.core.TinyBundles.with;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.with;
 
 import java.io.File;
 import java.net.URL;
@@ -20,7 +20,7 @@
 import javax.transaction.TransactionManager;
 
 import org.apache.felix.ipojo.ComponentInstance;
-import org.apache.felix.ipojo.pax.exam.target.BundleAsiPOJO;
+import org.apache.felix.ipojo.tinybundles.BundleAsiPOJO;
 import org.apache.felix.ipojo.transaction.test.component.FooDelegator;
 import org.apache.felix.ipojo.transaction.test.component.FooImpl;
 import org.apache.felix.ipojo.transaction.test.service.CheckService;
@@ -34,7 +34,7 @@
 import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.junit.Configuration;
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.tinybundles.core.TinyBundles;
+import org.ops4j.pax.swissbox.tinybundles.core.TinyBundles;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
@@ -106,9 +106,9 @@
                         mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.ipojo.handler.transaction").version(asInProject()),
                         mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.transaction").version(asInProject()),
                         mavenBundle()
-                        .groupId( "org.ops4j.pax.tinybundles" )
-                        .artifactId( "pax-tinybundles-core" )
-                        .version( "0.5.0-SNAPSHOT" ),
+                            .groupId( "org.ops4j.pax.swissbox" )
+                            .artifactId( "pax-swissbox-tinybundles" )
+                            .version(asInProject()),
                         bundle(service.toExternalForm()),
                         bundle(fooimpl),
                         bundle(test)
diff --git a/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestRequires.java b/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestRequires.java
index 781e0dd..5dfd591 100644
--- a/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestRequires.java
+++ b/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestRequires.java
@@ -5,7 +5,7 @@
 import static org.ops4j.pax.exam.CoreOptions.options;
 import static org.ops4j.pax.exam.CoreOptions.provision;
 import static org.ops4j.pax.exam.MavenUtils.asInProject;
-import static org.ops4j.pax.tinybundles.core.TinyBundles.with;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.with;
 
 import java.io.File;
 import java.net.URL;
@@ -20,7 +20,7 @@
 import javax.transaction.TransactionManager;
 
 import org.apache.felix.ipojo.ComponentInstance;
-import org.apache.felix.ipojo.pax.exam.target.BundleAsiPOJO;
+import org.apache.felix.ipojo.tinybundles.BundleAsiPOJO;
 import org.apache.felix.ipojo.transaction.test.component.FooDelegator;
 import org.apache.felix.ipojo.transaction.test.component.FooImpl;
 import org.apache.felix.ipojo.transaction.test.service.CheckService;
@@ -34,7 +34,7 @@
 import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.junit.Configuration;
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.tinybundles.core.TinyBundles;
+import org.ops4j.pax.swissbox.tinybundles.core.TinyBundles;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
@@ -107,9 +107,9 @@
                         mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.ipojo.handler.transaction").version(asInProject()),
                         mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.transaction").version(asInProject()),
                         mavenBundle()
-                        .groupId( "org.ops4j.pax.tinybundles" )
-                        .artifactId( "pax-tinybundles-core" )
-                        .version( "0.5.0-SNAPSHOT" ),
+                            .groupId( "org.ops4j.pax.swissbox" )
+                            .artifactId( "pax-swissbox-tinybundles" )
+                            .version(asInProject()),
                         bundle(service.toExternalForm()),
                         bundle(fooimpl),
                         bundle(test)
diff --git a/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestRequiresNew.java b/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestRequiresNew.java
index 00805ed..b7a231b 100644
--- a/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestRequiresNew.java
+++ b/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestRequiresNew.java
@@ -5,7 +5,7 @@
 import static org.ops4j.pax.exam.CoreOptions.options;
 import static org.ops4j.pax.exam.CoreOptions.provision;
 import static org.ops4j.pax.exam.MavenUtils.asInProject;
-import static org.ops4j.pax.tinybundles.core.TinyBundles.with;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.with;
 
 import java.io.File;
 import java.net.URL;
@@ -20,7 +20,7 @@
 import javax.transaction.TransactionManager;
 
 import org.apache.felix.ipojo.ComponentInstance;
-import org.apache.felix.ipojo.pax.exam.target.BundleAsiPOJO;
+import org.apache.felix.ipojo.tinybundles.BundleAsiPOJO;
 import org.apache.felix.ipojo.transaction.test.component.FooDelegator;
 import org.apache.felix.ipojo.transaction.test.component.FooImpl;
 import org.apache.felix.ipojo.transaction.test.service.CheckService;
@@ -34,7 +34,7 @@
 import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.junit.Configuration;
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.tinybundles.core.TinyBundles;
+import org.ops4j.pax.swissbox.tinybundles.core.TinyBundles;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
@@ -107,9 +107,9 @@
                         mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.ipojo.handler.transaction").version(asInProject()),
                         mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.transaction").version(asInProject()),
                         mavenBundle()
-                        .groupId( "org.ops4j.pax.tinybundles" )
-                        .artifactId( "pax-tinybundles-core" )
-                        .version( "0.5.0-SNAPSHOT" ),
+                            .groupId( "org.ops4j.pax.swissbox" )
+                            .artifactId( "pax-swissbox-tinybundles" )
+                            .version(asInProject()),
                         bundle(service.toExternalForm()),
                         bundle(fooimpl),
                         bundle(test)
diff --git a/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestSupported.java b/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestSupported.java
index 7a2e6e2..b2eea67 100644
--- a/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestSupported.java
+++ b/ipojo/tests/handler/transaction/src/test/java/org/apache/felix/ipojo/transaction/test/TestSupported.java
@@ -5,7 +5,7 @@
 import static org.ops4j.pax.exam.CoreOptions.options;
 import static org.ops4j.pax.exam.CoreOptions.provision;
 import static org.ops4j.pax.exam.MavenUtils.asInProject;
-import static org.ops4j.pax.tinybundles.core.TinyBundles.with;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.with;
 
 import java.io.File;
 import java.net.URL;
@@ -20,7 +20,7 @@
 import javax.transaction.TransactionManager;
 
 import org.apache.felix.ipojo.ComponentInstance;
-import org.apache.felix.ipojo.pax.exam.target.BundleAsiPOJO;
+import org.apache.felix.ipojo.tinybundles.BundleAsiPOJO;
 import org.apache.felix.ipojo.transaction.test.component.FooDelegator;
 import org.apache.felix.ipojo.transaction.test.component.FooImpl;
 import org.apache.felix.ipojo.transaction.test.service.CheckService;
@@ -34,7 +34,7 @@
 import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.junit.Configuration;
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.tinybundles.core.TinyBundles;
+import org.ops4j.pax.swissbox.tinybundles.core.TinyBundles;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
@@ -106,9 +106,9 @@
                         mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.ipojo.handler.transaction").version(asInProject()),
                         mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.transaction").version(asInProject()),
                         mavenBundle()
-                        .groupId( "org.ops4j.pax.tinybundles" )
-                        .artifactId( "pax-tinybundles-core" )
-                        .version( "0.5.0-SNAPSHOT" ),
+                            .groupId( "org.ops4j.pax.swissbox" )
+                            .artifactId( "pax-swissbox-tinybundles" )
+                            .version(asInProject()),
                         bundle(service.toExternalForm()),
                         bundle(fooimpl),
                         bundle(test)
diff --git a/ipojo/tests/online-manipulator/pom.xml b/ipojo/tests/online-manipulator/pom.xml
index ca02a04..4b89c93 100644
--- a/ipojo/tests/online-manipulator/pom.xml
+++ b/ipojo/tests/online-manipulator/pom.xml
@@ -28,7 +28,7 @@
 					</execution>
 				</executions>
 			</plugin>
-			
+
 		  <!--
 		  <plugin>
 				<groupId>org.ops4j.pax.exam</groupId>
@@ -48,15 +48,15 @@
 				</configuration>
 			</plugin> -->
 		</plugins>
-	</build>	
-	
+	</build>
+
 	<dependencies>
 	<dependency>
  	 	<groupId>org.apache.felix</groupId>
  	 	<artifactId>org.osgi.core</artifactId>
  	 	<version>1.2.0</version>
  	 </dependency>
-		
+
 	<!--
 		Pax Exam API:
 	-->
@@ -93,19 +93,19 @@
 		<type>jar</type>
 		<scope>test</scope>
 	</dependency>
-	
-		
+
+
 	<!-- TinyBundle -->
 	<dependency>
-		 <groupId>org.ops4j.pax.tinybundles</groupId>
-  		 <artifactId>pax-tinybundles-core</artifactId>
-  		 <version>0.5.0-SNAPSHOT</version>
-  	</dependency>
-  	<dependency>
-  		<groupId>org.apache.felix</groupId>
-  		<artifactId>org.apache.felix.ipojo.pax.exam.target</artifactId>
-  		<version>0.9.0-SNAPSHOT</version>
- 	 </dependency>
+		<groupId>org.ops4j.pax.swissbox</groupId>
+		<artifactId>pax-swissbox-tinybundles</artifactId>
+		<version>1.0.0</version>
+	</dependency>
+	<dependency>
+		<groupId>org.apache.felix</groupId>
+		<artifactId>org.apache.felix.ipojo.tinybundles.bundleAsiPOJO</artifactId>
+		<version>1.3.0-SNAPSHOT</version>
+	</dependency>
  	 <dependency>
 			<groupId>xerces</groupId>
 			<artifactId>xercesImpl</artifactId>
@@ -121,6 +121,6 @@
  	 	<artifactId>org.apache.felix.ipojo</artifactId>
  	 	<version>1.3.0-SNAPSHOT</version>
  	 </dependency>
- 	 
+
 	</dependencies>
 </project>
diff --git a/ipojo/tests/online-manipulator/src/test/java/org/apache/felix/org/apache/felix/ipojo/online/manipulator/test/OnlineManipulatorTest.java b/ipojo/tests/online-manipulator/src/test/java/org/apache/felix/org/apache/felix/ipojo/online/manipulator/test/OnlineManipulatorTest.java
index 63c42b0..f119499 100644
--- a/ipojo/tests/online-manipulator/src/test/java/org/apache/felix/org/apache/felix/ipojo/online/manipulator/test/OnlineManipulatorTest.java
+++ b/ipojo/tests/online-manipulator/src/test/java/org/apache/felix/org/apache/felix/ipojo/online/manipulator/test/OnlineManipulatorTest.java
@@ -4,15 +4,14 @@
 import static org.ops4j.pax.exam.CoreOptions.equinox;
 import static org.ops4j.pax.exam.CoreOptions.felix;
 import static org.ops4j.pax.exam.CoreOptions.frameworks;
-import static org.ops4j.pax.exam.CoreOptions.knopflerfish;
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
 import static org.ops4j.pax.exam.CoreOptions.provision;
 import static org.ops4j.pax.exam.CoreOptions.systemProperty;
-import static org.ops4j.pax.tinybundles.core.TinyBundles.asFile;
-import static org.ops4j.pax.tinybundles.core.TinyBundles.asURL;
-import static org.ops4j.pax.tinybundles.core.TinyBundles.newBundle;
-import static org.ops4j.pax.tinybundles.core.TinyBundles.with;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.asFile;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.asURL;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.newBundle;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.with;
 
 import java.io.File;
 import java.io.IOException;
@@ -42,35 +41,35 @@
 
 @RunWith( JUnit4TestRunner.class )
 public class OnlineManipulatorTest {
-    
-    
+
+
     private static File TMP = new File("target/tmp-bundle");
-    
+
     @Inject
     BundleContext context;
 
     private OSGiHelper helper;
 
-    
+
     /*
      * <groupId>org.apache.felix</groupId>
   <artifactId>org.apache.felix.ipojo.online.manipulator</artifactId>
   <version>1.3.0-SNAPSHOT</version>
- 
+
      */
-    
+
     @Configuration
     public static Option[] configure() throws IOException
     {
-        
-        
+
+
 
         String providerWithMetadata = providerWithMetadata();
         String providerWithMetadataInMetaInf = providerWithMetadataInMetaInf();
         String providerWithoutMetadata = providerWithoutMetadata();
         String consumerWithMetadata =  consumerWithMetadata();
         String consumerWithoutMetadata = consumerWithoutMetadata();
-        
+
         return options(
                 frameworks(
                         felix(),
@@ -81,13 +80,13 @@
                     .groupId( "org.ops4j.pax.tinybundles" )
                     .artifactId( "pax-tinybundles-core" )
                     .version( "0.5.0-SNAPSHOT" )),
-            provision( 
+            provision(
                     mavenBundle()
                     .groupId("org.apache.felix")
                     .artifactId("org.apache.felix.ipojo")
                     .version("1.3.0-SNAPSHOT")
             ),
-            
+
             provision(
                     mavenBundle()
                     .groupId("org.apache.felix")
@@ -108,22 +107,22 @@
            systemProperty( "consumerWithMetadata").value(consumerWithMetadata),
            systemProperty( "consumerWithoutMetadata").value(consumerWithoutMetadata)
            );
-        
-       
+
+
 
 
     }
-    
+
     @Before
     public void before() {
         helper = new OSGiHelper(context);
     }
-    
+
     @After
     public void after() {
         helper.dispose();
     }
-    
+
     private static File getTemporaryFile(String name) throws IOException {
         if (! TMP.exists()) {
             TMP.mkdirs();
@@ -135,22 +134,22 @@
             file.delete();
         }
         file.deleteOnExit();
-        return file;  
+        return file;
     }
-    
+
     @Test
     public void installProviderWithMetadata1() throws BundleException, InvalidSyntaxException, IOException {
         String url = context.getProperty("providerWithMetadata");
         Assert.assertNotNull(url);
         context.installBundle("ipojo:"+url).start();
-        
+
         assertBundle("Provider");
         helper.waitForService(Hello.class.getName(), null, 5000);
         assertValidity();
         Assert.assertNotNull(context.getServiceReference(Hello.class.getName()));
     }
-    
-   
+
+
 
     @Test
     public void installProviderWithMetadata2() throws BundleException, InvalidSyntaxException, IOException {
@@ -162,7 +161,7 @@
         assertValidity();
         Assert.assertNotNull(context.getServiceReference(Hello.class.getName()));
     }
-    
+
     @Test
     public void installProviderWithoutMetadata() throws BundleException, InvalidSyntaxException, IOException {
         String url = context.getProperty("providerWithoutMetadata");
@@ -173,14 +172,14 @@
         assertValidity();
         Assert.assertNotNull(context.getServiceReference(Hello.class.getName()));
     }
-    
+
     @Test
     public void installConsumerWithMetadata() throws BundleException, InvalidSyntaxException, IOException {
         String url = context.getProperty("providerWithoutMetadata");
         Assert.assertNotNull(url);
         context.installBundle("ipojo:"+url).start();
         assertBundle("Provider");
-        
+
         String url2 = context.getProperty("consumerWithMetadata");
         Assert.assertNotNull(url);
         context.installBundle("ipojo:"+url2).start();
@@ -195,7 +194,7 @@
         assertValidity();
         Assert.assertNotNull(context.getServiceReference(Hello.class.getName()));
     }
-    
+
     @Test
     public void installConsumerWithoutMetadata() throws BundleException, InvalidSyntaxException, IOException {
         String url = context.getProperty("providerWithMetadataInMetaInf");
@@ -213,69 +212,69 @@
             Thread.sleep(2000);
         } catch (InterruptedException e) {
             e.printStackTrace();
-        }  
+        }
         assertValidity();
         Assert.assertNotNull(context.getServiceReference(Hello.class.getName()));
     }
-    
+
     /**
      * Gets a regular bundle containing metadata file
      * @return the url of the bundle
-     * @throws IOException 
+     * @throws IOException
      */
     public static String providerWithMetadata() throws IOException {
         return newBundle()
         .addResource("metadata.xml", OnlineManipulatorTest.class.getClassLoader().getResource("provider.xml"))
         .addClass(MyProvider.class)
-        .prepare( 
+        .prepare(
             with()
                 .set(Constants.BUNDLE_SYMBOLICNAME,"Provider")
                 .set(Constants.IMPORT_PACKAGE, "org.apache.felix.org.apache.felix.ipojo.online.manipulator.test.service")
             )
               .build( asFile(getTemporaryFile("providerWithMetadata")) ).toURL().toExternalForm();
     }
-    
+
     /**
      * Gets a regular bundle containing metadata file in the META-INF directory
      * @return the url of the bundle
-     * @throws IOException 
+     * @throws IOException
      */
     public static String providerWithMetadataInMetaInf() throws IOException {
         return newBundle()
         .addResource("META-INF/metadata.xml", OnlineManipulatorTest.class.getClassLoader().getResource("provider.xml"))
         .addClass(MyProvider.class)
-        .prepare( 
+        .prepare(
             with()
                 .set(Constants.BUNDLE_SYMBOLICNAME,"Provider")
                 .set(Constants.IMPORT_PACKAGE, "org.apache.felix.org.apache.felix.ipojo.online.manipulator.test.service")
             )
               .build( asFile(getTemporaryFile("providerWithMetadataInMetaInf")) ).toURL().toExternalForm();
     }
-    
+
     /**
      * Gets a provider bundle which does not contain the metadata file.
      * @return the url of the bundle + metadata
-     * @throws IOException 
+     * @throws IOException
      */
     public static String providerWithoutMetadata() throws IOException {
         String url = newBundle()
         //.addResource("metadata.xml", this.getClass().getClassLoader().getResource("provider.xml"))
         .addClass(MyProvider.class)
-        .prepare( 
+        .prepare(
             with()
                 .set(Constants.BUNDLE_SYMBOLICNAME,"Provider")
                 .set(Constants.IMPORT_PACKAGE, "org.apache.felix.org.apache.felix.ipojo.online.manipulator.test.service")
             )
               .build( asFile(getTemporaryFile("providerWithoutMetadata")) ).toURL().toExternalForm();
-        
+
         return url + "!" +OnlineManipulatorTest.class.getClassLoader().getResource("provider.xml");
     }
-    
+
     /**
      * Gets a consumer bundle using annotation containing the instance
      * declaration in the metadata.
      * @return the url of the bundle
-     * @throws IOException 
+     * @throws IOException
      */
     public static String consumerWithMetadata() throws IOException {
         return newBundle()
@@ -288,14 +287,14 @@
                 .set(Constants.IMPORT_PACKAGE, "org.apache.felix.org.apache.felix.ipojo.online.manipulator.test.service")
                 )
                 .build( asFile(getTemporaryFile("consumerWithMetadata")) ).toURL().toExternalForm();
-       
+
     }
-    
+
     /**
      * Gets a consumer bundle using annotation that does not contain
      * metadata
      * @return the url of the bundle + metadata
-     * @throws IOException 
+     * @throws IOException
      */
     public static String consumerWithoutMetadata() throws IOException {
         String url = newBundle()
@@ -306,12 +305,12 @@
                 .set(Constants.IMPORT_PACKAGE, "org.apache.felix.org.apache.felix.ipojo.online.manipulator.test.service")
                 )
                 .build( asFile(getTemporaryFile("consumerWithoutMetadata")) ).toURL().toExternalForm();
-        
+
         return url + "!" + OnlineManipulatorTest.class.getClassLoader().getResource("consumer.xml");
     }
-    
-    
-    
+
+
+
     public void dumpServices() throws InvalidSyntaxException {
         ServiceReference[] refs = context.getAllServiceReferences(null, null);
         System.out.println(" === Services === ");
@@ -321,7 +320,7 @@
         }
         System.out.println("====");
     }
-    
+
     public void dumpBundles() throws InvalidSyntaxException {
         Bundle[] bundles = context.getBundles();
         System.out.println(" === Bundles === ");
@@ -331,18 +330,18 @@
         }
         System.out.println("====");
     }
-    
+
     private void assertBundle(String sn) {
         for (Bundle bundle :context.getBundles()) {
             if (bundle.getSymbolicName().equals(sn)
                     && bundle.getState() == Bundle.ACTIVE) {
                 return;
             }
-                
+
         }
         Assert.fail("Cannot find the bundle " + sn);
     }
-    
+
     private void assertValidity() {
         try {
             ServiceReference[] refs = context.getServiceReferences(Architecture.class.getName(), null);
@@ -355,9 +354,9 @@
         } catch (InvalidSyntaxException e) {
             Assert.fail(e.getMessage());
         }
-            
+
     }
-    
-  
+
+
 
 }
diff --git a/ipojo/tests/pom.xml b/ipojo/tests/pom.xml
index 46830e5..5cc2c9a 100644
--- a/ipojo/tests/pom.xml
+++ b/ipojo/tests/pom.xml
@@ -20,7 +20,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>ipojo.tests</groupId>
   <artifactId>ipojo.tests</artifactId>
-  <version>1.1.0-SNAPSHOT</version>
+  <version>1.3.0-SNAPSHOT</version>
   <name>Apache Felix iPOJO Tests</name>
   <packaging>pom</packaging>
   
@@ -60,6 +60,7 @@
 			<jdk>1.5</jdk>
 		</activation>
 		<modules>
+			<module>bundleAsiPOJO</module>
 			<module>core/annotations</module>
 			<module>manipulator/manipulator-java5</module>
 			<module>handler/transaction</module>
@@ -71,6 +72,7 @@
 			<jdk>1.6</jdk>
 		</activation>
 		<modules>
+			<module>bundleAsiPOJO</module>
 			<module>core/annotations</module>
 			<module>manipulator/manipulator-java5</module>
 			<module>handler/transaction</module>
