You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by dk...@apache.org on 2020/07/30 18:18:10 UTC

[sling-org-apache-sling-app-cms] 03/18: Adding migrated Feature model files

This is an automated email from the ASF dual-hosted git repository.

dklco pushed a commit to branch SLING-8913-multiple-instance-types
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-app-cms.git

commit c1b6527204d355037eae9c4fcccb46d422c624fa
Author: Dan Klco <dk...@apache.org>
AuthorDate: Fri Jul 24 11:36:27 2020 -0400

    Adding migrated Feature model files
---
 feature/pom.xml                                    | 149 +++++++
 feature/src/main/features/boot_boot.json           | 134 +++++++
 feature/src/main/features/cms_cms.json             | 328 +++++++++++++++
 .../src/main/features/composum_composum-nodes.json |  35 ++
 .../src/main/features/healthcheck_healthcheck.json | 103 +++++
 feature/src/main/features/launchpad_launchpad.json |  19 +
 feature/src/main/features/oak_oak.json             | 124 ++++++
 feature/src/main/features/repoinit_repoinit.json   |  74 ++++
 feature/src/main/features/scripting_sling.json     |  92 +++++
 .../features/sling-caconfig_sling-caconfig.json    |  28 ++
 .../features/sling-discovery_sling-discovery.json  |  45 +++
 .../src/main/features/sling-event_sling-event.json |  32 ++
 ...els-jacksonexporter_models-jacksonexporter.json |  25 ++
 .../sling-validation_sling-validation.json         |  36 ++
 feature/src/main/features/sling_sling.json         | 443 +++++++++++++++++++++
 .../src/main/features/standalone_standalone.json   |  16 +
 feature/src/main/features/webapp_webapp.json       |   4 +
 .../apache/sling/launchpad/LaunchpadReadyRule.java | 121 ++++++
 .../java/org/apache/sling/launchpad/SmokeIT.java   | 195 +++++++++
 .../org/apache/sling/launchpad/package-info.java   |  30 ++
 20 files changed, 2033 insertions(+)

diff --git a/feature/pom.xml b/feature/pom.xml
new file mode 100644
index 0000000..6c70994
--- /dev/null
+++ b/feature/pom.xml
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+        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">
+
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>org.apache.sling.cms</artifactId>
+        <groupId>org.apache.sling</groupId>
+        <version>0.16.3-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>org.apache.sling.cms.fmconverter</artifactId>
+    <name>Apache Sling - CMS Feature Model</name>
+
+    <properties>
+        <sling.java.version>8</sling.java.version>
+        <IT.expected.bundles.count>208</IT.expected.bundles.count>
+        <cms.version>${project.parent.version}</cms.version>
+        <composum.version>1.12.0</composum.version>
+        <jackrabbit.version>2.20.0</jackrabbit.version>
+        <jackson.version>2.11.1</jackson.version>
+        <oak.version>1.26.0</oak.version>
+        <slf4j.version>1.7.25</slf4j.version>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>ianal-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>verify-legal-files</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-clean-plugin</artifactId>
+                <configuration>
+                    <filesets>
+                        <fileset>
+                            <directory>${basedir}</directory>
+                            <includes>
+                                <include>sling/**</include>
+                                <include>coverage.ec</include>
+                                <include>launcher/**</include>
+                            </includes>
+                        </fileset>
+                    </filesets>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.sling</groupId>
+                <artifactId>slingfeature-maven-plugin</artifactId>
+                <version>1.3.0</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <framework>
+                        <groupId>org.apache.felix</groupId>
+                        <artifactId>org.apache.felix.framework</artifactId>
+                        <version>6.0.3</version>
+                    </framework>
+                    <aggregates>
+                        <aggregate>
+                            <classifier>slingcms</classifier>
+                            <filesInclude>**/*.json</filesInclude>
+                            <title>Sling CMS</title>
+                        </aggregate>
+                    </aggregates>
+                    <scans>
+                        <scan>
+                            <includeClassifier>slingcms</includeClassifier>
+                        </scan>
+                    </scans>
+                    <archives>
+                        <archive>
+                            <classifier>slingcms_far</classifier>
+                            <includeClassifier>slingcms</includeClassifier>
+                        </archive>
+                    </archives>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>aggregate-features</id>
+                        <phase>prepare-package</phase>
+                        <goals>
+                            <goal>aggregate-features</goal>
+                            <!-- <goal>analyse-features</goal> -->
+                            <goal>attach-features</goal>
+                            <goal>attach-featurearchives</goal>
+                        </goals>
+                        <configuration>
+                            <replacePropertyVariables>cms.version,composum.version,jackrabbit.version,jackson.version,oak.version,slf4j.version</replacePropertyVariables>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <!-- Extend RAT configuration from parent pom -->
+                    <groupId>org.apache.rat</groupId>
+                    <artifactId>apache-rat-plugin</artifactId>
+                    <configuration>
+                        <excludes combine.children="append">
+                            <!-- Exclude sling instance -->
+                            <exclude>sling/**</exclude>
+                            <exclude>launcher/**</exclude>
+                        </excludes>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.10</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.utils</artifactId>
+            <version>1.11.2</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/feature/src/main/features/boot_boot.json b/feature/src/main/features/boot_boot.json
new file mode 100644
index 0000000..0fbf079
--- /dev/null
+++ b/feature/src/main/features/boot_boot.json
@@ -0,0 +1,134 @@
+
+{
+    "id":"org.apache.sling:org.apache.sling.cms.fmconverter:slingfeature:boot:0.16.3-SNAPSHOT",
+    "variables":{
+        "slf4j.version":"1.7.25"
+    },
+    "bundles":[
+        {
+            "id":"org.apache.aries:org.apache.aries.util:1.1.3",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.commons:commons-lang3:3.9",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.felix:org.apache.felix.configadmin:1.9.16",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.felix:org.apache.felix.converter:1.0.14",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.felix:org.apache.felix.eventadmin:1.5.0",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.geronimo.specs:geronimo-annotation_1.3_spec:1.1",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.geronimo.specs:geronimo-atinject_1.0_spec:1.1",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.geronimo.specs:geronimo-ws-metadata_2.0_spec:1.1.3",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.servicemix.bundles:org.apache.servicemix.bundles.jaxb-impl:2.2.11_1",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.servicemix.bundles:org.apache.servicemix.bundles.saaj-impl:1.3.23_2",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.servicemix.specs:org.apache.servicemix.specs.jaxb-api-2.2:2.9.0",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.servicemix.specs:org.apache.servicemix.specs.jaxws-api-2.2:2.9.0",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.servicemix.specs:org.apache.servicemix.specs.saaj-api-1.3:2.8.0",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.commons.johnzon:1.2.2",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.commons.log:5.1.12",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.commons.logservice:1.1.0",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.commons.osgi:2.4.0",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.installer.core:3.11.2",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.installer.factory.configuration:1.3.2",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.installer.provider.file:1.2.2",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.javax.activation:0.1.0",
+            "start-order":"1"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.settings:1.3.10",
+            "start-order":"1"
+        },
+        {
+            "id":"org.jvnet.staxex:stax-ex:1.7.6",
+            "start-order":"1"
+        },
+        {
+            "id":"org.osgi:org.osgi.service.log:1.4.0",
+            "start-order":"1"
+        },
+        {
+            "id":"org.osgi:org.osgi.util.function:1.1.0",
+            "start-order":"1"
+        },
+        {
+            "id":"org.osgi:org.osgi.util.promise:1.1.1",
+            "start-order":"1"
+        },
+        {
+            "id":"org.osgi:org.osgi.util.pushstream:1.0.1",
+            "start-order":"1"
+        },
+        {
+            "id":"org.slf4j:jcl-over-slf4j:1.7.25",
+            "start-order":"1"
+        },
+        {
+            "id":"org.slf4j:log4j-over-slf4j:1.7.25",
+            "start-order":"1"
+        },
+        {
+            "id":"org.slf4j:slf4j-api:1.7.25",
+            "start-order":"1"
+        }
+    ],
+    "framework-properties":{
+        "sling.run.mode.install.options":"oak_tar,oak_mongo",
+        "localIndexDir":"${sling.home}/repository/index",
+        "repository.home":"${sling.home}/repository"
+    }
+}
\ No newline at end of file
diff --git a/feature/src/main/features/cms_cms.json b/feature/src/main/features/cms_cms.json
new file mode 100644
index 0000000..cd0a963
--- /dev/null
+++ b/feature/src/main/features/cms_cms.json
@@ -0,0 +1,328 @@
+
+{
+    "id":"org.apache.sling:org.apache.sling.cms.fmconverter:slingfeature:cms:0.16.3-SNAPSHOT",
+    "variables":{
+        "oak.version":"1.26.0",
+        "cms.version":"0.16.3-SNAPSHOT"
+    },
+    "bundles":[
+        {
+            "id":"com.github.livesense:org.liveSense.fragment.sun.misc:1.0.5",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.cms.api:0.16.3-SNAPSHOT",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.cms.ui:0.16.3-SNAPSHOT",
+            "start-order":"5"
+        },
+        {
+            "id":"com.vladsch.flexmark:flexmark-osgi:0.61.24",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.cocoon:cocoon-serializers-charsets:1.0.2",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.commons:commons-compress:1.20",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.commons:commons-csv:1.8",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.commons:commons-email:1.5",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.commons:commons-math3:3.6.1",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:oak-auth-external:1.26.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:oak-auth-ldap:1.26.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.servicemix.bundles:org.apache.servicemix.bundles.xmlbeans:3.0.2_1",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.fileoptim:0.9.4",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.resourcemerger:1.3.10",
+            "start-order":"15"
+        },
+        {
+            "id":"org.jsoup:jsoup:1.13.1",
+            "start-order":"15"
+        },
+        {
+            "id":"com.sun.mail:javax.mail:1.6.2",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.commons:commons-text:1.8",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.servicemix.bundles:org.apache.servicemix.bundles.jasypt:1.9.3_1",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.servicemix.bundles:org.apache.servicemix.bundles.poi:4.1.1_1",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.cms.core:0.16.3-SNAPSHOT",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.cms.reference:0.16.3-SNAPSHOT",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.cms.transformer:0.16.3-SNAPSHOT",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.commons.crypto:1.0.0",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.commons.html:1.1.0",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.commons.messaging.mail:1.0.0",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.commons.messaging:1.0.0",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.rewriter:1.2.2",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.tika:tika-bundle:1.22",
+            "start-order":"20"
+        },
+        {
+            "id":"org.codehaus.groovy:groovy-all:2.4.19",
+            "start-order":"20"
+        }
+    ],
+    "configurations":{
+        "org.apache.sling.servlets.get.DefaultGetServlet":{
+            "index.files":[
+                "index",
+                "index.html"
+            ],
+            "aliases":[
+                ""
+            ],
+            "enable.html":false,
+            "json.maximumresults:Integer":"200",
+            "enable.txt":false,
+            "enable.xml":false,
+            "index":false,
+            "enable.json":true,
+            "ecmaSuport":true
+        },
+        "org.apache.felix.hc.generalchecks.JmxAttributeCheck~index":{
+            "mbean.name":"org.apache.jackrabbit.oak:name=async,type=IndexStats",
+            "hc.tags":[
+                "oak",
+                "system-resources"
+            ],
+            "hc.name":"Jackrabbit Oak - Index",
+            "attribute.value.constraint":"false",
+            "attribute.name":"Failing",
+            "statusForFailedContraint":"CRITICAL"
+        },
+        "org.apache.felix.hc.generalchecks.JmxAttributeCheck~jobqueue":{
+            "mbean.name":"org.apache.sling:type=queues,name=AllQueues",
+            "hc.tags":[
+                "sling",
+                "system-resources"
+            ],
+            "hc.name":"Sling - Job Queue",
+            "attribute.value.constraint":"< 1000",
+            "attribute.name":"NumberOfQueuedJobs",
+            "statusForFailedContraint":"WARN"
+        },
+        "org.apache.felix.hc.generalchecks.JmxAttributeCheck~luceneindex":{
+            "mbean.name":"org.apache.jackrabbit.oak:name=Lucene Index statistics,type=LuceneIndex",
+            "hc.tags":[
+                "oak",
+                "system-resources"
+            ],
+            "hc.name":"Jackrabbit Oak - Lucene Index",
+            "attribute.value.constraint":"false",
+            "attribute.name":"Failing",
+            "statusForFailedContraint":"CRITICAL"
+        },
+        "org.apache.felix.hc.generalchecks.JmxAttributeCheck~requestdurationcritical":{
+            "mbean.name":"org.apache.sling:type=engine,service=RequestProcessor",
+            "hc.tags":[
+                "sling",
+                "system-resources"
+            ],
+            "hc.name":"Sling - StdDev Request Duration (CRITICAL)",
+            "attribute.value.constraint":"matches (1|2|3|4)?\\d?\\d\\..*",
+            "attribute.name":"StandardDeviationDurationMsec",
+            "statusForFailedContraint":"CRITICAL"
+        },
+        "org.apache.felix.hc.generalchecks.JmxAttributeCheck~requestdurationwarn":{
+            "mbean.name":"org.apache.sling:type=engine,service=RequestProcessor",
+            "hc.tags":[
+                "sling",
+                "system-resources"
+            ],
+            "hc.name":"Sling - StdDev Request Duration (WARN)",
+            "attribute.value.constraint":"matches (1)?\\d?\\d\\..*",
+            "attribute.name":"StandardDeviationDurationMsec",
+            "statusForFailedContraint":"WARN"
+        },
+        "org.apache.felix.hc.generalchecks.JmxAttributeCheck~slowqueries":{
+            "mbean.name":"org.apache.jackrabbit.oak:name=Oak Query Statistics,type=QueryStats",
+            "hc.tags":[
+                "oak",
+                "system-resources"
+            ],
+            "hc.name":"Jackrabbit Oak - Slow Queries",
+            "attribute.value.constraint":"0",
+            "attribute.name":"SlowQueriesQueueSize",
+            "statusForFailedContraint":"WARN"
+        },
+        "org.apache.sling.hc.support.DefaultLoginsHealthCheck~slingcms":{
+            "logins":[
+                "admin:admin"
+            ],
+            "hc.tags":[
+                "configuration"
+            ],
+            "hc.name":"Sling CMS - Default Logins Check"
+        },
+        "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~sling-cms-error":{
+            "user.mapping":[
+                "org.apache.sling.cms.core:sling-cms-error=sling-cms-error",
+                "org.apache.sling.models.impl:sling-cms-error=sling-cms-error"
+            ]
+        },
+        "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~sling-cms-metadata":{
+            "user.mapping":[
+                "org.apache.sling.cms.core:sling-cms-metadata=sling-cms-metadata"
+            ]
+        },
+        "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~sling-cms-transformer":{
+            "user.mapping":[
+                "org.apache.sling.cms.transformer:sling-cms-transformer=sling-cms-transformer"
+            ]
+        },
+        "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~sling-cms-ugc":{
+            "user.mapping":[
+                "org.apache.sling.cms.core:sling-cms-ugc=sling-cms-ugc"
+            ]
+        },
+        "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~sling-cms-versionmgr":{
+            "user.mapping":[
+                "org.apache.sling.cms.core:sling-cms-versionmgr=sling-cms-versionmgr"
+            ]
+        },
+        "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~sling.rewriter":{
+            "user.mapping":[
+                "org.apache.sling.rewriter=sling-rewriter"
+            ]
+        }
+    },
+    "repoinit:TEXT|true":[
+        "",
+        "# CMS root paths",
+        "create path (sling:OrderedFolder) /etc/i18n",
+        "set ACL for everyone",
+        "allow   jcr:read\ton /etc/i18n",
+        "end",
+        "create path (sling:OrderedFolder) /etc/taxonomy",
+        "set ACL for everyone",
+        "allow   jcr:read\ton /etc/taxonomy",
+        "end",
+        "create path (sling:OrderedFolder) /static",
+        "set ACL for everyone",
+        "allow   jcr:read\ton /static",
+        "end",
+        "create path (sling:OrderedFolder) /conf",
+        "set ACL for everyone",
+        "allow   jcr:read\ton /conf",
+        "end",
+        "create path (sling:OrderedFolder) /content",
+        "create path (sling:OrderedFolder) /etc/usergenerated",
+        "set ACL for everyone",
+        "allow   jcr:read    on /etc/usergenerated",
+        "end",
+        "",
+        "# Groups",
+        "create path (rep:AuthorizableFolder) /home/groups",
+        "create path (rep:AuthorizableFolder) /home/groups/sling-cms",
+        "create group administrators with path sling-cms",
+        "set ACL for administrators",
+        "allow   jcr:all    on /",
+        "end",
+        "create group authors with path sling-cms",
+        "set ACL for authors",
+        "allow   jcr:write,jcr:nodeTypeManagement,jcr:versionManagement    on /content",
+        "allow   jcr:write,jcr:nodeTypeManagement,jcr:versionManagement    on /static",
+        "allow   jcr:read    on /",
+        "end",
+        "create group job-users with path sling-cms",
+        "create group taxonomy-users with path sling-cms",
+        "set ACL for taxonomy-users",
+        "allow   jcr:write,jcr:nodeTypeManagement,jcr:versionManagement    on /etc/taxonomy",
+        "end",
+        "create group ugc-users with path sling-cms",
+        "set ACL for ugc-users",
+        "allow   jcr:write,jcr:nodeTypeManagement,jcr:versionManagement    on /etc/usergenerated",
+        "end",
+        "",
+        "# Service users",
+        "create service user sling-cms-error",
+        "set ACL for sling-cms-error",
+        "allow\tjcr:read\ton /",
+        "end",
+        "create service user sling-cms-metadata",
+        "set ACL for sling-cms-metadata",
+        "allow   jcr:write,jcr:nodeTypeManagement,jcr:versionManagement    on /content",
+        "allow   jcr:write,jcr:nodeTypeManagement,jcr:versionManagement    on /static",
+        "allow   jcr:read    on /",
+        "end",
+        "create service user sling-cms-transformer",
+        "set ACL for sling-cms-transformer",
+        "allow   jcr:write,jcr:nodeTypeManagement,jcr:versionManagement    on /content",
+        "allow   jcr:write,jcr:nodeTypeManagement,jcr:versionManagement    on /static",
+        "allow   jcr:read    on /",
+        "end",
+        "create service user sling-rewriter",
+        "set ACL for sling-rewriter",
+        "allow   jcr:read    on /",
+        "end",
+        "create service user sling-cms-ugc",
+        "set ACL for sling-cms-ugc",
+        "allow   jcr:write,jcr:nodeTypeManagement,jcr:versionManagement    on /etc/usergenerated",
+        "end",
+        "create service user sling-cms-versionmgr",
+        "set ACL for sling-cms-versionmgr",
+        "allow   jcr:write,jcr:nodeTypeManagement,jcr:versionManagement    on /content",
+        "end"
+    ]
+}
\ No newline at end of file
diff --git a/feature/src/main/features/composum_composum-nodes.json b/feature/src/main/features/composum_composum-nodes.json
new file mode 100644
index 0000000..acaf4bd
--- /dev/null
+++ b/feature/src/main/features/composum_composum-nodes.json
@@ -0,0 +1,35 @@
+
+{
+    "id":"org.apache.sling:org.apache.sling.cms.fmconverter:slingfeature:composum_composum-nodes:0.16.3-SNAPSHOT",
+    "variables":{
+        "composum.nodes.version":"1.12.0"
+    },
+    "bundles":[
+        {
+            "id":"com.composum.sling.core:composum-sling-core-commons:1.12.0",
+            "start-order":"20"
+        },
+        {
+            "id":"com.composum.sling.core:composum-sling-core-console:1.12.0",
+            "start-order":"20"
+        },
+        {
+            "id":"com.composum.sling.core:composum-sling-core-jslibs:1.12.0",
+            "start-order":"20"
+        },
+        {
+            "id":"com.composum.sling.core:composum-sling-package-manager:1.12.0",
+            "start-order":"20"
+        }
+    ],
+    "configurations":{
+        "org.apache.sling.jcr.base.internal.LoginAdminWhitelist.fragment~composum":{
+            "whitelist.bundles":[
+                "com.composum.core.commons",
+                "com.composum.core.pckgmgr",
+                "com.composum.core.pckginstall"
+            ],
+            "whitelist.name":"composum"
+        }
+    }
+}
\ No newline at end of file
diff --git a/feature/src/main/features/healthcheck_healthcheck.json b/feature/src/main/features/healthcheck_healthcheck.json
new file mode 100644
index 0000000..06d0b5d
--- /dev/null
+++ b/feature/src/main/features/healthcheck_healthcheck.json
@@ -0,0 +1,103 @@
+
+{
+    "id":"org.apache.sling:org.apache.sling.cms.fmconverter:slingfeature:healthcheck:0.16.3-SNAPSHOT",
+    "bundles":[
+        {
+            "id":"org.apache.felix:org.apache.felix.healthcheck.api:2.0.4",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.felix:org.apache.felix.healthcheck.core:2.0.8",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.felix:org.apache.felix.healthcheck.generalchecks:2.0.6",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.felix:org.apache.felix.healthcheck.webconsoleplugin:2.0.2",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.hc.api:1.0.4",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.hc.support:1.0.6",
+            "start-order":"20"
+        }
+    ],
+    "configurations":{
+        "org.apache.felix.hc.generalchecks.BundlesStartedCheck":{
+            "hc.tags":[
+                "bundles"
+            ]
+        },
+        "org.apache.felix.hc.generalchecks.CpuCheck":{
+            "hc.tags":[
+                "cpu",
+                "system-resources"
+            ],
+            "cpuPercentageThresholdWarn":95
+        },
+        "org.apache.felix.hc.generalchecks.DiskSpaceCheck":{
+            "hc.tags":[
+                "diskspace",
+                "system-resources"
+            ],
+            "diskPaths":[
+                "."
+            ]
+        },
+        "org.apache.felix.hc.generalchecks.FrameworkStartCheck":{
+            "hc.tags":[
+                "systemalive"
+            ],
+            "targetStartLevel:Integer":"30"
+        },
+        "org.apache.felix.hc.generalchecks.MemoryCheck":{
+            "hc.tags":[
+                "memory",
+                "system-resources"
+            ],
+            "heapUsedPercentageThresholdCritical":100,
+            "heapUsedPercentageThresholdWarn":95
+        },
+        "org.apache.felix.hc.generalchecks.ServicesCheck":{
+            "hc.tags":[
+                "systemalive"
+            ],
+            "services.list":[
+                "org.apache.sling.jcr.api.SlingRepository",
+                "org.apache.sling.engine.auth.Authenticator",
+                "org.apache.sling.api.resource.ResourceResolverFactory",
+                "org.apache.sling.api.servlets.ServletResolver",
+                "javax.script.ScriptEngineManager"
+            ]
+        },
+        "org.apache.felix.hc.generalchecks.ThreadUsageCheck":{
+            "hc.tags":[
+                "threads",
+                "cpu",
+                "system-resources"
+            ]
+        },
+        "org.apache.felix.hc.core.impl.filter.ServiceUnavailableFilter~startupandshutdown":{
+            "osgi.http.whiteboard.filter.regex":"(?!/system/).*",
+            "avoid404DuringStartup":true,
+            "service.ranking:Integer":"2147483647",
+            "includeExecutionResult":false,
+            "osgi.http.whiteboard.context.select":"(osgi.http.whiteboard.context.name=*)",
+            "tags":[
+                "systemalive"
+            ],
+            "autoDisableFilter":true,
+            "responseTextFor503":"classpath:org.apache.sling.cms.ui:/content/startup/index.html"
+        },
+        "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~hc-support":{
+            "user.mapping":[
+                "org.apache.sling.hc.support=sling-readall"
+            ]
+        }
+    }
+}
\ No newline at end of file
diff --git a/feature/src/main/features/launchpad_launchpad.json b/feature/src/main/features/launchpad_launchpad.json
new file mode 100644
index 0000000..acdb0b8
--- /dev/null
+++ b/feature/src/main/features/launchpad_launchpad.json
@@ -0,0 +1,19 @@
+
+{
+    "id":"org.apache.sling:org.apache.sling.cms.fmconverter:slingfeature:launchpad:0.16.3-SNAPSHOT",
+    "bundles":[
+        {
+            "id":"org.apache.sling:org.apache.sling.launchpad.base:6.0.2-2.6.36",
+            "start-order":"20"
+        }
+    ],
+    "framework-properties":{
+        "sling.jre.java.xml":",javax.xml;version=\"2.1.0\",javax.xml.datatype;uses:=\"javax.xml.namespace\";version=\"2.1.0\",javax.xml.namespace;version=\"2.1.0\",javax.xml.parsers;uses:=\"javax.xml.validation,org.w3c.dom,org.xml.sax,org.xml.sax.helpers\";version=\"2.1.0\",javax.xml.stream;uses:=\"javax.xml.namespace,javax.xml.stream.events,javax.xml.stream.util,javax.xml.transform\";version=\"1.0.0\",javax.xml.stream.events;uses:=\"javax.xml.namespace,javax.xml.stream\";version=\"1.0.0 [...]
+        "felix.systempackages.calculate.uses":"true",
+        "org.osgi.framework.system.packages":"org.osgi.framework;version=\"1.9\",org.osgi.framework.dto;version=\"1.8\";uses:=\"org.osgi.dto\",org.osgi.framework.hooks.bundle;version=\"1.1\";uses:=\"org.osgi.framework\",org.osgi.framework.hooks.resolver;version=\"1.0\";uses:=\"org.osgi.framework.wiring\",org.osgi.framework.hooks.service;version=\"1.1\";uses:=\"org.osgi.framework\",org.osgi.framework.hooks.weaving;version=\"1.1\";uses:=\"org.osgi.framework.wiring\",org.osgi.framework.laun [...]
+        "felix.systempackages.substitution":"true",
+        "sling.jre-jpms":"{dollar}{felix.jpms.java.base}{dollar}{felix.jpms.java.compiler}{dollar}{felix.jpms.java.datatransfer}{dollar}{felix.jpms.java.desktop}{dollar}{felix.jpms.java.instrument}{dollar}{felix.jpms.java.logging}{dollar}{felix.jpms.java.management}{dollar}{felix.jpms.java.management.rmi}{dollar}{felix.jpms.java.naming}{dollar}{felix.jpms.java.net.http}{dollar}{felix.jpms.java.prefs}{dollar}{felix.jpms.java.rmi}{dollar}{felix.jpms.java.scripting}{dollar}{felix.jpms.java. [...]
+        "sling.jpms.java.xml":"{dollar}{sling.jre.java.xml},javax.xml.catalog;uses:=\"javax.xml.namespace\";version=\"1.0.0\"",
+        "sling.jre-1.8":",java.applet;version=\"{dollar}{felix.detect.java.version}\",java.awt;version=\"{dollar}{felix.detect.java.version}\",java.awt.color;version=\"{dollar}{felix.detect.java.version}\",java.awt.datatransfer;version=\"{dollar}{felix.detect.java.version}\",java.awt.dnd;version=\"{dollar}{felix.detect.java.version}\",java.awt.event;version=\"{dollar}{felix.detect.java.version}\",java.awt.font;version=\"{dollar}{felix.detect.java.version}\",java.awt.geom;version=\"{dolla [...]
+    }
+}
\ No newline at end of file
diff --git a/feature/src/main/features/oak_oak.json b/feature/src/main/features/oak_oak.json
new file mode 100644
index 0000000..27f959c
--- /dev/null
+++ b/feature/src/main/features/oak_oak.json
@@ -0,0 +1,124 @@
+
+{
+    "id":"org.apache.sling:org.apache.sling.cms.fmconverter:slingfeature:oak:0.16.3-SNAPSHOT",
+    "variables":{
+        "oak.version":"1.26.0"
+    },
+    "bundles":[
+        {
+            "id":"org.apache.felix:org.apache.felix.jaas:1.0.2",
+            "start-order":"10"
+        },
+        {
+            "id":"org.apache.jackrabbit:oak-api:1.26.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:oak-blob-plugins:1.26.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:oak-blob:1.26.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:oak-commons:1.26.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:oak-core-spi:1.26.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:oak-core:1.26.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:oak-jackrabbit-api:1.26.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:oak-jcr:1.26.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:oak-lucene:1.26.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:oak-query-spi:1.26.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:oak-security-spi:1.26.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:oak-store-composite:1.26.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:oak-store-document:1.26.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:oak-store-spi:1.26.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.jcr.oak.server:1.2.4",
+            "start-order":"16"
+        },
+        {
+            "id":"org.apache.jackrabbit:oak-segment-tar:1.26.0",
+            "run-modes":"oak_tar",
+            "start-order":"15"
+        }
+    ],
+    "configurations":{
+        "org.apache.felix.jaas.ConfigurationSpi":{
+            "jaas.defaultRealmName":"jackrabbit.oak",
+            "jaas.configProviderName":"FelixJaasProvider"
+        },
+        "org.apache.jackrabbit.oak.security.authentication.AuthenticationConfigurationImpl":{
+            "org.apache.jackrabbit.oak.authentication.configSpiName":"FelixJaasProvider"
+        },
+        "org.apache.jackrabbit.oak.security.user.RandomAuthorizableNodeName":{
+            "length:Integer":"21"
+        },
+        "org.apache.jackrabbit.oak.security.user.UserConfigurationImpl":{
+            "groupsPath":"/home/groups",
+            "defaultDepth":"1",
+            "importBehavior":"besteffort",
+            "usersPath":"/home/users"
+        },
+        "org.apache.jackrabbit.oak.spi.security.user.action.DefaultAuthorizableActionProvider":{
+            "userPrivilegeNames":[
+                "jcr:all"
+            ],
+            "groupPrivilegeNames":[
+                "jcr:read"
+            ],
+            "enabledActions":[
+                "org.apache.jackrabbit.oak.spi.security.user.action.AccessControlAction"
+            ]
+        },
+        "org.apache.felix.jaas.Configuration.factory~GuestLoginModule":{
+            "jaas.controlFlag":"optional",
+            "jaas.classname":"org.apache.jackrabbit.oak.spi.security.authentication.GuestLoginModule",
+            "jaas.ranking:Integer":"300"
+        },
+        "org.apache.felix.jaas.Configuration.factory~LoginModuleImpl":{
+            "jaas.controlFlag":"required",
+            "jaas.classname":"org.apache.jackrabbit.oak.security.authentication.user.LoginModuleImpl"
+        },
+        "org.apache.felix.jaas.Configuration.factory~TokenLoginModule":{
+            "jaas.controlFlag":"sufficient",
+            "jaas.classname":"org.apache.jackrabbit.oak.security.authentication.token.TokenLoginModule",
+            "jaas.ranking:Integer":"200"
+        },
+        "org.apache.jackrabbit.oak.segment.SegmentNodeStoreService":{
+            "name":"Default NodeStore"
+        }
+    }
+}
\ No newline at end of file
diff --git a/feature/src/main/features/repoinit_repoinit.json b/feature/src/main/features/repoinit_repoinit.json
new file mode 100644
index 0000000..8327bc9
--- /dev/null
+++ b/feature/src/main/features/repoinit_repoinit.json
@@ -0,0 +1,74 @@
+
+{
+    "id":"org.apache.sling:org.apache.sling.cms.fmconverter:slingfeature:repoinit:0.16.3-SNAPSHOT",
+    "bundles":[
+        {
+            "id":"org.apache.sling:org.apache.sling.jcr.repoinit:1.1.24",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.provisioning.model:1.8.6",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.repoinit.parser:1.6.2",
+            "start-order":"20"
+        }
+    ],
+    "repoinit:TEXT|true":[
+        "# general",
+        "create path (sling:OrderedFolder) /content",
+        "set ACL for everyone",
+        "allow   jcr:read\ton /content",
+        "end",
+        "",
+        "# sling-mapping",
+        "create service user sling-mapping",
+        "",
+        "set ACL for sling-mapping",
+        "allow   jcr:read    on /",
+        "end",
+        "",
+        "# sling-readall",
+        "create service user sling-readall",
+        "",
+        "set ACL for sling-readall",
+        "allow   jcr:read    on /",
+        "end",
+        "",
+        "# sling-xss",
+        "create service user sling-xss",
+        "",
+        "create path (sling:Folder) /apps/sling/xss",
+        "",
+        "set ACL for sling-xss",
+        "allow   jcr:read    on /apps/sling/xss",
+        "end",
+        "",
+        "# sling-i18n",
+        "create service user sling-i18n",
+        "",
+        "set ACL for sling-i18n",
+        "allow   jcr:read    on /",
+        "end",
+        "",
+        "# sling-jcr-install",
+        "create service user sling-jcr-install",
+        "",
+        "# used for config OSGi writeback",
+        "create path (sling:Folder) /apps/sling/install",
+        "",
+        "set ACL for sling-jcr-install",
+        "allow\tjcr:read\ton\t/",
+        "allow\trep:write\ton /apps/sling/install",
+        "end",
+        "",
+        "# content-package installer",
+        "create service user sling-package-install",
+        "",
+        "set ACL for sling-package-install",
+        "allow\tjcr:all     on\t/",
+        "allow   jcr:namespaceManagement,jcr:nodeTypeDefinitionManagement on :repository",
+        "end"
+    ]
+}
\ No newline at end of file
diff --git a/feature/src/main/features/scripting_sling.json b/feature/src/main/features/scripting_sling.json
new file mode 100644
index 0000000..915a006
--- /dev/null
+++ b/feature/src/main/features/scripting_sling.json
@@ -0,0 +1,92 @@
+
+{
+    "id":"org.apache.sling:org.apache.sling.cms.fmconverter:slingfeature:scripting_sling:0.16.3-SNAPSHOT",
+    "bundles":[
+        {
+            "id":"org.antlr:antlr4-runtime:4.7.2",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.servicemix.bundles:org.apache.servicemix.bundles.rhino:1.7.10_1",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.scripting.api:2.2.0",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.scripting.core:2.3.0",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.scripting.el-api:1.0.2",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.scripting.javascript:3.1.2",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.scripting.jsp-api:1.0.2",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.scripting.jsp.taglib:2.4.0",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.scripting.jsp:2.5.0",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.scripting.sightly.compiler.java:1.2.0-1.4.0",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.scripting.sightly.compiler:1.2.6-1.4.0",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.scripting.sightly.js.provider:1.2.0",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.scripting.sightly.repl:1.0.6",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.scripting.sightly.runtime:1.2.2-1.4.0",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.scripting.sightly:1.4.0-1.4.0",
+            "start-order":"20"
+        }
+    ],
+    "configurations":{
+        "org.apache.sling.scripting.core.impl.ScriptCacheImpl":{
+            "org.apache.sling.scripting.cache.additional_extensions":[
+                "js"
+            ]
+        },
+        "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~scripting":{
+            "user.mapping":[
+                "org.apache.sling.scripting.core=sling-scripting",
+                "org.apache.sling.scripting.sightly.js.provider=sling-scripting"
+            ]
+        }
+    },
+    "repoinit:TEXT|true":[
+        "#<<< SLING-5848 - Define service user and ACLs for Scripting",
+        "create service user sling-scripting",
+        "",
+        "create path (sling:Folder) /libs",
+        "create path (sling:Folder) /apps",
+        "",
+        "set ACL for sling-scripting",
+        "deny    jcr:all     on /",
+        "allow   jcr:read    on /libs,/apps",
+        "end",
+        "# SLING-5848 - Define service user and ACLs for Scripting >>>"
+    ]
+}
\ No newline at end of file
diff --git a/feature/src/main/features/sling-caconfig_sling-caconfig.json b/feature/src/main/features/sling-caconfig_sling-caconfig.json
new file mode 100644
index 0000000..91d46b2
--- /dev/null
+++ b/feature/src/main/features/sling-caconfig_sling-caconfig.json
@@ -0,0 +1,28 @@
+
+{
+    "id":"org.apache.sling:org.apache.sling.cms.fmconverter:slingfeature:sling-caconfig:0.16.3-SNAPSHOT",
+    "bundles":[
+        {
+            "id":"org.apache.sling:org.apache.sling.caconfig.api:1.2.0",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.caconfig.impl:1.5.0",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.caconfig.spi:1.3.4",
+            "start-order":"20"
+        }
+    ],
+    "configurations":{
+        "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~sling-caconfig":{
+            "user.mapping":[
+                "org.apache.sling.caconfig.impl=sling-readall"
+            ]
+        }
+    },
+    "repoinit:TEXT|true":[
+        "create path (sling:Folder) /conf"
+    ]
+}
\ No newline at end of file
diff --git a/feature/src/main/features/sling-discovery_sling-discovery.json b/feature/src/main/features/sling-discovery_sling-discovery.json
new file mode 100644
index 0000000..e4da74a
--- /dev/null
+++ b/feature/src/main/features/sling-discovery_sling-discovery.json
@@ -0,0 +1,45 @@
+
+{
+    "id":"org.apache.sling:org.apache.sling.cms.fmconverter:slingfeature:sling-discovery:0.16.3-SNAPSHOT",
+    "bundles":[
+        {
+            "id":"org.apache.sling:org.apache.sling.discovery.api:1.0.4",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.discovery.base:2.0.8",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.discovery.commons:1.0.20",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.discovery.oak:1.2.28",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.discovery.support:1.0.4",
+            "start-order":"20"
+        }
+    ],
+    "configurations":{
+        "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~sling.discovery":{
+            "user.mapping":[
+                "org.apache.sling.discovery.commons=sling-discovery",
+                "org.apache.sling.discovery.base=sling-discovery",
+                "org.apache.sling.discovery.oak=sling-discovery"
+            ]
+        }
+    },
+    "repoinit:TEXT|true":[
+        "create service user sling-discovery",
+        "",
+        "create path (sling:Folder) /var/discovery",
+        "create path (sling:Folder) /var/discovery/oak",
+        "",
+        "set ACL for sling-discovery",
+        "allow   jcr:read,rep:write    on /var/discovery",
+        "end"
+    ]
+}
\ No newline at end of file
diff --git a/feature/src/main/features/sling-event_sling-event.json b/feature/src/main/features/sling-event_sling-event.json
new file mode 100644
index 0000000..2b236eb
--- /dev/null
+++ b/feature/src/main/features/sling-event_sling-event.json
@@ -0,0 +1,32 @@
+
+{
+    "id":"org.apache.sling:org.apache.sling.cms.fmconverter:slingfeature:sling-event:0.16.3-SNAPSHOT",
+    "bundles":[
+        {
+            "id":"org.apache.sling:org.apache.sling.event.dea:1.1.4",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.event:4.2.12",
+            "start-order":"20"
+        }
+    ],
+    "configurations":{
+        "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~sling.event":{
+            "user.mapping":[
+                "org.apache.sling.event=sling-event",
+                "org.apache.sling.event.dea=sling-event"
+            ]
+        }
+    },
+    "repoinit:TEXT|true":[
+        "create service user sling-event",
+        "",
+        "create path (sling:Folder) /var",
+        "create path (sling:Folder) /var/eventing",
+        "",
+        "set ACL for sling-event",
+        "allow   jcr:read,rep:write    on /var/eventing",
+        "end"
+    ]
+}
\ No newline at end of file
diff --git a/feature/src/main/features/sling-models-jacksonexporter_models-jacksonexporter.json b/feature/src/main/features/sling-models-jacksonexporter_models-jacksonexporter.json
new file mode 100644
index 0000000..d7b04f6
--- /dev/null
+++ b/feature/src/main/features/sling-models-jacksonexporter_models-jacksonexporter.json
@@ -0,0 +1,25 @@
+
+{
+    "id":"org.apache.sling:org.apache.sling.cms.fmconverter:slingfeature:sling-models-jacksonexporter_models-jacksonexporter:0.16.3-SNAPSHOT",
+    "variables":{
+        "jackson.version":"2.11.1"
+    },
+    "bundles":[
+        {
+            "id":"com.fasterxml.jackson.core:jackson-annotations:2.11.1",
+            "start-order":"20"
+        },
+        {
+            "id":"com.fasterxml.jackson.core:jackson-core:2.11.1",
+            "start-order":"20"
+        },
+        {
+            "id":"com.fasterxml.jackson.core:jackson-databind:2.11.1",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.models.jacksonexporter:1.0.8",
+            "start-order":"20"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/feature/src/main/features/sling-validation_sling-validation.json b/feature/src/main/features/sling-validation_sling-validation.json
new file mode 100644
index 0000000..336a578
--- /dev/null
+++ b/feature/src/main/features/sling-validation_sling-validation.json
@@ -0,0 +1,36 @@
+
+{
+    "id":"org.apache.sling:org.apache.sling.cms.fmconverter:slingfeature:sling-validation:0.16.3-SNAPSHOT",
+    "bundles":[
+        {
+            "id":"org.apache.sling:org.apache.sling.models.validation-impl:1.0.0",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.validation.api:1.0.0",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.validation.core:1.0.4",
+            "start-order":"20"
+        }
+    ],
+    "configurations":{
+        "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~validation":{
+            "user.mapping":[
+                "org.apache.sling.validation.core=sling-validation"
+            ]
+        }
+    },
+    "repoinit:TEXT|true":[
+        "create service user sling-validation",
+        "",
+        "create path (sling:Folder) /apps",
+        "create path (sling:Folder) /libs",
+        "",
+        "set ACL for sling-validation",
+        "allow   jcr:read    on /apps",
+        "allow   jcr:read    on /libs",
+        "end"
+    ]
+}
\ No newline at end of file
diff --git a/feature/src/main/features/sling_sling.json b/feature/src/main/features/sling_sling.json
new file mode 100644
index 0000000..250f14b
--- /dev/null
+++ b/feature/src/main/features/sling_sling.json
@@ -0,0 +1,443 @@
+
+{
+    "id":"org.apache.sling:org.apache.sling.cms.fmconverter:slingfeature:sling:0.16.3-SNAPSHOT",
+    "variables":{
+        "jackrabbit.version":"2.20.0"
+    },
+    "bundles":[
+        {
+            "id":"commons-codec:commons-codec:1.14",
+            "start-order":"20"
+        },
+        {
+            "id":"commons-collections:commons-collections:3.2.2",
+            "start-order":"20"
+        },
+        {
+            "id":"javax.mail:mail:1.5.0-b01",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.commons:commons-collections4:4.4",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.commons:commons-math:2.2",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.geronimo.bundles:jstl:1.2_1",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.httpcomponents:httpclient-osgi:4.5.10",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.httpcomponents:httpcore-osgi:4.4.12",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.jackrabbit.vault:org.apache.jackrabbit.vault:3.4.4",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.adapter:2.1.10",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.auth.form:1.0.20",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.bundleresource.impl:2.3.2",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.commons.classloader:1.4.4",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.commons.compiler:2.4.0",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.commons.fsclassloader:1.0.12",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.commons.mime:2.2.2",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.commons.scheduler:2.7.6",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.commons.threads:3.2.20",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.engine:2.7.2",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.fsresource:2.1.16",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.i18n:2.5.14",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.installer.console:1.1.0",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.installer.factory.packages:1.0.4",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.installer.hc:2.0.2",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.installer.provider.jcr:3.2.2",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.jcr.contentloader:2.3.0",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.jcr.resource:3.0.22",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.models.api:1.3.8",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.models.impl:1.4.12",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.resourceresolver:1.6.16",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.serviceuser.webconsole:1.0.2",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.serviceusermapper:1.4.4",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.servlets.get:2.1.40",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.servlets.post:2.3.36",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.servlets.resolver:2.7.2",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.xss:2.2.2",
+            "start-order":"20"
+        },
+        {
+            "id":"org.apache.felix:org.apache.felix.metatype:1.2.2",
+            "start-order":"4"
+        },
+        {
+            "id":"org.apache.felix:org.apache.felix.scr:2.1.20",
+            "start-order":"4"
+        },
+        {
+            "id":"commons-fileupload:commons-fileupload:1.4",
+            "start-order":"5"
+        },
+        {
+            "id":"commons-io:commons-io:2.6",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.aries.jmx:org.apache.aries.jmx.api:1.1.5",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.aries.jmx:org.apache.aries.jmx.core:1.1.8",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.aries.jmx:org.apache.aries.jmx.whiteboard:1.2.0",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.felix:org.apache.felix.bundlerepository:2.0.10",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.felix:org.apache.felix.http.whiteboard:4.0.0",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.felix:org.apache.felix.inventory:1.0.6",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.felix:org.apache.felix.prefs:1.1.0",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.felix:org.apache.felix.webconsole.plugins.ds:2.1.0",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.felix:org.apache.felix.webconsole.plugins.event:1.1.8",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.felix:org.apache.felix.webconsole.plugins.memoryusage:1.0.10",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.felix:org.apache.felix.webconsole.plugins.obr:1.0.4",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.felix:org.apache.felix.webconsole.plugins.packageadmin:1.0.4",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.felix:org.apache.felix.webconsole:4.5.0",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.api:2.22.0",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.auth.core:1.4.8",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.commons.log.webconsole:1.0.0",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.extensions.threaddump:0.2.2",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.extensions.webconsolebranding:1.0.2",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.extensions.webconsolesecurityprovider:1.2.4",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.felix:org.apache.felix.http.sslfilter:1.2.6",
+            "start-order":"10"
+        },
+        {
+            "id":"org.apache.pdfbox:fontbox:2.0.17",
+            "start-order":"10"
+        },
+        {
+            "id":"org.apache.pdfbox:jempbox:1.8.16",
+            "start-order":"10"
+        },
+        {
+            "id":"org.apache.pdfbox:pdfbox:2.0.17",
+            "start-order":"10"
+        },
+        {
+            "id":"org.apache.tika:tika-core:1.24",
+            "start-order":"10"
+        },
+        {
+            "id":"com.google.guava:guava:15.0",
+            "start-order":"15"
+        },
+        {
+            "id":"io.dropwizard.metrics:metrics-core:3.2.6",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:jackrabbit-data:2.20.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:jackrabbit-jcr-commons:2.20.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:jackrabbit-jcr-rmi:2.20.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:jackrabbit-spi-commons:2.20.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:jackrabbit-spi:2.20.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.jackrabbit:jackrabbit-webdav:2.20.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.commons.metrics:1.2.8",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.jcr.api:2.4.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.jcr.base:3.1.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.jcr.davex:1.3.10",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.jcr.jackrabbit.accessmanager:3.0.4",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.jcr.jackrabbit.usermanager:2.2.8",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.jcr.jcr-wrapper:2.0.0",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.jcr.registration:1.0.6",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.jcr.webconsole:1.0.2",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.jcr.webdav:2.3.8",
+            "start-order":"15"
+        },
+        {
+            "id":"org.apache.sling:org.apache.sling.resource.filter:1.0.0",
+            "start-order":"15"
+        }
+    ],
+    "configurations":{
+        "org.apache.sling.commons.log.LogManager":{
+            "org.apache.sling.commons.log.packagingDataEnabled":true,
+            "org.apache.sling.commons.log.pattern":"%d{dd.MM.yyyy HH:mm:ss.SSS} *%level* [%thread] %logger %msg%n",
+            "org.apache.sling.commons.log.level":"info",
+            "org.apache.sling.commons.log.file":"logs/error.log",
+            "org.apache.sling.commons.log.file.number:Integer":"7",
+            "org.apache.sling.commons.log.file.size":"'.'yyyy-MM-dd"
+        },
+        "org.apache.sling.engine.impl.log.RequestLogger":{
+            "access.log.enabled":true,
+            "request.log.outputtype:Integer":"0",
+            "access.log.output":"log.access",
+            "request.log.output":"log.request",
+            "request.log.enabled":true,
+            "access.log.outputtype:Integer":"0"
+        },
+        "org.apache.sling.jcr.davex.impl.servlets.SlingDavExServlet":{
+            "alias":"/server"
+        },
+        "org.apache.sling.jcr.webdav.impl.servlets.SimpleWebDavServlet":{
+            "dav.root":"/dav"
+        },
+        "org.apache.sling.commons.log.LogManager.factory.config~access.log":{
+            "org.apache.sling.commons.log.pattern":"%msg%n",
+            "org.apache.sling.commons.log.names":[
+                "log.access"
+            ],
+            "org.apache.sling.commons.log.level":"info",
+            "org.apache.sling.commons.log.file":"logs/access.log"
+        },
+        "org.apache.sling.commons.log.LogManager.factory.config~request.log":{
+            "org.apache.sling.commons.log.pattern":"%msg%n",
+            "org.apache.sling.commons.log.names":[
+                "log.request"
+            ],
+            "org.apache.sling.commons.log.level":"info",
+            "org.apache.sling.commons.log.file":"logs/request.log"
+        },
+        "org.apache.sling.jcr.base.internal.LoginAdminWhitelist.fragment~sling":{
+            "whitelist.bundles":[
+                "org.apache.sling.discovery.commons",
+                "org.apache.sling.discovery.base",
+                "org.apache.sling.discovery.oak",
+                "org.apache.sling.extensions.webconsolesecurityprovider",
+                "org.apache.sling.i18n",
+                "org.apache.sling.jcr.base",
+                "org.apache.sling.jcr.contentloader",
+                "org.apache.sling.jcr.jackrabbit.usermanager",
+                "org.apache.sling.jcr.oak.server",
+                "org.apache.sling.jcr.repoinit",
+                "org.apache.sling.jcr.webconsole",
+                "org.apache.sling.servlets.post",
+                "org.apache.sling.serviceuser.webconsole"
+            ],
+            "whitelist.name":"sling"
+        },
+        "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~i18n":{
+            "user.mapping":[
+                "org.apache.sling.i18n=sling-i18n"
+            ]
+        },
+        "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~installer-factories":{
+            "user.mapping":[
+                "org.apache.sling.installer.factory.packages=sling-package-install"
+            ]
+        },
+        "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~jcr-install":{
+            "user.mapping":[
+                "org.apache.sling.installer.provider.jcr=sling-jcr-install"
+            ]
+        },
+        "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~jcr-resource":{
+            "user.mapping":[
+                "org.apache.sling.jcr.resource:validation=sling-readall"
+            ]
+        },
+        "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~observation":{
+            "user.mapping":[
+                "org.apache.sling.jcr.resource:observation=sling-readall"
+            ]
+        },
+        "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~resourceresolver":{
+            "user.mapping":[
+                "org.apache.sling.resourceresolver:mapping=sling-mapping",
+                "org.apache.sling.resourceresolver:hierarchy=sling-readall",
+                "org.apache.sling.resourceresolver:observation=sling-readall",
+                "org.apache.sling.resourceresolver:console=sling-readall"
+            ]
+        },
+        "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~servletsresolver":{
+            "user.mapping":[
+                "org.apache.sling.servlets.resolver:console=sling-readall",
+                "org.apache.sling.servlets.resolver:scripts=sling-scripting"
+            ]
+        },
+        "org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~xss":{
+            "user.mapping":[
+                "org.apache.sling.xss=sling-xss"
+            ]
+        }
+    }
+}
\ No newline at end of file
diff --git a/feature/src/main/features/standalone_standalone.json b/feature/src/main/features/standalone_standalone.json
new file mode 100644
index 0000000..e44e70d
--- /dev/null
+++ b/feature/src/main/features/standalone_standalone.json
@@ -0,0 +1,16 @@
+
+{
+    "id":"org.apache.sling:org.apache.sling.cms.fmconverter:slingfeature:standalone:0.16.3-SNAPSHOT",
+    "bundles":[
+        {
+            "id":"org.apache.felix:org.apache.felix.http.jetty:4.0.18",
+            "run-modes":":standalone",
+            "start-order":"5"
+        },
+        {
+            "id":"org.apache.felix:org.apache.felix.http.servlet-api:1.1.2",
+            "run-modes":":standalone",
+            "start-order":"5"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/feature/src/main/features/webapp_webapp.json b/feature/src/main/features/webapp_webapp.json
new file mode 100644
index 0000000..f1e6022
--- /dev/null
+++ b/feature/src/main/features/webapp_webapp.json
@@ -0,0 +1,4 @@
+
+{
+    "id":"org.apache.sling:org.apache.sling.cms.fmconverter:slingfeature:webapp:0.16.3-SNAPSHOT"
+}
\ No newline at end of file
diff --git a/feature/src/test/java/org/apache/sling/launchpad/LaunchpadReadyRule.java b/feature/src/test/java/org/apache/sling/launchpad/LaunchpadReadyRule.java
new file mode 100644
index 0000000..d6b6d6f
--- /dev/null
+++ b/feature/src/test/java/org/apache/sling/launchpad/LaunchpadReadyRule.java
@@ -0,0 +1,121 @@
+/*
+ * 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.sling.launchpad;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.ConnectException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.junit.rules.ExternalResource;
+
+public class LaunchpadReadyRule extends ExternalResource {
+
+    private static final int TRIES = 60;
+    private static final int WAIT_BETWEEN_TRIES_MILLIS = 1000;
+
+    private final List<Check> checks = new ArrayList<>();
+
+    public LaunchpadReadyRule(int launchpadPort) {
+
+        checks.add(new Check("http://localhost:" + launchpadPort + "/server/default/jcr:root/content"));
+        checks.add(new Check("http://localhost:" + launchpadPort + "/content/starter.html") {
+            @Override
+            public String runCheck(HttpResponse response) throws Exception {
+                try (InputStreamReader isr = new InputStreamReader(response.getEntity().getContent());
+                        BufferedReader reader = new BufferedReader(isr)) {
+
+                    String line;
+                    while ((line = reader.readLine()) != null) {
+                        if (line.contains("Do not remove this comment, used for Starter integration tests")) {
+                            return null;
+                        }
+                    }
+                }
+
+                return "Did not find 'ready' marker in the response body";
+            }
+        });
+    }
+
+    @Override
+    protected void before() throws Throwable {
+
+        try (CloseableHttpClient client = HttpClients.createDefault()) {
+            for (Check check : checks) {
+                runCheck(client, check);
+            }
+        }
+    }
+
+    private void runCheck(CloseableHttpClient client, Check check) throws Exception {
+
+        String lastFailure = null;
+        HttpGet get = new HttpGet(check.getUrl());
+        
+        for (int i = 0; i < TRIES; i++) {
+            try (CloseableHttpResponse response = client.execute(get)) {
+
+                if (response.getStatusLine().getStatusCode() != 200) {
+                    lastFailure = "Status code is " + response.getStatusLine();
+                    Thread.sleep(WAIT_BETWEEN_TRIES_MILLIS);
+                    continue;
+                }
+
+                lastFailure = check.runCheck(response);
+                if (lastFailure == null) {
+                    return;
+                }
+            } catch ( ConnectException e ) {
+                lastFailure = e.getClass().getName() + " : " + e.getMessage();
+            }
+
+            Thread.sleep(WAIT_BETWEEN_TRIES_MILLIS);
+        }
+        
+        throw new RuntimeException(String.format("Launchpad not ready. Failed check for URL %s with message '%s'",
+                check.getUrl(), lastFailure));
+    }
+
+    static class Check {
+        private String url;
+
+        public Check(String url) {
+            this.url = url;
+        }
+
+        public String getUrl() {
+            return url;
+        }
+
+        /**
+         * @param response the HttpResponse
+         * @return null if check check was successful, an error description otherwise
+         * @throws Exception
+         */
+        public String runCheck(HttpResponse response) throws Exception {
+            return null;
+        }
+    }
+
+}
diff --git a/feature/src/test/java/org/apache/sling/launchpad/SmokeIT.java b/feature/src/test/java/org/apache/sling/launchpad/SmokeIT.java
new file mode 100644
index 0000000..71676dc
--- /dev/null
+++ b/feature/src/test/java/org/apache/sling/launchpad/SmokeIT.java
@@ -0,0 +1,195 @@
+/*
+ * 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.sling.launchpad;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.apache.felix.utils.json.JSONParser;
+import org.apache.http.Header;
+import org.apache.http.HttpHost;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.client.CredentialsProvider;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.impl.auth.BasicScheme;
+import org.apache.http.impl.client.BasicAuthCache;
+import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.hamcrest.CoreMatchers;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+public class SmokeIT {
+
+    private static final int LAUNCHPAD_PORT = Integer.getInteger("launchpad.http.port", 8080);
+    private static final int EXPECTED_BUNDLES_COUNT = Integer.getInteger("IT.expected.bundles.count", Integer.MAX_VALUE);
+
+    @ClassRule
+    public static LaunchpadReadyRule LAUNCHPAD = new LaunchpadReadyRule(LAUNCHPAD_PORT);
+    private HttpClientContext httpClientContext;
+
+    @Before
+    public void prepareHttpContext() {
+
+        CredentialsProvider credsProvider = new BasicCredentialsProvider();
+        UsernamePasswordCredentials creds = new UsernamePasswordCredentials("admin", "admin");
+        credsProvider.setCredentials(new AuthScope("localhost", LAUNCHPAD_PORT), creds);
+
+        BasicAuthCache authCache = new BasicAuthCache();
+        BasicScheme basicAuth = new BasicScheme();
+        authCache.put(new HttpHost("localhost", LAUNCHPAD_PORT, "http"), basicAuth);
+
+        httpClientContext = HttpClientContext.create();
+        httpClientContext.setCredentialsProvider(credsProvider);
+        httpClientContext.setAuthCache(authCache);
+    }
+
+    private CloseableHttpClient newClient() {
+
+        return HttpClientBuilder.create()
+                .setDefaultCredentialsProvider(httpClientContext.getCredentialsProvider())
+                .build();
+    }
+
+    @Test
+    public void verifyAllBundlesStarted() throws Exception {
+
+        try ( CloseableHttpClient client = newClient() ) {
+
+            HttpGet get = new HttpGet("http://localhost:" + LAUNCHPAD_PORT + "/system/console/bundles.json");
+
+            // pass the context to ensure preemptive basic auth is used
+            // https://hc.apache.org/httpcomponents-client-ga/tutorial/html/authentication.html
+            try ( CloseableHttpResponse response = client.execute(get, httpClientContext) ) {
+
+                if ( response.getStatusLine().getStatusCode() != 200 ) {
+                    fail("Unexpected status line " + response.getStatusLine());
+                }
+
+                Header contentType = response.getFirstHeader("Content-Type");
+                assertThat("Content-Type header", contentType.getValue(), CoreMatchers.startsWith("application/json"));
+
+                Map<String, Object> obj = new JSONParser(response.getEntity().getContent()).getParsed();
+
+                @SuppressWarnings("unchecked")
+                List<Object> status = (List<Object>) obj.get("s");
+
+                @SuppressWarnings("unchecked")
+                List<Object> bundles = (List<Object>) obj.get("data");
+                if(bundles.size() < EXPECTED_BUNDLES_COUNT) {
+                    fail("Expected at least " + EXPECTED_BUNDLES_COUNT + " bundles, got " + bundles.size());
+                }
+
+                BundleStatus bs = new BundleStatus(status);
+
+                if ( bs.resolvedBundles != 0 || bs.installedBundles != 0 ) {
+
+                    StringBuilder out = new StringBuilder();
+                    out.append("Expected all bundles to be active, but instead got ")
+                        .append(bs.resolvedBundles).append(" resolved bundles, ")
+                        .append(bs.installedBundles).append(" installed bundlles: ");
+
+                    for ( int i = 0 ; i < bundles.size(); i++ ) {
+                        @SuppressWarnings("unchecked")
+                        Map<String, Object> bundle = (Map<String, Object>) bundles.get(i);
+
+                        String bundleState = (String) bundle.get("state");
+                        String bundleSymbolicName = (String) bundle.get("symbolicName");
+                        String bundleVersion = (String) bundle.get("version");
+
+                        switch ( bundleState ) {
+                            case "Active":
+                            case "Fragment":
+                                continue;
+
+                            default:
+                                out.append("\n- ").append(bundleSymbolicName).append(" ").append(bundleVersion).append(" is in state " ).append(bundleState);
+                        }
+                    }
+
+                    fail(out.toString());
+                }
+            }
+        }
+    }
+
+    @Test
+    public void ensureRepositoryIsStarted() throws Exception {
+        try ( CloseableHttpClient client = newClient() ) {
+
+            HttpGet get = new HttpGet("http://localhost:" + LAUNCHPAD_PORT + "/server/default/jcr:root/content");
+
+            try ( CloseableHttpResponse response = client.execute(get) ) {
+
+                if ( response.getStatusLine().getStatusCode() != 200 ) {
+                    fail("Unexpected status line " + response.getStatusLine());
+                }
+
+                Header contentType = response.getFirstHeader("Content-Type");
+                assertThat("Content-Type header", contentType.getValue(), equalTo("text/xml"));
+
+                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+                dbf.setNamespaceAware(true);
+                DocumentBuilder db = dbf.newDocumentBuilder();
+                Document document = db.parse(response.getEntity().getContent());
+
+                Element docElement = document.getDocumentElement();
+                NamedNodeMap attrs = docElement.getAttributes();
+
+                Node nameAttr = attrs.getNamedItemNS("http://www.jcp.org/jcr/sv/1.0", "name");
+                assertThat("no 'name' attribute found", nameAttr, notNullValue());
+                assertThat("Invalid name attribute value", nameAttr.getNodeValue(), equalTo("content"));
+            }
+        }
+    }
+
+    static class BundleStatus {
+
+        long totalBundles;
+        long activeBundles;
+        long activeFragments;
+        long resolvedBundles;
+        long installedBundles;
+
+        public BundleStatus(List<Object> array) {
+
+            totalBundles = (Long)array.get(0);
+            activeBundles = (Long)array.get(1);
+            activeFragments = (Long)array.get(2);
+            resolvedBundles = (Long)array.get(3);
+            installedBundles = (Long)array.get(4);
+
+        }
+    }
+}
diff --git a/feature/src/test/java/org/apache/sling/launchpad/package-info.java b/feature/src/test/java/org/apache/sling/launchpad/package-info.java
new file mode 100644
index 0000000..f70e5e8
--- /dev/null
+++ b/feature/src/test/java/org/apache/sling/launchpad/package-info.java
@@ -0,0 +1,30 @@
+/*
+ * 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.
+ */
+/**
+ * <h1>Smoke tests for the Sling Launchpad</h1>
+ * 
+ * <p>This package contains a minimal set of tests for the Sling launchpad. The
+ * tests validate that the launchpad is correctly assembled and that there are
+ * no obvious mistakes such as bundles that can't be wired. More extensive
+ * tests must be placed in specific test projects.</p>
+ * 
+ * <p>The launchpad tests don't depend on other Sling bundles,to prevent circular
+ * dependencies. As such, there is some duplication of code ( at least intent, if 
+ * not implementation ) with some of the testing projects. This is another 
+ * argument for keeping the tests minimal.</p>
+ */
+package org.apache.sling.launchpad;
\ No newline at end of file