diff --git a/src/main/java/org/apache/sling/cpconverter/maven/mojos/ContentPackage.java b/src/main/java/org/apache/sling/cpconverter/maven/mojos/ContentPackage.java
index 0b2b36c..295f270 100644
--- a/src/main/java/org/apache/sling/cpconverter/maven/mojos/ContentPackage.java
+++ b/src/main/java/org/apache/sling/cpconverter/maven/mojos/ContentPackage.java
@@ -21,7 +21,9 @@
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
+import java.lang.reflect.Array;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 import java.util.Set;
@@ -38,12 +40,14 @@
      */
     private String artifactId = "";
 
-    private String type = "zip";
+    private List<String> types = new ArrayList(Arrays.asList("zip"));
 
     // TODO: Classifier should not be set as we have the one from the converter
     private String classifier = "";
 
     private boolean excludeTransitive;
+
+    private boolean moduleIsContentPackage;
     
     public void setGroupId(String groupId) {
         this.groupId = groupId == null ? "" : groupId;
@@ -60,7 +64,20 @@
     public boolean isExcludeTransitive() {
         return excludeTransitive;
     }
-    
+
+    public void setModuleIsContentPackage(boolean moduleIsContentPackage) {
+        this.moduleIsContentPackage = moduleIsContentPackage;
+        if(this.moduleIsContentPackage) {
+            types.add("content-package");
+        } else {
+            types.remove("content-package");
+        }
+    }
+
+    public boolean isModuleIsContentPackage() {
+        return moduleIsContentPackage;
+    }
+
     public Collection<Artifact> getMatchingArtifacts(final MavenProject project) {
         // get artifacts depending on whether we exclude transitives or not
         final Set<Artifact> artifacts;
@@ -73,15 +90,26 @@
             // all dependencies, transitives included
             artifacts = project.getArtifacts();
         }
+        // Add the project artifact itself to convert after building a content package
+        if(moduleIsContentPackage) {
+            Artifact projectArtifact = project.getArtifact();
+            System.out.println("Project Artifact: " + projectArtifact);
+            artifacts.add(projectArtifact);
+        }
         return getMatchingArtifacts(artifacts);
     }
 
     public Collection<Artifact> getMatchingArtifacts(final Collection<Artifact> artifacts) {
         final List<Artifact> matches = new ArrayList<Artifact>();
         for (Artifact artifact : artifacts) {
+            System.out.println("Check Artifact: " + artifact);
+            System.out.println("Check Artifact Group: " + artifact.getGroupId());
+            System.out.println("Check Artifact Artifact: " + artifact.getArtifactId());
+            System.out.println("Check Artifact Type: " + artifact.getType());
+            System.out.println("Check Artifact Classifier: " + artifact.getClassifier());
             if(groupId.equals(artifact.getGroupId())
                 && artifactId.equals(artifact.getArtifactId())
-                && type.equals(artifact.getType())
+                && types.contains(artifact.getType())
                 && (classifier.equals(artifact.getClassifier()) || (classifier.equals("") && artifact.getClassifier() == null))
             ) {
                 matches.add(artifact);
@@ -98,8 +126,8 @@
         builder.append("groupId=").append(groupId).append(",");
         builder.append("artifactId=").append(artifactId).append(",");
 
-        if (type != null) {
-            builder.append("type=").append(type).append(",");
+        if (types != null) {
+            builder.append("type='").append(types).append("',");
         }
         if (classifier != null) {
             builder.append("classifier=").append(classifier).append(",");
diff --git a/src/main/java/org/apache/sling/cpconverter/maven/mojos/ConvertCPMojo.java b/src/main/java/org/apache/sling/cpconverter/maven/mojos/ConvertCPMojo.java
index 4638912..a7921c5 100644
--- a/src/main/java/org/apache/sling/cpconverter/maven/mojos/ConvertCPMojo.java
+++ b/src/main/java/org/apache/sling/cpconverter/maven/mojos/ConvertCPMojo.java
@@ -17,7 +17,9 @@
 package org.apache.sling.cpconverter.maven.mojos;
 
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.ArtifactUtils;
 import org.apache.maven.artifact.DefaultArtifact;
+import org.apache.maven.artifact.handler.DefaultArtifactHandler;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugins.annotations.Mojo;
@@ -78,6 +80,8 @@
 
     public static final String CFG_CONTENT_PACKAGES = "packages";
 
+    public static final String CFG_IS_CONTENT_PACKAGE = "isContentPackage";
+
     public static final boolean DEFAULT_STRING_VALIDATION = false;
 
     public static final boolean DEFAULT_MERGE_CONFIGURATIONS = false;
@@ -90,6 +94,8 @@
 
     public static final String DEFAULT_FM_OUTPUT_DIRECTORY = DEFAULT_CONVERTED_CP_OUTPUT_DIRECTORY + "/fm.out";
 
+    public static final boolean DEFAULT_IS_CONTENT_PACKAGE = false;
+
     /**
      * If set to {@code true} the Content Package is strictly validated.
      */
@@ -151,6 +157,12 @@
     @Parameter(property = CFG_CONTENT_PACKAGES)
     private List<ContentPackage> contentPackages;
 
+    /**
+     * If set to {@code true} the module is handled as Content Package
+     */
+    @Parameter(property = CFG_IS_CONTENT_PACKAGE, defaultValue = DEFAULT_IS_CONTENT_PACKAGE + "")
+    private boolean isContentPackage;
+
     @Override
     public void execute() throws MojoExecutionException, MojoFailureException {
         // Un-encode a given Artifact Override Id
@@ -207,18 +219,14 @@
                 File targetFile = new File(targetPath);
                 if (targetFile.exists() && targetFile.isFile() && targetFile.canRead()) {
                     converter.convert(project.getArtifact().getFile());
-//                    Artifact convertedPackage = new DefaultArtifact(
-//                        project.getGroupId(), project.getArtifactId(), project.getVersion(),
-//                        "compile", ZIP_TYPE, PACKAGE_CLASSIFIER, artifactHandlerManager.getArtifactHandler(ZIP_TYPE)
-//                    );
-//                    installConvertedCP(convertedPackage);
                 } else {
                     getLog().error("Artifact is not found: " + targetPath);
                 }
             } else {
                 for(ContentPackage contentPackage: contentPackages) {
-                    getLog().info("Content Package Artifact File: " + contentPackage.toString());
+                    getLog().info("Content Package Artifact File: " + contentPackage.toString() + ", is module CP: " + isContentPackage);
                     contentPackage.setExcludeTransitive(true);
+                    contentPackage.setModuleIsContentPackage(isContentPackage);
                     final Collection<Artifact> artifacts = contentPackage.getMatchingArtifacts(project);
                     if (artifacts.isEmpty()) {
                         getLog().warn("No matching artifacts for " + contentPackage);
@@ -227,6 +235,7 @@
                     getLog().info("Target Convert CP of --- " + contentPackage + " ---");
                     for (final Artifact artifact : artifacts) {
                         final File source = artifact.getFile();
+                        getLog().info("Artifact: '" + artifact + "', source file: '" + source + "'");
                         if (source.exists() && source.isFile() && source.canRead()) {
                             converter.convert(source);
                             Artifact convertedPackage = new DefaultArtifact(
@@ -258,6 +267,9 @@
                 File destFolder = new File(userHome, ".m2/repository");
                 if(destFolder.isDirectory()) {
                     copyFiles(convertedCPOutput, destFolder);
+                    if(isContentPackage) {
+                        installFMDescriptor(project.getArtifact());
+                    }
                 }
             }
         }
@@ -312,24 +324,29 @@
         }
     }
 
-    private void installConvertedCP(Artifact artifact) throws MojoFailureException, MojoExecutionException {
+    private void installFMDescriptor(Artifact artifact) {
         if(installConvertedCP) {
             Collection<Artifact> artifacts = Collections.synchronizedCollection(new ArrayList<>());
-            // Rebuild the converted package path
-            String convertedPackagePath = artifact.getGroupId().replaceAll("\\.", "/")
-                + "/" + artifact.getArtifactId()
-                + "/" + artifact.getVersion()
-                + "/" + artifact.getArtifactId()
-                + "-" + artifact.getVersion()
-                + "-" + PACKAGE_CLASSIFIER
-                + "." + ZIP_TYPE;
-            File convertedPackageFile = new File(convertedCPOutput, convertedPackagePath);
-            if(convertedPackageFile.exists() && convertedPackageFile.canRead()) {
-                artifact.setFile(convertedPackageFile);
-                artifacts.add(artifact);
-                installArtifact(mavenSession.getProjectBuildingRequest(), artifacts);
+            // Source FM Descriptor File Path
+            String fmDescriptorFilePath = fmPrefix + artifact.getArtifactId() + ".json";
+            File fmDescriptorFile = new File(fmOutput, fmDescriptorFilePath);
+            if(fmDescriptorFile.exists() && fmDescriptorFile.canRead()) {
+                // Need to create a new Artifact Handler for the different extension and an Artifact to not
+                // change the module artifact
+                DefaultArtifactHandler fmArtifactHandler = new DefaultArtifactHandler("slingosgifeature");
+                DefaultArtifact fmArtifact = new DefaultArtifact(
+                    artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(),
+                    artifact.getScope(), "slingosgifeature", artifact.getArtifactId(), fmArtifactHandler
+                );
+                fmArtifact.setFile(fmDescriptorFile);
+                artifacts.add(fmArtifact);
+                try {
+                    installArtifact(mavenSession.getProjectBuildingRequest(), artifacts);
+                } catch (MojoFailureException | MojoExecutionException e) {
+                    getLog().error("Failed to install FM Descriptor", e);
+                }
             } else {
-                getLog().error("xCould not find Converted Package: " + convertedPackageFile);
+                getLog().error("Could not find FM Descriptor File: " + fmDescriptorFile);
             }
         }
     }
diff --git a/src/site/markdown/usage.md.vm b/src/site/markdown/usage.md.vm
index c6118c3..0c63fc9 100644
--- a/src/site/markdown/usage.md.vm
+++ b/src/site/markdown/usage.md.vm
@@ -10,7 +10,7 @@
 
 $h2 Usage
 
-$h3 Converting Sling, Project Content Packages and Lauch it
+$h3 Converting Sling, Project Content Packages and Launch it
 
 **Note**: In this sample we use Maven variables like **project.groupId** instead of a static value assuming
 that the project is within the same project that creates the content packages. Adjust that as needed.
@@ -291,3 +291,101 @@
     install \
     -P launch
 ```
+
+$h3 Converting a Content Package and Install its Feature Model Descriptor
+
+Instead of building everything local in a dedicated Maven module now each Content Project Module
+can install their generated Feature Module descriptor into the local Maven repository so that it
+can be **included as artifact** when the FM project is assembled.
+
+First in each Content Package module add this plugin configuration to your POM in the **build** section:
+
+```
+<plugin>
+    <groupId>org.apache.sling</groupId>
+    <artifactId>sling-feature-converter-maven-plugin</artifactId>
+    <version>${sp}sling-feature-converter-maven-plugin.version}</version>
+    <extensions>true</extensions>
+    <executions>
+        <execution>
+            <id>convert-cp</id>
+            <phase>verify</phase>
+            <goals>
+                <goal>convert-cp</goal>
+            </goals>
+            <configuration>
+                <artifactIdOverride>${sp}project.groupId}:${sp}project.artifactId}:slingosgifeature:${sp3}filename}}}:${sp}project.version}</artifactIdOverride>
+                <installConvertedCP>true</installConvertedCP>
+                <convertedCPOutput>${sp}project.build.directory}/fm.out</convertedCPOutput>
+                <fmOutput>${sp}project.build.directory}/fm</fmOutput>
+                <fmPrefix>peregrine-</fmPrefix>
+                <isContentPackage>true</isContentPackage>
+                <contentPackages>
+                    <contentPackage>
+                        <groupId>${sp}project.groupId}</groupId>
+                        <artifactId>${sp}project.artifactId}</artifactId>
+                    </contentPackage>
+                </contentPackages>
+            </configuration>
+        </execution>
+    </executions>
+</plugin>
+```
+
+* **sling-feature-converter-maven-plugin.version**: is a property with the version of this plugin to be used (1.0.0-SNAPSHOT for now)
+* **artifactIdOverride**: This should match the Maven Id with this pattern: 'groupId':'artifactId':'type fixed to slingosgifeature':'classifier':'version'
+* **installConvertedCP**: must be set to true otherwise I cannot be assembled later
+* **convertedCPOutput/fmOutput/fmPrefix**: adjust to your preferences
+* **isContentPackage**: must be set to true
+* **contentPackage**: must match the module's properties (later we might remove this)
+
+After a successful build one can check the installation by going to your local Maven repository, got to the location of you artifact and
+check if there is a file with the extension **slingosgifeature**.
+
+Now we can go to the Assembly part and add the FM installed locally as artifact:
+
+```
+<plugin>
+    <groupId>org.apache.sling</groupId>
+    <artifactId>slingfeature-maven-plugin</artifactId>
+    <version>${slingfeature-maven-plugin.version}</version>
+    <extensions>true</extensions>
+    <configuration>
+        <features>target/fm</features>
+        <generatedFeatures>${basedir}/target/fm</generatedFeatures>
+    </configuration>
+    <executions>
+        <execution>
+            <id>aggregate-base-feature</id>
+            <phase>generate-test-sources</phase>
+            <goals>
+                <goal>aggregate-features</goal>
+            </goals>
+            <configuration>
+                <aggregates>
+                    <aggregate>
+                        <classifier>example-runtime</classifier>
+                        <filesInclude>**/*.json</filesInclude>
+                        <configurationOverrides>*=USE_LATEST</configurationOverrides>
+                        <includeArtifact>
+                            <groupId>${project.groupId}</groupId>
+                            <artifactId>base.ui.apps</artifactId>
+                            <version>${project.version}</version>
+                            <classifier>base.ui.apps</classifier>
+                            <type>slingosgifeature</type>
+                        </includeArtifact>
+                        ...
+                    </aggregate>
+                </aggregates>
+            </configuration>
+        </execution>
+    </executions>
+</plugin>
+```
+
+* **slingfeature-maven-plugin.version**: version of the sling feature maven plugin to be used
+* **features/generatedFeatures**: add/set depending on your project
+* **classifier/filesInclude/configurationOverrides**: set depending on your project
+* **includeArtifact**: one entry per Content Package FM. The **groupId**, **artifactId**, **version** and **classifier**
+    must match your FM descriptor
+
