diff --git a/bnd.bnd b/bnd.bnd
new file mode 100644
index 0000000..d2c832f
--- /dev/null
+++ b/bnd.bnd
@@ -0,0 +1,2 @@
+-includeresource: @org.apache.sling.feature.extension.apiregions-[0-9.]*.jar!/org/apache/sling/feature/extension/apiregions/launcher/LauncherProperties.*
+Conditional-Package: org.apache.sling.feature.extension.apiregions.api
diff --git a/pom.xml b/pom.xml
index fe8398e..76a1193 100644
--- a/pom.xml
+++ b/pom.xml
@@ -79,6 +79,12 @@
             <artifactId>osgi.core</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-json_1.1_spec</artifactId>
+            <version>1.2</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
         </dependency>
@@ -94,24 +100,6 @@
         </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.jcr.api</artifactId>
-            <version>2.4.0</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.jcr.repoinit</artifactId>
-            <version>1.1.0</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.repoinit.parser</artifactId>
-            <version>1.1.0</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.feature</artifactId>
             <version>1.1.8</version>
             <scope>provided</scope>
@@ -122,6 +110,12 @@
             <version>1.3.0</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.feature.extension.apiregions</artifactId>
+            <version>1.1.4</version>
+            <scope>provided</scope>
+        </dependency>
    <!-- Testing -->
         <dependency>
             <groupId>junit</groupId>
diff --git a/src/main/java/org/apache/sling/installer/factory/model/impl/FeatureModelInstallerPlugin.java b/src/main/java/org/apache/sling/installer/factory/model/impl/FeatureModelInstallerPlugin.java
index fb34de2..3c1b870 100644
--- a/src/main/java/org/apache/sling/installer/factory/model/impl/FeatureModelInstallerPlugin.java
+++ b/src/main/java/org/apache/sling/installer/factory/model/impl/FeatureModelInstallerPlugin.java
@@ -94,15 +94,6 @@
     /** Logger. */
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
-//    @Reference
-//    private SlingRepository repository;
-
-//    @Reference
-//    private JcrRepoInitOpsProcessor repoInitProcessor;
-
-//    @Reference
-//    private RepoInitParser repoInitParser;
-
     private final BundleContext bundleContext;
 
     private final ArtifactManager artifactManager;
@@ -234,8 +225,7 @@
         if (rsrc.getState() == ResourceState.UNINSTALL ) {
             return new UninstallFeatureModelTask(group, bundleContext);
         }
-        final InstallContext ctx = new InstallContext(//this.repository, this.repoInitProcessor, this.repoInitParser,
-                this.artifactManager, this.storageDirectory);
+        final InstallContext ctx = new InstallContext(this.artifactManager, this.storageDirectory);
         return new InstallFeatureModelTask(group,
                 ctx, this.bundleContext);
     }
diff --git a/src/main/java/org/apache/sling/installer/factory/model/impl/InstallContext.java b/src/main/java/org/apache/sling/installer/factory/model/impl/InstallContext.java
index 9f7f42f..8408f91 100644
--- a/src/main/java/org/apache/sling/installer/factory/model/impl/InstallContext.java
+++ b/src/main/java/org/apache/sling/installer/factory/model/impl/InstallContext.java
@@ -24,23 +24,11 @@
 
 public class InstallContext {
 
-//    public final SlingRepository repository;
-
-//    public final JcrRepoInitOpsProcessor repoInitProcessor;
-
-//    public final RepoInitParser repoInitParser;
-
     public final ArtifactManager artifactManager;
 
     public final File storageDirectory;
 
-    public InstallContext(//final SlingRepository repository,
-//            final JcrRepoInitOpsProcessor repoInitProcessor,
-//            final RepoInitParser repoInitParser,
-            final ArtifactManager artifactManager, final File storageDirectory) {
-//        this.repository = repository;
-//        this.repoInitProcessor = repoInitProcessor;
-//        this.repoInitParser = repoInitParser;
+    public InstallContext(final ArtifactManager artifactManager, final File storageDirectory) {
         this.artifactManager = artifactManager;
         this.storageDirectory = storageDirectory;
     }
diff --git a/src/main/java/org/apache/sling/installer/factory/model/impl/InstallFeatureModelTask.java b/src/main/java/org/apache/sling/installer/factory/model/impl/InstallFeatureModelTask.java
index efce876..f60c0cb 100644
--- a/src/main/java/org/apache/sling/installer/factory/model/impl/InstallFeatureModelTask.java
+++ b/src/main/java/org/apache/sling/installer/factory/model/impl/InstallFeatureModelTask.java
@@ -38,6 +38,8 @@
 import org.apache.sling.feature.Extension;
 import org.apache.sling.feature.ExtensionType;
 import org.apache.sling.feature.Feature;
+import org.apache.sling.feature.extension.apiregions.api.ApiRegions;
+import org.apache.sling.feature.extension.apiregions.launcher.LauncherProperties;
 import org.apache.sling.feature.io.archive.ArchiveReader;
 import org.apache.sling.feature.io.artifacts.ArtifactHandler;
 import org.apache.sling.feature.io.json.FeatureJSONReader;
@@ -54,6 +56,14 @@
  */
 public class InstallFeatureModelTask extends AbstractFeatureModelTask {
 
+    private static final String PROP_idbsnver = "mapping.bundleid.bsnver";
+    private static final String PROP_bundleFeatures = "mapping.bundleid.features";
+    private static final String PROP_featureRegions = "mapping.featureid.regions";
+    private static final String PROP_regionPackage = "mapping.region.packages";
+
+    private static final String REGION_FACTORY_PID = "org.apache.sling.feature.apiregions.factory~";
+    private static final String REPOINIT_FACTORY_PID = "org.apache.sling.jcr.repoinit.RepositoryInitializer~";
+
     private final InstallContext installContext;
 
     public InstallFeatureModelTask(final TaskResourceGroup group,
@@ -62,7 +72,6 @@
         this.installContext = installContext;
     }
 
-    @SuppressWarnings("deprecation")
     @Override
     public void execute(final InstallationContext ctx) {
         try {
@@ -74,49 +83,17 @@
                 this.getResourceGroup().setFinishState(ResourceState.IGNORED);
             } else {
                 boolean success = false;
-                final Result result = this.transform(featureJson, resource);
+                final List<InstallableResource> result = this.transform(featureJson, resource);
                 if (result == null) {
                     ctx.log("Unable to install feature model resource {} : unable to create resources", resource);
                     this.getResourceGroup().setFinishState(ResourceState.IGNORED);
                 } else {
-                    // repo init first
-/*                    if (result.repoinit != null) {
-                        List<Operation> ops = null;
-                        try (final Reader r = new StringReader(result.repoinit)) {
-                            ops = this.installContext.repoInitParser.parse(r);
-                        } catch (final IOException | RepoInitParsingException e) {
-                            logger.error("Unable to parse repoinit text.", e);
-                            ctx.log("Unable to install feature model resource {} : unable parse repoinit text.",
-                                    resource);
-                            this.getResourceGroup().setFinishState(ResourceState.IGNORED);
-                            return;
-                        }
-
-                        // login admin is required for repo init
-                        Session session = null;
-                        try {
-                            session = this.installContext.repository.loginAdministrative(null);
-                            this.installContext.repoInitProcessor.apply(session, ops);
-                            session.save();
-                        } catch (final RepositoryException re) {
-                            logger.error("Unable to process repoinit text.", re);
-                            ctx.log("Unable to install feature model resource {} : unable to process repoinit text.",
-                                    resource);
-                            this.getResourceGroup().setFinishState(ResourceState.IGNORED);
-                            return;
-
-                        } finally {
-                            if (session != null) {
-                                session.logout();
-                            }
-                        }
-                    }*/
-                    if (!result.resources.isEmpty()) {
+                    if (!result.isEmpty()) {
                         final OsgiInstaller installer = this.getService(OsgiInstaller.class);
                         if (installer != null) {
                             installer.registerResources(
                                     getScheme(resource),
-                                    result.resources.toArray(new InstallableResource[result.resources.size()]));
+                                    result.toArray(new InstallableResource[result.size()]));
                         } else {
                             ctx.log("Unable to install feature model resource {} : unable to get OSGi installer",
                                     resource);
@@ -136,16 +113,11 @@
         }
     }
 
-    public static final class Result {
-        public final List<InstallableResource> resources = new ArrayList<>();
-//        public String repoinit;
-    }
-
     private File getArtifactFile(final File baseDir, final ArtifactId id) {
         return new File(baseDir, id.toMvnId().replace('/', File.separatorChar));
     }
 
-    private Result transform(final String featureJson,
+    private List<InstallableResource> transform(final String featureJson,
             final TaskResource rsrc) {
         Feature feature = null;
         try (final Reader reader = new StringReader(featureJson)) {
@@ -157,8 +129,26 @@
             return null;
         }
 
+        final List<InstallableResource> result = new ArrayList<>();
+        // configurations
+        for (final Configuration cfg : feature.getConfigurations()) {
+            result.add(new InstallableResource("/".concat(cfg.getPid()).concat(".config"), null,
+                    cfg.getConfigurationProperties(), null, InstallableResource.TYPE_CONFIG, null));
+        }
+
+        // repoinit
+        final Extension repoInit = feature.getExtensions().getByName(Extension.EXTENSION_NAME_REPOINIT);
+        if (repoInit != null && repoInit.getType() == ExtensionType.TEXT) {
+            final String configPid = REPOINIT_FACTORY_PID.concat(feature.getId().toMvnName().replace('-', '_'));
+            final Dictionary<String, Object> props = new Hashtable<>();
+            props.put("scripts", repoInit.getText());
+
+            result.add(new InstallableResource("/".concat(configPid).concat(".config"), null,
+                    props, null, InstallableResource.TYPE_CONFIG, null));
+        }
+
+        // extract artifacts
         if (this.installContext.storageDirectory != null) {
-            // extract artifacts
             final byte[] buffer = new byte[1024*1024*256];
 
             try ( final InputStream is = rsrc.getInputStream() ) {
@@ -184,13 +174,35 @@
             }
         }
 
+        // api regions
+        final Extension regionExt = feature.getExtensions().getByName(ApiRegions.EXTENSION_NAME);
+        if ( regionExt != null ) {
+            try {
+                final ApiRegions regions = ApiRegions.parse(regionExt.getJSONStructure().asJsonArray());
 
-        final Result result = new Result();
+                final String configPid = REGION_FACTORY_PID.concat(feature.getId().toMvnName().replace('-', '_'));
+                final Dictionary<String, Object> props = new Hashtable<>();
+                props.put(PROP_idbsnver, LauncherProperties.getBundleIDtoBSNandVersionMap(feature, this.installContext.artifactManager));
+                props.put(PROP_bundleFeatures, LauncherProperties.getBundleIDtoFeaturesMap(feature));
+                props.put(PROP_featureRegions, LauncherProperties.getFeatureIDtoRegionsMap(regions));
+                props.put(PROP_regionPackage, LauncherProperties.getRegionNametoPackagesMap(regions));
+
+                result.add(new InstallableResource("/".concat(configPid).concat(".config"), null,
+                        props, null, InstallableResource.TYPE_CONFIG, null));
+            } catch (final IOException ioe) {
+                logger.warn("Unable to parse region information " + feature.getId().toMvnId(), ioe);
+                return null;
+            }
+        }
+
+        // bundles
         for (final Artifact bundle : feature.getBundles()) {
             if (!addArtifact(bundle, result)) {
                 return null;
             }
         }
+
+        // content packages
         final Extension ext = feature.getExtensions().getByName(Extension.EXTENSION_NAME_CONTENT_PACKAGES);
         if (ext != null && ext.getType() == ExtensionType.ARTIFACTS) {
             for (final Artifact artifact : ext.getArtifacts()) {
@@ -198,26 +210,11 @@
             }
         }
 
-        for (final Configuration cfg : feature.getConfigurations()) {
-            result.resources.add(new InstallableResource("/".concat(cfg.getPid()).concat(".config"), null,
-                    cfg.getConfigurationProperties(), null, InstallableResource.TYPE_CONFIG, null));
-        }
-
-        final Extension repoInit = feature.getExtensions().getByName(Extension.EXTENSION_NAME_REPOINIT);
-        if (repoInit != null && repoInit.getType() == ExtensionType.TEXT) {
-//            result.repoinit = repoInit.getText();
-            final String configPid = "org.apache.sling.jcr.repoinit.RepositoryInitializer~".concat(feature.getId().toMvnName().replace('-', '_'));
-            final Dictionary<String, Object> props = new Hashtable<>();
-            props.put("scripts", repoInit.getText());
-
-            result.resources.add(new InstallableResource("/".concat(configPid).concat(".config"), null,
-                    props, null, InstallableResource.TYPE_CONFIG, null));
-        }
         return result;
     }
 
     private boolean addArtifact(final Artifact artifact,
-            final Result result) {
+            final List<InstallableResource> result) {
         File artifactFile = (this.installContext.storageDirectory == null ? null
                 : getArtifactFile(this.installContext.storageDirectory, artifact.getId()));
         ArtifactHandler handler;
@@ -250,7 +247,7 @@
             }
             dict.put(InstallableResource.RESOURCE_URI_HINT, handler.getLocalURL().toString());
 
-            result.resources.add(new InstallableResource("/".concat(artifact.getId().toMvnName()), is, dict, digest,
+            result.add(new InstallableResource("/".concat(artifact.getId().toMvnName()), is, dict, digest,
                     InstallableResource.TYPE_FILE, null));
         } catch (final IOException ioe) {
             logger.warn("Unable to read artifact " + handler.getLocalURL(), ioe);
