diff --git a/pom.xml b/pom.xml
index 622ebeb..e7fb6de 100644
--- a/pom.xml
+++ b/pom.xml
@@ -114,6 +114,13 @@
             <version>3.3</version>
             <scope>provided</scope>
         </dependency>
+      <!-- We use a class from the config admin implementation to read config files -->
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.configadmin</artifactId>
+            <version>1.2.8</version>
+            <scope>provided</scope>
+        </dependency>
         <dependency>
             <groupId>org.codehaus.plexus</groupId>
             <artifactId>plexus-archiver</artifactId>
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 c3616c6..4b3d973 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/DependencyLifecycleParticipant.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/DependencyLifecycleParticipant.java
@@ -138,12 +138,12 @@
     }
 
     private static void addDependencies(final SSMDeliverable model, final Logger log, final MavenProject project) {
-        for(final SSMFeature feature : model.features) {
+        for(final SSMFeature feature : model.getFeatures()) {
             // skip base
             if ( feature.isRunMode(SSMFeature.RUN_MODE_BASE) ) {
                 continue;
             }
-            for(final SSMStartLevel sl : feature.startLevels) {
+            for(final SSMStartLevel sl : feature.getStartLevels()) {
                 for(final SSMArtifact a : sl.artifacts) {
                     final Dependency dep = new Dependency();
                     dep.setGroupId(a.groupId);
diff --git a/src/main/java/org/apache/sling/maven/slingstart/ModelUtils.java b/src/main/java/org/apache/sling/maven/slingstart/ModelUtils.java
index b213c4e..6895e23 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/ModelUtils.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/ModelUtils.java
@@ -30,8 +30,8 @@
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.project.MavenProject;
 import org.apache.sling.slingstart.model.SSMArtifact;
-import org.apache.sling.slingstart.model.SSMFeature;
 import org.apache.sling.slingstart.model.SSMDeliverable;
+import org.apache.sling.slingstart.model.SSMFeature;
 import org.apache.sling.slingstart.model.xml.XMLSSMModelReader;
 import org.codehaus.plexus.logging.Logger;
 
@@ -142,17 +142,17 @@
         if ( base == null ) {
             throw new MojoExecutionException("No base run mode found.");
         }
-        if ( base.startLevels.size() == 0 ) {
+        if ( base.getStartLevels().size() == 0 ) {
             throw new MojoExecutionException("No base artifacts defined.");
         }
-        if ( base.startLevels.size() > 1 ) {
+        if ( base.getStartLevels().size() > 1 ) {
             throw new MojoExecutionException("Base run mode should only have a single start level.");
         }
-        if ( base.startLevels.get(0).artifacts.size() != 1 ) {
+        if ( base.getStartLevels().get(0).artifacts.size() != 1 ) {
             throw new MojoExecutionException("Base run mode should contain exactly one artifact.");
         }
 
-        return base.startLevels.get(0).artifacts.get(0);
+        return base.getStartLevels().get(0).artifacts.get(0);
     }
 
     /**
diff --git a/src/main/java/org/apache/sling/maven/slingstart/PreparePackageMojo.java b/src/main/java/org/apache/sling/maven/slingstart/PreparePackageMojo.java
index ffc643b..f066ad0 100644
--- a/src/main/java/org/apache/sling/maven/slingstart/PreparePackageMojo.java
+++ b/src/main/java/org/apache/sling/maven/slingstart/PreparePackageMojo.java
@@ -17,12 +17,14 @@
 package org.apache.sling.maven.slingstart;
 
 import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
 
+import org.apache.felix.cm.file.ConfigurationHandler;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -126,7 +128,7 @@
                 if ( webConfig != null ) {
                     final File webXML = new File(webappDir, "web.xml");
                     try {
-                        FileUtils.fileWrite(webXML, webConfig.properties);
+                        FileUtils.fileWrite(webXML, webConfig.getProperties().get(SSMConstants.CFG_WEB_XML).toString());
                     } catch (final IOException e) {
                         throw new MojoExecutionException("Unable to write configuration to " + webXML, e);
                     }
@@ -149,7 +151,7 @@
             final Artifact artifact = getBaseArtifact(model, null, BuildConstants.TYPE_JAR);
             contentsMap.put(BASE_DESTINATION + "/"+ artifact.getArtifactId() + "." + artifact.getArtifactHandler().getExtension(), artifact.getFile());
         }
-        for(final SSMFeature feature : model.features) {
+        for(final SSMFeature feature : model.getFeatures()) {
             if ( packageRunMode == null ) {
                 if ( feature.isSpecial()
                      && !feature.isRunMode(SSMFeature.RUN_MODE_BOOT)) {
@@ -169,17 +171,17 @@
      */
     private void buildContentsMap(final SSMDeliverable model, final SSMFeature runMode, final Map<String, File> contentsMap)
     throws MojoExecutionException{
-        for(final SSMStartLevel sl : runMode.startLevels) {
+        for(final SSMStartLevel sl : runMode.getStartLevels()) {
             for(final SSMArtifact a : sl.artifacts) {
                 final Artifact artifact = ModelUtils.getArtifact(this.project, a.groupId, a.artifactId, model.getValue(a.version), a.type, a.classifier);
                 final File artifactFile = artifact.getFile();
-                contentsMap.put(getPathForArtifact(sl.level, artifactFile.getName(), runMode), artifactFile);
+                contentsMap.put(getPathForArtifact(sl.getLevel(), artifactFile.getName(), runMode), artifactFile);
             }
         }
 
         final File rootConfDir = new File(this.getTmpDir(), "global-config");
         boolean hasConfig = false;
-        for(final SSMConfiguration config : runMode.configurations) {
+        for(final SSMConfiguration config : runMode.getConfigurations()) {
             // skip special configurations
             if ( config.isSpecial() ) {
                 continue;
@@ -189,7 +191,12 @@
             getLog().debug(String.format("Creating configuration at %s", configFile.getPath()));
             configFile.getParentFile().mkdirs();
             try {
-                FileUtils.fileWrite(configFile, config.properties);
+                final FileOutputStream os = new FileOutputStream(configFile);
+                try {
+                    ConfigurationHandler.write(os, config.getProperties());
+                } finally {
+                    os.close();
+                }
             } catch (final IOException e) {
                 throw new MojoExecutionException("Unable to write configuration to " + configFile, e);
             }
@@ -207,18 +214,18 @@
     throws MojoExecutionException {
         String settings = null;
         final SSMFeature baseRM = model.getRunMode(SSMFeature.RUN_MODE_BASE);
-        if ( baseRM != null && baseRM.settings != null ) {
-            settings = baseRM.settings.properties + "\n";
+        if ( baseRM != null && baseRM.getSettings() != null ) {
+            settings = baseRM.getSettings().properties + "\n";
         } else {
             settings = "";
         }
         final SSMFeature bootRM = model.getRunMode(SSMFeature.RUN_MODE_BOOT);
-        if ( bootRM != null && bootRM.settings != null ) {
-            settings = settings + bootRM.settings.properties + "\n";
+        if ( bootRM != null && bootRM.getSettings() != null ) {
+            settings = settings + bootRM.getSettings().properties + "\n";
         }
         final SSMFeature packageRM = model.getRunMode(packageRunMode);
-        if ( packageRM != null && packageRM.settings != null ) {
-            settings = settings + packageRM.settings.properties;
+        if ( packageRM != null && packageRM.getSettings() != null ) {
+            settings = settings + packageRM.getSettings().properties;
         }
 
         if ( settings != null ) {
@@ -237,34 +244,37 @@
      */
     private void buildBootstrapFile(final SSMDeliverable model, final String packageRunMode, final File outputDir)
     throws MojoExecutionException {
-        String bootstrapTxt = "";
+        final StringBuilder sb = new StringBuilder();
         final SSMFeature baseRM = model.getRunMode(SSMFeature.RUN_MODE_BASE);
         if ( baseRM != null ) {
             final SSMConfiguration c = baseRM.getConfiguration(SSMConstants.CFG_BOOTSTRAP);
             if ( c != null ) {
-                bootstrapTxt = c.properties + "\n";
+                sb.append(c.getProperties().get(c.getPid()));
+                sb.append('\n');
             }
         }
         final SSMFeature bootRM = model.getRunMode(SSMFeature.RUN_MODE_BOOT);
         if ( bootRM != null ) {
             final SSMConfiguration c = bootRM.getConfiguration(SSMConstants.CFG_BOOTSTRAP);
             if ( c != null ) {
-                bootstrapTxt = bootstrapTxt + c.properties;
+                sb.append(c.getProperties().get(c.getPid()));
+                sb.append('\n');
             }
         }
         final SSMFeature packageRM = model.getRunMode(packageRunMode);
         if ( packageRM != null ) {
             final SSMConfiguration c = packageRM.getConfiguration(SSMConstants.CFG_BOOTSTRAP);
             if ( c != null ) {
-                bootstrapTxt = bootstrapTxt + c.properties;
+                sb.append(c.getProperties().get(c.getPid()));
+                sb.append('\n');
             }
         }
 
-        if ( bootstrapTxt != null ) {
+        if ( sb.length() > 0 ) {
             final File file = new File(outputDir, BOOTSTRAP_FILE);
             getLog().debug(String.format("Creating bootstrap file at %s", file.getPath()));
             try {
-                FileUtils.fileWrite(file, bootstrapTxt);
+                FileUtils.fileWrite(file, sb.toString());
             } catch ( final IOException ioe ) {
                 throw new MojoExecutionException("Unable to write bootstrap file.", ioe);
             }
@@ -335,8 +345,8 @@
      */
     private String getPathForArtifact(final int startLevel, final String artifactName, final SSMFeature rm) {
         final Set<String> runModesList = new TreeSet<String>();
-        if (rm.runModes != null ) {
-            for(final String mode : rm.runModes) {
+        if (rm.getRunModes() != null ) {
+            for(final String mode : rm.getRunModes()) {
                 runModesList.add(mode);
             }
         }
@@ -367,8 +377,8 @@
      */
     private String getPathForConfiguration(final SSMConfiguration config, final SSMFeature rm) {
         final Set<String> runModesList = new TreeSet<String>();
-        if (rm.runModes != null ) {
-            for(final String mode : rm.runModes) {
+        if (rm.getRunModes() != null ) {
+            for(final String mode : rm.getRunModes()) {
                 runModesList.add(mode);
             }
         }
@@ -390,8 +400,8 @@
             runModeExt = sb.toString();
         }
 
-        final String mainName = (config.factoryPid != null ? config.factoryPid : config.pid);
-        final String alias = (config.factoryPid != null ? "-" + config.pid : "");
+        final String mainName = (config.getFactoryPid() != null ? config.getFactoryPid() : config.getPid());
+        final String alias = (config.getFactoryPid() != null ? "-" + config.getPid() : "");
         return String.format("%s/%s%s/%s%s.cfg", BASE_DESTINATION, CONFIG_DIRECTORY,
                 runModeExt,
                 mainName,
