diff --git a/pom.xml b/pom.xml
index c47ead9..5a57a47 100644
--- a/pom.xml
+++ b/pom.xml
@@ -160,6 +160,26 @@
             <version>1.8.4</version>
         </dependency>
         <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.feature.analyser</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.feature.modelconverter</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.feature.io</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.feature.resolver</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
             <groupId>org.apache.maven</groupId>
             <artifactId>maven-core</artifactId>
             <version>${maven.version}</version>
@@ -254,6 +274,12 @@
             so these dependencies ensures that they are in the .m2 directory prior to executing the tests.
             Whenever you modify these, you must also modify the references in org.apache.sling.maven.slingstart.PreparePackageMojoTest! -->
         <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.configurator</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.commons.classloader</artifactId>
             <version>1.3.2</version>
@@ -283,6 +309,22 @@
             <version>3.2.0</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.feature</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <reporting>
diff --git a/src/main/java/org/apache/sling/maven/slingstart/DependencyLifecycleParticipant.java b/src/main/java/org/apache/sling/maven/slingstart/DependencyLifecycleParticipant.java
index 3a11d9a..96ba69a 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/DependencyLifecycleParticipant.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/DependencyLifecycleParticipant.java
@@ -16,10 +16,6 @@
  */
 package org.apache.sling.maven.slingstart;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Properties;
-
 import org.apache.maven.AbstractMavenLifecycleParticipant;
 import org.apache.maven.MavenExecutionException;
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
@@ -33,6 +29,10 @@
 import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.logging.Logger;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
 /**
  * Maven lifecycle participant which adds the artifacts of the model to the dependencies.
  * This cannot happen as part of a regular Mojo (as there the dependencies have already been calculated)
@@ -46,7 +46,7 @@
 
     private static final String GROUP_ID = "org.apache.sling";
     private static final String ARTIFACT_ID = "slingstart-maven-plugin";
-    
+
     /**
      *  the plugin ID consists of <code>groupId:artifactId</code>, see {@link Plugin#constructKey(String, String)}
      */
@@ -97,12 +97,13 @@
             }
         }
 
+        new FeatureModelConverter().convert(session, env);
         new ModelPreprocessor().addDependencies(env);
     }
-    
+
     /**
      * Retrieves the version of the encapsulating Mojo by evaluating the {@code pom.properties} loaded via the extension classloader
-     * @throws IOException 
+     * @throws IOException
      * @see <a href="https://maven.apache.org/shared/maven-archiver/#pom-properties-content">Maven Archiver - pom.properties</a>
      */
     static final String getCurrentPluginVersion() throws IOException {
diff --git a/src/main/java/org/apache/sling/maven/slingstart/FeatureModelConverter.java b/src/main/java/org/apache/sling/maven/slingstart/FeatureModelConverter.java
new file mode 100644
index 0000000..e39ad45
--- /dev/null
+++ b/src/main/java/org/apache/sling/maven/slingstart/FeatureModelConverter.java
@@ -0,0 +1,87 @@
+/*
+ * 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.maven.slingstart;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.MavenExecutionException;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.project.MavenProject;
+import org.apache.sling.feature.io.ArtifactManager;
+import org.apache.sling.feature.io.ArtifactManagerConfig;
+import org.apache.sling.feature.modelconverter.impl.FeatureToProvisioning;
+import org.apache.sling.maven.slingstart.ModelPreprocessor.Environment;
+import org.apache.sling.maven.slingstart.ModelPreprocessor.ProjectInfo;
+
+public class FeatureModelConverter {
+    static final String BUILD_DIR = "provisioning/converted";
+
+    public void convert(MavenSession session, Environment env) throws MavenExecutionException {
+        Map<String, ProjectInfo> projs = env.modelProjects;
+        for (ProjectInfo pi : projs.values()) {
+            convert(session, pi.project);
+        }
+    }
+
+    private void convert(MavenSession session, MavenProject project) throws MavenExecutionException {
+        File featuresDir = new File(project.getBasedir(), "src/main/features");
+
+        File[] files = featuresDir.listFiles();
+        List<File> featureFiles;
+        if (files != null) {
+            featureFiles = Arrays.asList(files);
+        } else {
+            featureFiles = Collections.emptyList();
+        }
+
+        if (featureFiles.size() == 0)
+            return;
+
+        File targetDir = new File(project.getBuild().getDirectory(), BUILD_DIR);
+        targetDir.mkdirs();
+
+        try {
+            ArtifactManager am = getArtifactManager(project, session);
+            for (File f : files) {
+                String fn = targetDir.getAbsolutePath() + "/" + f.getName() + ".txt";
+                FeatureToProvisioning.convert(f, fn, am);
+            }
+        } catch (Exception e) {
+            throw new MavenExecutionException("Cannot convert feature files to provisioning model", e);
+        }
+    }
+
+    private ArtifactManager getArtifactManager(MavenProject project, MavenSession session)
+            throws IOException {
+        List<String> repos = new ArrayList<>();
+        repos.add(session.getLocalRepository().getUrl());
+        for (ArtifactRepository ar : project.getRemoteArtifactRepositories()) {
+            repos.add(ar.getUrl());
+        }
+
+        final ArtifactManagerConfig amConfig = new ArtifactManagerConfig();
+        amConfig.setRepositoryUrls(repos.toArray(new String[] {}));
+        return ArtifactManager.getArtifactManager(amConfig);
+    }
+}
diff --git a/src/main/java/org/apache/sling/maven/slingstart/GenerateResourcesMojo.java b/src/main/java/org/apache/sling/maven/slingstart/GenerateResourcesMojo.java
new file mode 100644
index 0000000..b0e4c47
--- /dev/null
+++ b/src/main/java/org/apache/sling/maven/slingstart/GenerateResourcesMojo.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.maven.slingstart;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactResolver;
+import org.apache.maven.plugin.MojoExecution;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.Component;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.plugins.annotations.ResolutionScope;
+import org.apache.sling.feature.io.ArtifactManager;
+import org.apache.sling.feature.io.ArtifactManagerConfig;
+import org.apache.sling.feature.modelconverter.impl.FeatureToProvisioning;
+import org.codehaus.plexus.archiver.manager.ArchiverManager;
+
+@Mojo(
+        name = "generate-resources",
+        defaultPhase = LifecyclePhase.GENERATE_RESOURCES,
+        requiresDependencyResolution = ResolutionScope.TEST,
+        threadSafe = true)
+public class GenerateResourcesMojo extends AbstractSlingStartMojo {
+    @Parameter(defaultValue="${basedir}/src/main/features")
+    private File featuresDirectory;
+
+    /**
+     * To look up Archiver/UnArchiver implementations
+     */
+    @Component
+    private ArchiverManager archiverManager;
+
+    @Component
+    private ArtifactHandlerManager artifactHandlerManager;
+
+    /**
+     * Used to look up Artifacts in the remote repository.
+     *
+     */
+    @Component
+    private ArtifactResolver resolver;
+
+    @Parameter(defaultValue = "${mojoExecution}", readonly = true, required = true)
+    protected MojoExecution mojoExecution;
+
+    @Override
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        File[] featureFiles = featuresDirectory.listFiles();
+        if (featureFiles == null)
+            return;
+
+        File targetDir = new File(project.getBuild().getDirectory(), FeatureModelConverter.BUILD_DIR);
+        targetDir.mkdirs();
+
+        try {
+            ArtifactManager am = getArtifactManager();
+            List<File> files = Arrays.asList(featureFiles);
+            for (File f : files) {
+                String fn = targetDir.getAbsolutePath() + "/" + f.getName() + ".txt";
+                FeatureToProvisioning.convert(f, fn, am);
+            }
+        } catch (Exception e) {
+            throw new MojoExecutionException("Cannot convert feature files to provisioning model", e);
+        }
+    }
+
+    private ArtifactManager getArtifactManager() throws IOException {
+        List<String> repos = new ArrayList<>();
+        repos.add(mavenSession.getLocalRepository().getUrl());
+        for (ArtifactRepository ar : project.getRemoteArtifactRepositories()) {
+            repos.add(ar.getUrl());
+        }
+
+        final ArtifactManagerConfig amConfig = new ArtifactManagerConfig();
+        amConfig.setRepositoryUrls(repos.toArray(new String[] {}));
+        return ArtifactManager.getArtifactManager(amConfig);
+    }
+}
diff --git a/src/main/java/org/apache/sling/maven/slingstart/ModelPreprocessor.java b/src/main/java/org/apache/sling/maven/slingstart/ModelPreprocessor.java
index 7e0be34..41b3475 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/ModelPreprocessor.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/ModelPreprocessor.java
@@ -16,20 +16,6 @@
  */
 package org.apache.sling.maven.slingstart;
 
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
 import org.apache.commons.io.IOUtils;
 import org.apache.maven.MavenExecutionException;
 import org.apache.maven.artifact.Artifact;
@@ -57,6 +43,21 @@
 import org.codehaus.plexus.logging.Logger;
 import org.codehaus.plexus.util.xml.Xpp3Dom;
 
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 public class ModelPreprocessor {
 
     public static final class ProjectInfo {
@@ -122,10 +123,30 @@
             } else {
                 // use multiple fallbacks here only in case the default model directory is not explicitly set
                 File defaultModelDirectory = new File(info.project.getBasedir(), "src/main/provisioning");
-                if (defaultModelDirectory.exists()) {
+                File defaultConvertedModelDirectory = new File(info.project.getBuild().getDirectory() + "/" + FeatureModelConverter.BUILD_DIR);
+
+                if (defaultModelDirectory.exists() && defaultConvertedModelDirectory.exists()) {
+                    // The model is partially converted, partially explicitly defined. Copy the defined ones in with the converted ones
+                    for (File f : defaultModelDirectory.listFiles()) {
+                        File targetFile = new File(defaultConvertedModelDirectory, f.getName());
+                        if (targetFile.exists()) {
+                            env.logger.debug("File already exists. Skipping: " + targetFile);
+                        } else {
+                            env.logger.debug("Copying " + f + " to " + targetFile);
+                            Files.copy(f.toPath(), targetFile.toPath());
+                        }
+                    }
+                } else {
                     env.logger.debug("Try to extract model from default provisioning directory " + defaultModelDirectory.getAbsolutePath());
                     info.localModel = readLocalModel(info.project, inlinedModel, defaultModelDirectory, pattern, env.logger);
-                } else {
+                }
+
+                if (defaultConvertedModelDirectory.exists()) {
+                    env.logger.debug("Try to extract model from generated provisioning model directory " + defaultConvertedModelDirectory.getAbsolutePath());
+                    info.localModel = readLocalModel(info.project, inlinedModel, defaultConvertedModelDirectory, pattern, env.logger);
+                }
+
+                if (info.localModel == null) {
                     File defaultModelDirectoryInTest = new File(info.project.getBasedir(), "src/test/provisioning");
                     env.logger.debug("Try to extract model from default test provisioning directory " + defaultModelDirectoryInTest.getAbsolutePath());
                     info.localModel = readLocalModel(info.project, inlinedModel, defaultModelDirectoryInTest, pattern, env.logger);
diff --git a/src/main/resources/META-INF/plexus/components.xml b/src/main/resources/META-INF/plexus/components.xml
index 6d60143..c05d45e 100644
--- a/src/main/resources/META-INF/plexus/components.xml
+++ b/src/main/resources/META-INF/plexus/components.xml
@@ -27,6 +27,7 @@
           <lifecycle>
             <id>default</id>
             <phases>
+              <generate-resources>org.apache.sling:slingstart-maven-plugin:generate-resources</generate-resources>
               <package>org.apache.sling:slingstart-maven-plugin:attach-slingfeature</package>
               <install>org.apache.maven.plugins:maven-install-plugin:install</install>
               <deploy>org.apache.maven.plugins:maven-deploy-plugin:deploy</deploy>
@@ -44,6 +45,7 @@
           <lifecycle>
             <id>default</id>
             <phases>
+              <generate-resources>org.apache.sling:slingstart-maven-plugin:generate-resources</generate-resources>
               <process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
               <compile>org.apache.maven.plugins:maven-compiler-plugin:compile</compile>
               <process-test-resources>
diff --git a/src/main/resources/features1/simple.json b/src/main/resources/features1/simple.json
new file mode 100644
index 0000000..4cc130a
--- /dev/null
+++ b/src/main/resources/features1/simple.json
@@ -0,0 +1,9 @@
+{
+  "id":"generated:simple:1.0.0",
+  "bundles":[
+    {
+      "id":"org.apache.aries:org.apache.aries.util:1.1.3",
+      "start-level":"20"
+    }
+  ]
+}
diff --git a/src/main/resources/features2/src/main/features/boot_gav.json b/src/main/resources/features2/src/main/features/boot_gav.json
new file mode 100644
index 0000000..1d997f8
--- /dev/null
+++ b/src/main/resources/features2/src/main/features/boot_gav.json
@@ -0,0 +1,100 @@
+{
+    "#": "The model version defaults to 1 if not specified",
+    "model-version": "1",
+    
+    "id": "testing123/boot/4.5.6",
+    "variables": {
+        "slf4j.version": "1.7.25",
+        
+        "#": "The model name when transformed to the provisioning model",
+        "provisioning.model.name": ":boot"
+    },
+    "bundles": [
+        {
+            "id": "org.slf4j/slf4j-api/${slf4j.version}",
+            "start-level": 1
+        },
+        {
+            "id": "org.apache.sling/org.apache.sling.commons.log/5.1.0",
+            "start-level": 1
+        },
+        {
+            "id": "org.apache.sling/org.apache.sling.commons.logservice/1.0.6",
+            "start-level": 1
+        },
+        {
+            "id": "org.slf4j/jcl-over-slf4j/${slf4j.version}",
+            "start-level": 1
+        },
+        {
+            "id": "org.slf4j/log4j-over-slf4j/${slf4j.version}",
+            "start-level": 1
+        },
+        {
+            "id": "org.apache.sling/org.apache.sling.settings/1.3.8",
+            "start-level": 1
+        },
+        {
+            "id": "org.apache.sling/org.apache.sling.fragment.xml/1.0.2",
+            "start-level": 1
+        },
+        {
+            "id": "org.apache.sling/org.apache.sling.fragment.transaction/1.0.0",
+            "start-level": 1
+        },
+        {
+            "id": "org.apache.sling/org.apache.sling.javax.activation/0.1.0",
+            "start-level": 1
+        },
+        {
+            "id": "org.apache.sling/org.apache.sling.fragment.ws/1.0.2",
+            "start-level": 1
+        },
+        {
+            "id": "org.apache.sling/org.apache.sling.launchpad.installer/1.2.2",
+            "start-level": 1
+        },
+        {
+            "id": "org.apache.sling/org.apache.sling.installer.core/3.8.12",
+            "start-level": 1
+        },
+        {
+            "id": "org.apache.sling/org.apache.sling.installer.provider.file/1.1.0",
+            "start-level": 1
+        },
+        {
+            "id": "org.apache.sling/org.apache.sling.installer.factory.configuration/1.1.2",
+            "start-level": 1
+        },
+        {
+            "id": "org.apache.felix/org.apache.felix.configadmin/1.8.16",
+            "start-level": 1
+        },
+        {
+            "id": "org.apache.felix/org.apache.felix.eventadmin/1.4.10",
+            "start-level": 1
+        },
+        {
+            "id": "org.apache.aries/org.apache.aries.util/1.1.3",
+            "start-level": 1
+        },
+        {
+            "id": "org.apache.geronimo.specs/geronimo-atinject_1.0_spec/1.0",
+            "start-level": 1
+        }],
+        
+    "framework-properties": {
+        "# oak_tar and oak_mongo run modes are mutually exclusive":
+        "# and cannot be changed after the first startup",
+    
+        "sling.run.mode.install.options": "oak_tar,oak_mongo",
+        "repository.home": "${sling.home}/repository",
+        "localIndexDir": "${sling.home}/repository/index",
+        
+        "# we need runmodes here too...": "",
+        "something.runmodes:a": "else",
+        "special.runmodes::b": "true", 
+        
+        "#": "${sling.home} needs to be provided at launch time"
+    }
+}
diff --git a/src/test/java/org/apache/sling/maven/slingstart/FeatureModelConverterTest.java b/src/test/java/org/apache/sling/maven/slingstart/FeatureModelConverterTest.java
new file mode 100644
index 0000000..45a8680
--- /dev/null
+++ b/src/test/java/org/apache/sling/maven/slingstart/FeatureModelConverterTest.java
@@ -0,0 +1,97 @@
+/*
+ * 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.maven.slingstart;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URL;
+
+import com.google.common.io.Files;
+
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.model.Build;
+import org.apache.maven.project.MavenProject;
+import org.apache.sling.maven.slingstart.ModelPreprocessor.Environment;
+import org.apache.sling.maven.slingstart.ModelPreprocessor.ProjectInfo;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class FeatureModelConverterTest {
+    private File tempDir;
+
+    @Before
+    public void setup() throws Exception {
+        tempDir = Files.createTempDir();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        // Delete the temp dir again
+        delTree(tempDir);
+        tempDir = null;
+    }
+
+    private void delTree(File f) throws IOException {
+        if (f.isDirectory()) {
+            for (File c : f.listFiles())
+                delTree(c);
+        }
+        if (!f.delete()) {
+            throw new FileNotFoundException("Cannot delete: " + f);
+        }
+    }
+
+    @Test
+    public void testConvert() throws Exception {
+        File f = new File(System.getProperty("user.home") + "/.m2");
+        ArtifactRepository localRepo = Mockito.mock(ArtifactRepository.class);
+        Mockito.when(localRepo.getUrl()).thenReturn(f.toURI().toURL().toString());
+
+        MavenSession session = Mockito.mock(MavenSession.class);
+        Mockito.when(session.getLocalRepository()).thenReturn(localRepo);
+
+        URL url = getClass().getResource("/features2/src/main/features/boot_gav.json");
+        File projBaseDir = new File(url.toURI())
+                .getParentFile().getParentFile().getParentFile().getParentFile();
+
+        Build build = Mockito.mock(Build.class);
+        Mockito.when(build.getDirectory()).thenReturn(tempDir.getAbsolutePath());
+
+        MavenProject proj = Mockito.mock(MavenProject.class);
+        Mockito.when(proj.getBasedir()).thenReturn(projBaseDir);
+        Mockito.when(proj.getBuild()).thenReturn(build);
+
+        ProjectInfo pi = new ProjectInfo();
+        pi.project = proj;
+
+        Environment env = new Environment();
+        env.modelProjects.put("xyz", pi);
+
+        FeatureModelConverter fmc = new FeatureModelConverter();
+        fmc.convert(session, env);
+
+        File expectedFile = new File(tempDir, "/provisioning/converted/boot_gav.json.txt");
+        assertTrue(expectedFile.exists());
+        assertTrue(expectedFile.length() > 0);
+    }
+}
diff --git a/src/test/java/org/apache/sling/maven/slingstart/GenerateResourcesMojoTest.java b/src/test/java/org/apache/sling/maven/slingstart/GenerateResourcesMojoTest.java
new file mode 100644
index 0000000..c2ca84f
--- /dev/null
+++ b/src/test/java/org/apache/sling/maven/slingstart/GenerateResourcesMojoTest.java
@@ -0,0 +1,102 @@
+/*
+ * 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.maven.slingstart;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.net.URL;
+
+import com.google.common.io.Files;
+
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.model.Build;
+import org.apache.maven.project.MavenProject;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class GenerateResourcesMojoTest {
+    private File tempDir;
+
+    @Before
+    public void setup() throws Exception {
+        tempDir = Files.createTempDir();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        // Delete the temp dir again
+        delTree(tempDir);
+        tempDir = null;
+    }
+
+    private void delTree(File f) throws IOException {
+        if (f.isDirectory()) {
+            for (File c : f.listFiles())
+                delTree(c);
+        }
+        if (!f.delete()) {
+            throw new FileNotFoundException("Cannot delete: " + f);
+        }
+    }
+
+    @Test
+    public void testExecute() throws Exception {
+        URL url = getClass().getResource("/features1/simple.json");
+        File featureDir = new File(url.toURI()).getParentFile();
+
+        Build build = Mockito.mock(Build.class);
+        Mockito.when(build.getDirectory()).thenReturn(tempDir.getAbsolutePath());
+
+        MavenProject proj = Mockito.mock(MavenProject.class);
+        Mockito.when(proj.getBuild()).thenReturn(build);
+
+        File f = new File(System.getProperty("user.home") + "/.m2");
+        ArtifactRepository localRepo = Mockito.mock(ArtifactRepository.class);
+        Mockito.when(localRepo.getUrl()).thenReturn(f.toURI().toURL().toString());
+
+        MavenSession session = Mockito.mock(MavenSession.class);
+        Mockito.when(session.getLocalRepository()).thenReturn(localRepo);
+
+        GenerateResourcesMojo grm = new GenerateResourcesMojo();
+        setPrivateField(grm, "featuresDirectory", featureDir);
+        setPrivateField(AbstractSlingStartMojo.class, grm, "project", proj);
+        setPrivateField(AbstractSlingStartMojo.class, grm, "mavenSession", session);
+
+        grm.execute();
+
+        File expectedFile = new File(tempDir, FeatureModelConverter.BUILD_DIR + "/simple.json.txt");
+        assertTrue(expectedFile.exists());
+        assertTrue(expectedFile.length() > 0);
+    }
+
+    private void setPrivateField(Object obj, String name, Object val) throws Exception {
+        setPrivateField(obj.getClass(), obj, name, val);
+    }
+
+    private void setPrivateField(Class<?> cls, Object obj, String name, Object val) throws Exception {
+        Field field = cls.getDeclaredField(name);
+        field.setAccessible(true);
+        field.set(obj, val);
+    }
+}
diff --git a/src/test/resources/johnzon-feature.json b/src/test/resources/johnzon-feature.json
new file mode 100644
index 0000000..f70f8f4
--- /dev/null
+++ b/src/test/resources/johnzon-feature.json
@@ -0,0 +1,4 @@
+{
+    "id": "org.apache.sling.test.features/johnzon-feature/1.0.0",
+    "bundles": ["org.apache.sling/org.apache.sling.commons.johnzon/1.0.0"] 
+}
\ No newline at end of file
diff --git a/src/test/resources/launchpad-feature.json b/src/test/resources/launchpad-feature.json
new file mode 100644
index 0000000..26a43c7
--- /dev/null
+++ b/src/test/resources/launchpad-feature.json
@@ -0,0 +1,4 @@
+{
+    "id": "org.apache.sling.test.features/launchpad-feature/1.0.0",
+    "bundles": ["org.apache.sling/org.apache.sling.commons.classloader/1.3.2"] 
+}
\ No newline at end of file
