diff --git a/bundlerepository.osgi-ct/pom.xml b/bundlerepository.osgi-ct/pom.xml
new file mode 100644
index 0000000..9ce9613
--- /dev/null
+++ b/bundlerepository.osgi-ct/pom.xml
@@ -0,0 +1,101 @@
+<!--
+ 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/maven-v4_0_0.xsd">
+  <parent>
+    <groupId>org.apache.felix</groupId>
+    <artifactId>felix-parent</artifactId>
+    <version>2.1</version>
+    <relativePath>../../pom/pom.xml</relativePath>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <packaging>bundle</packaging>
+  <name>Apache Felix Bundle Repository - OSGi CT integration</name>
+  <description>
+    Bundle repository service OSGi CT integration. To run a Repository implementation in the 
+    OSGi CT, a small integration layer needs to be provided by the implementation that knows
+    how to prime the repository with the provided repository xml file.
+  </description>
+  <artifactId>org.apache.felix.bundlerepository.osgi-ct</artifactId>
+  <version>1.7.0-SNAPSHOT</version>
+  <scm>
+    <connection>scm:svn:http://svn.apache.org/repos/asf/felix/trunk/bundlerepository.osgi-ct</connection>
+    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/trunk/bundlerepository.osgi-ct</developerConnection>
+    <url>http://svn.apache.org/repos/asf/felix/trunk/bundlerepository.osgi-ct</url>
+  </scm>
+  <dependencies>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.core</artifactId>
+      <version>5.0.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.compendium</artifactId>
+      <version>5.0.0</version>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>org.apache.felix.bundlerepository</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+  </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <target>1.5</target>
+          <source>1.5</source>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <version>2.3.4</version>
+        <extensions>true</extensions>
+        <configuration>
+          <instructions>
+            <Export-Package></Export-Package>
+            <Private-Package>org.apache.felix.bundlerepository.osgict</Private-Package>
+            <Bundle-Activator>org.apache.felix.bundlerepository.osgict.Activator</Bundle-Activator>
+            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+            <Bundle-Vendor>The Apache Software Foundation</Bundle-Vendor>
+          </instructions>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.rat</groupId>
+        <artifactId>apache-rat-plugin</artifactId>
+        <configuration>
+          <excludeSubProjects>false</excludeSubProjects>
+          <useEclipseDefaultExcludes>true</useEclipseDefaultExcludes>
+          <useMavenDefaultExcludes>true</useMavenDefaultExcludes>
+          <excludes>
+            <param>doc/*</param>
+            <param>maven-eclipse.xml</param>
+            <param>.checkstyle</param>
+            <param>.externalToolBuilders/*</param>
+          </excludes>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/bundlerepository.osgi-ct/src/main/java/org/apache/felix/bundlerepository/osgict/Activator.java b/bundlerepository.osgi-ct/src/main/java/org/apache/felix/bundlerepository/osgict/Activator.java
new file mode 100644
index 0000000..d1d65b5
--- /dev/null
+++ b/bundlerepository.osgi-ct/src/main/java/org/apache/felix/bundlerepository/osgict/Activator.java
@@ -0,0 +1,109 @@
+/*
+ * 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.bundlerepository.osgict;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.apache.felix.bundlerepository.RepositoryAdmin;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Filter;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * This Activator implements the required glue between an OSGi Repository implementation and the
+ * OSGi CT. It is needed to prime the repository with the data needed by the CT and works as
+ * follows:
+ * <ul>
+ * <li>The CT registers a String service with as property {@code repository-xml}. This service is
+ * literally the repository XML needed by the test, and must be fed to the repository implementation.
+ * <li>When that's done this glue code registers another service with as property
+ * {@code repository-populated} to signal to the CT that the priming is done.
+ * </ul>
+ */
+public class Activator implements BundleActivator
+{
+    private BundleContext bundleContext;
+    private ServiceTracker<String, String> repoXMLTracker;
+    private ServiceTracker<RepositoryAdmin, RepositoryAdmin> repoTracker;
+
+    public void start(BundleContext context) throws Exception
+    {
+        bundleContext = context;
+        Filter f = context.createFilter("(&(objectClass=java.lang.String)(repository-xml=*))");
+        repoXMLTracker = new ServiceTracker<String, String>(context, f, null) {
+            @Override
+            public String addingService(ServiceReference<String> reference)
+            {
+                try
+                {
+                    String xml = super.addingService(reference);
+                    handleRepositoryXML(reference, xml);
+                    return xml;
+                }
+                catch (Exception e)
+                {
+                    throw new RuntimeException(e);
+                }
+            }
+        };
+        repoXMLTracker.open();
+    }
+
+    public void stop(BundleContext context) throws Exception
+    {
+        repoXMLTracker.close();
+        if (repoTracker != null)
+            repoTracker.close();
+    }
+
+    private void handleRepositoryXML(ServiceReference<String> reference, String xml) throws Exception
+    {
+        File tempXMLFile = bundleContext.getDataFile("repo-" + reference.getProperty("repository-xml") + ".xml");
+        writeXMLToFile(tempXMLFile, xml);
+
+        repoTracker = new ServiceTracker<RepositoryAdmin, RepositoryAdmin>(bundleContext, RepositoryAdmin.class, null);
+        repoTracker.open();
+        RepositoryAdmin repo = repoTracker.waitForService(30000);
+        repo.addRepository(tempXMLFile.toURI().toURL());
+        tempXMLFile.delete();
+
+        Dictionary<String, Object> props = new Hashtable<String, Object>();
+        props.put("repository-populated", reference.getProperty("repository-xml"));
+        bundleContext.registerService(String.class, "", props);
+    }
+
+    private void writeXMLToFile(File tempXMLFile, String xml) throws IOException
+    {
+        FileOutputStream fos = new FileOutputStream(tempXMLFile);
+        try
+        {
+            fos.write(xml.getBytes());
+        }
+        finally
+        {
+            fos.close();
+        }
+    }
+}
diff --git a/pom.xml b/pom.xml
index c9b407f..14ca26e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -64,6 +64,7 @@
       <modules>
         <module>utils</module>
         <module>bundlerepository</module>
+        <module>bundlerepository.osgi-ct</module>
      </modules>
    </profile>
 
