diff --git a/pom.xml b/pom.xml
index fed2ca1..b5172c7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,8 +23,8 @@
 
     <parent>
         <groupId>org.apache.sling</groupId>
-        <artifactId>sling</artifactId>
-        <version>34</version>
+        <artifactId>sling-bundle-parent</artifactId>
+        <version>35</version>
         <relativePath />
     </parent>
 
@@ -36,7 +36,7 @@
 
   <properties>
     <sling.java.version>8</sling.java.version>
-    <org.ops4j.pax.exam.version>4.12.0</org.ops4j.pax.exam.version>
+    <org.ops4j.pax.exam.version>4.13.1</org.ops4j.pax.exam.version>
   </properties>
 
   <scm>
@@ -222,7 +222,7 @@
       <dependency>
         <groupId>org.apache.felix</groupId>
         <artifactId>org.apache.felix.framework</artifactId>
-        <version>5.6.10</version>
+        <version>6.0.3</version>
         <scope>test</scope>
       </dependency>
       <!-- Apache Sling -->
@@ -235,7 +235,7 @@
       <dependency>
         <groupId>org.apache.sling</groupId>
         <artifactId>org.apache.sling.testing.paxexam</artifactId>
-        <version>2.0.0</version>
+        <version>3.0.0</version>
         <scope>test</scope>
       </dependency>
     <!-- testing -->
diff --git a/src/test/java/org/apache/sling/jcr/contentloader/it/BasicInitialContentIT.java b/src/test/java/org/apache/sling/jcr/contentloader/it/BasicInitialContentIT.java
index 5dbd02c..8e3c281 100644
--- a/src/test/java/org/apache/sling/jcr/contentloader/it/BasicInitialContentIT.java
+++ b/src/test/java/org/apache/sling/jcr/contentloader/it/BasicInitialContentIT.java
@@ -22,66 +22,78 @@
 
 import javax.jcr.RepositoryException;
 
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.Multimap;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.junit.PaxExam;
 import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
 import org.ops4j.pax.exam.spi.reactors.PerClass;
-import org.ops4j.pax.tinybundles.core.TinyBundle;
 import org.osgi.framework.Bundle;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
-/** Basic test of a bundle that provides initial content */
+/**
+ * Basic test of a bundle that provides initial content
+ */
 @RunWith(PaxExam.class)
 @ExamReactorStrategy(PerClass.class)
 public class BasicInitialContentIT extends ContentloaderTestSupport {
 
-    protected TinyBundle setupTestBundle(TinyBundle b) throws IOException {
-        b.set(SLING_INITIAL_CONTENT_HEADER, DEFAULT_PATH_IN_BUNDLE + ";path:=" + contentRootPath);
-        addContent(b, DEFAULT_PATH_IN_BUNDLE, "basic-content.json");
-        addContent(b, DEFAULT_PATH_IN_BUNDLE, "simple-folder/test1.txt");
-        addContent(b, DEFAULT_PATH_IN_BUNDLE, "folder-with-descriptor.json");
-        addContent(b, DEFAULT_PATH_IN_BUNDLE, "folder-with-descriptor/test2.txt");
-        return b;
+    @Configuration
+    public Option[] configuration() throws IOException {
+        final String header = DEFAULT_PATH_IN_BUNDLE + ";path:=" + CONTENT_ROOT_PATH;
+        final Multimap<String, String> content = ImmutableListMultimap.of(
+            DEFAULT_PATH_IN_BUNDLE, "basic-content.json",
+            DEFAULT_PATH_IN_BUNDLE, "simple-folder/test1.txt",
+            DEFAULT_PATH_IN_BUNDLE, "folder-with-descriptor.json",
+            DEFAULT_PATH_IN_BUNDLE, "folder-with-descriptor/test2.txt"
+        );
+        final Option bundle = buildInitialContentBundle(header, content);
+        return new Option[]{
+            baseConfiguration(),
+            bundle
+        };
     }
-    
+
     @Test
     public void bundleStarted() {
-        final Bundle b = findBundle(bundleSymbolicName);
-        assertNotNull("Expecting bundle to be found:" + bundleSymbolicName, b);
-        assertEquals("Expecting bundle to be active:" + bundleSymbolicName, Bundle.ACTIVE, b.getState());
+        final Bundle b = findBundle(BUNDLE_SYMBOLICNAME);
+        assertNotNull("Expecting bundle to be found:" + BUNDLE_SYMBOLICNAME, b);
+        assertEquals("Expecting bundle to be active:" + BUNDLE_SYMBOLICNAME, Bundle.ACTIVE, b.getState());
     }
-    
+
     @Test
     public void initialContentInstalled() throws RepositoryException {
-        final String testNodePath = contentRootPath + "/basic-content/test-node"; 
-        assertTrue("Expecting initial content to be installed", session.itemExists(testNodePath)); 
-        assertEquals("Expecting foo=bar", "bar", session.getNode(testNodePath).getProperty("foo").getString()); 
+        final String testNodePath = CONTENT_ROOT_PATH + "/basic-content/test-node";
+        assertTrue("Expecting initial content to be installed", session.itemExists(testNodePath));
+        assertEquals("Expecting foo=bar", "bar", session.getNode(testNodePath).getProperty("foo").getString());
     }
 
     @Test
     public void folderWithoutDescriptor() throws RepositoryException {
-        final String folderPath = contentRootPath + "/simple-folder"; 
-        assertTrue("folder node " + folderPath + " exists", session.itemExists(folderPath)); 
-        assertEquals("folder has node type 'sling:Folder'", "sling:Folder", session.getNode(folderPath).getPrimaryNodeType().getName()); 
+        final String folderPath = CONTENT_ROOT_PATH + "/simple-folder";
+        assertTrue("folder node " + folderPath + " exists", session.itemExists(folderPath));
+        assertEquals("folder has node type 'sling:Folder'", "sling:Folder", session.getNode(folderPath).getPrimaryNodeType().getName());
 
-        final String filePath = contentRootPath + "/simple-folder/test1.txt"; 
-        assertTrue("file node " + filePath + " exists", session.itemExists(filePath)); 
-        assertEquals("file has node type 'nt:file'", "nt:file", session.getNode(filePath).getPrimaryNodeType().getName()); 
+        final String filePath = CONTENT_ROOT_PATH + "/simple-folder/test1.txt";
+        assertTrue("file node " + filePath + " exists", session.itemExists(filePath));
+        assertEquals("file has node type 'nt:file'", "nt:file", session.getNode(filePath).getPrimaryNodeType().getName());
     }
 
     @Test
     public void folderWithDescriptor() throws RepositoryException {
-        final String folderPath = contentRootPath + "/folder-with-descriptor"; 
-        assertTrue("folder node " + folderPath + " exists", session.itemExists(folderPath)); 
-        assertEquals("folder has node type 'sling:OrderedFolder'", "sling:OrderedFolder", session.getNode(folderPath).getPrimaryNodeType().getName()); 
+        final String folderPath = CONTENT_ROOT_PATH + "/folder-with-descriptor";
+        assertTrue("folder node " + folderPath + " exists", session.itemExists(folderPath));
+        assertEquals("folder has node type 'sling:OrderedFolder'", "sling:OrderedFolder", session.getNode(folderPath).getPrimaryNodeType().getName());
 
-        final String filePath = contentRootPath + "/folder-with-descriptor/test2.txt"; 
-        assertTrue("file node " + filePath + " exists", session.itemExists(filePath)); 
-        assertEquals("file has node type 'nt:file'", "nt:file", session.getNode(filePath).getPrimaryNodeType().getName()); 
+        final String filePath = CONTENT_ROOT_PATH + "/folder-with-descriptor/test2.txt";
+        assertTrue("file node " + filePath + " exists", session.itemExists(filePath));
+        assertEquals("file has node type 'nt:file'", "nt:file", session.getNode(filePath).getPrimaryNodeType().getName());
     }
 
 }
diff --git a/src/test/java/org/apache/sling/jcr/contentloader/it/ContentloaderTestSupport.java b/src/test/java/org/apache/sling/jcr/contentloader/it/ContentloaderTestSupport.java
index e5e5bca..f8e8196 100644
--- a/src/test/java/org/apache/sling/jcr/contentloader/it/ContentloaderTestSupport.java
+++ b/src/test/java/org/apache/sling/jcr/contentloader/it/ContentloaderTestSupport.java
@@ -18,34 +18,24 @@
  */
 package org.apache.sling.jcr.contentloader.it;
 
-import static org.apache.sling.testing.paxexam.SlingOptions.slingQuickstartOakTar;
-import static org.apache.sling.testing.paxexam.SlingOptions.slingResourcePresence;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-import static org.ops4j.pax.exam.CoreOptions.junitBundles;
-import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
-import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.newConfiguration;
-
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Arrays;
-import java.util.Objects;
-import java.util.UUID;
-import java.util.concurrent.TimeUnit;
+import java.util.Map;
 
 import javax.inject.Inject;
+import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
+import com.google.common.collect.Multimap;
 import org.apache.sling.jcr.api.SlingRepository;
+import org.apache.sling.resource.presence.ResourcePresence;
 import org.apache.sling.testing.paxexam.SlingOptions;
 import org.apache.sling.testing.paxexam.TestSupport;
 import org.junit.After;
 import org.junit.Before;
-import org.ops4j.pax.exam.Configuration;
 import org.ops4j.pax.exam.Option;
-import org.ops4j.pax.exam.options.CompositeOption;
-import org.ops4j.pax.exam.options.DefaultCompositeOption;
+import org.ops4j.pax.exam.options.ModifiableCompositeOption;
+import org.ops4j.pax.exam.util.Filter;
 import org.ops4j.pax.tinybundles.core.TinyBundle;
 import org.ops4j.pax.tinybundles.core.TinyBundles;
 import org.osgi.framework.Bundle;
@@ -54,6 +44,19 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.sling.testing.paxexam.SlingOptions.slingQuickstartOakTar;
+import static org.apache.sling.testing.paxexam.SlingOptions.slingResourcePresence;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.ops4j.pax.exam.CoreOptions.composite;
+import static org.ops4j.pax.exam.CoreOptions.junitBundles;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.streamBundle;
+import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.factoryConfiguration;
+import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.newConfiguration;
+import static org.ops4j.pax.tinybundles.core.TinyBundles.withBnd;
+
 public abstract class ContentloaderTestSupport extends TestSupport {
 
     @Inject
@@ -64,54 +67,52 @@
 
     protected Session session;
 
-    protected String bundleSymbolicName;
-
-    protected String contentRootPath;
-
     protected static final String SLING_INITIAL_CONTENT_HEADER = "Sling-Initial-Content";
 
+    protected static final String BUNDLE_SYMBOLICNAME = "TEST-CONTENT-BUNDLE";
+
     protected static final String DEFAULT_PATH_IN_BUNDLE = "test-initial-content";
 
+    protected static final String CONTENT_ROOT_PATH = "/test-content/" + BUNDLE_SYMBOLICNAME;
+
     private final Logger logger = LoggerFactory.getLogger(ContentloaderTestSupport.class);
 
     ContentloaderTestSupport() {
     }
 
+    @Inject
+    @Filter(value = "(path=" + CONTENT_ROOT_PATH + ")")
+    private ResourcePresence resourcePresence;
+
+    public ModifiableCompositeOption baseConfiguration() {
+        final Option contentloader = mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.jcr.contentloader").version(SlingOptions.versionResolver.getVersion("org.apache.sling", "org.apache.sling.jcr.contentloader"));
+        final ModifiableCompositeOption quickstart = quickstart().remove(contentloader);
+        return composite(
+            super.baseConfiguration(),
+            quickstart,
+            // Sling JCR ContentLoader
+            testBundle("bundle.filename"),
+            factoryConfiguration("org.apache.sling.resource.presence.internal.ResourcePresenter")
+                .put("path", CONTENT_ROOT_PATH)
+                .asOption(),
+            // testing
+            newConfiguration("org.apache.sling.jcr.base.internal.LoginAdminWhitelist")
+                .put("whitelist.bundles.regexp", "PAXEXAM-PROBE-.*")
+                .asOption(),
+            slingResourcePresence(),
+            junitBundles()
+        );
+    }
+
+    protected ModifiableCompositeOption quickstart() {
+        final int httpPort = findFreePort();
+        final String workingDirectory = workingDirectory();
+        return slingQuickstartOakTar(workingDirectory, httpPort);
+    }
+
     @Before
     public void setup() throws Exception {
-        bundleSymbolicName = "TEST-" + UUID.randomUUID();
-        contentRootPath = "/test-content/" + bundleSymbolicName;
         session = repository.loginAdministrative(null);
-
-        assertFalse("Expecting no content before test", session.itemExists(contentRootPath));
-
-        // Create, install and start a bundle that has initial content
-        try (InputStream is = getTestBundleStream()) {
-            final Bundle bundle = bundleContext.installBundle(bundleSymbolicName, is);
-            bundle.start();
-        }
-        
-		// stabilize the downstream assertions by waiting a moment for the background content loading 
-        // to be processed.  Retry the checking a few times (if necessary) since the timing is tricky.
-        String contentLoadedPath = String.format("/var/sling/bundle-content/%s", bundleSymbolicName);
-        long timeoutSeconds = 30;
-        long timeout = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(timeoutSeconds);
-        boolean retry = true;
-        do {
-        	if (session.itemExists(contentLoadedPath)) {
-        		//stop looping
-        		retry = false;
-        	} else {
-        		if (System.currentTimeMillis() > timeout) {
-			        fail("RetryLoop failed, condition is false after " + timeoutSeconds + " seconds: " 
-			                + "A content loaded node expected at " + contentLoadedPath);
-        		} else {
-                    logger.warn("Bundle content not loaded yet, retrying after a short delay, path={}", contentLoadedPath);
-                    Thread.sleep(200);
-                    session.refresh(false);
-        		}        		
-        	}
-        } while (retry);        
     }
 
     @After
@@ -119,57 +120,31 @@
         session.logout();
     }
 
-    @Configuration
-    public Option[] configuration() {
-    	//workaround to get the required jcr.base bundle into the runtime
-    	SlingOptions.versionResolver.setVersionFromProject("org.apache.sling", "org.apache.sling.jcr.base");
-    	
-        CompositeOption quickstart = (CompositeOption) quickstart();
-        final Option[] options = Arrays.stream(quickstart.getOptions()).filter(e -> !Objects.deepEquals(e,
-            mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.jcr.contentloader").version(SlingOptions.versionResolver.getVersion("org.apache.sling", "org.apache.sling.jcr.contentloader"))
-        )).toArray(Option[]::new);
-        quickstart = new DefaultCompositeOption(options);
-        return new Option[]{
-            super.baseConfiguration(),
-            quickstart,
-            // Sling JCR ContentLoader
-            testBundle("bundle.filename"),
-            // testing
-            newConfiguration("org.apache.sling.jcr.base.internal.LoginAdminWhitelist")
-                .put("whitelist.bundles.regexp", "PAXEXAM-PROBE-.*")
-                .asOption(),
-            slingResourcePresence(),
-            junitBundles()
-        };
-    }
-
-    protected Option quickstart() {
-        final int httpPort = findFreePort();
-        final String workingDirectory = workingDirectory();
-        return slingQuickstartOakTar(workingDirectory, httpPort);
-    }
-
-
-    private InputStream getTestBundleStream() throws Exception {
-        final TinyBundle bundle = TinyBundles.bundle().set(Constants.BUNDLE_SYMBOLICNAME, bundleSymbolicName);
-        return setupTestBundle(bundle).build(TinyBundles.withBnd());
-    }
-
-    abstract protected TinyBundle setupTestBundle(TinyBundle b) throws Exception;
-
     /**
      * Add content to our test bundle
      */
-    protected void addContent(TinyBundle b, String pathInBundle, String resourcePath) throws IOException {
+    protected void addContent(final TinyBundle bundle, String pathInBundle, String resourcePath) throws IOException {
         pathInBundle += "/" + resourcePath;
         resourcePath = "/initial-content/" + resourcePath;
         try (final InputStream is = getClass().getResourceAsStream(resourcePath)) {
             assertNotNull("Expecting resource to be found:" + resourcePath, is);
             logger.info("Adding resource to bundle, path={}, resource={}", pathInBundle, resourcePath);
-            b.add(pathInBundle, is);
+            bundle.add(pathInBundle, is);
         }
     }
 
+    protected Option buildInitialContentBundle(final String header, final Multimap<String, String> content) throws IOException {
+        final TinyBundle bundle = TinyBundles.bundle();
+        bundle.set(Constants.BUNDLE_SYMBOLICNAME, BUNDLE_SYMBOLICNAME);
+        bundle.set(SLING_INITIAL_CONTENT_HEADER, header);
+        for (final Map.Entry<String, String> entry : content.entries()) {
+            addContent(bundle, entry.getKey(), entry.getValue());
+        }
+        return streamBundle(
+            bundle.build(withBnd())
+        ).start();
+    }
+
     protected Bundle findBundle(final String symbolicName) {
         for (final Bundle bundle : bundleContext.getBundles()) {
             if (symbolicName.equals(bundle.getSymbolicName())) {
@@ -179,4 +154,10 @@
         return null;
     }
 
+    protected void assertProperty(final Session session, final String path, final String expected) throws RepositoryException {
+        assertTrue("Expecting property " + path, session.itemExists(path));
+        final String actual = session.getProperty(path).getString();
+        assertEquals("Expecting correct value at " + path, expected, actual);
+    }
+
 }
diff --git a/src/test/java/org/apache/sling/jcr/contentloader/it/I18nInitialContentIT.java b/src/test/java/org/apache/sling/jcr/contentloader/it/I18nInitialContentIT.java
index 2d8238c..72a62d2 100644
--- a/src/test/java/org/apache/sling/jcr/contentloader/it/I18nInitialContentIT.java
+++ b/src/test/java/org/apache/sling/jcr/contentloader/it/I18nInitialContentIT.java
@@ -24,12 +24,15 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.nodetype.NodeType;
 
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.Multimap;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.junit.PaxExam;
 import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
 import org.ops4j.pax.exam.spi.reactors.PerClass;
-import org.ops4j.pax.tinybundles.core.TinyBundle;
 import org.osgi.framework.Bundle;
 
 import static org.junit.Assert.assertEquals;
@@ -37,43 +40,52 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
-/** Basic test of a bundle that provides initial content */
+/**
+ * Basic test of a bundle that provides I18N initial content
+ */
 @RunWith(PaxExam.class)
 @ExamReactorStrategy(PerClass.class)
 public class I18nInitialContentIT extends ContentloaderTestSupport {
 
-    protected TinyBundle setupTestBundle(TinyBundle b) throws IOException {
-        b.set(SLING_INITIAL_CONTENT_HEADER, DEFAULT_PATH_IN_BUNDLE + ";ignoreImportProviders:=json;path:=" + contentRootPath);
-        addContent(b, DEFAULT_PATH_IN_BUNDLE, "i18n/en.json");
-        addContent(b, DEFAULT_PATH_IN_BUNDLE, "i18n/en.json.xml");
-        return b;
+    @Configuration
+    public Option[] configuration() throws IOException {
+        final String header = DEFAULT_PATH_IN_BUNDLE + ";ignoreImportProviders:=json;path:=" + CONTENT_ROOT_PATH;
+        final Multimap<String, String> content = ImmutableListMultimap.of(
+            DEFAULT_PATH_IN_BUNDLE, "i18n/en.json",
+            DEFAULT_PATH_IN_BUNDLE, "i18n/en.json.xml"
+        );
+        final Option bundle = buildInitialContentBundle(header, content);
+        return new Option[]{
+            baseConfiguration(),
+            bundle
+        };
     }
-    
+
     @Test
     public void bundleStarted() {
-        final Bundle b = findBundle(bundleSymbolicName);
-        assertNotNull("Expecting bundle to be found:" + bundleSymbolicName, b);
-        assertEquals("Expecting bundle to be active:" + bundleSymbolicName, Bundle.ACTIVE, b.getState());
+        final Bundle b = findBundle(BUNDLE_SYMBOLICNAME);
+        assertNotNull("Expecting bundle to be found:" + BUNDLE_SYMBOLICNAME, b);
+        assertEquals("Expecting bundle to be active:" + BUNDLE_SYMBOLICNAME, Bundle.ACTIVE, b.getState());
     }
-    
+
     @Test
     public void i18nJsonFile() throws RepositoryException {
-        final String filePath = contentRootPath + "/i18n/en.json"; 
-        assertTrue("file node " + filePath + " exists", session.itemExists(filePath)); 
+        final String filePath = CONTENT_ROOT_PATH + "/i18n/en.json";
+        assertTrue("file node " + filePath + " exists", session.itemExists(filePath));
         Node node = session.getNode(filePath);
         assertEquals("file has node type 'nt:file'", "nt:file", node.getPrimaryNodeType().getName());
-        
+
         boolean mixLanguageFound = false;
         for (NodeType mixin : node.getMixinNodeTypes()) {
             if ("mix:language".equals(mixin.getName())) {
                 mixLanguageFound = true;
             }
         }
-        assertTrue("file has mixin 'mix:language'", mixLanguageFound); 
+        assertTrue("file has mixin 'mix:language'", mixLanguageFound);
         assertEquals("file has property 'en'", "en", node.getProperty("jcr:language").getString());
 
-        final String descriptorPath = contentRootPath + "/i18n/en.json.xml"; 
-        assertFalse("descriptor " + descriptorPath + " does not exists", session.itemExists(descriptorPath)); 
+        final String descriptorPath = CONTENT_ROOT_PATH + "/i18n/en.json.xml";
+        assertFalse("descriptor " + descriptorPath + " does not exists", session.itemExists(descriptorPath));
     }
 
 }
diff --git a/src/test/java/org/apache/sling/jcr/contentloader/it/OrderedInitialContentIT.java b/src/test/java/org/apache/sling/jcr/contentloader/it/OrderedInitialContentIT.java
index 268fc74..64e2ae7 100644
--- a/src/test/java/org/apache/sling/jcr/contentloader/it/OrderedInitialContentIT.java
+++ b/src/test/java/org/apache/sling/jcr/contentloader/it/OrderedInitialContentIT.java
@@ -21,47 +21,52 @@
 import java.io.IOException;
 
 import javax.jcr.RepositoryException;
-import javax.jcr.Session;
 
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.Multimap;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.junit.PaxExam;
 import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
 import org.ops4j.pax.exam.spi.reactors.PerClass;
-import org.ops4j.pax.tinybundles.core.TinyBundle;
 import org.osgi.framework.Bundle;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
 
-/** Test the SLING-5682 ordered content loading */
+/**
+ * Test the SLING-5682 ordered content loading
+ */
 @RunWith(PaxExam.class)
 @ExamReactorStrategy(PerClass.class)
 public class OrderedInitialContentIT extends ContentloaderTestSupport {
 
-    protected TinyBundle setupTestBundle(TinyBundle b) throws IOException {
-        b.set(SLING_INITIAL_CONTENT_HEADER, DEFAULT_PATH_IN_BUNDLE + ";path:=" + contentRootPath);
-        addContent(b, DEFAULT_PATH_IN_BUNDLE, "ordered-content.ordered-json");
-        return b;
+    @Configuration
+    public Option[] configuration() throws IOException {
+        final String header = DEFAULT_PATH_IN_BUNDLE + ";path:=" + CONTENT_ROOT_PATH;
+        final Multimap<String, String> content = ImmutableListMultimap.of(
+            DEFAULT_PATH_IN_BUNDLE, "ordered-content.ordered-json"
+        );
+        final Option bundle = buildInitialContentBundle(header, content);
+        return new Option[]{
+            baseConfiguration(),
+            bundle
+        };
     }
-    
+
     @Test
     public void bundleStarted() {
-        final Bundle b = findBundle(bundleSymbolicName);
-        assertNotNull("Expecting bundle to be found:" + bundleSymbolicName, b);
-        assertEquals("Expecting bundle to be active:" + bundleSymbolicName, Bundle.ACTIVE, b.getState());
+        final Bundle b = findBundle(BUNDLE_SYMBOLICNAME);
+        assertNotNull("Expecting bundle to be found:" + BUNDLE_SYMBOLICNAME, b);
+        assertEquals("Expecting bundle to be active:" + BUNDLE_SYMBOLICNAME, Bundle.ACTIVE, b.getState());
     }
-    
-    private void assertProperty(Session session, String path, String expected) throws RepositoryException {
-        assertTrue("Expecting property " + path, session.itemExists(path));
-        final String actual = session.getProperty(path).getString();
-        assertEquals("Expecting correct value at " + path, expected, actual);
-    }
-    
+
     @Test
     public void initialContentInstalled() throws RepositoryException {
-        assertProperty(session, contentRootPath + "/ordered-content/first/title", "This comes first"); 
-        assertProperty(session, contentRootPath + "/ordered-content/second/title", "This comes second"); 
+        assertProperty(session, CONTENT_ROOT_PATH + "/ordered-content/first/title", "This comes first");
+        assertProperty(session, CONTENT_ROOT_PATH + "/ordered-content/second/title", "This comes second");
     }
-}
\ No newline at end of file
+
+}
diff --git a/src/test/java/org/apache/sling/jcr/contentloader/it/SLING7268InitialContentIT.java b/src/test/java/org/apache/sling/jcr/contentloader/it/SLING7268InitialContentIT.java
index a4f9914..f7e0e57 100644
--- a/src/test/java/org/apache/sling/jcr/contentloader/it/SLING7268InitialContentIT.java
+++ b/src/test/java/org/apache/sling/jcr/contentloader/it/SLING7268InitialContentIT.java
@@ -20,6 +20,7 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -34,16 +35,19 @@
 import javax.jcr.security.AccessControlPolicy;
 import javax.jcr.security.Privilege;
 
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.Multimap;
 import org.apache.jackrabbit.api.security.user.Authorizable;
 import org.apache.jackrabbit.api.security.user.Group;
 import org.apache.jackrabbit.api.security.user.UserManager;
 import org.apache.sling.jcr.base.util.AccessControlUtil;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.junit.PaxExam;
 import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
 import org.ops4j.pax.exam.spi.reactors.PerClass;
-import org.ops4j.pax.tinybundles.core.TinyBundle;
 import org.osgi.framework.Bundle;
 
 import static org.junit.Assert.assertEquals;
@@ -51,32 +55,39 @@
 import static org.junit.Assert.assertTrue;
 
 /**
- * test of a bundle that provides initial content that creates a user/group and
- * defines an ace for those principals within the same transaction
+ * test of a bundle that provides initial content that creates a user/group and defines an ace
+ * for those principals within the same transaction
+
  */
 @RunWith(PaxExam.class)
 @ExamReactorStrategy(PerClass.class)
 public class SLING7268InitialContentIT extends ContentloaderTestSupport {
 
-    protected TinyBundle setupTestBundle(TinyBundle b) throws IOException {
-        b.set(SLING_INITIAL_CONTENT_HEADER, DEFAULT_PATH_IN_BUNDLE + ";path:=" + contentRootPath);
-        addContent(b, DEFAULT_PATH_IN_BUNDLE, "SLING-7268.json");
-        return b;
+    @Configuration
+    public Option[] configuration() throws IOException {
+        final String header = DEFAULT_PATH_IN_BUNDLE + ";path:=" + CONTENT_ROOT_PATH;
+        final Multimap<String, String> content = ImmutableListMultimap.of(
+            DEFAULT_PATH_IN_BUNDLE, "SLING-7268.json"
+        );
+        final Option bundle = buildInitialContentBundle(header, content);
+        return new Option[]{
+            baseConfiguration(),
+            bundle
+        };
     }
 
     @Test
     public void bundleStarted() {
-        final Bundle b = findBundle(bundleSymbolicName);
-        assertNotNull("Expecting bundle to be found:" + bundleSymbolicName, b);
-        assertEquals("Expecting bundle to be active:" + bundleSymbolicName, Bundle.ACTIVE, b.getState());
+        final Bundle b = findBundle(BUNDLE_SYMBOLICNAME);
+        assertNotNull("Expecting bundle to be found:" + BUNDLE_SYMBOLICNAME, b);
+        assertEquals("Expecting bundle to be active:" + BUNDLE_SYMBOLICNAME, Bundle.ACTIVE, b.getState());
     }
 
     @Test
     public void initialContentInstalled() throws RepositoryException {
-        final String folderPath = contentRootPath + "/SLING-7268";
+        final String folderPath = CONTENT_ROOT_PATH + "/SLING-7268";
         assertTrue("Expecting initial content to be installed", session.itemExists(folderPath));
-        assertEquals("folder has node type 'sling:Folder'", "sling:Folder",
-                session.getNode(folderPath).getPrimaryNodeType().getName());
+        assertEquals("folder has node type 'sling:Folder'", "sling:Folder", session.getNode(folderPath).getPrimaryNodeType().getName());
     }
 
     @Test
@@ -98,21 +109,18 @@
         assertEquals("sling7268_user", firstMember.getID());
     }
 
-
     @Test
     public void aceCreated() throws RepositoryException {
-        final String folderPath = contentRootPath + "/SLING-7268";
+        final String folderPath = CONTENT_ROOT_PATH + "/SLING-7268";
         assertTrue("Expecting test folder to exist", session.itemExists(folderPath));
+
         AccessControlManager accessControlManager = AccessControlUtil.getAccessControlManager(session);
         AccessControlPolicy[] policies = accessControlManager.getPolicies(folderPath);
         List<AccessControlEntry> allEntries = new ArrayList<AccessControlEntry>();
         for (AccessControlPolicy accessControlPolicy : policies) {
             if (accessControlPolicy instanceof AccessControlList) {
-                AccessControlEntry[] accessControlEntries = ((AccessControlList) accessControlPolicy)
-                        .getAccessControlEntries();
-                for (AccessControlEntry accessControlEntry : accessControlEntries) {
-                    allEntries.add(accessControlEntry);
-                }
+                AccessControlEntry[] accessControlEntries = ((AccessControlList) accessControlPolicy).getAccessControlEntries();
+                allEntries.addAll(Arrays.asList(accessControlEntries));
             }
         }
         assertEquals(3, allEntries.size());
@@ -121,7 +129,7 @@
             aceMap.put(accessControlEntry.getPrincipal().getName(), accessControlEntry);
         }
 
-        // check ACE for sling7268_user
+        //check ACE for sling7268_user
         AccessControlEntry testUserAce = aceMap.get("sling7268_user");
         assertNotNull("Expected ACE for test user", testUserAce);
         assertEquals("sling7268_user", testUserAce.getPrincipal().getName());
@@ -135,7 +143,7 @@
         assertTrue("Expecting granted read privilege", privilegeNames.contains("jcr:read"));
         assertTrue("Expecting granted write privilege", privilegeNames.contains("jcr:write"));
 
-        // check ACE for sling7268_group
+        //check ACE for sling7268_group
         AccessControlEntry testGroupAce = aceMap.get("sling7268_group");
         assertNotNull("Expected ACE for test user", testGroupAce);
         assertEquals("sling7268_group", testGroupAce.getPrincipal().getName());
@@ -146,10 +154,9 @@
         for (Privilege privilege : privileges) {
             privilegeNames.add(privilege.getName());
         }
-        assertTrue("Expecting granted modifyAccessControl privilege",
-                privilegeNames.contains("jcr:modifyAccessControl"));
+        assertTrue("Expecting granted modifyAccessControl privilege", privilegeNames.contains("jcr:modifyAccessControl"));
 
-        // check ACE for everyone group
+        //check ACE for everyone group
         AccessControlEntry everyoneAce = aceMap.get("everyone");
         assertNotNull("Expected ACE for everyone", everyoneAce);
         assertEquals("everyone", everyoneAce.getPrincipal().getName());
@@ -159,4 +166,5 @@
 
         assertEquals("Expecting granted read privilege", "jcr:read", privileges[0].getName());
     }
+
 }
diff --git a/src/test/java/org/apache/sling/jcr/contentloader/it/SLING8118InitialContentIT.java b/src/test/java/org/apache/sling/jcr/contentloader/it/SLING8118InitialContentIT.java
index 21a01d9..12c96db 100644
--- a/src/test/java/org/apache/sling/jcr/contentloader/it/SLING8118InitialContentIT.java
+++ b/src/test/java/org/apache/sling/jcr/contentloader/it/SLING8118InitialContentIT.java
@@ -18,12 +18,9 @@
  */
 package org.apache.sling.jcr.contentloader.it;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -39,6 +36,8 @@
 import javax.jcr.security.AccessControlPolicy;
 import javax.jcr.security.Privilege;
 
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.Multimap;
 import org.apache.jackrabbit.api.security.JackrabbitAccessControlEntry;
 import org.apache.jackrabbit.api.security.user.Authorizable;
 import org.apache.jackrabbit.api.security.user.Group;
@@ -46,39 +45,49 @@
 import org.apache.sling.jcr.base.util.AccessControlUtil;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.junit.PaxExam;
 import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
 import org.ops4j.pax.exam.spi.reactors.PerClass;
-import org.ops4j.pax.tinybundles.core.TinyBundle;
 import org.osgi.framework.Bundle;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
 /**
- * test of a bundle that provides initial content that defines an ace with
- * restrictions
+ * test of a bundle that provides initial content that defines an ace with restrictions
  */
 @RunWith(PaxExam.class)
 @ExamReactorStrategy(PerClass.class)
 public class SLING8118InitialContentIT extends ContentloaderTestSupport {
 
-    protected TinyBundle setupTestBundle(TinyBundle b) throws IOException {
-        b.set(SLING_INITIAL_CONTENT_HEADER, DEFAULT_PATH_IN_BUNDLE + ";path:=" + contentRootPath);
-        addContent(b, DEFAULT_PATH_IN_BUNDLE, "SLING-8118.json");
-        return b;
+    @Configuration
+    public Option[] configuration() throws IOException {
+        final String header = DEFAULT_PATH_IN_BUNDLE + ";path:=" + CONTENT_ROOT_PATH;
+        final Multimap<String, String> content = ImmutableListMultimap.of(
+            DEFAULT_PATH_IN_BUNDLE, "SLING-8118.json"
+        );
+        final Option bundle = buildInitialContentBundle(header, content);
+        return new Option[]{
+            baseConfiguration(),
+            bundle
+        };
     }
 
     @Test
     public void bundleStarted() {
-        final Bundle b = findBundle(bundleSymbolicName);
-        assertNotNull("Expecting bundle to be found:" + bundleSymbolicName, b);
-        assertEquals("Expecting bundle to be active:" + bundleSymbolicName, Bundle.ACTIVE, b.getState());
+        final Bundle b = findBundle(BUNDLE_SYMBOLICNAME);
+        assertNotNull("Expecting bundle to be found:" + BUNDLE_SYMBOLICNAME, b);
+        assertEquals("Expecting bundle to be active:" + BUNDLE_SYMBOLICNAME, Bundle.ACTIVE, b.getState());
     }
 
     @Test
     public void initialContentInstalled() throws RepositoryException {
-        final String folderPath = contentRootPath + "/SLING-8118";
+        final String folderPath = CONTENT_ROOT_PATH + "/SLING-8118";
         assertTrue("Expecting initial content to be installed", session.itemExists(folderPath));
-        assertEquals("folder has node type 'sling:Folder'", "sling:Folder",
-                session.getNode(folderPath).getPrimaryNodeType().getName());
+        assertEquals("folder has node type 'sling:Folder'", "sling:Folder", session.getNode(folderPath).getPrimaryNodeType().getName());
     }
 
     @Test
@@ -102,7 +111,7 @@
 
     @Test
     public void aceWithRestrictionsCreated() throws RepositoryException {
-        final String folderPath = contentRootPath + "/SLING-8118";
+        final String folderPath = CONTENT_ROOT_PATH + "/SLING-8118";
         assertTrue("Expecting test folder to exist", session.itemExists(folderPath));
 
         AccessControlManager accessControlManager = AccessControlUtil.getAccessControlManager(session);
@@ -110,11 +119,8 @@
         List<AccessControlEntry> allEntries = new ArrayList<AccessControlEntry>();
         for (AccessControlPolicy accessControlPolicy : policies) {
             if (accessControlPolicy instanceof AccessControlList) {
-                AccessControlEntry[] accessControlEntries = ((AccessControlList) accessControlPolicy)
-                        .getAccessControlEntries();
-                for (AccessControlEntry accessControlEntry : accessControlEntries) {
-                    allEntries.add(accessControlEntry);
-                }
+                AccessControlEntry[] accessControlEntries = ((AccessControlList) accessControlPolicy).getAccessControlEntries();
+                allEntries.addAll(Arrays.asList(accessControlEntries));
             }
         }
         assertEquals(3, allEntries.size());
@@ -123,7 +129,7 @@
             aceMap.put(accessControlEntry.getPrincipal().getName(), accessControlEntry);
         }
 
-        // check ACE for sling8118_user
+        //check ACE for sling8118_user
         AccessControlEntry testUserAce = aceMap.get("sling8118_user");
         assertNotNull("Expected ACE for test user", testUserAce);
         assertEquals("sling8118_user", testUserAce.getPrincipal().getName());
@@ -137,7 +143,7 @@
         assertTrue("Expecting granted read privilege", privilegeNames.contains("jcr:read"));
         assertTrue("Expecting granted write privilege", privilegeNames.contains("jcr:write"));
 
-        // check restrictions
+        //check restrictions
         assertTrue(testUserAce instanceof JackrabbitAccessControlEntry);
         JackrabbitAccessControlEntry testUserJAce = (JackrabbitAccessControlEntry) testUserAce;
         String[] testUserRestrictionNames = testUserJAce.getRestrictionNames();
@@ -148,7 +154,7 @@
         assertNotNull(globRestriction);
         assertEquals("glob1", globRestriction.getString());
 
-        // check ACE for sling8118_group
+        //check ACE for sling8118_group
         AccessControlEntry testGroupAce = aceMap.get("sling8118_group");
         assertNotNull("Expected ACE for test user", testGroupAce);
         assertEquals("sling8118_group", testGroupAce.getPrincipal().getName());
@@ -159,10 +165,9 @@
         for (Privilege privilege : privileges) {
             privilegeNames.add(privilege.getName());
         }
-        assertTrue("Expecting granted modifyAccessControl privilege",
-                privilegeNames.contains("jcr:modifyAccessControl"));
+        assertTrue("Expecting granted modifyAccessControl privilege", privilegeNames.contains("jcr:modifyAccessControl"));
 
-        // check restrictions
+        //check restrictions
         assertTrue(testGroupAce instanceof JackrabbitAccessControlEntry);
         JackrabbitAccessControlEntry testGroupJAce = (JackrabbitAccessControlEntry) testGroupAce;
         String[] testGroupRestrictionNames = testGroupJAce.getRestrictionNames();
@@ -175,7 +180,8 @@
         assertEquals("name1", restrictions[0].getString());
         assertEquals("name2", restrictions[1].getString());
 
-        // check ACE for everyone group
+
+        //check ACE for everyone group
         AccessControlEntry everyoneAce = aceMap.get("everyone");
         assertNotNull("Expected ACE for everyone", everyoneAce);
         assertEquals("everyone", everyoneAce.getPrincipal().getName());
@@ -185,11 +191,12 @@
 
         assertEquals("Expecting granted read privilege", "jcr:read", privileges[0].getName());
 
-        // check restrictions
+        //check restrictions
         assertTrue(everyoneAce instanceof JackrabbitAccessControlEntry);
         JackrabbitAccessControlEntry everyoneJAce = (JackrabbitAccessControlEntry) everyoneAce;
         String[] everyoneRestrictionNames = everyoneJAce.getRestrictionNames();
         assertNotNull(everyoneRestrictionNames);
         assertEquals(0, everyoneRestrictionNames.length);
     }
+
 }
