Blob Blame History Raw
From 06cbffad8f5609188a788e85991918078d9fca12 Mon Sep 17 00:00:00 2001
From: Mikolaj Izdebski <mizdebsk@redhat.com>
Date: Wed, 7 Jan 2015 10:21:15 +0100
Subject: [PATCH 4/5] Port to Modello 1.7

---
 xmvn-core/pom.xml                                  |    2 -
 .../org/fedoraproject/xmvn/config/Artifact.java    |  197 ++++
 .../fedoraproject/xmvn/config/BuildSettings.java   |  148 +++
 .../fedoraproject/xmvn/config/Configuration.java   |  343 ++++++
 .../xmvn/config/InstallerSettings.java             |  108 ++
 .../fedoraproject/xmvn/config/PackagingRule.java   |  374 +++++++
 .../org/fedoraproject/xmvn/config/Repository.java  |  308 ++++++
 .../xmvn/config/ResolverSettings.java              |  310 ++++++
 .../org/fedoraproject/xmvn/config/Stereotype.java  |  122 +++
 .../config/io/stax/ConfigurationStaxReader.java    | 1139 ++++++++++++++++++++
 .../config/io/stax/ConfigurationStaxWriter.java    |  597 ++++++++++
 .../config/io/stax/IndentingXMLStreamWriter.java   |  653 +++++++++++
 .../fedoraproject/xmvn/metadata/ArtifactAlias.java |  157 +++
 .../xmvn/metadata/ArtifactMetadata.java            |  520 +++++++++
 .../fedoraproject/xmvn/metadata/Dependency.java    |  323 ++++++
 .../xmvn/metadata/DependencyExclusion.java         |  103 ++
 .../xmvn/metadata/PackageMetadata.java             |  270 +++++
 .../xmvn/metadata/SkippedArtifactMetadata.java     |  159 +++
 .../metadata/io/stax/IndentingXMLStreamWriter.java |  653 +++++++++++
 .../xmvn/metadata/io/stax/MetadataStaxReader.java  |  950 ++++++++++++++++
 .../xmvn/metadata/io/stax/MetadataStaxWriter.java  |  490 +++++++++
 xmvn-parent/pom.xml                                |    2 +-
 22 files changed, 7925 insertions(+), 3 deletions(-)
 create mode 100644 xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/Artifact.java
 create mode 100644 xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/BuildSettings.java
 create mode 100644 xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/Configuration.java
 create mode 100644 xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/InstallerSettings.java
 create mode 100644 xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/PackagingRule.java
 create mode 100644 xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/Repository.java
 create mode 100644 xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/ResolverSettings.java
 create mode 100644 xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/Stereotype.java
 create mode 100644 xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/io/stax/ConfigurationStaxReader.java
 create mode 100644 xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/io/stax/ConfigurationStaxWriter.java
 create mode 100644 xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/io/stax/IndentingXMLStreamWriter.java
 create mode 100644 xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/ArtifactAlias.java
 create mode 100644 xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/ArtifactMetadata.java
 create mode 100644 xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/Dependency.java
 create mode 100644 xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/DependencyExclusion.java
 create mode 100644 xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/PackageMetadata.java
 create mode 100644 xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/SkippedArtifactMetadata.java
 create mode 100644 xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/io/stax/IndentingXMLStreamWriter.java
 create mode 100644 xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/io/stax/MetadataStaxReader.java
 create mode 100644 xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/io/stax/MetadataStaxWriter.java

diff --git a/xmvn-core/pom.xml b/xmvn-core/pom.xml
index 1c1808a..3c3f878 100644
--- a/xmvn-core/pom.xml
+++ b/xmvn-core/pom.xml
@@ -85,8 +85,6 @@
             <id>standard</id>
             <goals>
               <goal>java</goal>
-              <goal>stax-reader</goal>
-              <goal>stax-writer</goal>
             </goals>
           </execution>
         </executions>
diff --git a/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/Artifact.java b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/Artifact.java
new file mode 100644
index 0000000..96bb7ed
--- /dev/null
+++ b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/Artifact.java
@@ -0,0 +1,197 @@
+// =================== DO NOT EDIT THIS FILE ====================
+// Generated by Modello 1.8.2,
+// any modifications will be overwritten.
+// ==============================================================
+
+package org.fedoraproject.xmvn.config;
+
+/**
+ * Identifier of Maven artifact.
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class Artifact
+    implements java.io.Serializable, java.lang.Cloneable
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * Group ID of the artifact.
+     */
+    private String groupId = "";
+
+    /**
+     * Artifact ID of the artifact.
+     */
+    private String artifactId = "";
+
+    /**
+     * Version of the artifact.
+     */
+    private String version = "";
+
+    /**
+     * Classifier of the artifact.
+     */
+    private String classifier = "";
+
+    /**
+     * Maven stereotype of the artifact.
+     */
+    private String stereotype = "";
+
+    /**
+     * Extension of the artifact.
+     */
+    private String extension = "";
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method clone.
+     * 
+     * @return Artifact
+     */
+    public Artifact clone()
+    {
+        try
+        {
+            Artifact copy = (Artifact) super.clone();
+
+            return copy;
+        }
+        catch ( java.lang.Exception ex )
+        {
+            throw (java.lang.RuntimeException) new java.lang.UnsupportedOperationException( getClass().getName()
+                + " does not support clone()" ).initCause( ex );
+        }
+    } //-- Artifact clone()
+
+    /**
+     * Get artifact ID of the artifact.
+     * 
+     * @return String
+     */
+    public String getArtifactId()
+    {
+        return this.artifactId;
+    } //-- String getArtifactId()
+
+    /**
+     * Get classifier of the artifact.
+     * 
+     * @return String
+     */
+    public String getClassifier()
+    {
+        return this.classifier;
+    } //-- String getClassifier()
+
+    /**
+     * Get extension of the artifact.
+     * 
+     * @return String
+     */
+    public String getExtension()
+    {
+        return this.extension;
+    } //-- String getExtension()
+
+    /**
+     * Get group ID of the artifact.
+     * 
+     * @return String
+     */
+    public String getGroupId()
+    {
+        return this.groupId;
+    } //-- String getGroupId()
+
+    /**
+     * Get maven stereotype of the artifact.
+     * 
+     * @return String
+     */
+    public String getStereotype()
+    {
+        return this.stereotype;
+    } //-- String getStereotype()
+
+    /**
+     * Get version of the artifact.
+     * 
+     * @return String
+     */
+    public String getVersion()
+    {
+        return this.version;
+    } //-- String getVersion()
+
+    /**
+     * Set artifact ID of the artifact.
+     * 
+     * @param artifactId
+     */
+    public void setArtifactId( String artifactId )
+    {
+        this.artifactId = artifactId;
+    } //-- void setArtifactId( String )
+
+    /**
+     * Set classifier of the artifact.
+     * 
+     * @param classifier
+     */
+    public void setClassifier( String classifier )
+    {
+        this.classifier = classifier;
+    } //-- void setClassifier( String )
+
+    /**
+     * Set extension of the artifact.
+     * 
+     * @param extension
+     */
+    public void setExtension( String extension )
+    {
+        this.extension = extension;
+    } //-- void setExtension( String )
+
+    /**
+     * Set group ID of the artifact.
+     * 
+     * @param groupId
+     */
+    public void setGroupId( String groupId )
+    {
+        this.groupId = groupId;
+    } //-- void setGroupId( String )
+
+    /**
+     * Set maven stereotype of the artifact.
+     * 
+     * @param stereotype
+     */
+    public void setStereotype( String stereotype )
+    {
+        this.stereotype = stereotype;
+    } //-- void setStereotype( String )
+
+    /**
+     * Set version of the artifact.
+     * 
+     * @param version
+     */
+    public void setVersion( String version )
+    {
+        this.version = version;
+    } //-- void setVersion( String )
+
+}
diff --git a/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/BuildSettings.java b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/BuildSettings.java
new file mode 100644
index 0000000..5b3e278
--- /dev/null
+++ b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/BuildSettings.java
@@ -0,0 +1,148 @@
+// =================== DO NOT EDIT THIS FILE ====================
+// Generated by Modello 1.8.2,
+// any modifications will be overwritten.
+// ==============================================================
+
+package org.fedoraproject.xmvn.config;
+
+/**
+ * Basic build settings.
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class BuildSettings
+    implements java.io.Serializable, java.lang.Cloneable
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * 
+     *             Whether detailed debugging information about the
+     * build
+     *             process should be logged.
+     *           
+     */
+    private Boolean debug;
+
+    /**
+     * 
+     *             Whether compilation and execution of unit and
+     * integration tests should be skipped.
+     *           
+     */
+    private Boolean skipTests;
+
+    /**
+     * 
+     *             Compatibility version of Java sources in the
+     * reactor. If
+     *             not specified then it defaults to 1.5 or
+     * whatever is
+     *             specified in configuration of Maven Compiler
+     * Plugin.
+     *           
+     */
+    private String compilerSource;
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method clone.
+     * 
+     * @return BuildSettings
+     */
+    public BuildSettings clone()
+    {
+        try
+        {
+            BuildSettings copy = (BuildSettings) super.clone();
+
+            return copy;
+        }
+        catch ( java.lang.Exception ex )
+        {
+            throw (java.lang.RuntimeException) new java.lang.UnsupportedOperationException( getClass().getName()
+                + " does not support clone()" ).initCause( ex );
+        }
+    } //-- BuildSettings clone()
+
+    /**
+     * Get compatibility version of Java sources in the reactor. If
+     *             not specified then it defaults to 1.5 or
+     * whatever is
+     *             specified in configuration of Maven Compiler
+     * Plugin.
+     * 
+     * @return String
+     */
+    public String getCompilerSource()
+    {
+        return this.compilerSource;
+    } //-- String getCompilerSource()
+
+    /**
+     * Get whether detailed debugging information about the build
+     *             process should be logged.
+     * 
+     * @return Boolean
+     */
+    public Boolean isDebug()
+    {
+        return this.debug;
+    } //-- Boolean isDebug()
+
+    /**
+     * Get whether compilation and execution of unit and
+     * integration tests should be skipped.
+     * 
+     * @return Boolean
+     */
+    public Boolean isSkipTests()
+    {
+        return this.skipTests;
+    } //-- Boolean isSkipTests()
+
+    /**
+     * Set compatibility version of Java sources in the reactor. If
+     *             not specified then it defaults to 1.5 or
+     * whatever is
+     *             specified in configuration of Maven Compiler
+     * Plugin.
+     * 
+     * @param compilerSource
+     */
+    public void setCompilerSource( String compilerSource )
+    {
+        this.compilerSource = compilerSource;
+    } //-- void setCompilerSource( String )
+
+    /**
+     * Set whether detailed debugging information about the build
+     *             process should be logged.
+     * 
+     * @param debug
+     */
+    public void setDebug( Boolean debug )
+    {
+        this.debug = debug;
+    } //-- void setDebug( Boolean )
+
+    /**
+     * Set whether compilation and execution of unit and
+     * integration tests should be skipped.
+     * 
+     * @param skipTests
+     */
+    public void setSkipTests( Boolean skipTests )
+    {
+        this.skipTests = skipTests;
+    } //-- void setSkipTests( Boolean )
+
+}
diff --git a/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/Configuration.java b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/Configuration.java
new file mode 100644
index 0000000..f898bca
--- /dev/null
+++ b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/Configuration.java
@@ -0,0 +1,343 @@
+// =================== DO NOT EDIT THIS FILE ====================
+// Generated by Modello 1.8.2,
+// any modifications will be overwritten.
+// ==============================================================
+
+package org.fedoraproject.xmvn.config;
+
+/**
+ * 
+ *         Root element of the configuration file.
+ *       
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class Configuration
+    implements java.io.Serializable, java.lang.Cloneable
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * Field properties.
+     */
+    private java.util.Properties properties;
+
+    /**
+     * Field repositories.
+     */
+    private java.util.List<Repository> repositories;
+
+    /**
+     * 
+     *             This element contains basic XMvn settings.
+     *           
+     */
+    private BuildSettings buildSettings;
+
+    /**
+     * Field artifactManagement.
+     */
+    private java.util.List<PackagingRule> artifactManagement;
+
+    /**
+     * 
+     *             This element contains configuration of XMvn
+     * resolver.
+     *           
+     */
+    private ResolverSettings resolverSettings;
+
+    /**
+     * 
+     *             This element contains configuration of XMvn
+     * installer.
+     *           
+     */
+    private InstallerSettings installerSettings;
+
+    /**
+     * Field modelEncoding.
+     */
+    private String modelEncoding = "UTF-8";
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method addArtifactManagement.
+     * 
+     * @param packagingRule
+     */
+    public void addArtifactManagement( PackagingRule packagingRule )
+    {
+        getArtifactManagement().add( packagingRule );
+    } //-- void addArtifactManagement( PackagingRule )
+
+    /**
+     * Method addProperty.
+     * 
+     * @param key
+     * @param value
+     */
+    public void addProperty( String key, String value )
+    {
+        getProperties().put( key, value );
+    } //-- void addProperty( String, String )
+
+    /**
+     * Method addRepository.
+     * 
+     * @param repository
+     */
+    public void addRepository( Repository repository )
+    {
+        getRepositories().add( repository );
+    } //-- void addRepository( Repository )
+
+    /**
+     * Method clone.
+     * 
+     * @return Configuration
+     */
+    public Configuration clone()
+    {
+        try
+        {
+            Configuration copy = (Configuration) super.clone();
+
+            if ( this.properties != null )
+            {
+                copy.properties = (java.util.Properties) this.properties.clone();
+            }
+
+            if ( this.repositories != null )
+            {
+                copy.repositories = new java.util.ArrayList<Repository>();
+                for ( Repository item : this.repositories )
+                {
+                    copy.repositories.add( ( (Repository) item).clone() );
+                }
+            }
+
+            if ( this.buildSettings != null )
+            {
+                copy.buildSettings = (BuildSettings) this.buildSettings.clone();
+            }
+
+            if ( this.artifactManagement != null )
+            {
+                copy.artifactManagement = new java.util.ArrayList<PackagingRule>();
+                for ( PackagingRule item : this.artifactManagement )
+                {
+                    copy.artifactManagement.add( ( (PackagingRule) item).clone() );
+                }
+            }
+
+            if ( this.resolverSettings != null )
+            {
+                copy.resolverSettings = (ResolverSettings) this.resolverSettings.clone();
+            }
+
+            if ( this.installerSettings != null )
+            {
+                copy.installerSettings = (InstallerSettings) this.installerSettings.clone();
+            }
+
+            return copy;
+        }
+        catch ( java.lang.Exception ex )
+        {
+            throw (java.lang.RuntimeException) new java.lang.UnsupportedOperationException( getClass().getName()
+                + " does not support clone()" ).initCause( ex );
+        }
+    } //-- Configuration clone()
+
+    /**
+     * Method getArtifactManagement.
+     * 
+     * @return List
+     */
+    public java.util.List<PackagingRule> getArtifactManagement()
+    {
+        if ( this.artifactManagement == null )
+        {
+            this.artifactManagement = new java.util.ArrayList<PackagingRule>();
+        }
+
+        return this.artifactManagement;
+    } //-- java.util.List<PackagingRule> getArtifactManagement()
+
+    /**
+     * Get this element contains basic XMvn settings.
+     * 
+     * @return BuildSettings
+     */
+    public BuildSettings getBuildSettings()
+    {
+        return this.buildSettings;
+    } //-- BuildSettings getBuildSettings()
+
+    /**
+     * Get this element contains configuration of XMvn installer.
+     * 
+     * @return InstallerSettings
+     */
+    public InstallerSettings getInstallerSettings()
+    {
+        return this.installerSettings;
+    } //-- InstallerSettings getInstallerSettings()
+
+    /**
+     * Get the modelEncoding field.
+     * 
+     * @return String
+     */
+    public String getModelEncoding()
+    {
+        return this.modelEncoding;
+    } //-- String getModelEncoding()
+
+    /**
+     * Method getProperties.
+     * 
+     * @return Properties
+     */
+    public java.util.Properties getProperties()
+    {
+        if ( this.properties == null )
+        {
+            this.properties = new java.util.Properties();
+        }
+
+        return this.properties;
+    } //-- java.util.Properties getProperties()
+
+    /**
+     * Method getRepositories.
+     * 
+     * @return List
+     */
+    public java.util.List<Repository> getRepositories()
+    {
+        if ( this.repositories == null )
+        {
+            this.repositories = new java.util.ArrayList<Repository>();
+        }
+
+        return this.repositories;
+    } //-- java.util.List<Repository> getRepositories()
+
+    /**
+     * Get this element contains configuration of XMvn resolver.
+     * 
+     * @return ResolverSettings
+     */
+    public ResolverSettings getResolverSettings()
+    {
+        return this.resolverSettings;
+    } //-- ResolverSettings getResolverSettings()
+
+    /**
+     * Method removeArtifactManagement.
+     * 
+     * @param packagingRule
+     */
+    public void removeArtifactManagement( PackagingRule packagingRule )
+    {
+        getArtifactManagement().remove( packagingRule );
+    } //-- void removeArtifactManagement( PackagingRule )
+
+    /**
+     * Method removeRepository.
+     * 
+     * @param repository
+     */
+    public void removeRepository( Repository repository )
+    {
+        getRepositories().remove( repository );
+    } //-- void removeRepository( Repository )
+
+    /**
+     * Set this element configures how artifacts should be assigned
+     *             to individual packages.
+     * 
+     * @param artifactManagement
+     */
+    public void setArtifactManagement( java.util.List<PackagingRule> artifactManagement )
+    {
+        this.artifactManagement = artifactManagement;
+    } //-- void setArtifactManagement( java.util.List )
+
+    /**
+     * Set this element contains basic XMvn settings.
+     * 
+     * @param buildSettings
+     */
+    public void setBuildSettings( BuildSettings buildSettings )
+    {
+        this.buildSettings = buildSettings;
+    } //-- void setBuildSettings( BuildSettings )
+
+    /**
+     * Set this element contains configuration of XMvn installer.
+     * 
+     * @param installerSettings
+     */
+    public void setInstallerSettings( InstallerSettings installerSettings )
+    {
+        this.installerSettings = installerSettings;
+    } //-- void setInstallerSettings( InstallerSettings )
+
+    /**
+     * Set the modelEncoding field.
+     * 
+     * @param modelEncoding
+     */
+    public void setModelEncoding( String modelEncoding )
+    {
+        this.modelEncoding = modelEncoding;
+    } //-- void setModelEncoding( String )
+
+    /**
+     * Set this element lists system Java properties that should be
+     * set before XMvn build is started.
+     * 
+     * @param properties
+     */
+    public void setProperties( java.util.Properties properties )
+    {
+        this.properties = properties;
+    } //-- void setProperties( java.util.Properties )
+
+    /**
+     * Set list of repositories.  Repositories can be used by
+     *             resolvers as source of artifacts, by installers
+     * as target
+     *             where artifacts should be installed, or by any
+     * other
+     *             component.
+     * 
+     * @param repositories
+     */
+    public void setRepositories( java.util.List<Repository> repositories )
+    {
+        this.repositories = repositories;
+    } //-- void setRepositories( java.util.List )
+
+    /**
+     * Set this element contains configuration of XMvn resolver.
+     * 
+     * @param resolverSettings
+     */
+    public void setResolverSettings( ResolverSettings resolverSettings )
+    {
+        this.resolverSettings = resolverSettings;
+    } //-- void setResolverSettings( ResolverSettings )
+
+}
diff --git a/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/InstallerSettings.java b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/InstallerSettings.java
new file mode 100644
index 0000000..96d87b3
--- /dev/null
+++ b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/InstallerSettings.java
@@ -0,0 +1,108 @@
+// =================== DO NOT EDIT THIS FILE ====================
+// Generated by Modello 1.8.2,
+// any modifications will be overwritten.
+// ==============================================================
+
+package org.fedoraproject.xmvn.config;
+
+/**
+ * XMvn settings related to installation of artifacts.
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class InstallerSettings
+    implements java.io.Serializable, java.lang.Cloneable
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * 
+     *             Whether additional debugging information about
+     * artifact
+     *             installation should be printed.
+     *           
+     */
+    private Boolean debug;
+
+    /**
+     * 
+     *             Directory into which XMvn metadata files are be
+     * installed.
+     *           
+     */
+    private String metadataDir;
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method clone.
+     * 
+     * @return InstallerSettings
+     */
+    public InstallerSettings clone()
+    {
+        try
+        {
+            InstallerSettings copy = (InstallerSettings) super.clone();
+
+            return copy;
+        }
+        catch ( java.lang.Exception ex )
+        {
+            throw (java.lang.RuntimeException) new java.lang.UnsupportedOperationException( getClass().getName()
+                + " does not support clone()" ).initCause( ex );
+        }
+    } //-- InstallerSettings clone()
+
+    /**
+     * Get directory into which XMvn metadata files are be
+     * installed.
+     * 
+     * @return String
+     */
+    public String getMetadataDir()
+    {
+        return this.metadataDir;
+    } //-- String getMetadataDir()
+
+    /**
+     * Get whether additional debugging information about artifact
+     *             installation should be printed.
+     * 
+     * @return Boolean
+     */
+    public Boolean isDebug()
+    {
+        return this.debug;
+    } //-- Boolean isDebug()
+
+    /**
+     * Set whether additional debugging information about artifact
+     *             installation should be printed.
+     * 
+     * @param debug
+     */
+    public void setDebug( Boolean debug )
+    {
+        this.debug = debug;
+    } //-- void setDebug( Boolean )
+
+    /**
+     * Set directory into which XMvn metadata files are be
+     * installed.
+     * 
+     * @param metadataDir
+     */
+    public void setMetadataDir( String metadataDir )
+    {
+        this.metadataDir = metadataDir;
+    } //-- void setMetadataDir( String )
+
+}
diff --git a/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/PackagingRule.java b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/PackagingRule.java
new file mode 100644
index 0000000..d40ab78
--- /dev/null
+++ b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/PackagingRule.java
@@ -0,0 +1,374 @@
+// =================== DO NOT EDIT THIS FILE ====================
+// Generated by Modello 1.8.2,
+// any modifications will be overwritten.
+// ==============================================================
+
+package org.fedoraproject.xmvn.config;
+
+/**
+ * Identification of Maven Artifact.
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class PackagingRule
+    implements java.io.Serializable, java.lang.Cloneable
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * Pattern specifying one or more Maven artifacts.
+     */
+    private Artifact artifactGlob;
+
+    /**
+     * Name of binary package into which artifacts are assigned.
+     */
+    private String targetPackage;
+
+    /**
+     * 
+     *             ID of repository into which artifacts are
+     * installed.
+     *           
+     */
+    private String targetRepository;
+
+    /**
+     * Field files.
+     */
+    private java.util.List<String> files;
+
+    /**
+     * Field versions.
+     */
+    private java.util.List<String> versions;
+
+    /**
+     * Field aliases.
+     */
+    private java.util.List<Artifact> aliases;
+
+    /**
+     * 
+     *             Whether this rule is optional.  Non-optional
+     * rules cause
+     *             build failure if they are not matched.
+     *           
+     */
+    private Boolean optional = Boolean.valueOf( false );
+
+    /**
+     * 
+     *             Whether any reactor artifact matches artifact
+     * glob pattern
+     *             for this rule.  Non-optional rules cause build
+     * failure if
+     *             they are not matched.
+     *           
+     */
+    private Boolean matched = Boolean.valueOf( false );
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method addFile.
+     * 
+     * @param string
+     */
+    public void addFile( String string )
+    {
+        getFiles().add( string );
+    } //-- void addFile( String )
+
+    /**
+     * Method addVersion.
+     * 
+     * @param string
+     */
+    public void addVersion( String string )
+    {
+        getVersions().add( string );
+    } //-- void addVersion( String )
+
+    /**
+     * Method clone.
+     * 
+     * @return PackagingRule
+     */
+    public PackagingRule clone()
+    {
+        try
+        {
+            PackagingRule copy = (PackagingRule) super.clone();
+
+            if ( this.artifactGlob != null )
+            {
+                copy.artifactGlob = (Artifact) this.artifactGlob.clone();
+            }
+
+            if ( this.files != null )
+            {
+                copy.files = new java.util.ArrayList<String>();
+                copy.files.addAll( this.files );
+            }
+
+            if ( this.versions != null )
+            {
+                copy.versions = new java.util.ArrayList<String>();
+                copy.versions.addAll( this.versions );
+            }
+
+            if ( this.aliases != null )
+            {
+                copy.aliases = new java.util.ArrayList<Artifact>();
+                for ( Artifact item : this.aliases )
+                {
+                    copy.aliases.add( ( (Artifact) item).clone() );
+                }
+            }
+
+            return copy;
+        }
+        catch ( java.lang.Exception ex )
+        {
+            throw (java.lang.RuntimeException) new java.lang.UnsupportedOperationException( getClass().getName()
+                + " does not support clone()" ).initCause( ex );
+        }
+    } //-- PackagingRule clone()
+
+    /**
+     * Method getAliases.
+     * 
+     * @return List
+     */
+    public java.util.List<Artifact> getAliases()
+    {
+        if ( this.aliases == null )
+        {
+            this.aliases = new java.util.ArrayList<Artifact>();
+        }
+
+        return this.aliases;
+    } //-- java.util.List<Artifact> getAliases()
+
+    /**
+     * Get pattern specifying one or more Maven artifacts.
+     * 
+     * @return Artifact
+     */
+    public Artifact getArtifactGlob()
+    {
+        return this.artifactGlob;
+    } //-- Artifact getArtifactGlob()
+
+    /**
+     * Method getFiles.
+     * 
+     * @return List
+     */
+    public java.util.List<String> getFiles()
+    {
+        if ( this.files == null )
+        {
+            this.files = new java.util.ArrayList<String>();
+        }
+
+        return this.files;
+    } //-- java.util.List<String> getFiles()
+
+    /**
+     * Get name of binary package into which artifacts are
+     * assigned.
+     * 
+     * @return String
+     */
+    public String getTargetPackage()
+    {
+        return this.targetPackage;
+    } //-- String getTargetPackage()
+
+    /**
+     * Get iD of repository into which artifacts are installed.
+     * 
+     * @return String
+     */
+    public String getTargetRepository()
+    {
+        return this.targetRepository;
+    } //-- String getTargetRepository()
+
+    /**
+     * Method getVersions.
+     * 
+     * @return List
+     */
+    public java.util.List<String> getVersions()
+    {
+        if ( this.versions == null )
+        {
+            this.versions = new java.util.ArrayList<String>();
+        }
+
+        return this.versions;
+    } //-- java.util.List<String> getVersions()
+
+    /**
+     * Get whether any reactor artifact matches artifact glob
+     * pattern
+     *             for this rule.  Non-optional rules cause build
+     * failure if
+     *             they are not matched.
+     * 
+     * @return Boolean
+     */
+    public Boolean isMatched()
+    {
+        return this.matched;
+    } //-- Boolean isMatched()
+
+    /**
+     * Get whether this rule is optional.  Non-optional rules cause
+     *             build failure if they are not matched.
+     * 
+     * @return Boolean
+     */
+    public Boolean isOptional()
+    {
+        return this.optional;
+    } //-- Boolean isOptional()
+
+    /**
+     * Method removeFile.
+     * 
+     * @param string
+     */
+    public void removeFile( String string )
+    {
+        getFiles().remove( string );
+    } //-- void removeFile( String )
+
+    /**
+     * Method removeVersion.
+     * 
+     * @param string
+     */
+    public void removeVersion( String string )
+    {
+        getVersions().remove( string );
+    } //-- void removeVersion( String )
+
+    /**
+     * Set alternative identifiers of artifacts.
+     * 
+     * @param aliases
+     */
+    public void setAliases( java.util.List<Artifact> aliases )
+    {
+        this.aliases = aliases;
+    } //-- void setAliases( java.util.List )
+
+    /**
+     * Set pattern specifying one or more Maven artifacts.
+     * 
+     * @param artifactGlob
+     */
+    public void setArtifactGlob( Artifact artifactGlob )
+    {
+        this.artifactGlob = artifactGlob;
+    } //-- void setArtifactGlob( Artifact )
+
+    /**
+     * Set files holding the artifact.
+     * 
+     * @param files
+     */
+    public void setFiles( java.util.List<String> files )
+    {
+        this.files = files;
+    } //-- void setFiles( java.util.List )
+
+    /**
+     * Set whether any reactor artifact matches artifact glob
+     * pattern
+     *             for this rule.  Non-optional rules cause build
+     * failure if
+     *             they are not matched.
+     * 
+     * @param matched
+     */
+    public void setMatched( Boolean matched )
+    {
+        this.matched = matched;
+    } //-- void setMatched( Boolean )
+
+    /**
+     * Set whether this rule is optional.  Non-optional rules cause
+     *             build failure if they are not matched.
+     * 
+     * @param optional
+     */
+    public void setOptional( Boolean optional )
+    {
+        this.optional = optional;
+    } //-- void setOptional( Boolean )
+
+    /**
+     * Set name of binary package into which artifacts are
+     * assigned.
+     * 
+     * @param targetPackage
+     */
+    public void setTargetPackage( String targetPackage )
+    {
+        this.targetPackage = targetPackage;
+    } //-- void setTargetPackage( String )
+
+    /**
+     * Set iD of repository into which artifacts are installed.
+     * 
+     * @param targetRepository
+     */
+    public void setTargetRepository( String targetRepository )
+    {
+        this.targetRepository = targetRepository;
+    } //-- void setTargetRepository( String )
+
+    /**
+     * Set compatibility versions of the artifact.
+     * 
+     * @param versions
+     */
+    public void setVersions( java.util.List<String> versions )
+    {
+        this.versions = versions;
+    } //-- void setVersions( java.util.List )
+
+    
+            
+    /**
+     * Add an alias.
+     * @param artifact alias to be added
+     */
+    public void addAlias( Artifact artifact )
+    {
+        getAliases().add( artifact );
+    }
+
+    /**
+     * Remove an alias.
+     * @param artifact alias to be removed
+     */
+    public void removeAlias( Artifact artifact )
+    {
+        getAliases().remove( artifact );
+    }
+            
+          
+}
diff --git a/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/Repository.java b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/Repository.java
new file mode 100644
index 0000000..88a5374
--- /dev/null
+++ b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/Repository.java
@@ -0,0 +1,308 @@
+// =================== DO NOT EDIT THIS FILE ====================
+// Generated by Modello 1.8.2,
+// any modifications will be overwritten.
+// ==============================================================
+
+package org.fedoraproject.xmvn.config;
+
+/**
+ * Artifact repository.
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class Repository
+    implements java.io.Serializable, java.lang.Cloneable
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * Unique string identifying this repository.
+     */
+    private String id;
+
+    /**
+     * 
+     *             Role hint of Plexus component implementing the
+     * repository.
+     *           
+     */
+    private String type;
+
+    /**
+     * Field stereotypes.
+     */
+    private java.util.List<Stereotype> stereotypes;
+
+    /**
+     * Field properties.
+     */
+    private java.util.Properties properties;
+
+    /**
+     * 
+     *             Arbitrary XML used to configure structure of the
+     *             repository.  Configuration can be freely used by
+     * the
+     *             implementation, so their exact meaning depends
+     * on
+     *             repository type.  See documentation for
+     * repository types
+     *             to see the format of supported configuration (if
+     * any).
+     *           
+     */
+    private Object configuration;
+
+    /**
+     * 
+     *             A boolean expression describing which artifacts
+     * can be
+     *             stored in this repository.
+     *           
+     */
+    private Object filter;
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method addProperty.
+     * 
+     * @param key
+     * @param value
+     */
+    public void addProperty( String key, String value )
+    {
+        getProperties().put( key, value );
+    } //-- void addProperty( String, String )
+
+    /**
+     * Method addStereotype.
+     * 
+     * @param stereotype
+     */
+    public void addStereotype( Stereotype stereotype )
+    {
+        getStereotypes().add( stereotype );
+    } //-- void addStereotype( Stereotype )
+
+    /**
+     * Method clone.
+     * 
+     * @return Repository
+     */
+    public Repository clone()
+    {
+        try
+        {
+            Repository copy = (Repository) super.clone();
+
+            if ( this.stereotypes != null )
+            {
+                copy.stereotypes = new java.util.ArrayList<Stereotype>();
+                for ( Stereotype item : this.stereotypes )
+                {
+                    copy.stereotypes.add( ( (Stereotype) item).clone() );
+                }
+            }
+
+            if ( this.properties != null )
+            {
+                copy.properties = (java.util.Properties) this.properties.clone();
+            }
+
+            if ( this.configuration != null )
+            {
+                copy.configuration = new org.codehaus.plexus.util.xml.Xpp3Dom( (org.codehaus.plexus.util.xml.Xpp3Dom) this.configuration );
+            }
+
+            if ( this.filter != null )
+            {
+                copy.filter = new org.codehaus.plexus.util.xml.Xpp3Dom( (org.codehaus.plexus.util.xml.Xpp3Dom) this.filter );
+            }
+
+            return copy;
+        }
+        catch ( java.lang.Exception ex )
+        {
+            throw (java.lang.RuntimeException) new java.lang.UnsupportedOperationException( getClass().getName()
+                + " does not support clone()" ).initCause( ex );
+        }
+    } //-- Repository clone()
+
+    /**
+     * Get arbitrary XML used to configure structure of the
+     *             repository.  Configuration can be freely used by
+     * the
+     *             implementation, so their exact meaning depends
+     * on
+     *             repository type.  See documentation for
+     * repository types
+     *             to see the format of supported configuration (if
+     * any).
+     * 
+     * @return Object
+     */
+    public Object getConfiguration()
+    {
+        return this.configuration;
+    } //-- Object getConfiguration()
+
+    /**
+     * Get a boolean expression describing which artifacts can be
+     *             stored in this repository.
+     * 
+     * @return Object
+     */
+    public Object getFilter()
+    {
+        return this.filter;
+    } //-- Object getFilter()
+
+    /**
+     * Get unique string identifying this repository.
+     * 
+     * @return String
+     */
+    public String getId()
+    {
+        return this.id;
+    } //-- String getId()
+
+    /**
+     * Method getProperties.
+     * 
+     * @return Properties
+     */
+    public java.util.Properties getProperties()
+    {
+        if ( this.properties == null )
+        {
+            this.properties = new java.util.Properties();
+        }
+
+        return this.properties;
+    } //-- java.util.Properties getProperties()
+
+    /**
+     * Method getStereotypes.
+     * 
+     * @return List
+     */
+    public java.util.List<Stereotype> getStereotypes()
+    {
+        if ( this.stereotypes == null )
+        {
+            this.stereotypes = new java.util.ArrayList<Stereotype>();
+        }
+
+        return this.stereotypes;
+    } //-- java.util.List<Stereotype> getStereotypes()
+
+    /**
+     * Get role hint of Plexus component implementing the
+     * repository.
+     * 
+     * @return String
+     */
+    public String getType()
+    {
+        return this.type;
+    } //-- String getType()
+
+    /**
+     * Method removeStereotype.
+     * 
+     * @param stereotype
+     */
+    public void removeStereotype( Stereotype stereotype )
+    {
+        getStereotypes().remove( stereotype );
+    } //-- void removeStereotype( Stereotype )
+
+    /**
+     * Set arbitrary XML used to configure structure of the
+     *             repository.  Configuration can be freely used by
+     * the
+     *             implementation, so their exact meaning depends
+     * on
+     *             repository type.  See documentation for
+     * repository types
+     *             to see the format of supported configuration (if
+     * any).
+     * 
+     * @param configuration
+     */
+    public void setConfiguration( Object configuration )
+    {
+        this.configuration = configuration;
+    } //-- void setConfiguration( Object )
+
+    /**
+     * Set a boolean expression describing which artifacts can be
+     *             stored in this repository.
+     * 
+     * @param filter
+     */
+    public void setFilter( Object filter )
+    {
+        this.filter = filter;
+    } //-- void setFilter( Object )
+
+    /**
+     * Set unique string identifying this repository.
+     * 
+     * @param id
+     */
+    public void setId( String id )
+    {
+        this.id = id;
+    } //-- void setId( String )
+
+    /**
+     * Set properties associated with this repository.  Properties
+     *             can be freely used by the implementation, so
+     * their exact
+     *             meaning depends on repository type.  See
+     * documentation for
+     *             repository types to see list of supported
+     * properties.
+     * 
+     * @param properties
+     */
+    public void setProperties( java.util.Properties properties )
+    {
+        this.properties = properties;
+    } //-- void setProperties( java.util.Properties )
+
+    /**
+     * Set list of artifact types that can be stored in this
+     *             repository.  Empty list means that this
+     * repository can
+     *             store any artifact type.
+     * 
+     * @param stereotypes
+     */
+    public void setStereotypes( java.util.List<Stereotype> stereotypes )
+    {
+        this.stereotypes = stereotypes;
+    } //-- void setStereotypes( java.util.List )
+
+    /**
+     * Set role hint of Plexus component implementing the
+     * repository.
+     * 
+     * @param type
+     */
+    public void setType( String type )
+    {
+        this.type = type;
+    } //-- void setType( String )
+
+}
diff --git a/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/ResolverSettings.java b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/ResolverSettings.java
new file mode 100644
index 0000000..5d99b74
--- /dev/null
+++ b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/ResolverSettings.java
@@ -0,0 +1,310 @@
+// =================== DO NOT EDIT THIS FILE ====================
+// Generated by Modello 1.8.2,
+// any modifications will be overwritten.
+// ==============================================================
+
+package org.fedoraproject.xmvn.config;
+
+/**
+ * XMvn settings related to resolution of artifacts.
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class ResolverSettings
+    implements java.io.Serializable, java.lang.Cloneable
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * 
+     *             Whether detailed debugging information about
+     * artifact
+     *             resolution process should be logged.
+     *           
+     */
+    private Boolean debug;
+
+    /**
+     * Field localRepositories.
+     */
+    private java.util.List<String> localRepositories;
+
+    /**
+     * Field metadataRepositories.
+     */
+    private java.util.List<String> metadataRepositories;
+
+    /**
+     * Field prefixes.
+     */
+    private java.util.List<String> prefixes;
+
+    /**
+     * Field blacklist.
+     */
+    private java.util.List<Artifact> blacklist;
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method addBlacklist.
+     * 
+     * @param artifact
+     */
+    public void addBlacklist( Artifact artifact )
+    {
+        getBlacklist().add( artifact );
+    } //-- void addBlacklist( Artifact )
+
+    /**
+     * Method addLocalRepository.
+     * 
+     * @param string
+     */
+    public void addLocalRepository( String string )
+    {
+        getLocalRepositories().add( string );
+    } //-- void addLocalRepository( String )
+
+    /**
+     * Method addMetadataRepository.
+     * 
+     * @param string
+     */
+    public void addMetadataRepository( String string )
+    {
+        getMetadataRepositories().add( string );
+    } //-- void addMetadataRepository( String )
+
+    /**
+     * Method addPrefix.
+     * 
+     * @param string
+     */
+    public void addPrefix( String string )
+    {
+        getPrefixes().add( string );
+    } //-- void addPrefix( String )
+
+    /**
+     * Method clone.
+     * 
+     * @return ResolverSettings
+     */
+    public ResolverSettings clone()
+    {
+        try
+        {
+            ResolverSettings copy = (ResolverSettings) super.clone();
+
+            if ( this.localRepositories != null )
+            {
+                copy.localRepositories = new java.util.ArrayList<String>();
+                copy.localRepositories.addAll( this.localRepositories );
+            }
+
+            if ( this.metadataRepositories != null )
+            {
+                copy.metadataRepositories = new java.util.ArrayList<String>();
+                copy.metadataRepositories.addAll( this.metadataRepositories );
+            }
+
+            if ( this.prefixes != null )
+            {
+                copy.prefixes = new java.util.ArrayList<String>();
+                copy.prefixes.addAll( this.prefixes );
+            }
+
+            if ( this.blacklist != null )
+            {
+                copy.blacklist = new java.util.ArrayList<Artifact>();
+                for ( Artifact item : this.blacklist )
+                {
+                    copy.blacklist.add( ( (Artifact) item).clone() );
+                }
+            }
+
+            return copy;
+        }
+        catch ( java.lang.Exception ex )
+        {
+            throw (java.lang.RuntimeException) new java.lang.UnsupportedOperationException( getClass().getName()
+                + " does not support clone()" ).initCause( ex );
+        }
+    } //-- ResolverSettings clone()
+
+    /**
+     * Method getBlacklist.
+     * 
+     * @return List
+     */
+    public java.util.List<Artifact> getBlacklist()
+    {
+        if ( this.blacklist == null )
+        {
+            this.blacklist = new java.util.ArrayList<Artifact>();
+        }
+
+        return this.blacklist;
+    } //-- java.util.List<Artifact> getBlacklist()
+
+    /**
+     * Method getLocalRepositories.
+     * 
+     * @return List
+     */
+    public java.util.List<String> getLocalRepositories()
+    {
+        if ( this.localRepositories == null )
+        {
+            this.localRepositories = new java.util.ArrayList<String>();
+        }
+
+        return this.localRepositories;
+    } //-- java.util.List<String> getLocalRepositories()
+
+    /**
+     * Method getMetadataRepositories.
+     * 
+     * @return List
+     */
+    public java.util.List<String> getMetadataRepositories()
+    {
+        if ( this.metadataRepositories == null )
+        {
+            this.metadataRepositories = new java.util.ArrayList<String>();
+        }
+
+        return this.metadataRepositories;
+    } //-- java.util.List<String> getMetadataRepositories()
+
+    /**
+     * Method getPrefixes.
+     * 
+     * @return List
+     */
+    public java.util.List<String> getPrefixes()
+    {
+        if ( this.prefixes == null )
+        {
+            this.prefixes = new java.util.ArrayList<String>();
+        }
+
+        return this.prefixes;
+    } //-- java.util.List<String> getPrefixes()
+
+    /**
+     * Get whether detailed debugging information about artifact
+     *             resolution process should be logged.
+     * 
+     * @return Boolean
+     */
+    public Boolean isDebug()
+    {
+        return this.debug;
+    } //-- Boolean isDebug()
+
+    /**
+     * Method removeBlacklist.
+     * 
+     * @param artifact
+     */
+    public void removeBlacklist( Artifact artifact )
+    {
+        getBlacklist().remove( artifact );
+    } //-- void removeBlacklist( Artifact )
+
+    /**
+     * Method removeLocalRepository.
+     * 
+     * @param string
+     */
+    public void removeLocalRepository( String string )
+    {
+        getLocalRepositories().remove( string );
+    } //-- void removeLocalRepository( String )
+
+    /**
+     * Method removeMetadataRepository.
+     * 
+     * @param string
+     */
+    public void removeMetadataRepository( String string )
+    {
+        getMetadataRepositories().remove( string );
+    } //-- void removeMetadataRepository( String )
+
+    /**
+     * Method removePrefix.
+     * 
+     * @param string
+     */
+    public void removePrefix( String string )
+    {
+        getPrefixes().remove( string );
+    } //-- void removePrefix( String )
+
+    /**
+     * Set list of blacklisted artifacts which will not be
+     * resolved.
+     * 
+     * @param blacklist
+     */
+    public void setBlacklist( java.util.List<Artifact> blacklist )
+    {
+        this.blacklist = blacklist;
+    } //-- void setBlacklist( java.util.List )
+
+    /**
+     * Set whether detailed debugging information about artifact
+     *             resolution process should be logged.
+     * 
+     * @param debug
+     */
+    public void setDebug( Boolean debug )
+    {
+        this.debug = debug;
+    } //-- void setDebug( Boolean )
+
+    /**
+     * Set list of local repositories where XMvn will look for
+     * artifacts.
+     * 
+     * @param localRepositories
+     */
+    public void setLocalRepositories( java.util.List<String> localRepositories )
+    {
+        this.localRepositories = localRepositories;
+    } //-- void setLocalRepositories( java.util.List )
+
+    /**
+     * Set list of repositories where XMvn will look for metadata
+     *             files.
+     * 
+     * @param metadataRepositories
+     */
+    public void setMetadataRepositories( java.util.List<String> metadataRepositories )
+    {
+        this.metadataRepositories = metadataRepositories;
+    } //-- void setMetadataRepositories( java.util.List )
+
+    /**
+     * Set list of prefixes that XMvn resolver will prepend to
+     * system
+     *             repositories.
+     * 
+     * @param prefixes
+     */
+    public void setPrefixes( java.util.List<String> prefixes )
+    {
+        this.prefixes = prefixes;
+    } //-- void setPrefixes( java.util.List )
+
+}
diff --git a/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/Stereotype.java b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/Stereotype.java
new file mode 100644
index 0000000..0a1d79e
--- /dev/null
+++ b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/Stereotype.java
@@ -0,0 +1,122 @@
+// =================== DO NOT EDIT THIS FILE ====================
+// Generated by Modello 1.8.2,
+// any modifications will be overwritten.
+// ==============================================================
+
+package org.fedoraproject.xmvn.config;
+
+/**
+ * Stereotype of Maven artifact.
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class Stereotype
+    implements java.io.Serializable, java.lang.Cloneable
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * Type ID of the stereotype.
+     */
+    private String type;
+
+    /**
+     * Extension of the artifact.
+     */
+    private String extension;
+
+    /**
+     * Classifier of the artifact.
+     */
+    private String classifier;
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method clone.
+     * 
+     * @return Stereotype
+     */
+    public Stereotype clone()
+    {
+        try
+        {
+            Stereotype copy = (Stereotype) super.clone();
+
+            return copy;
+        }
+        catch ( java.lang.Exception ex )
+        {
+            throw (java.lang.RuntimeException) new java.lang.UnsupportedOperationException( getClass().getName()
+                + " does not support clone()" ).initCause( ex );
+        }
+    } //-- Stereotype clone()
+
+    /**
+     * Get classifier of the artifact.
+     * 
+     * @return String
+     */
+    public String getClassifier()
+    {
+        return this.classifier;
+    } //-- String getClassifier()
+
+    /**
+     * Get extension of the artifact.
+     * 
+     * @return String
+     */
+    public String getExtension()
+    {
+        return this.extension;
+    } //-- String getExtension()
+
+    /**
+     * Get type ID of the stereotype.
+     * 
+     * @return String
+     */
+    public String getType()
+    {
+        return this.type;
+    } //-- String getType()
+
+    /**
+     * Set classifier of the artifact.
+     * 
+     * @param classifier
+     */
+    public void setClassifier( String classifier )
+    {
+        this.classifier = classifier;
+    } //-- void setClassifier( String )
+
+    /**
+     * Set extension of the artifact.
+     * 
+     * @param extension
+     */
+    public void setExtension( String extension )
+    {
+        this.extension = extension;
+    } //-- void setExtension( String )
+
+    /**
+     * Set type ID of the stereotype.
+     * 
+     * @param type
+     */
+    public void setType( String type )
+    {
+        this.type = type;
+    } //-- void setType( String )
+
+}
diff --git a/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/io/stax/ConfigurationStaxReader.java b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/io/stax/ConfigurationStaxReader.java
new file mode 100644
index 0000000..1b52cab
--- /dev/null
+++ b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/io/stax/ConfigurationStaxReader.java
@@ -0,0 +1,1139 @@
+// =================== DO NOT EDIT THIS FILE ====================
+// Generated by Modello 1.8.2,
+// any modifications will be overwritten.
+// ==============================================================
+
+package org.fedoraproject.xmvn.config.io.stax;
+
+  //---------------------------------/
+ //- Imported classes and packages -/
+//---------------------------------/
+
+import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.text.DateFormat;
+import java.text.ParsePosition;
+import java.util.Locale;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.xml.stream.*;
+import org.codehaus.plexus.util.xml.Xpp3Dom;
+import org.fedoraproject.xmvn.config.Artifact;
+import org.fedoraproject.xmvn.config.BuildSettings;
+import org.fedoraproject.xmvn.config.Configuration;
+import org.fedoraproject.xmvn.config.InstallerSettings;
+import org.fedoraproject.xmvn.config.PackagingRule;
+import org.fedoraproject.xmvn.config.Repository;
+import org.fedoraproject.xmvn.config.ResolverSettings;
+import org.fedoraproject.xmvn.config.Stereotype;
+
+/**
+ * Class ConfigurationStaxReader.
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class ConfigurationStaxReader
+{
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method read.
+     * 
+     * @param reader
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return Configuration
+     */
+    public Configuration read( Reader reader, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader( reader );
+
+        return read( xmlStreamReader, strict );
+    } //-- Configuration read( Reader, boolean )
+
+    /**
+     * Method read.
+     * 
+     * @param reader
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return Configuration
+     */
+    public Configuration read( Reader reader )
+        throws IOException, XMLStreamException
+    {
+        return read( reader, true );
+    } //-- Configuration read( Reader )
+
+    /**
+     * Method read.
+     * 
+     * @param stream
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return Configuration
+     */
+    public Configuration read( InputStream stream, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader( stream );
+
+        return read( xmlStreamReader, strict );
+    } //-- Configuration read( InputStream, boolean )
+
+    /**
+     * Method read.
+     * 
+     * @param stream
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return Configuration
+     */
+    public Configuration read( InputStream stream )
+        throws IOException, XMLStreamException
+    {
+        return read( stream, true );
+    } //-- Configuration read( InputStream )
+
+    /**
+     * Method read.
+     * 
+     * @param filePath
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return Configuration
+     */
+    public Configuration read( String filePath, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        java.io.File file = new java.io.File( filePath );
+        XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader( file.toURI().toURL().toExternalForm(), new FileInputStream( file ) );
+
+        return read( xmlStreamReader, strict );
+    } //-- Configuration read( String, boolean )
+
+    /**
+     * Method read.
+     * 
+     * @param filePath
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return Configuration
+     */
+    public Configuration read( String filePath )
+        throws IOException, XMLStreamException
+    {
+        return read( filePath, true );
+    } //-- Configuration read( String )
+
+    /**
+     * Method buildDom.
+     * 
+     * @param xmlStreamReader
+     * @param trim
+     * @throws XMLStreamException
+     * @return Xpp3Dom
+     */
+    private Xpp3Dom buildDom( XMLStreamReader xmlStreamReader, boolean trim )
+        throws XMLStreamException
+    {
+        java.util.Stack elements = new java.util.Stack();
+        java.util.Stack values = new java.util.Stack();
+        int eventType = xmlStreamReader.getEventType();
+        boolean spacePreserve = false;
+        while ( xmlStreamReader.hasNext() )
+        {
+            if ( eventType == XMLStreamConstants.START_ELEMENT )
+            {
+                spacePreserve = false;
+                String rawName = xmlStreamReader.getLocalName();
+                Xpp3Dom element = new Xpp3Dom( rawName );
+                if ( !elements.empty() )
+                {
+                    Xpp3Dom parent = (Xpp3Dom) elements.peek();
+                    parent.addChild( element );
+                }
+                elements.push( element );
+                if ( xmlStreamReader.isEndElement() )
+                {
+                    values.push( null );
+                }
+                else
+                {
+                    values.push( new StringBuffer() );
+                }
+                int attributesSize = xmlStreamReader.getAttributeCount();
+                for ( int i = 0; i < attributesSize; i++ )
+                {
+                    String name = xmlStreamReader.getAttributeLocalName( i );
+                    String value = xmlStreamReader.getAttributeValue( i );
+                    element.setAttribute( name, value );
+                    spacePreserve = spacePreserve || ( "xml".equals( xmlStreamReader.getAttributePrefix( i ) ) && "space".equals( name ) && "preserve".equals( value ) );
+                }
+            }
+            else if ( eventType == XMLStreamConstants.CHARACTERS )
+            {
+                StringBuffer valueBuffer = (StringBuffer) values.peek();
+                String text = xmlStreamReader.getText();
+                if ( trim && !spacePreserve )
+                {
+                    text = text.trim();
+                }
+                valueBuffer.append( text );
+            }
+            else if ( eventType == XMLStreamConstants.END_ELEMENT )
+            {
+                Xpp3Dom element = (Xpp3Dom) elements.pop();
+                // this Object could be null if it is a singleton tag
+                Object accumulatedValue = values.pop();
+                if ( element.getChildCount() == 0 )
+                {
+                    element.setValue( ( accumulatedValue == null ) ? null : accumulatedValue.toString() );
+                }
+                if ( values.empty() )
+                {
+                    return element;
+                }
+            }
+            eventType = xmlStreamReader.next();
+        }
+        throw new IllegalStateException( "End of document found before returning to 0 depth" );
+    } //-- Xpp3Dom buildDom( XMLStreamReader, boolean )
+
+    /**
+     * Method checkFieldWithDuplicate.
+     * 
+     * @param xmlStreamReader
+     * @param parsed
+     * @param alias
+     * @param tagName
+     * @throws XMLStreamException
+     * @return boolean
+     */
+    private boolean checkFieldWithDuplicate( XMLStreamReader xmlStreamReader, String tagName, String alias, java.util.Set parsed )
+        throws XMLStreamException
+    {
+        if ( !( xmlStreamReader.getLocalName().equals( tagName ) || xmlStreamReader.getLocalName().equals( alias ) ) )
+        {
+            return false;
+        }
+        if ( !parsed.add( tagName ) )
+        {
+            throw new XMLStreamException( "Duplicated tag: '" + tagName + "'", xmlStreamReader.getLocation() );
+        }
+        return true;
+    } //-- boolean checkFieldWithDuplicate( XMLStreamReader, String, String, java.util.Set )
+
+    /**
+     * Method checkUnknownElement.
+     * 
+     * @param xmlStreamReader
+     * @param strict
+     * @throws XMLStreamException
+     */
+    private void checkUnknownElement( XMLStreamReader xmlStreamReader, boolean strict )
+        throws XMLStreamException
+    {
+        if ( strict )
+        {
+            throw new XMLStreamException( "Unrecognised tag: '" + xmlStreamReader.getLocalName() + "'", xmlStreamReader.getLocation() );
+        }
+        int unrecognizedTagCount = 1;
+        while( unrecognizedTagCount != 0 )
+        {
+            xmlStreamReader.next();
+            if ( xmlStreamReader.getEventType() == XMLStreamConstants.START_ELEMENT )
+            {
+                unrecognizedTagCount++;
+            }
+            else if ( xmlStreamReader.getEventType() == XMLStreamConstants.END_ELEMENT )
+            {
+                unrecognizedTagCount--;
+            }
+        }
+    } //-- void checkUnknownElement( XMLStreamReader, boolean )
+
+    /**
+     * Method getBooleanValue.
+     * 
+     * @param s
+     * @param xmlStreamReader
+     * @param attribute
+     * @throws XMLStreamException
+     * @return boolean
+     */
+    private boolean getBooleanValue( String s, String attribute, XMLStreamReader xmlStreamReader )
+        throws XMLStreamException
+    {
+        if ( s != null )
+        {
+            return Boolean.valueOf( s ).booleanValue();
+        }
+        return false;
+    } //-- boolean getBooleanValue( String, String, XMLStreamReader )
+
+    /**
+     * Method getByteValue.
+     * 
+     * @param s
+     * @param strict
+     * @param xmlStreamReader
+     * @param attribute
+     * @throws XMLStreamException
+     * @return byte
+     */
+    private byte getByteValue( String s, String attribute, XMLStreamReader xmlStreamReader, boolean strict )
+        throws XMLStreamException
+    {
+        if ( s != null )
+        {
+            try
+            {
+                return Byte.valueOf( s ).byteValue();
+            }
+            catch ( NumberFormatException nfe )
+            {
+                if ( strict )
+                {
+                    throw new XMLStreamException( "Unable to parse element '" + attribute + "', must be a byte but was '" + s + "'", xmlStreamReader.getLocation(), nfe );
+                }
+            }
+        }
+        return 0;
+    } //-- byte getByteValue( String, String, XMLStreamReader, boolean )
+
+    /**
+     * Method getCharacterValue.
+     * 
+     * @param s
+     * @param xmlStreamReader
+     * @param attribute
+     * @throws XMLStreamException
+     * @return char
+     */
+    private char getCharacterValue( String s, String attribute, XMLStreamReader xmlStreamReader )
+        throws XMLStreamException
+    {
+        if ( s != null )
+        {
+            return s.charAt( 0 );
+        }
+        return 0;
+    } //-- char getCharacterValue( String, String, XMLStreamReader )
+
+    /**
+     * Method getDateValue.
+     * 
+     * @param s
+     * @param xmlStreamReader
+     * @param dateFormat
+     * @param attribute
+     * @throws XMLStreamException
+     * @return Date
+     */
+    private java.util.Date getDateValue( String s, String attribute, String dateFormat, XMLStreamReader xmlStreamReader )
+        throws XMLStreamException
+    {
+        if ( s != null )
+        {
+            String effectiveDateFormat = dateFormat;
+            if ( dateFormat == null )
+            {
+                effectiveDateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS";
+            }
+            if ( "long".equals( effectiveDateFormat ) )
+            {
+                try
+                {
+                    return new java.util.Date( Long.parseLong( s ) );
+                }
+                catch ( NumberFormatException e )
+                {
+                    throw new XMLStreamException( e.getMessage(), xmlStreamReader.getLocation(), e );
+                }
+            }
+            else
+            {
+                try
+                {
+                    DateFormat dateParser = new java.text.SimpleDateFormat( effectiveDateFormat, java.util.Locale.US );
+                    return dateParser.parse( s );
+                }
+                catch ( java.text.ParseException e )
+                {
+                    throw new XMLStreamException( e.getMessage(), xmlStreamReader.getLocation(), e );
+                }
+            }
+        }
+        return null;
+    } //-- java.util.Date getDateValue( String, String, String, XMLStreamReader )
+
+    /**
+     * Method getDefaultValue.
+     * 
+     * @param s
+     * @param v
+     * @return String
+     */
+    private String getDefaultValue( String s, String v )
+    {
+        if ( s == null )
+        {
+            s = v;
+        }
+        return s;
+    } //-- String getDefaultValue( String, String )
+
+    /**
+     * Method getDoubleValue.
+     * 
+     * @param s
+     * @param strict
+     * @param xmlStreamReader
+     * @param attribute
+     * @throws XMLStreamException
+     * @return double
+     */
+    private double getDoubleValue( String s, String attribute, XMLStreamReader xmlStreamReader, boolean strict )
+        throws XMLStreamException
+    {
+        if ( s != null )
+        {
+            try
+            {
+                return Double.valueOf( s ).doubleValue();
+            }
+            catch ( NumberFormatException nfe )
+            {
+                if ( strict )
+                {
+                    throw new XMLStreamException( "Unable to parse element '" + attribute + "', must be a floating point number but was '" + s + "'", xmlStreamReader.getLocation(), nfe );
+                }
+            }
+        }
+        return 0;
+    } //-- double getDoubleValue( String, String, XMLStreamReader, boolean )
+
+    /**
+     * Method getFloatValue.
+     * 
+     * @param s
+     * @param strict
+     * @param xmlStreamReader
+     * @param attribute
+     * @throws XMLStreamException
+     * @return float
+     */
+    private float getFloatValue( String s, String attribute, XMLStreamReader xmlStreamReader, boolean strict )
+        throws XMLStreamException
+    {
+        if ( s != null )
+        {
+            try
+            {
+                return Float.valueOf( s ).floatValue();
+            }
+            catch ( NumberFormatException nfe )
+            {
+                if ( strict )
+                {
+                    throw new XMLStreamException( "Unable to parse element '" + attribute + "', must be a floating point number but was '" + s + "'", xmlStreamReader.getLocation(), nfe );
+                }
+            }
+        }
+        return 0;
+    } //-- float getFloatValue( String, String, XMLStreamReader, boolean )
+
+    /**
+     * Method getIntegerValue.
+     * 
+     * @param s
+     * @param strict
+     * @param xmlStreamReader
+     * @param attribute
+     * @throws XMLStreamException
+     * @return int
+     */
+    private int getIntegerValue( String s, String attribute, XMLStreamReader xmlStreamReader, boolean strict )
+        throws XMLStreamException
+    {
+        if ( s != null )
+        {
+            try
+            {
+                return Integer.valueOf( s ).intValue();
+            }
+            catch ( NumberFormatException nfe )
+            {
+                if ( strict )
+                {
+                    throw new XMLStreamException( "Unable to parse element '" + attribute + "', must be an integer but was '" + s + "'", xmlStreamReader.getLocation(), nfe );
+                }
+            }
+        }
+        return 0;
+    } //-- int getIntegerValue( String, String, XMLStreamReader, boolean )
+
+    /**
+     * Method getLongValue.
+     * 
+     * @param s
+     * @param strict
+     * @param xmlStreamReader
+     * @param attribute
+     * @throws XMLStreamException
+     * @return long
+     */
+    private long getLongValue( String s, String attribute, XMLStreamReader xmlStreamReader, boolean strict )
+        throws XMLStreamException
+    {
+        if ( s != null )
+        {
+            try
+            {
+                return Long.valueOf( s ).longValue();
+            }
+            catch ( NumberFormatException nfe )
+            {
+                if ( strict )
+                {
+                    throw new XMLStreamException( "Unable to parse element '" + attribute + "', must be a long integer but was '" + s + "'", xmlStreamReader.getLocation(), nfe );
+                }
+            }
+        }
+        return 0;
+    } //-- long getLongValue( String, String, XMLStreamReader, boolean )
+
+    /**
+     * Method getRequiredAttributeValue.
+     * 
+     * @param s
+     * @param strict
+     * @param xmlStreamReader
+     * @param attribute
+     * @throws XMLStreamException
+     * @return String
+     */
+    private String getRequiredAttributeValue( String s, String attribute, XMLStreamReader xmlStreamReader, boolean strict )
+        throws XMLStreamException
+    {
+        if ( s == null )
+        {
+            if ( strict )
+            {
+                throw new XMLStreamException( "Missing required value for attribute '" + attribute + "'", xmlStreamReader.getLocation() );
+            }
+        }
+        return s;
+    } //-- String getRequiredAttributeValue( String, String, XMLStreamReader, boolean )
+
+    /**
+     * Method getShortValue.
+     * 
+     * @param s
+     * @param strict
+     * @param xmlStreamReader
+     * @param attribute
+     * @throws XMLStreamException
+     * @return short
+     */
+    private short getShortValue( String s, String attribute, XMLStreamReader xmlStreamReader, boolean strict )
+        throws XMLStreamException
+    {
+        if ( s != null )
+        {
+            try
+            {
+                return Short.valueOf( s ).shortValue();
+            }
+            catch ( NumberFormatException nfe )
+            {
+                if ( strict )
+                {
+                    throw new XMLStreamException( "Unable to parse element '" + attribute + "', must be a short integer but was '" + s + "'", xmlStreamReader.getLocation(), nfe );
+                }
+            }
+        }
+        return 0;
+    } //-- short getShortValue( String, String, XMLStreamReader, boolean )
+
+    /**
+     * Method getTrimmedValue.
+     * 
+     * @param s
+     * @return String
+     */
+    private String getTrimmedValue( String s )
+    {
+        if ( s != null )
+        {
+            s = s.trim();
+        }
+        return s;
+    } //-- String getTrimmedValue( String )
+
+    /**
+     * Method nextTag.
+     * 
+     * @param xmlStreamReader
+     * @throws XMLStreamException
+     * @return int
+     */
+    private int nextTag( XMLStreamReader xmlStreamReader )
+        throws XMLStreamException
+    {
+        while ( true )
+        {
+            int eventType = xmlStreamReader.next();
+            switch ( eventType )
+            {
+                case XMLStreamConstants.CHARACTERS:
+                case XMLStreamConstants.CDATA:
+                case XMLStreamConstants.SPACE:
+                case XMLStreamConstants.PROCESSING_INSTRUCTION:
+                case XMLStreamConstants.COMMENT:
+                    break;
+                case XMLStreamConstants.START_ELEMENT:
+                case XMLStreamConstants.END_ELEMENT:
+                    return eventType;
+                default:
+                    throw new XMLStreamException( "expected start or end tag", xmlStreamReader.getLocation() );
+            }
+        }
+    } //-- int nextTag( XMLStreamReader )
+
+    /**
+     * Method parseArtifact.
+     * 
+     * @param xmlStreamReader
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return Artifact
+     */
+    private Artifact parseArtifact( XMLStreamReader xmlStreamReader, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        Artifact artifact = new Artifact();
+        java.util.Set parsed = new java.util.HashSet();
+        while ( ( strict ? xmlStreamReader.nextTag() : nextTag( xmlStreamReader ) ) == XMLStreamConstants.START_ELEMENT )
+        {
+            if ( checkFieldWithDuplicate( xmlStreamReader, "groupId", null, parsed ) )
+            {
+                artifact.setGroupId( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "" ) ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "artifactId", null, parsed ) )
+            {
+                artifact.setArtifactId( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "" ) ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "version", null, parsed ) )
+            {
+                artifact.setVersion( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "" ) ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "classifier", null, parsed ) )
+            {
+                artifact.setClassifier( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "" ) ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "stereotype", null, parsed ) )
+            {
+                artifact.setStereotype( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "" ) ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "extension", null, parsed ) )
+            {
+                artifact.setExtension( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "" ) ) );
+            }
+            else
+            {
+                checkUnknownElement( xmlStreamReader, strict );
+            }
+        }
+        return artifact;
+    } //-- Artifact parseArtifact( XMLStreamReader, boolean )
+
+    /**
+     * Method parseBuildSettings.
+     * 
+     * @param xmlStreamReader
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return BuildSettings
+     */
+    private BuildSettings parseBuildSettings( XMLStreamReader xmlStreamReader, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        BuildSettings buildSettings = new BuildSettings();
+        java.util.Set parsed = new java.util.HashSet();
+        while ( ( strict ? xmlStreamReader.nextTag() : nextTag( xmlStreamReader ) ) == XMLStreamConstants.START_ELEMENT )
+        {
+            if ( checkFieldWithDuplicate( xmlStreamReader, "debug", null, parsed ) )
+            {
+                buildSettings.setDebug( getBooleanValue( getTrimmedValue( xmlStreamReader.getElementText() ), "debug", xmlStreamReader ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "skipTests", null, parsed ) )
+            {
+                buildSettings.setSkipTests( getBooleanValue( getTrimmedValue( xmlStreamReader.getElementText() ), "skipTests", xmlStreamReader ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "compilerSource", null, parsed ) )
+            {
+                buildSettings.setCompilerSource( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else
+            {
+                checkUnknownElement( xmlStreamReader, strict );
+            }
+        }
+        return buildSettings;
+    } //-- BuildSettings parseBuildSettings( XMLStreamReader, boolean )
+
+    /**
+     * Method parseConfiguration.
+     * 
+     * @param xmlStreamReader
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return Configuration
+     */
+    private Configuration parseConfiguration( XMLStreamReader xmlStreamReader, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        Configuration configuration = new Configuration();
+        java.util.Set parsed = new java.util.HashSet();
+        while ( ( strict ? xmlStreamReader.nextTag() : nextTag( xmlStreamReader ) ) == XMLStreamConstants.START_ELEMENT )
+        {
+            if ( checkFieldWithDuplicate( xmlStreamReader, "properties", null, parsed ) )
+            {
+                while ( xmlStreamReader.nextTag() == XMLStreamConstants.START_ELEMENT )
+                {
+                    String key = xmlStreamReader.getLocalName();
+                    String value = xmlStreamReader.getElementText().trim();
+                    configuration.addProperty( key, value );
+                }
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "repositories", null, parsed ) )
+            {
+                java.util.List repositories = new java.util.ArrayList/*<Repository>*/();
+                configuration.setRepositories( repositories );
+                while ( xmlStreamReader.nextTag() == XMLStreamConstants.START_ELEMENT )
+                {
+                    if ( "repository".equals( xmlStreamReader.getLocalName() ) )
+                    {
+                        configuration.addRepository( parseRepository( xmlStreamReader, strict ) );
+                    }
+                    else
+                    {
+                        throw new XMLStreamException( "Unrecognised tag: '" + xmlStreamReader.getLocalName() + "'", xmlStreamReader.getLocation() );
+                    }
+                }
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "buildSettings", null, parsed ) )
+            {
+                configuration.setBuildSettings( parseBuildSettings( xmlStreamReader, strict ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "artifactManagement", null, parsed ) )
+            {
+                java.util.List artifactManagement = new java.util.ArrayList/*<PackagingRule>*/();
+                configuration.setArtifactManagement( artifactManagement );
+                while ( xmlStreamReader.nextTag() == XMLStreamConstants.START_ELEMENT )
+                {
+                    if ( "rule".equals( xmlStreamReader.getLocalName() ) )
+                    {
+                        configuration.addArtifactManagement( parsePackagingRule( xmlStreamReader, strict ) );
+                    }
+                    else
+                    {
+                        throw new XMLStreamException( "Unrecognised tag: '" + xmlStreamReader.getLocalName() + "'", xmlStreamReader.getLocation() );
+                    }
+                }
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "resolverSettings", null, parsed ) )
+            {
+                configuration.setResolverSettings( parseResolverSettings( xmlStreamReader, strict ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "installerSettings", null, parsed ) )
+            {
+                configuration.setInstallerSettings( parseInstallerSettings( xmlStreamReader, strict ) );
+            }
+            else
+            {
+                checkUnknownElement( xmlStreamReader, strict );
+            }
+        }
+        return configuration;
+    } //-- Configuration parseConfiguration( XMLStreamReader, boolean )
+
+    /**
+     * Method parseInstallerSettings.
+     * 
+     * @param xmlStreamReader
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return InstallerSettings
+     */
+    private InstallerSettings parseInstallerSettings( XMLStreamReader xmlStreamReader, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        InstallerSettings installerSettings = new InstallerSettings();
+        java.util.Set parsed = new java.util.HashSet();
+        while ( ( strict ? xmlStreamReader.nextTag() : nextTag( xmlStreamReader ) ) == XMLStreamConstants.START_ELEMENT )
+        {
+            if ( checkFieldWithDuplicate( xmlStreamReader, "debug", null, parsed ) )
+            {
+                installerSettings.setDebug( getBooleanValue( getTrimmedValue( xmlStreamReader.getElementText() ), "debug", xmlStreamReader ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "metadataDir", null, parsed ) )
+            {
+                installerSettings.setMetadataDir( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else
+            {
+                checkUnknownElement( xmlStreamReader, strict );
+            }
+        }
+        return installerSettings;
+    } //-- InstallerSettings parseInstallerSettings( XMLStreamReader, boolean )
+
+    /**
+     * Method parsePackagingRule.
+     * 
+     * @param xmlStreamReader
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return PackagingRule
+     */
+    private PackagingRule parsePackagingRule( XMLStreamReader xmlStreamReader, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        PackagingRule packagingRule = new PackagingRule();
+        java.util.Set parsed = new java.util.HashSet();
+        while ( ( strict ? xmlStreamReader.nextTag() : nextTag( xmlStreamReader ) ) == XMLStreamConstants.START_ELEMENT )
+        {
+            if ( checkFieldWithDuplicate( xmlStreamReader, "artifactGlob", null, parsed ) )
+            {
+                packagingRule.setArtifactGlob( parseArtifact( xmlStreamReader, strict ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "targetPackage", null, parsed ) )
+            {
+                packagingRule.setTargetPackage( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "targetRepository", null, parsed ) )
+            {
+                packagingRule.setTargetRepository( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "files", null, parsed ) )
+            {
+                java.util.List files = new java.util.ArrayList/*<String>*/();
+                packagingRule.setFiles( files );
+                while ( xmlStreamReader.nextTag() == XMLStreamConstants.START_ELEMENT )
+                {
+                    if ( "file".equals( xmlStreamReader.getLocalName() ) )
+                    {
+                        files.add( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "new java.util.ArrayList/*<String>*/()" ) ) );
+                    }
+                    else
+                    {
+                        throw new XMLStreamException( "Unrecognised tag: '" + xmlStreamReader.getLocalName() + "'", xmlStreamReader.getLocation() );
+                    }
+                }
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "versions", null, parsed ) )
+            {
+                java.util.List versions = new java.util.ArrayList/*<String>*/();
+                packagingRule.setVersions( versions );
+                while ( xmlStreamReader.nextTag() == XMLStreamConstants.START_ELEMENT )
+                {
+                    if ( "version".equals( xmlStreamReader.getLocalName() ) )
+                    {
+                        versions.add( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "new java.util.ArrayList/*<String>*/()" ) ) );
+                    }
+                    else
+                    {
+                        throw new XMLStreamException( "Unrecognised tag: '" + xmlStreamReader.getLocalName() + "'", xmlStreamReader.getLocation() );
+                    }
+                }
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "aliases", null, parsed ) )
+            {
+                java.util.List aliases = new java.util.ArrayList/*<Artifact>*/();
+                packagingRule.setAliases( aliases );
+                while ( xmlStreamReader.nextTag() == XMLStreamConstants.START_ELEMENT )
+                {
+                    if ( "alias".equals( xmlStreamReader.getLocalName() ) )
+                    {
+                        aliases.add( parseArtifact( xmlStreamReader, strict ) );
+                    }
+                    else
+                    {
+                        throw new XMLStreamException( "Unrecognised tag: '" + xmlStreamReader.getLocalName() + "'", xmlStreamReader.getLocation() );
+                    }
+                }
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "optional", null, parsed ) )
+            {
+                packagingRule.setOptional( getBooleanValue( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "false" ) ), "optional", xmlStreamReader ) );
+            }
+            else
+            {
+                checkUnknownElement( xmlStreamReader, strict );
+            }
+        }
+        return packagingRule;
+    } //-- PackagingRule parsePackagingRule( XMLStreamReader, boolean )
+
+    /**
+     * Method parseRepository.
+     * 
+     * @param xmlStreamReader
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return Repository
+     */
+    private Repository parseRepository( XMLStreamReader xmlStreamReader, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        Repository repository = new Repository();
+        java.util.Set parsed = new java.util.HashSet();
+        while ( ( strict ? xmlStreamReader.nextTag() : nextTag( xmlStreamReader ) ) == XMLStreamConstants.START_ELEMENT )
+        {
+            if ( checkFieldWithDuplicate( xmlStreamReader, "id", null, parsed ) )
+            {
+                repository.setId( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "type", null, parsed ) )
+            {
+                repository.setType( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "stereotypes", null, parsed ) )
+            {
+                java.util.List stereotypes = new java.util.ArrayList/*<Stereotype>*/();
+                repository.setStereotypes( stereotypes );
+                while ( xmlStreamReader.nextTag() == XMLStreamConstants.START_ELEMENT )
+                {
+                    if ( "stereotype".equals( xmlStreamReader.getLocalName() ) )
+                    {
+                        repository.addStereotype( parseStereotype( xmlStreamReader, strict ) );
+                    }
+                    else
+                    {
+                        throw new XMLStreamException( "Unrecognised tag: '" + xmlStreamReader.getLocalName() + "'", xmlStreamReader.getLocation() );
+                    }
+                }
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "properties", null, parsed ) )
+            {
+                while ( xmlStreamReader.nextTag() == XMLStreamConstants.START_ELEMENT )
+                {
+                    String key = xmlStreamReader.getLocalName();
+                    String value = xmlStreamReader.getElementText().trim();
+                    repository.addProperty( key, value );
+                }
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "configuration", null, parsed ) )
+            {
+                repository.setConfiguration( buildDom( xmlStreamReader, true ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "filter", null, parsed ) )
+            {
+                repository.setFilter( buildDom( xmlStreamReader, true ) );
+            }
+            else
+            {
+                checkUnknownElement( xmlStreamReader, strict );
+            }
+        }
+        return repository;
+    } //-- Repository parseRepository( XMLStreamReader, boolean )
+
+    /**
+     * Method parseResolverSettings.
+     * 
+     * @param xmlStreamReader
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return ResolverSettings
+     */
+    private ResolverSettings parseResolverSettings( XMLStreamReader xmlStreamReader, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        ResolverSettings resolverSettings = new ResolverSettings();
+        java.util.Set parsed = new java.util.HashSet();
+        while ( ( strict ? xmlStreamReader.nextTag() : nextTag( xmlStreamReader ) ) == XMLStreamConstants.START_ELEMENT )
+        {
+            if ( checkFieldWithDuplicate( xmlStreamReader, "debug", null, parsed ) )
+            {
+                resolverSettings.setDebug( getBooleanValue( getTrimmedValue( xmlStreamReader.getElementText() ), "debug", xmlStreamReader ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "localRepositories", null, parsed ) )
+            {
+                java.util.List localRepositories = new java.util.ArrayList/*<String>*/();
+                resolverSettings.setLocalRepositories( localRepositories );
+                while ( xmlStreamReader.nextTag() == XMLStreamConstants.START_ELEMENT )
+                {
+                    if ( "repository".equals( xmlStreamReader.getLocalName() ) )
+                    {
+                        localRepositories.add( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "new java.util.ArrayList/*<String>*/()" ) ) );
+                    }
+                    else
+                    {
+                        throw new XMLStreamException( "Unrecognised tag: '" + xmlStreamReader.getLocalName() + "'", xmlStreamReader.getLocation() );
+                    }
+                }
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "metadataRepositories", null, parsed ) )
+            {
+                java.util.List metadataRepositories = new java.util.ArrayList/*<String>*/();
+                resolverSettings.setMetadataRepositories( metadataRepositories );
+                while ( xmlStreamReader.nextTag() == XMLStreamConstants.START_ELEMENT )
+                {
+                    if ( "repository".equals( xmlStreamReader.getLocalName() ) )
+                    {
+                        metadataRepositories.add( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "new java.util.ArrayList/*<String>*/()" ) ) );
+                    }
+                    else
+                    {
+                        throw new XMLStreamException( "Unrecognised tag: '" + xmlStreamReader.getLocalName() + "'", xmlStreamReader.getLocation() );
+                    }
+                }
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "prefixes", null, parsed ) )
+            {
+                java.util.List prefixes = new java.util.ArrayList/*<String>*/();
+                resolverSettings.setPrefixes( prefixes );
+                while ( xmlStreamReader.nextTag() == XMLStreamConstants.START_ELEMENT )
+                {
+                    if ( "prefix".equals( xmlStreamReader.getLocalName() ) )
+                    {
+                        prefixes.add( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "new java.util.ArrayList/*<String>*/()" ) ) );
+                    }
+                    else
+                    {
+                        throw new XMLStreamException( "Unrecognised tag: '" + xmlStreamReader.getLocalName() + "'", xmlStreamReader.getLocation() );
+                    }
+                }
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "blacklist", null, parsed ) )
+            {
+                java.util.List blacklist = new java.util.ArrayList/*<Artifact>*/();
+                resolverSettings.setBlacklist( blacklist );
+                while ( xmlStreamReader.nextTag() == XMLStreamConstants.START_ELEMENT )
+                {
+                    if ( "artifact".equals( xmlStreamReader.getLocalName() ) )
+                    {
+                        resolverSettings.addBlacklist( parseArtifact( xmlStreamReader, strict ) );
+                    }
+                    else
+                    {
+                        throw new XMLStreamException( "Unrecognised tag: '" + xmlStreamReader.getLocalName() + "'", xmlStreamReader.getLocation() );
+                    }
+                }
+            }
+            else
+            {
+                checkUnknownElement( xmlStreamReader, strict );
+            }
+        }
+        return resolverSettings;
+    } //-- ResolverSettings parseResolverSettings( XMLStreamReader, boolean )
+
+    /**
+     * Method parseStereotype.
+     * 
+     * @param xmlStreamReader
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return Stereotype
+     */
+    private Stereotype parseStereotype( XMLStreamReader xmlStreamReader, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        Stereotype stereotype = new Stereotype();
+        java.util.Set parsed = new java.util.HashSet();
+        while ( ( strict ? xmlStreamReader.nextTag() : nextTag( xmlStreamReader ) ) == XMLStreamConstants.START_ELEMENT )
+        {
+            if ( checkFieldWithDuplicate( xmlStreamReader, "type", null, parsed ) )
+            {
+                stereotype.setType( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "extension", null, parsed ) )
+            {
+                stereotype.setExtension( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "classifier", null, parsed ) )
+            {
+                stereotype.setClassifier( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else
+            {
+                checkUnknownElement( xmlStreamReader, strict );
+            }
+        }
+        return stereotype;
+    } //-- Stereotype parseStereotype( XMLStreamReader, boolean )
+
+    /**
+     * Method read.
+     * 
+     * @param xmlStreamReader
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return Configuration
+     */
+    private Configuration read( XMLStreamReader xmlStreamReader, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        int eventType = xmlStreamReader.getEventType();
+        String encoding = null;
+        while ( eventType != XMLStreamConstants.END_DOCUMENT )
+        {
+            if ( eventType == XMLStreamConstants.START_DOCUMENT )
+            {
+                encoding = xmlStreamReader.getCharacterEncodingScheme();
+            }
+            if ( eventType == XMLStreamConstants.START_ELEMENT )
+            {
+                if ( strict && ! "configuration".equals( xmlStreamReader.getLocalName() ) )
+                {
+                    throw new XMLStreamException( "Expected root element 'configuration' but found '" + xmlStreamReader.getLocalName() + "'", xmlStreamReader.getLocation(), null );
+                }
+                Configuration configuration = parseConfiguration( xmlStreamReader, strict );
+                configuration.setModelEncoding( encoding );
+                resolveReferences( configuration );
+                return configuration;
+            }
+            eventType = xmlStreamReader.next();
+        }
+        throw new XMLStreamException( "Expected root element 'configuration' but found no element at all: invalid XML document", xmlStreamReader.getLocation(), null );
+    } //-- Configuration read( XMLStreamReader, boolean )
+
+    /**
+     * Method resolveReferences.
+     * 
+     * @param value
+     */
+    private void resolveReferences( Configuration value )
+    {
+        java.util.Map refs;
+    } //-- void resolveReferences( Configuration )
+
+}
diff --git a/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/io/stax/ConfigurationStaxWriter.java b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/io/stax/ConfigurationStaxWriter.java
new file mode 100644
index 0000000..9f870f9
--- /dev/null
+++ b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/io/stax/ConfigurationStaxWriter.java
@@ -0,0 +1,597 @@
+// =================== DO NOT EDIT THIS FILE ====================
+// Generated by Modello 1.8.2,
+// any modifications will be overwritten.
+// ==============================================================
+
+package org.fedoraproject.xmvn.config.io.stax;
+
+  //---------------------------------/
+ //- Imported classes and packages -/
+//---------------------------------/
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.text.DateFormat;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.jar.Manifest;
+import javax.xml.stream.*;
+import org.codehaus.plexus.util.xml.Xpp3Dom;
+import org.fedoraproject.xmvn.config.Artifact;
+import org.fedoraproject.xmvn.config.BuildSettings;
+import org.fedoraproject.xmvn.config.Configuration;
+import org.fedoraproject.xmvn.config.InstallerSettings;
+import org.fedoraproject.xmvn.config.PackagingRule;
+import org.fedoraproject.xmvn.config.Repository;
+import org.fedoraproject.xmvn.config.ResolverSettings;
+import org.fedoraproject.xmvn.config.Stereotype;
+
+/**
+ * Class ConfigurationStaxWriter.
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class ConfigurationStaxWriter
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * Field curId.
+     */
+    private int curId;
+
+    /**
+     * Field idMap.
+     */
+    private java.util.Map idMap;
+
+
+      //----------------/
+     //- Constructors -/
+    //----------------/
+
+    public ConfigurationStaxWriter()
+    {
+        idMap = new java.util.HashMap();
+    } //-- org.fedoraproject.xmvn.config.io.stax.ConfigurationStaxWriter()
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method write.
+     * 
+     * @param writer
+     * @param configuration
+     * @throws java.io.IOException
+     * @throws XMLStreamException
+     */
+    public void write( Writer writer, Configuration configuration )
+        throws java.io.IOException, XMLStreamException
+    {
+        XMLOutputFactory factory = XMLOutputFactory.newInstance();
+        boolean supportWindowsLineEndings = false;
+        if ( factory.isPropertySupported( "com.ctc.wstx.outputEscapeCr" ) )
+        {
+            factory.setProperty( "com.ctc.wstx.outputEscapeCr", Boolean.FALSE );
+            supportWindowsLineEndings = true;
+        }
+        if ( factory.isPropertySupported( "org.codehaus.stax2.automaticEmptyElements" ) )
+        {
+            factory.setProperty( "org.codehaus.stax2.automaticEmptyElements", Boolean.FALSE );
+        }
+        IndentingXMLStreamWriter serializer = new IndentingXMLStreamWriter( factory.createXMLStreamWriter( writer ) );
+        if ( supportWindowsLineEndings )
+        {
+            serializer.setNewLine( serializer.getLineSeparator() );
+        }
+        serializer.writeStartDocument( configuration.getModelEncoding(), "1.0" );
+        writeConfiguration( configuration, "configuration", serializer );
+        serializer.writeEndDocument();
+    } //-- void write( Writer, Configuration )
+
+    /**
+     * Method write.
+     * 
+     * @param stream
+     * @param configuration
+     * @throws java.io.IOException
+     * @throws XMLStreamException
+     */
+    public void write( OutputStream stream, Configuration configuration )
+        throws java.io.IOException, XMLStreamException
+    {
+        XMLOutputFactory factory = XMLOutputFactory.newInstance();
+        boolean supportWindowsLineEndings = false;
+        if ( factory.isPropertySupported( "com.ctc.wstx.outputEscapeCr" ) )
+        {
+            factory.setProperty( "com.ctc.wstx.outputEscapeCr", Boolean.FALSE );
+            supportWindowsLineEndings = true;
+        }
+        if ( factory.isPropertySupported( "org.codehaus.stax2.automaticEmptyElements" ) )
+        {
+            factory.setProperty( "org.codehaus.stax2.automaticEmptyElements", Boolean.FALSE );
+        }
+        IndentingXMLStreamWriter serializer = new IndentingXMLStreamWriter( factory.createXMLStreamWriter( stream, configuration.getModelEncoding() ) );
+        if ( supportWindowsLineEndings )
+        {
+            serializer.setNewLine( serializer.getLineSeparator() );
+        }
+        serializer.writeStartDocument( configuration.getModelEncoding(), "1.0" );
+        writeConfiguration( configuration, "configuration", serializer );
+        serializer.writeEndDocument();
+    } //-- void write( OutputStream, Configuration )
+
+    /**
+     * Method writeArtifact.
+     * 
+     * @param artifact
+     * @param serializer
+     * @param tagName
+     * @throws java.io.IOException
+     * @throws XMLStreamException
+     */
+    private void writeArtifact( Artifact artifact, String tagName, XMLStreamWriter serializer )
+        throws java.io.IOException, XMLStreamException
+    {
+        if ( artifact != null )
+        {
+            serializer.writeStartElement( tagName );
+            if ( ( artifact.getGroupId() != null ) && !artifact.getGroupId().equals( "" ) )
+            {
+                serializer.writeStartElement( "groupId" );
+                serializer.writeCharacters( artifact.getGroupId() );
+                serializer.writeEndElement();
+            }
+            if ( ( artifact.getArtifactId() != null ) && !artifact.getArtifactId().equals( "" ) )
+            {
+                serializer.writeStartElement( "artifactId" );
+                serializer.writeCharacters( artifact.getArtifactId() );
+                serializer.writeEndElement();
+            }
+            if ( ( artifact.getVersion() != null ) && !artifact.getVersion().equals( "" ) )
+            {
+                serializer.writeStartElement( "version" );
+                serializer.writeCharacters( artifact.getVersion() );
+                serializer.writeEndElement();
+            }
+            if ( ( artifact.getClassifier() != null ) && !artifact.getClassifier().equals( "" ) )
+            {
+                serializer.writeStartElement( "classifier" );
+                serializer.writeCharacters( artifact.getClassifier() );
+                serializer.writeEndElement();
+            }
+            if ( ( artifact.getStereotype() != null ) && !artifact.getStereotype().equals( "" ) )
+            {
+                serializer.writeStartElement( "stereotype" );
+                serializer.writeCharacters( artifact.getStereotype() );
+                serializer.writeEndElement();
+            }
+            if ( ( artifact.getExtension() != null ) && !artifact.getExtension().equals( "" ) )
+            {
+                serializer.writeStartElement( "extension" );
+                serializer.writeCharacters( artifact.getExtension() );
+                serializer.writeEndElement();
+            }
+            serializer.writeEndElement();
+        }
+    } //-- void writeArtifact( Artifact, String, XMLStreamWriter )
+
+    /**
+     * Method writeBuildSettings.
+     * 
+     * @param buildSettings
+     * @param serializer
+     * @param tagName
+     * @throws java.io.IOException
+     * @throws XMLStreamException
+     */
+    private void writeBuildSettings( BuildSettings buildSettings, String tagName, XMLStreamWriter serializer )
+        throws java.io.IOException, XMLStreamException
+    {
+        if ( buildSettings != null )
+        {
+            serializer.writeStartElement( tagName );
+            if ( buildSettings.isDebug() != null )
+            {
+                serializer.writeStartElement( "debug" );
+                serializer.writeCharacters( String.valueOf( buildSettings.isDebug() ) );
+                serializer.writeEndElement();
+            }
+            if ( buildSettings.isSkipTests() != null )
+            {
+                serializer.writeStartElement( "skipTests" );
+                serializer.writeCharacters( String.valueOf( buildSettings.isSkipTests() ) );
+                serializer.writeEndElement();
+            }
+            if ( buildSettings.getCompilerSource() != null )
+            {
+                serializer.writeStartElement( "compilerSource" );
+                serializer.writeCharacters( buildSettings.getCompilerSource() );
+                serializer.writeEndElement();
+            }
+            serializer.writeEndElement();
+        }
+    } //-- void writeBuildSettings( BuildSettings, String, XMLStreamWriter )
+
+    /**
+     * Method writeConfiguration.
+     * 
+     * @param configuration
+     * @param serializer
+     * @param tagName
+     * @throws java.io.IOException
+     * @throws XMLStreamException
+     */
+    private void writeConfiguration( Configuration configuration, String tagName, XMLStreamWriter serializer )
+        throws java.io.IOException, XMLStreamException
+    {
+        if ( configuration != null )
+        {
+            serializer.setDefaultNamespace( "http://fedorahosted.org/xmvn/CONFIG/2.0.0" );
+            serializer.writeStartElement( tagName );
+            serializer.writeDefaultNamespace( "http://fedorahosted.org/xmvn/CONFIG/2.0.0" );
+            if ( ( configuration.getProperties() != null ) && ( configuration.getProperties().size() > 0 ) )
+            {
+                serializer.writeStartElement( "properties" );
+                for ( Iterator iter = configuration.getProperties().keySet().iterator(); iter.hasNext(); )
+                {
+                    String key = (String) iter.next();
+                    String value = (String) configuration.getProperties().get( key );
+                    serializer.writeStartElement( "" + key + "" );
+                    serializer.writeCharacters( value );
+                    serializer.writeEndElement();
+                }
+                serializer.writeEndElement();
+            }
+            if ( ( configuration.getRepositories() != null ) && ( configuration.getRepositories().size() > 0 ) )
+            {
+                serializer.writeStartElement( "repositories" );
+                for ( Iterator iter = configuration.getRepositories().iterator(); iter.hasNext(); )
+                {
+                    Repository o = (Repository) iter.next();
+                    writeRepository( o, "repository", serializer );
+                }
+                serializer.writeEndElement();
+            }
+            if ( configuration.getBuildSettings() != null )
+            {
+                writeBuildSettings( (BuildSettings) configuration.getBuildSettings(), "buildSettings", serializer );
+            }
+            if ( ( configuration.getArtifactManagement() != null ) && ( configuration.getArtifactManagement().size() > 0 ) )
+            {
+                serializer.writeStartElement( "artifactManagement" );
+                for ( Iterator iter = configuration.getArtifactManagement().iterator(); iter.hasNext(); )
+                {
+                    PackagingRule o = (PackagingRule) iter.next();
+                    writePackagingRule( o, "rule", serializer );
+                }
+                serializer.writeEndElement();
+            }
+            if ( configuration.getResolverSettings() != null )
+            {
+                writeResolverSettings( (ResolverSettings) configuration.getResolverSettings(), "resolverSettings", serializer );
+            }
+            if ( configuration.getInstallerSettings() != null )
+            {
+                writeInstallerSettings( (InstallerSettings) configuration.getInstallerSettings(), "installerSettings", serializer );
+            }
+            serializer.writeEndElement();
+        }
+    } //-- void writeConfiguration( Configuration, String, XMLStreamWriter )
+
+    /**
+     * Method writeDom.
+     * 
+     * @param dom
+     * @param serializer
+     * @throws XMLStreamException
+     */
+    private void writeDom( Xpp3Dom dom, XMLStreamWriter serializer )
+        throws XMLStreamException
+    {
+        serializer.writeStartElement( dom.getName() );
+        String[] attributeNames = dom.getAttributeNames();
+        for ( int i = 0; i < attributeNames.length; i++ )
+        {
+            String attributeName = attributeNames[i];
+            serializer.writeAttribute( attributeName, dom.getAttribute( attributeName ) );
+        }
+        Xpp3Dom[] children = dom.getChildren();
+        for ( int i = 0; i < children.length; i++ )
+        {
+            writeDom( children[i], serializer );
+        }
+        String value = dom.getValue();
+        if ( value != null )
+        {
+            serializer.writeCharacters( value );
+        }
+        serializer.writeEndElement();
+    } //-- void writeDom( Xpp3Dom, XMLStreamWriter )
+
+    /**
+     * Method writeInstallerSettings.
+     * 
+     * @param installerSettings
+     * @param serializer
+     * @param tagName
+     * @throws java.io.IOException
+     * @throws XMLStreamException
+     */
+    private void writeInstallerSettings( InstallerSettings installerSettings, String tagName, XMLStreamWriter serializer )
+        throws java.io.IOException, XMLStreamException
+    {
+        if ( installerSettings != null )
+        {
+            serializer.writeStartElement( tagName );
+            if ( installerSettings.isDebug() != null )
+            {
+                serializer.writeStartElement( "debug" );
+                serializer.writeCharacters( String.valueOf( installerSettings.isDebug() ) );
+                serializer.writeEndElement();
+            }
+            if ( installerSettings.getMetadataDir() != null )
+            {
+                serializer.writeStartElement( "metadataDir" );
+                serializer.writeCharacters( installerSettings.getMetadataDir() );
+                serializer.writeEndElement();
+            }
+            serializer.writeEndElement();
+        }
+    } //-- void writeInstallerSettings( InstallerSettings, String, XMLStreamWriter )
+
+    /**
+     * Method writePackagingRule.
+     * 
+     * @param packagingRule
+     * @param serializer
+     * @param tagName
+     * @throws java.io.IOException
+     * @throws XMLStreamException
+     */
+    private void writePackagingRule( PackagingRule packagingRule, String tagName, XMLStreamWriter serializer )
+        throws java.io.IOException, XMLStreamException
+    {
+        if ( packagingRule != null )
+        {
+            serializer.writeStartElement( tagName );
+            if ( packagingRule.getArtifactGlob() != null )
+            {
+                writeArtifact( (Artifact) packagingRule.getArtifactGlob(), "artifactGlob", serializer );
+            }
+            if ( packagingRule.getTargetPackage() != null )
+            {
+                serializer.writeStartElement( "targetPackage" );
+                serializer.writeCharacters( packagingRule.getTargetPackage() );
+                serializer.writeEndElement();
+            }
+            if ( packagingRule.getTargetRepository() != null )
+            {
+                serializer.writeStartElement( "targetRepository" );
+                serializer.writeCharacters( packagingRule.getTargetRepository() );
+                serializer.writeEndElement();
+            }
+            if ( ( packagingRule.getFiles() != null ) && ( packagingRule.getFiles().size() > 0 ) )
+            {
+                serializer.writeStartElement( "files" );
+                for ( Iterator iter = packagingRule.getFiles().iterator(); iter.hasNext(); )
+                {
+                    String file = (String) iter.next();
+                    serializer.writeStartElement( "file" );
+                    serializer.writeCharacters( file );
+                    serializer.writeEndElement();
+                }
+                serializer.writeEndElement();
+            }
+            if ( ( packagingRule.getVersions() != null ) && ( packagingRule.getVersions().size() > 0 ) )
+            {
+                serializer.writeStartElement( "versions" );
+                for ( Iterator iter = packagingRule.getVersions().iterator(); iter.hasNext(); )
+                {
+                    String version = (String) iter.next();
+                    serializer.writeStartElement( "version" );
+                    serializer.writeCharacters( version );
+                    serializer.writeEndElement();
+                }
+                serializer.writeEndElement();
+            }
+            if ( ( packagingRule.getAliases() != null ) && ( packagingRule.getAliases().size() > 0 ) )
+            {
+                serializer.writeStartElement( "aliases" );
+                for ( Iterator iter = packagingRule.getAliases().iterator(); iter.hasNext(); )
+                {
+                    Artifact o = (Artifact) iter.next();
+                    writeArtifact( o, "alias", serializer );
+                }
+                serializer.writeEndElement();
+            }
+            if ( packagingRule.isOptional() != null )
+            {
+                serializer.writeStartElement( "optional" );
+                serializer.writeCharacters( String.valueOf( packagingRule.isOptional() ) );
+                serializer.writeEndElement();
+            }
+            serializer.writeEndElement();
+        }
+    } //-- void writePackagingRule( PackagingRule, String, XMLStreamWriter )
+
+    /**
+     * Method writeRepository.
+     * 
+     * @param repository
+     * @param serializer
+     * @param tagName
+     * @throws java.io.IOException
+     * @throws XMLStreamException
+     */
+    private void writeRepository( Repository repository, String tagName, XMLStreamWriter serializer )
+        throws java.io.IOException, XMLStreamException
+    {
+        if ( repository != null )
+        {
+            serializer.writeStartElement( tagName );
+            if ( repository.getId() != null )
+            {
+                serializer.writeStartElement( "id" );
+                serializer.writeCharacters( repository.getId() );
+                serializer.writeEndElement();
+            }
+            if ( repository.getType() != null )
+            {
+                serializer.writeStartElement( "type" );
+                serializer.writeCharacters( repository.getType() );
+                serializer.writeEndElement();
+            }
+            if ( ( repository.getStereotypes() != null ) && ( repository.getStereotypes().size() > 0 ) )
+            {
+                serializer.writeStartElement( "stereotypes" );
+                for ( Iterator iter = repository.getStereotypes().iterator(); iter.hasNext(); )
+                {
+                    Stereotype o = (Stereotype) iter.next();
+                    writeStereotype( o, "stereotype", serializer );
+                }
+                serializer.writeEndElement();
+            }
+            if ( ( repository.getProperties() != null ) && ( repository.getProperties().size() > 0 ) )
+            {
+                serializer.writeStartElement( "properties" );
+                for ( Iterator iter = repository.getProperties().keySet().iterator(); iter.hasNext(); )
+                {
+                    String key = (String) iter.next();
+                    String value = (String) repository.getProperties().get( key );
+                    serializer.writeStartElement( "" + key + "" );
+                    serializer.writeCharacters( value );
+                    serializer.writeEndElement();
+                }
+                serializer.writeEndElement();
+            }
+            if ( repository.getConfiguration() != null )
+            {
+                writeDom( (Xpp3Dom) repository.getConfiguration(), serializer );
+            }
+            if ( repository.getFilter() != null )
+            {
+                writeDom( (Xpp3Dom) repository.getFilter(), serializer );
+            }
+            serializer.writeEndElement();
+        }
+    } //-- void writeRepository( Repository, String, XMLStreamWriter )
+
+    /**
+     * Method writeResolverSettings.
+     * 
+     * @param resolverSettings
+     * @param serializer
+     * @param tagName
+     * @throws java.io.IOException
+     * @throws XMLStreamException
+     */
+    private void writeResolverSettings( ResolverSettings resolverSettings, String tagName, XMLStreamWriter serializer )
+        throws java.io.IOException, XMLStreamException
+    {
+        if ( resolverSettings != null )
+        {
+            serializer.writeStartElement( tagName );
+            if ( resolverSettings.isDebug() != null )
+            {
+                serializer.writeStartElement( "debug" );
+                serializer.writeCharacters( String.valueOf( resolverSettings.isDebug() ) );
+                serializer.writeEndElement();
+            }
+            if ( ( resolverSettings.getLocalRepositories() != null ) && ( resolverSettings.getLocalRepositories().size() > 0 ) )
+            {
+                serializer.writeStartElement( "localRepositories" );
+                for ( Iterator iter = resolverSettings.getLocalRepositories().iterator(); iter.hasNext(); )
+                {
+                    String localRepository = (String) iter.next();
+                    serializer.writeStartElement( "repository" );
+                    serializer.writeCharacters( localRepository );
+                    serializer.writeEndElement();
+                }
+                serializer.writeEndElement();
+            }
+            if ( ( resolverSettings.getMetadataRepositories() != null ) && ( resolverSettings.getMetadataRepositories().size() > 0 ) )
+            {
+                serializer.writeStartElement( "metadataRepositories" );
+                for ( Iterator iter = resolverSettings.getMetadataRepositories().iterator(); iter.hasNext(); )
+                {
+                    String metadataRepository = (String) iter.next();
+                    serializer.writeStartElement( "repository" );
+                    serializer.writeCharacters( metadataRepository );
+                    serializer.writeEndElement();
+                }
+                serializer.writeEndElement();
+            }
+            if ( ( resolverSettings.getPrefixes() != null ) && ( resolverSettings.getPrefixes().size() > 0 ) )
+            {
+                serializer.writeStartElement( "prefixes" );
+                for ( Iterator iter = resolverSettings.getPrefixes().iterator(); iter.hasNext(); )
+                {
+                    String prefix = (String) iter.next();
+                    serializer.writeStartElement( "prefix" );
+                    serializer.writeCharacters( prefix );
+                    serializer.writeEndElement();
+                }
+                serializer.writeEndElement();
+            }
+            if ( ( resolverSettings.getBlacklist() != null ) && ( resolverSettings.getBlacklist().size() > 0 ) )
+            {
+                serializer.writeStartElement( "blacklist" );
+                for ( Iterator iter = resolverSettings.getBlacklist().iterator(); iter.hasNext(); )
+                {
+                    Artifact o = (Artifact) iter.next();
+                    writeArtifact( o, "artifact", serializer );
+                }
+                serializer.writeEndElement();
+            }
+            serializer.writeEndElement();
+        }
+    } //-- void writeResolverSettings( ResolverSettings, String, XMLStreamWriter )
+
+    /**
+     * Method writeStereotype.
+     * 
+     * @param stereotype
+     * @param serializer
+     * @param tagName
+     * @throws java.io.IOException
+     * @throws XMLStreamException
+     */
+    private void writeStereotype( Stereotype stereotype, String tagName, XMLStreamWriter serializer )
+        throws java.io.IOException, XMLStreamException
+    {
+        if ( stereotype != null )
+        {
+            serializer.writeStartElement( tagName );
+            if ( stereotype.getType() != null )
+            {
+                serializer.writeStartElement( "type" );
+                serializer.writeCharacters( stereotype.getType() );
+                serializer.writeEndElement();
+            }
+            if ( stereotype.getExtension() != null )
+            {
+                serializer.writeStartElement( "extension" );
+                serializer.writeCharacters( stereotype.getExtension() );
+                serializer.writeEndElement();
+            }
+            if ( stereotype.getClassifier() != null )
+            {
+                serializer.writeStartElement( "classifier" );
+                serializer.writeCharacters( stereotype.getClassifier() );
+                serializer.writeEndElement();
+            }
+            serializer.writeEndElement();
+        }
+    } //-- void writeStereotype( Stereotype, String, XMLStreamWriter )
+
+}
diff --git a/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/io/stax/IndentingXMLStreamWriter.java b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/io/stax/IndentingXMLStreamWriter.java
new file mode 100644
index 0000000..5fd340e
--- /dev/null
+++ b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/config/io/stax/IndentingXMLStreamWriter.java
@@ -0,0 +1,653 @@
+// =================== DO NOT EDIT THIS FILE ====================
+// Generated by Modello 1.8.2,
+// any modifications will be overwritten.
+// ==============================================================
+
+package org.fedoraproject.xmvn.config.io.stax;
+
+  //---------------------------------/
+ //- Imported classes and packages -/
+//---------------------------------/
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+/**
+ * Class IndentingXMLStreamWriter.
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+class IndentingXMLStreamWriter
+    implements XMLStreamWriter
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * Field out.
+     */
+    private XMLStreamWriter out;
+
+    /**
+     * Field NEW_LINE.
+     */
+    private static final String NEW_LINE = "\n";
+
+    /**
+     * Field newLine.
+     */
+    private String newLine = NEW_LINE;
+
+    /**
+     * Field indent.
+     */
+    private String indent = "  ";
+
+    /**
+     * Field linePrefix.
+     */
+    private char[] linePrefix = "                        ".toCharArray();
+
+    /**
+     * Field depth.
+     */
+    private int depth;
+
+    /**
+     * Field states.
+     */
+    private byte[] states = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+    /**
+     * Field ELEMENT_HAS_DATA.
+     */
+    private static final int ELEMENT_HAS_DATA = 0x1;
+
+    /**
+     * Field ELEMENT_HAS_MARKUP.
+     */
+    private static final int ELEMENT_HAS_MARKUP = 0x2;
+
+
+      //----------------/
+     //- Constructors -/
+    //----------------/
+
+    public IndentingXMLStreamWriter(XMLStreamWriter out)
+    {
+        this.out = out;
+    } //-- org.fedoraproject.xmvn.config.io.stax.IndentingXMLStreamWriter(XMLStreamWriter)
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method close.
+     * 
+     * @throws XMLStreamException
+     */
+    public void close()
+        throws XMLStreamException
+    {
+        out.close();
+    } //-- void close()
+
+    /**
+     * Method flush.
+     * 
+     * @throws XMLStreamException
+     */
+    public void flush()
+        throws XMLStreamException
+    {
+        out.flush();
+    } //-- void flush()
+
+    /**
+     * Method getNamespaceContext.
+     * 
+     * @return NamespaceContext
+     */
+    public NamespaceContext getNamespaceContext()
+    {
+        return out.getNamespaceContext();
+    } //-- NamespaceContext getNamespaceContext()
+
+    /**
+     * Method getPrefix.
+     * 
+     * @param uri
+     * @throws XMLStreamException
+     * @return String
+     */
+    public String getPrefix( String uri )
+        throws XMLStreamException
+    {
+        return out.getPrefix( uri );
+    } //-- String getPrefix( String )
+
+    /**
+     * Method getProperty.
+     * 
+     * @param name
+     * @throws IllegalArgumentException
+     * @return Object
+     */
+    public Object getProperty( String name )
+        throws IllegalArgumentException
+    {
+        return out.getProperty( name );
+    } //-- Object getProperty( String )
+
+    /**
+     * Method setDefaultNamespace.
+     * 
+     * @param uri
+     * @throws XMLStreamException
+     */
+    public void setDefaultNamespace( String uri )
+        throws XMLStreamException
+    {
+        out.setDefaultNamespace( uri );
+    } //-- void setDefaultNamespace( String )
+
+    /**
+     * Method setNamespaceContext.
+     * 
+     * @param context
+     * @throws XMLStreamException
+     */
+    public void setNamespaceContext( NamespaceContext context )
+        throws XMLStreamException
+    {
+        out.setNamespaceContext( context );
+    } //-- void setNamespaceContext( NamespaceContext )
+
+    /**
+     * Method setPrefix.
+     * 
+     * @param prefix
+     * @param uri
+     * @throws XMLStreamException
+     */
+    public void setPrefix( String prefix, String uri )
+        throws XMLStreamException
+    {
+        out.setPrefix( prefix, uri );
+    } //-- void setPrefix( String, String )
+
+    /**
+     * Method writeAttribute.
+     * 
+     * @param localName
+     * @param value
+     * @throws XMLStreamException
+     */
+    public void writeAttribute( String localName, String value )
+        throws XMLStreamException
+    {
+        out.writeAttribute( localName, value );
+    } //-- void writeAttribute( String, String )
+
+    /**
+     * Method writeAttribute.
+     * 
+     * @param namespaceURI
+     * @param value
+     * @param localName
+     * @throws XMLStreamException
+     */
+    public void writeAttribute( String namespaceURI, String localName, String value )
+        throws XMLStreamException
+    {
+        out.writeAttribute( namespaceURI, localName, value );
+    } //-- void writeAttribute( String, String, String )
+
+    /**
+     * Method writeAttribute.
+     * 
+     * @param prefix
+     * @param value
+     * @param localName
+     * @param namespaceURI
+     * @throws XMLStreamException
+     */
+    public void writeAttribute( String prefix, String namespaceURI, String localName, String value )
+        throws XMLStreamException
+    {
+        out.writeAttribute( prefix, namespaceURI, localName, value );
+    } //-- void writeAttribute( String, String, String, String )
+
+    /**
+     * Method writeCData.
+     * 
+     * @param data
+     * @throws XMLStreamException
+     */
+    public void writeCData( String data )
+        throws XMLStreamException
+    {
+        out.writeCData( data );
+        afterData();
+    } //-- void writeCData( String )
+
+    /**
+     * Method writeCharacters.
+     * 
+     * @param text
+     * @throws XMLStreamException
+     */
+    public void writeCharacters( String text )
+        throws XMLStreamException
+    {
+        out.writeCharacters( text );
+        afterData();
+    } //-- void writeCharacters( String )
+
+    /**
+     * Method writeCharacters.
+     * 
+     * @param text
+     * @param len
+     * @param start
+     * @throws XMLStreamException
+     */
+    public void writeCharacters( char[] text, int start, int len )
+        throws XMLStreamException
+    {
+        out.writeCharacters( text, start, len );
+        afterData();
+    } //-- void writeCharacters( char[], int, int )
+
+    /**
+     * Method writeComment.
+     * 
+     * @param data
+     * @throws XMLStreamException
+     */
+    public void writeComment( String data )
+        throws XMLStreamException
+    {
+        beforeMarkup();
+        out.writeComment( data );
+        afterMarkup();
+    } //-- void writeComment( String )
+
+    /**
+     * Method writeDTD.
+     * 
+     * @param dtd
+     * @throws XMLStreamException
+     */
+    public void writeDTD( String dtd )
+        throws XMLStreamException
+    {
+        beforeMarkup();
+        out.writeDTD( dtd );
+        afterMarkup();
+    } //-- void writeDTD( String )
+
+    /**
+     * Method writeDefaultNamespace.
+     * 
+     * @param namespaceURI
+     * @throws XMLStreamException
+     */
+    public void writeDefaultNamespace( String namespaceURI )
+        throws XMLStreamException
+    {
+        out.writeDefaultNamespace( namespaceURI );
+    } //-- void writeDefaultNamespace( String )
+
+    /**
+     * Method writeEmptyElement.
+     * 
+     * @param localName
+     * @throws XMLStreamException
+     */
+    public void writeEmptyElement( String localName )
+        throws XMLStreamException
+    {
+        beforeMarkup();
+        out.writeEmptyElement( localName );
+        afterMarkup();
+    } //-- void writeEmptyElement( String )
+
+    /**
+     * Method writeEmptyElement.
+     * 
+     * @param namespaceURI
+     * @param localName
+     * @throws XMLStreamException
+     */
+    public void writeEmptyElement( String namespaceURI, String localName )
+        throws XMLStreamException
+    {
+        beforeMarkup();
+        out.writeEmptyElement( namespaceURI, localName );
+        afterMarkup();
+    } //-- void writeEmptyElement( String, String )
+
+    /**
+     * Method writeEmptyElement.
+     * 
+     * @param prefix
+     * @param localName
+     * @param namespaceURI
+     * @throws XMLStreamException
+     */
+    public void writeEmptyElement( String prefix, String namespaceURI, String localName )
+        throws XMLStreamException
+    {
+        beforeMarkup();
+        out.writeEmptyElement( prefix, namespaceURI, localName );
+        afterMarkup();
+    } //-- void writeEmptyElement( String, String, String )
+
+    /**
+     * Method writeEndDocument.
+     * 
+     * @throws XMLStreamException
+     */
+    public void writeEndDocument()
+        throws XMLStreamException
+    {
+        out.writeEndDocument(  );
+    } //-- void writeEndDocument()
+
+    /**
+     * Method writeEndElement.
+     * 
+     * @throws XMLStreamException
+     */
+    public void writeEndElement()
+        throws XMLStreamException
+    {
+        beforeEndElement();
+        out.writeEndElement(  );
+        afterEndElement();
+    } //-- void writeEndElement()
+
+    /**
+     * Method writeEntityRef.
+     * 
+     * @param name
+     * @throws XMLStreamException
+     */
+    public void writeEntityRef( String name )
+        throws XMLStreamException
+    {
+        out.writeEntityRef( name );
+        afterData();
+    } //-- void writeEntityRef( String )
+
+    /**
+     * Method writeNamespace.
+     * 
+     * @param prefix
+     * @param namespaceURI
+     * @throws XMLStreamException
+     */
+    public void writeNamespace( String prefix, String namespaceURI )
+        throws XMLStreamException
+    {
+        out.writeNamespace( prefix, namespaceURI );
+    } //-- void writeNamespace( String, String )
+
+    /**
+     * Method writeProcessingInstruction.
+     * 
+     * @param target
+     * @throws XMLStreamException
+     */
+    public void writeProcessingInstruction( String target )
+        throws XMLStreamException
+    {
+        beforeMarkup();
+        out.writeProcessingInstruction( target );
+        afterMarkup();
+    } //-- void writeProcessingInstruction( String )
+
+    /**
+     * Method writeProcessingInstruction.
+     * 
+     * @param target
+     * @param data
+     * @throws XMLStreamException
+     */
+    public void writeProcessingInstruction( String target, String data )
+        throws XMLStreamException
+    {
+        beforeMarkup();
+        out.writeProcessingInstruction( target, data );
+        afterMarkup();
+    } //-- void writeProcessingInstruction( String, String )
+
+    /**
+     * Method writeStartDocument.
+     * 
+     * @throws XMLStreamException
+     */
+    public void writeStartDocument()
+        throws XMLStreamException
+    {
+        beforeMarkup();
+        out.writeStartDocument(  );
+        afterMarkup();
+    } //-- void writeStartDocument()
+
+    /**
+     * Method writeStartDocument.
+     * 
+     * @param version
+     * @throws XMLStreamException
+     */
+    public void writeStartDocument( String version )
+        throws XMLStreamException
+    {
+        beforeMarkup();
+        out.writeStartDocument( version );
+        afterMarkup();
+    } //-- void writeStartDocument( String )
+
+    /**
+     * Method writeStartDocument.
+     * 
+     * @param encoding
+     * @param version
+     * @throws XMLStreamException
+     */
+    public void writeStartDocument( String encoding, String version )
+        throws XMLStreamException
+    {
+        beforeMarkup();
+        out.writeStartDocument( encoding, version );
+        afterMarkup();
+    } //-- void writeStartDocument( String, String )
+
+    /**
+     * Method writeStartElement.
+     * 
+     * @param localName
+     * @throws XMLStreamException
+     */
+    public void writeStartElement( String localName )
+        throws XMLStreamException
+    {
+        beforeStartElement();
+        out.writeStartElement( localName );
+        afterStartElement();
+    } //-- void writeStartElement( String )
+
+    /**
+     * Method writeStartElement.
+     * 
+     * @param namespaceURI
+     * @param localName
+     * @throws XMLStreamException
+     */
+    public void writeStartElement( String namespaceURI, String localName )
+        throws XMLStreamException
+    {
+        beforeStartElement();
+        out.writeStartElement( namespaceURI, localName );
+        afterStartElement();
+    } //-- void writeStartElement( String, String )
+
+    /**
+     * Method writeStartElement.
+     * 
+     * @param prefix
+     * @param namespaceURI
+     * @param localName
+     * @throws XMLStreamException
+     */
+    public void writeStartElement( String prefix, String localName, String namespaceURI )
+        throws XMLStreamException
+    {
+        beforeStartElement();
+        out.writeStartElement( prefix, localName, namespaceURI );
+        afterStartElement();
+    } //-- void writeStartElement( String, String, String )
+
+    /**
+     * Method afterData.
+     */
+    private void afterData()
+    {
+        states[depth] |= ELEMENT_HAS_DATA;
+    } //-- void afterData()
+
+    /**
+     * Method afterEndElement.
+     */
+    private void afterEndElement()
+    {
+        if ( depth > 0 )
+        {
+            depth--;
+            if ( depth <= 0 )
+            {
+                newLine( 0 );
+            }
+        }
+    } //-- void afterEndElement()
+
+    /**
+     * Method afterMarkup.
+     */
+    private void afterMarkup()
+    {
+        states[depth] |= ELEMENT_HAS_MARKUP;
+    } //-- void afterMarkup()
+
+    /**
+     * Method afterStartElement.
+     */
+    private void afterStartElement()
+    {
+        afterMarkup();
+        depth++;
+    } //-- void afterStartElement()
+
+    /**
+     * Method beforeEndElement.
+     */
+    private void beforeEndElement()
+    {
+        if ( depth > 0 && states[depth] == ELEMENT_HAS_MARKUP )
+        {
+            newLine( depth - 1 );
+        }
+    } //-- void beforeEndElement()
+
+    /**
+     * Method beforeMarkup.
+     */
+    private void beforeMarkup()
+    {
+        int state = states[depth];
+        if ( ( state & ELEMENT_HAS_DATA ) == 0 && ( depth > 0 || state != 0 ) )
+        {
+            newLine( depth );
+            if ( depth > 0 && indent.length() > 0 )
+            {
+                afterMarkup();
+            }
+        }
+    } //-- void beforeMarkup()
+
+    /**
+     * Method beforeStartElement.
+     */
+    private void beforeStartElement()
+    {
+        beforeMarkup();
+        if ( states.length <= depth + 1 )
+        {
+            byte[] tmp = new byte[states.length * 2];
+            System.arraycopy( states, 0, tmp, 0, states.length );
+            states = tmp;
+        }
+        states[depth + 1] = 0;
+    } //-- void beforeStartElement()
+
+    /**
+     * Method getLineSeparator.
+     * 
+     * @return String
+     */
+    public String getLineSeparator()
+    {
+        try
+        {
+            return System.getProperty( "line.separator", NEW_LINE );
+        }
+        catch ( Exception e )
+        {
+            return NEW_LINE;
+        }
+    } //-- String getLineSeparator()
+
+    /**
+     * Method newLine.
+     * 
+     * @param depth
+     */
+    private void newLine( int depth )
+    {
+        try
+        {
+            out.writeCharacters( newLine );
+            int prefixLength = depth * indent.length();
+            while ( linePrefix.length < prefixLength )
+            {
+                char[] tmp = new char[linePrefix.length * 2];
+                System.arraycopy( linePrefix, 0, tmp, 0, linePrefix.length );
+                System.arraycopy( linePrefix, 0, tmp, linePrefix.length, linePrefix.length );
+                linePrefix = tmp;
+            }
+            out.writeCharacters( linePrefix, 0, prefixLength );
+        }
+        catch ( Exception e )
+        {
+        }
+    } //-- void newLine( int )
+
+    /**
+     * Method setNewLine.
+     * 
+     * @param newLine
+     */
+    public void setNewLine( String newLine )
+    {
+        this.newLine = newLine;
+    } //-- void setNewLine( String )
+
+}
diff --git a/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/ArtifactAlias.java b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/ArtifactAlias.java
new file mode 100644
index 0000000..4da0d4b
--- /dev/null
+++ b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/ArtifactAlias.java
@@ -0,0 +1,157 @@
+// =================== DO NOT EDIT THIS FILE ====================
+// Generated by Modello 1.8.2,
+// any modifications will be overwritten.
+// ==============================================================
+
+package org.fedoraproject.xmvn.metadata;
+
+/**
+ * 
+ *         Alternative artifact identification coordinates.
+ *       
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class ArtifactAlias
+    implements java.io.Serializable, java.lang.Cloneable
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * 
+     *             Group ID of the artifact alias.
+     *           
+     */
+    private String groupId;
+
+    /**
+     * 
+     *             Artifact ID of the artifact alias.
+     *           
+     */
+    private String artifactId;
+
+    /**
+     * 
+     *             Extension of the artifact alias.
+     *           
+     */
+    private String extension = "jar";
+
+    /**
+     * 
+     *             Classifier of the artifact alias.
+     *           
+     */
+    private String classifier = "";
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method clone.
+     * 
+     * @return ArtifactAlias
+     */
+    public ArtifactAlias clone()
+    {
+        try
+        {
+            ArtifactAlias copy = (ArtifactAlias) super.clone();
+
+            return copy;
+        }
+        catch ( java.lang.Exception ex )
+        {
+            throw (java.lang.RuntimeException) new java.lang.UnsupportedOperationException( getClass().getName()
+                + " does not support clone()" ).initCause( ex );
+        }
+    } //-- ArtifactAlias clone()
+
+    /**
+     * Get artifact ID of the artifact alias.
+     * 
+     * @return String
+     */
+    public String getArtifactId()
+    {
+        return this.artifactId;
+    } //-- String getArtifactId()
+
+    /**
+     * Get classifier of the artifact alias.
+     * 
+     * @return String
+     */
+    public String getClassifier()
+    {
+        return this.classifier;
+    } //-- String getClassifier()
+
+    /**
+     * Get extension of the artifact alias.
+     * 
+     * @return String
+     */
+    public String getExtension()
+    {
+        return this.extension;
+    } //-- String getExtension()
+
+    /**
+     * Get group ID of the artifact alias.
+     * 
+     * @return String
+     */
+    public String getGroupId()
+    {
+        return this.groupId;
+    } //-- String getGroupId()
+
+    /**
+     * Set artifact ID of the artifact alias.
+     * 
+     * @param artifactId
+     */
+    public void setArtifactId( String artifactId )
+    {
+        this.artifactId = artifactId;
+    } //-- void setArtifactId( String )
+
+    /**
+     * Set classifier of the artifact alias.
+     * 
+     * @param classifier
+     */
+    public void setClassifier( String classifier )
+    {
+        this.classifier = classifier;
+    } //-- void setClassifier( String )
+
+    /**
+     * Set extension of the artifact alias.
+     * 
+     * @param extension
+     */
+    public void setExtension( String extension )
+    {
+        this.extension = extension;
+    } //-- void setExtension( String )
+
+    /**
+     * Set group ID of the artifact alias.
+     * 
+     * @param groupId
+     */
+    public void setGroupId( String groupId )
+    {
+        this.groupId = groupId;
+    } //-- void setGroupId( String )
+
+}
diff --git a/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/ArtifactMetadata.java b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/ArtifactMetadata.java
new file mode 100644
index 0000000..b227b38
--- /dev/null
+++ b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/ArtifactMetadata.java
@@ -0,0 +1,520 @@
+// =================== DO NOT EDIT THIS FILE ====================
+// Generated by Modello 1.8.2,
+// any modifications will be overwritten.
+// ==============================================================
+
+package org.fedoraproject.xmvn.metadata;
+
+/**
+ * 
+ *         Information about a single artifact.
+ *       
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class ArtifactMetadata
+    implements java.io.Serializable, java.lang.Cloneable
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * 
+     *             Group identifier of the artifact.
+     *           
+     */
+    private String groupId;
+
+    /**
+     * 
+     *             Identifier of the artifact.
+     *           
+     */
+    private String artifactId;
+
+    /**
+     * 
+     *             Extension of artifact file.
+     *           
+     */
+    private String extension = "jar";
+
+    /**
+     * 
+     *             Classifier of the artifact.
+     *           
+     */
+    private String classifier = "";
+
+    /**
+     * 
+     *             Artifact version.  This is always upstream
+     * version, never
+     *             compat version nor SYSTEM.
+     *           
+     */
+    private String version;
+
+    /**
+     * 
+     *             Absolute path to artifact file stored in the
+     * local file
+     *             system.
+     *           
+     */
+    private String path;
+
+    /**
+     * 
+     *             A namespace within which this artifact is
+     * stored.  This
+     *             usually is an identifier of software collection.
+     *           
+     */
+    private String namespace = "";
+
+    /**
+     * 
+     *             Universally unique identifier of this artifact.
+     *           
+     */
+    private String uuid;
+
+    /**
+     * Field properties.
+     */
+    private java.util.Properties properties;
+
+    /**
+     * Field compatVersions.
+     */
+    private java.util.List<String> compatVersions;
+
+    /**
+     * Field aliases.
+     */
+    private java.util.List<ArtifactAlias> aliases;
+
+    /**
+     * Field dependencies.
+     */
+    private java.util.List<Dependency> dependencies;
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method addCompatVersion.
+     * 
+     * @param string
+     */
+    public void addCompatVersion( String string )
+    {
+        getCompatVersions().add( string );
+    } //-- void addCompatVersion( String )
+
+    /**
+     * Method addDependency.
+     * 
+     * @param dependency
+     */
+    public void addDependency( Dependency dependency )
+    {
+        getDependencies().add( dependency );
+    } //-- void addDependency( Dependency )
+
+    /**
+     * Method addProperty.
+     * 
+     * @param key
+     * @param value
+     */
+    public void addProperty( String key, String value )
+    {
+        getProperties().put( key, value );
+    } //-- void addProperty( String, String )
+
+    /**
+     * Method clone.
+     * 
+     * @return ArtifactMetadata
+     */
+    public ArtifactMetadata clone()
+    {
+        try
+        {
+            ArtifactMetadata copy = (ArtifactMetadata) super.clone();
+
+            if ( this.properties != null )
+            {
+                copy.properties = (java.util.Properties) this.properties.clone();
+            }
+
+            if ( this.compatVersions != null )
+            {
+                copy.compatVersions = new java.util.ArrayList<String>();
+                copy.compatVersions.addAll( this.compatVersions );
+            }
+
+            if ( this.aliases != null )
+            {
+                copy.aliases = new java.util.ArrayList<ArtifactAlias>();
+                for ( ArtifactAlias item : this.aliases )
+                {
+                    copy.aliases.add( ( (ArtifactAlias) item).clone() );
+                }
+            }
+
+            if ( this.dependencies != null )
+            {
+                copy.dependencies = new java.util.ArrayList<Dependency>();
+                for ( Dependency item : this.dependencies )
+                {
+                    copy.dependencies.add( ( (Dependency) item).clone() );
+                }
+            }
+
+            return copy;
+        }
+        catch ( java.lang.Exception ex )
+        {
+            throw (java.lang.RuntimeException) new java.lang.UnsupportedOperationException( getClass().getName()
+                + " does not support clone()" ).initCause( ex );
+        }
+    } //-- ArtifactMetadata clone()
+
+    /**
+     * Method getAliases.
+     * 
+     * @return List
+     */
+    public java.util.List<ArtifactAlias> getAliases()
+    {
+        if ( this.aliases == null )
+        {
+            this.aliases = new java.util.ArrayList<ArtifactAlias>();
+        }
+
+        return this.aliases;
+    } //-- java.util.List<ArtifactAlias> getAliases()
+
+    /**
+     * Get identifier of the artifact.
+     * 
+     * @return String
+     */
+    public String getArtifactId()
+    {
+        return this.artifactId;
+    } //-- String getArtifactId()
+
+    /**
+     * Get classifier of the artifact.
+     * 
+     * @return String
+     */
+    public String getClassifier()
+    {
+        return this.classifier;
+    } //-- String getClassifier()
+
+    /**
+     * Method getCompatVersions.
+     * 
+     * @return List
+     */
+    public java.util.List<String> getCompatVersions()
+    {
+        if ( this.compatVersions == null )
+        {
+            this.compatVersions = new java.util.ArrayList<String>();
+        }
+
+        return this.compatVersions;
+    } //-- java.util.List<String> getCompatVersions()
+
+    /**
+     * Method getDependencies.
+     * 
+     * @return List
+     */
+    public java.util.List<Dependency> getDependencies()
+    {
+        if ( this.dependencies == null )
+        {
+            this.dependencies = new java.util.ArrayList<Dependency>();
+        }
+
+        return this.dependencies;
+    } //-- java.util.List<Dependency> getDependencies()
+
+    /**
+     * Get extension of artifact file.
+     * 
+     * @return String
+     */
+    public String getExtension()
+    {
+        return this.extension;
+    } //-- String getExtension()
+
+    /**
+     * Get group identifier of the artifact.
+     * 
+     * @return String
+     */
+    public String getGroupId()
+    {
+        return this.groupId;
+    } //-- String getGroupId()
+
+    /**
+     * Get a namespace within which this artifact is stored.  This
+     *             usually is an identifier of software collection.
+     * 
+     * @return String
+     */
+    public String getNamespace()
+    {
+        return this.namespace;
+    } //-- String getNamespace()
+
+    /**
+     * Get absolute path to artifact file stored in the local file
+     *             system.
+     * 
+     * @return String
+     */
+    public String getPath()
+    {
+        return this.path;
+    } //-- String getPath()
+
+    /**
+     * Method getProperties.
+     * 
+     * @return Properties
+     */
+    public java.util.Properties getProperties()
+    {
+        if ( this.properties == null )
+        {
+            this.properties = new java.util.Properties();
+        }
+
+        return this.properties;
+    } //-- java.util.Properties getProperties()
+
+    /**
+     * Get universally unique identifier of this artifact.
+     * 
+     * @return String
+     */
+    public String getUuid()
+    {
+        return this.uuid;
+    } //-- String getUuid()
+
+    /**
+     * Get artifact version.  This is always upstream version,
+     * never
+     *             compat version nor SYSTEM.
+     * 
+     * @return String
+     */
+    public String getVersion()
+    {
+        return this.version;
+    } //-- String getVersion()
+
+    /**
+     * Method removeCompatVersion.
+     * 
+     * @param string
+     */
+    public void removeCompatVersion( String string )
+    {
+        getCompatVersions().remove( string );
+    } //-- void removeCompatVersion( String )
+
+    /**
+     * Method removeDependency.
+     * 
+     * @param dependency
+     */
+    public void removeDependency( Dependency dependency )
+    {
+        getDependencies().remove( dependency );
+    } //-- void removeDependency( Dependency )
+
+    /**
+     * Set alternative identifiers of the artifact.
+     * 
+     * @param aliases
+     */
+    public void setAliases( java.util.List<ArtifactAlias> aliases )
+    {
+        this.aliases = aliases;
+    } //-- void setAliases( java.util.List )
+
+    /**
+     * Set identifier of the artifact.
+     * 
+     * @param artifactId
+     */
+    public void setArtifactId( String artifactId )
+    {
+        this.artifactId = artifactId;
+    } //-- void setArtifactId( String )
+
+    /**
+     * Set classifier of the artifact.
+     * 
+     * @param classifier
+     */
+    public void setClassifier( String classifier )
+    {
+        this.classifier = classifier;
+    } //-- void setClassifier( String )
+
+    /**
+     * Set compatibility versions of this artifact.  If the list is
+     *             empty then this artifact is not considered as
+     *             compatibility artifact.
+     * 
+     * @param compatVersions
+     */
+    public void setCompatVersions( java.util.List<String> compatVersions )
+    {
+        this.compatVersions = compatVersions;
+    } //-- void setCompatVersions( java.util.List )
+
+    /**
+     * Set list of artifact dependencies.
+     * 
+     * @param dependencies
+     */
+    public void setDependencies( java.util.List<Dependency> dependencies )
+    {
+        this.dependencies = dependencies;
+    } //-- void setDependencies( java.util.List )
+
+    /**
+     * Set extension of artifact file.
+     * 
+     * @param extension
+     */
+    public void setExtension( String extension )
+    {
+        this.extension = extension;
+    } //-- void setExtension( String )
+
+    /**
+     * Set group identifier of the artifact.
+     * 
+     * @param groupId
+     */
+    public void setGroupId( String groupId )
+    {
+        this.groupId = groupId;
+    } //-- void setGroupId( String )
+
+    /**
+     * Set a namespace within which this artifact is stored.  This
+     *             usually is an identifier of software collection.
+     * 
+     * @param namespace
+     */
+    public void setNamespace( String namespace )
+    {
+        this.namespace = namespace;
+    } //-- void setNamespace( String )
+
+    /**
+     * Set absolute path to artifact file stored in the local file
+     *             system.
+     * 
+     * @param path
+     */
+    public void setPath( String path )
+    {
+        this.path = path;
+    } //-- void setPath( String )
+
+    /**
+     * Set extra properties of this artifact.
+     * 
+     * @param properties
+     */
+    public void setProperties( java.util.Properties properties )
+    {
+        this.properties = properties;
+    } //-- void setProperties( java.util.Properties )
+
+    /**
+     * Set universally unique identifier of this artifact.
+     * 
+     * @param uuid
+     */
+    public void setUuid( String uuid )
+    {
+        this.uuid = uuid;
+    } //-- void setUuid( String )
+
+    /**
+     * Set artifact version.  This is always upstream version,
+     * never
+     *             compat version nor SYSTEM.
+     * 
+     * @param version
+     */
+    public void setVersion( String version )
+    {
+        this.version = version;
+    } //-- void setVersion( String )
+
+    
+            
+    /**
+     * Add an alias.
+     * @param alias alias to be added
+     */
+    public void addAlias( ArtifactAlias alias )
+    {
+        getAliases().add( alias );
+    }
+
+    /**
+     * Remove an alias.
+     * @param alias alias to be removed
+     */
+    public void removeAlias( ArtifactAlias alias )
+    {
+        getAliases().remove( alias );
+    }
+
+    /**
+     * Return list of versions from which this artifact can be resolved.
+     * <p>
+     * For non-compat artifacts this method returns a singleton list containing default artfact version.
+     * Otherwise it returns a list of compat versions.
+     * 
+     * @return non-empty list of versions, never {@code null}
+     */
+    public java.util.List<String> getResolvableVersions()
+    {
+        java.util.List<String> versions = java.util.Collections.unmodifiableList( getCompatVersions() );
+
+        if ( versions.isEmpty() )
+            versions = java.util.Collections.singletonList( org.fedoraproject.xmvn.artifact.Artifact.DEFAULT_VERSION );
+
+        return versions;
+    }
+            
+          
+}
diff --git a/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/Dependency.java b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/Dependency.java
new file mode 100644
index 0000000..ad83f24
--- /dev/null
+++ b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/Dependency.java
@@ -0,0 +1,323 @@
+// =================== DO NOT EDIT THIS FILE ====================
+// Generated by Modello 1.8.2,
+// any modifications will be overwritten.
+// ==============================================================
+
+package org.fedoraproject.xmvn.metadata;
+
+/**
+ * 
+ *         Description of dependency artifact.
+ *       
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class Dependency
+    implements java.io.Serializable, java.lang.Cloneable
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * 
+     *             Group ID of the dependency artifact.
+     *           
+     */
+    private String groupId;
+
+    /**
+     * 
+     *             Artifact ID of the dependency artifact.
+     *           
+     */
+    private String artifactId;
+
+    /**
+     * 
+     *             Extension of the dependency artifact.
+     *           
+     */
+    private String extension = "jar";
+
+    /**
+     * 
+     *             Classifier of the dependency artifact.
+     *           
+     */
+    private String classifier = "";
+
+    /**
+     * 
+     *             Version of the dependency artifact as defined in
+     * the main
+     *             artifact descriptor.  This may be a version
+     * range as
+     *             supported by Aether.
+     *           
+     */
+    private String requestedVersion = "SYSTEM";
+
+    /**
+     * 
+     *             Version of the dependency artifact, as resolved
+     * during
+     *             build.  Absence of this field indicates a
+     * dependency on
+     *             default artifact version.
+     *           
+     */
+    private String resolvedVersion = "SYSTEM";
+
+    /**
+     * 
+     *             A namespace within which this artifact is
+     * stored.  This
+     *             usually is an identifier of software collection.
+     *           
+     */
+    private String namespace = "";
+
+    /**
+     * Field exclusions.
+     */
+    private java.util.List<DependencyExclusion> exclusions;
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method addExclusion.
+     * 
+     * @param dependencyExclusion
+     */
+    public void addExclusion( DependencyExclusion dependencyExclusion )
+    {
+        getExclusions().add( dependencyExclusion );
+    } //-- void addExclusion( DependencyExclusion )
+
+    /**
+     * Method clone.
+     * 
+     * @return Dependency
+     */
+    public Dependency clone()
+    {
+        try
+        {
+            Dependency copy = (Dependency) super.clone();
+
+            if ( this.exclusions != null )
+            {
+                copy.exclusions = new java.util.ArrayList<DependencyExclusion>();
+                for ( DependencyExclusion item : this.exclusions )
+                {
+                    copy.exclusions.add( ( (DependencyExclusion) item).clone() );
+                }
+            }
+
+            return copy;
+        }
+        catch ( java.lang.Exception ex )
+        {
+            throw (java.lang.RuntimeException) new java.lang.UnsupportedOperationException( getClass().getName()
+                + " does not support clone()" ).initCause( ex );
+        }
+    } //-- Dependency clone()
+
+    /**
+     * Get artifact ID of the dependency artifact.
+     * 
+     * @return String
+     */
+    public String getArtifactId()
+    {
+        return this.artifactId;
+    } //-- String getArtifactId()
+
+    /**
+     * Get classifier of the dependency artifact.
+     * 
+     * @return String
+     */
+    public String getClassifier()
+    {
+        return this.classifier;
+    } //-- String getClassifier()
+
+    /**
+     * Method getExclusions.
+     * 
+     * @return List
+     */
+    public java.util.List<DependencyExclusion> getExclusions()
+    {
+        if ( this.exclusions == null )
+        {
+            this.exclusions = new java.util.ArrayList<DependencyExclusion>();
+        }
+
+        return this.exclusions;
+    } //-- java.util.List<DependencyExclusion> getExclusions()
+
+    /**
+     * Get extension of the dependency artifact.
+     * 
+     * @return String
+     */
+    public String getExtension()
+    {
+        return this.extension;
+    } //-- String getExtension()
+
+    /**
+     * Get group ID of the dependency artifact.
+     * 
+     * @return String
+     */
+    public String getGroupId()
+    {
+        return this.groupId;
+    } //-- String getGroupId()
+
+    /**
+     * Get a namespace within which this artifact is stored.  This
+     *             usually is an identifier of software collection.
+     * 
+     * @return String
+     */
+    public String getNamespace()
+    {
+        return this.namespace;
+    } //-- String getNamespace()
+
+    /**
+     * Get version of the dependency artifact as defined in the
+     * main
+     *             artifact descriptor.  This may be a version
+     * range as
+     *             supported by Aether.
+     * 
+     * @return String
+     */
+    public String getRequestedVersion()
+    {
+        return this.requestedVersion;
+    } //-- String getRequestedVersion()
+
+    /**
+     * Get version of the dependency artifact, as resolved during
+     *             build.  Absence of this field indicates a
+     * dependency on
+     *             default artifact version.
+     * 
+     * @return String
+     */
+    public String getResolvedVersion()
+    {
+        return this.resolvedVersion;
+    } //-- String getResolvedVersion()
+
+    /**
+     * Method removeExclusion.
+     * 
+     * @param dependencyExclusion
+     */
+    public void removeExclusion( DependencyExclusion dependencyExclusion )
+    {
+        getExclusions().remove( dependencyExclusion );
+    } //-- void removeExclusion( DependencyExclusion )
+
+    /**
+     * Set artifact ID of the dependency artifact.
+     * 
+     * @param artifactId
+     */
+    public void setArtifactId( String artifactId )
+    {
+        this.artifactId = artifactId;
+    } //-- void setArtifactId( String )
+
+    /**
+     * Set classifier of the dependency artifact.
+     * 
+     * @param classifier
+     */
+    public void setClassifier( String classifier )
+    {
+        this.classifier = classifier;
+    } //-- void setClassifier( String )
+
+    /**
+     * Set list of dependency exclusions.
+     * 
+     * @param exclusions
+     */
+    public void setExclusions( java.util.List<DependencyExclusion> exclusions )
+    {
+        this.exclusions = exclusions;
+    } //-- void setExclusions( java.util.List )
+
+    /**
+     * Set extension of the dependency artifact.
+     * 
+     * @param extension
+     */
+    public void setExtension( String extension )
+    {
+        this.extension = extension;
+    } //-- void setExtension( String )
+
+    /**
+     * Set group ID of the dependency artifact.
+     * 
+     * @param groupId
+     */
+    public void setGroupId( String groupId )
+    {
+        this.groupId = groupId;
+    } //-- void setGroupId( String )
+
+    /**
+     * Set a namespace within which this artifact is stored.  This
+     *             usually is an identifier of software collection.
+     * 
+     * @param namespace
+     */
+    public void setNamespace( String namespace )
+    {
+        this.namespace = namespace;
+    } //-- void setNamespace( String )
+
+    /**
+     * Set version of the dependency artifact as defined in the
+     * main
+     *             artifact descriptor.  This may be a version
+     * range as
+     *             supported by Aether.
+     * 
+     * @param requestedVersion
+     */
+    public void setRequestedVersion( String requestedVersion )
+    {
+        this.requestedVersion = requestedVersion;
+    } //-- void setRequestedVersion( String )
+
+    /**
+     * Set version of the dependency artifact, as resolved during
+     *             build.  Absence of this field indicates a
+     * dependency on
+     *             default artifact version.
+     * 
+     * @param resolvedVersion
+     */
+    public void setResolvedVersion( String resolvedVersion )
+    {
+        this.resolvedVersion = resolvedVersion;
+    } //-- void setResolvedVersion( String )
+
+}
diff --git a/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/DependencyExclusion.java b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/DependencyExclusion.java
new file mode 100644
index 0000000..419c939
--- /dev/null
+++ b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/DependencyExclusion.java
@@ -0,0 +1,103 @@
+// =================== DO NOT EDIT THIS FILE ====================
+// Generated by Modello 1.8.2,
+// any modifications will be overwritten.
+// ==============================================================
+
+package org.fedoraproject.xmvn.metadata;
+
+/**
+ * 
+ *         Description of artifact excluded from dependency tree.
+ *       
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class DependencyExclusion
+    implements java.io.Serializable, java.lang.Cloneable
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * 
+     *             Group ID of the excluded artifact.
+     *           
+     */
+    private String groupId;
+
+    /**
+     * 
+     *             Artifact ID of the excluded artifact.
+     *           
+     */
+    private String artifactId;
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method clone.
+     * 
+     * @return DependencyExclusion
+     */
+    public DependencyExclusion clone()
+    {
+        try
+        {
+            DependencyExclusion copy = (DependencyExclusion) super.clone();
+
+            return copy;
+        }
+        catch ( java.lang.Exception ex )
+        {
+            throw (java.lang.RuntimeException) new java.lang.UnsupportedOperationException( getClass().getName()
+                + " does not support clone()" ).initCause( ex );
+        }
+    } //-- DependencyExclusion clone()
+
+    /**
+     * Get artifact ID of the excluded artifact.
+     * 
+     * @return String
+     */
+    public String getArtifactId()
+    {
+        return this.artifactId;
+    } //-- String getArtifactId()
+
+    /**
+     * Get group ID of the excluded artifact.
+     * 
+     * @return String
+     */
+    public String getGroupId()
+    {
+        return this.groupId;
+    } //-- String getGroupId()
+
+    /**
+     * Set artifact ID of the excluded artifact.
+     * 
+     * @param artifactId
+     */
+    public void setArtifactId( String artifactId )
+    {
+        this.artifactId = artifactId;
+    } //-- void setArtifactId( String )
+
+    /**
+     * Set group ID of the excluded artifact.
+     * 
+     * @param groupId
+     */
+    public void setGroupId( String groupId )
+    {
+        this.groupId = groupId;
+    } //-- void setGroupId( String )
+
+}
diff --git a/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/PackageMetadata.java b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/PackageMetadata.java
new file mode 100644
index 0000000..762652f
--- /dev/null
+++ b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/PackageMetadata.java
@@ -0,0 +1,270 @@
+// =================== DO NOT EDIT THIS FILE ====================
+// Generated by Modello 1.8.2,
+// any modifications will be overwritten.
+// ==============================================================
+
+package org.fedoraproject.xmvn.metadata;
+
+/**
+ * 
+ *         Root element of the metadata file.
+ *       
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class PackageMetadata
+    implements java.io.Serializable, java.lang.Cloneable
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * 
+     *             Universally unique identifier of this piece of
+     * metadata.
+     *           
+     */
+    private String uuid;
+
+    /**
+     * Field properties.
+     */
+    private java.util.Properties properties;
+
+    /**
+     * Field artifacts.
+     */
+    private java.util.List<ArtifactMetadata> artifacts;
+
+    /**
+     * Field skippedArtifacts.
+     */
+    private java.util.List<SkippedArtifactMetadata> skippedArtifacts;
+
+    /**
+     * Field modelEncoding.
+     */
+    private String modelEncoding = "UTF-8";
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method addArtifact.
+     * 
+     * @param artifactMetadata
+     */
+    public void addArtifact( ArtifactMetadata artifactMetadata )
+    {
+        getArtifacts().add( artifactMetadata );
+    } //-- void addArtifact( ArtifactMetadata )
+
+    /**
+     * Method addProperty.
+     * 
+     * @param key
+     * @param value
+     */
+    public void addProperty( String key, String value )
+    {
+        getProperties().put( key, value );
+    } //-- void addProperty( String, String )
+
+    /**
+     * Method addSkippedArtifact.
+     * 
+     * @param skippedArtifactMetadata
+     */
+    public void addSkippedArtifact( SkippedArtifactMetadata skippedArtifactMetadata )
+    {
+        getSkippedArtifacts().add( skippedArtifactMetadata );
+    } //-- void addSkippedArtifact( SkippedArtifactMetadata )
+
+    /**
+     * Method clone.
+     * 
+     * @return PackageMetadata
+     */
+    public PackageMetadata clone()
+    {
+        try
+        {
+            PackageMetadata copy = (PackageMetadata) super.clone();
+
+            if ( this.properties != null )
+            {
+                copy.properties = (java.util.Properties) this.properties.clone();
+            }
+
+            if ( this.artifacts != null )
+            {
+                copy.artifacts = new java.util.ArrayList<ArtifactMetadata>();
+                for ( ArtifactMetadata item : this.artifacts )
+                {
+                    copy.artifacts.add( ( (ArtifactMetadata) item).clone() );
+                }
+            }
+
+            if ( this.skippedArtifacts != null )
+            {
+                copy.skippedArtifacts = new java.util.ArrayList<SkippedArtifactMetadata>();
+                for ( SkippedArtifactMetadata item : this.skippedArtifacts )
+                {
+                    copy.skippedArtifacts.add( ( (SkippedArtifactMetadata) item).clone() );
+                }
+            }
+
+            return copy;
+        }
+        catch ( java.lang.Exception ex )
+        {
+            throw (java.lang.RuntimeException) new java.lang.UnsupportedOperationException( getClass().getName()
+                + " does not support clone()" ).initCause( ex );
+        }
+    } //-- PackageMetadata clone()
+
+    /**
+     * Method getArtifacts.
+     * 
+     * @return List
+     */
+    public java.util.List<ArtifactMetadata> getArtifacts()
+    {
+        if ( this.artifacts == null )
+        {
+            this.artifacts = new java.util.ArrayList<ArtifactMetadata>();
+        }
+
+        return this.artifacts;
+    } //-- java.util.List<ArtifactMetadata> getArtifacts()
+
+    /**
+     * Get the modelEncoding field.
+     * 
+     * @return String
+     */
+    public String getModelEncoding()
+    {
+        return this.modelEncoding;
+    } //-- String getModelEncoding()
+
+    /**
+     * Method getProperties.
+     * 
+     * @return Properties
+     */
+    public java.util.Properties getProperties()
+    {
+        if ( this.properties == null )
+        {
+            this.properties = new java.util.Properties();
+        }
+
+        return this.properties;
+    } //-- java.util.Properties getProperties()
+
+    /**
+     * Method getSkippedArtifacts.
+     * 
+     * @return List
+     */
+    public java.util.List<SkippedArtifactMetadata> getSkippedArtifacts()
+    {
+        if ( this.skippedArtifacts == null )
+        {
+            this.skippedArtifacts = new java.util.ArrayList<SkippedArtifactMetadata>();
+        }
+
+        return this.skippedArtifacts;
+    } //-- java.util.List<SkippedArtifactMetadata> getSkippedArtifacts()
+
+    /**
+     * Get universally unique identifier of this piece of metadata.
+     * 
+     * @return String
+     */
+    public String getUuid()
+    {
+        return this.uuid;
+    } //-- String getUuid()
+
+    /**
+     * Method removeArtifact.
+     * 
+     * @param artifactMetadata
+     */
+    public void removeArtifact( ArtifactMetadata artifactMetadata )
+    {
+        getArtifacts().remove( artifactMetadata );
+    } //-- void removeArtifact( ArtifactMetadata )
+
+    /**
+     * Method removeSkippedArtifact.
+     * 
+     * @param skippedArtifactMetadata
+     */
+    public void removeSkippedArtifact( SkippedArtifactMetadata skippedArtifactMetadata )
+    {
+        getSkippedArtifacts().remove( skippedArtifactMetadata );
+    } //-- void removeSkippedArtifact( SkippedArtifactMetadata )
+
+    /**
+     * Set list of installed artifacts described by this piece of
+     *             metadata.
+     * 
+     * @param artifacts
+     */
+    public void setArtifacts( java.util.List<ArtifactMetadata> artifacts )
+    {
+        this.artifacts = artifacts;
+    } //-- void setArtifacts( java.util.List )
+
+    /**
+     * Set the modelEncoding field.
+     * 
+     * @param modelEncoding
+     */
+    public void setModelEncoding( String modelEncoding )
+    {
+        this.modelEncoding = modelEncoding;
+    } //-- void setModelEncoding( String )
+
+    /**
+     * Set properties of this piece of metadata.
+     * 
+     * @param properties
+     */
+    public void setProperties( java.util.Properties properties )
+    {
+        this.properties = properties;
+    } //-- void setProperties( java.util.Properties )
+
+    /**
+     * Set list of artifacts built but not installed in any
+     * package.
+     *             Useful for detecting broken package
+     * dependencies.
+     * 
+     * @param skippedArtifacts
+     */
+    public void setSkippedArtifacts( java.util.List<SkippedArtifactMetadata> skippedArtifacts )
+    {
+        this.skippedArtifacts = skippedArtifacts;
+    } //-- void setSkippedArtifacts( java.util.List )
+
+    /**
+     * Set universally unique identifier of this piece of metadata.
+     * 
+     * @param uuid
+     */
+    public void setUuid( String uuid )
+    {
+        this.uuid = uuid;
+    } //-- void setUuid( String )
+
+}
diff --git a/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/SkippedArtifactMetadata.java b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/SkippedArtifactMetadata.java
new file mode 100644
index 0000000..0ccc123
--- /dev/null
+++ b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/SkippedArtifactMetadata.java
@@ -0,0 +1,159 @@
+// =================== DO NOT EDIT THIS FILE ====================
+// Generated by Modello 1.8.2,
+// any modifications will be overwritten.
+// ==============================================================
+
+package org.fedoraproject.xmvn.metadata;
+
+/**
+ * 
+ *         Information about artifact which was built, but not
+ * installed
+ *         into any package.
+ *       
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class SkippedArtifactMetadata
+    implements java.io.Serializable, java.lang.Cloneable
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * 
+     *             Group ID of skipped artifact.
+     *           
+     */
+    private String groupId;
+
+    /**
+     * 
+     *             Artifact ID of skipped artifact.
+     *           
+     */
+    private String artifactId;
+
+    /**
+     * 
+     *             Extension of skipped artifact.
+     *           
+     */
+    private String extension = "jar";
+
+    /**
+     * 
+     *             Classifier of skipped artifact.
+     *           
+     */
+    private String classifier = "";
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method clone.
+     * 
+     * @return SkippedArtifactMetadata
+     */
+    public SkippedArtifactMetadata clone()
+    {
+        try
+        {
+            SkippedArtifactMetadata copy = (SkippedArtifactMetadata) super.clone();
+
+            return copy;
+        }
+        catch ( java.lang.Exception ex )
+        {
+            throw (java.lang.RuntimeException) new java.lang.UnsupportedOperationException( getClass().getName()
+                + " does not support clone()" ).initCause( ex );
+        }
+    } //-- SkippedArtifactMetadata clone()
+
+    /**
+     * Get artifact ID of skipped artifact.
+     * 
+     * @return String
+     */
+    public String getArtifactId()
+    {
+        return this.artifactId;
+    } //-- String getArtifactId()
+
+    /**
+     * Get classifier of skipped artifact.
+     * 
+     * @return String
+     */
+    public String getClassifier()
+    {
+        return this.classifier;
+    } //-- String getClassifier()
+
+    /**
+     * Get extension of skipped artifact.
+     * 
+     * @return String
+     */
+    public String getExtension()
+    {
+        return this.extension;
+    } //-- String getExtension()
+
+    /**
+     * Get group ID of skipped artifact.
+     * 
+     * @return String
+     */
+    public String getGroupId()
+    {
+        return this.groupId;
+    } //-- String getGroupId()
+
+    /**
+     * Set artifact ID of skipped artifact.
+     * 
+     * @param artifactId
+     */
+    public void setArtifactId( String artifactId )
+    {
+        this.artifactId = artifactId;
+    } //-- void setArtifactId( String )
+
+    /**
+     * Set classifier of skipped artifact.
+     * 
+     * @param classifier
+     */
+    public void setClassifier( String classifier )
+    {
+        this.classifier = classifier;
+    } //-- void setClassifier( String )
+
+    /**
+     * Set extension of skipped artifact.
+     * 
+     * @param extension
+     */
+    public void setExtension( String extension )
+    {
+        this.extension = extension;
+    } //-- void setExtension( String )
+
+    /**
+     * Set group ID of skipped artifact.
+     * 
+     * @param groupId
+     */
+    public void setGroupId( String groupId )
+    {
+        this.groupId = groupId;
+    } //-- void setGroupId( String )
+
+}
diff --git a/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/io/stax/IndentingXMLStreamWriter.java b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/io/stax/IndentingXMLStreamWriter.java
new file mode 100644
index 0000000..510caf1
--- /dev/null
+++ b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/io/stax/IndentingXMLStreamWriter.java
@@ -0,0 +1,653 @@
+// =================== DO NOT EDIT THIS FILE ====================
+// Generated by Modello 1.8.2,
+// any modifications will be overwritten.
+// ==============================================================
+
+package org.fedoraproject.xmvn.metadata.io.stax;
+
+  //---------------------------------/
+ //- Imported classes and packages -/
+//---------------------------------/
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+/**
+ * Class IndentingXMLStreamWriter.
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+class IndentingXMLStreamWriter
+    implements XMLStreamWriter
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * Field out.
+     */
+    private XMLStreamWriter out;
+
+    /**
+     * Field NEW_LINE.
+     */
+    private static final String NEW_LINE = "\n";
+
+    /**
+     * Field newLine.
+     */
+    private String newLine = NEW_LINE;
+
+    /**
+     * Field indent.
+     */
+    private String indent = "  ";
+
+    /**
+     * Field linePrefix.
+     */
+    private char[] linePrefix = "                        ".toCharArray();
+
+    /**
+     * Field depth.
+     */
+    private int depth;
+
+    /**
+     * Field states.
+     */
+    private byte[] states = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+    /**
+     * Field ELEMENT_HAS_DATA.
+     */
+    private static final int ELEMENT_HAS_DATA = 0x1;
+
+    /**
+     * Field ELEMENT_HAS_MARKUP.
+     */
+    private static final int ELEMENT_HAS_MARKUP = 0x2;
+
+
+      //----------------/
+     //- Constructors -/
+    //----------------/
+
+    public IndentingXMLStreamWriter(XMLStreamWriter out)
+    {
+        this.out = out;
+    } //-- org.fedoraproject.xmvn.metadata.io.stax.IndentingXMLStreamWriter(XMLStreamWriter)
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method close.
+     * 
+     * @throws XMLStreamException
+     */
+    public void close()
+        throws XMLStreamException
+    {
+        out.close();
+    } //-- void close()
+
+    /**
+     * Method flush.
+     * 
+     * @throws XMLStreamException
+     */
+    public void flush()
+        throws XMLStreamException
+    {
+        out.flush();
+    } //-- void flush()
+
+    /**
+     * Method getNamespaceContext.
+     * 
+     * @return NamespaceContext
+     */
+    public NamespaceContext getNamespaceContext()
+    {
+        return out.getNamespaceContext();
+    } //-- NamespaceContext getNamespaceContext()
+
+    /**
+     * Method getPrefix.
+     * 
+     * @param uri
+     * @throws XMLStreamException
+     * @return String
+     */
+    public String getPrefix( String uri )
+        throws XMLStreamException
+    {
+        return out.getPrefix( uri );
+    } //-- String getPrefix( String )
+
+    /**
+     * Method getProperty.
+     * 
+     * @param name
+     * @throws IllegalArgumentException
+     * @return Object
+     */
+    public Object getProperty( String name )
+        throws IllegalArgumentException
+    {
+        return out.getProperty( name );
+    } //-- Object getProperty( String )
+
+    /**
+     * Method setDefaultNamespace.
+     * 
+     * @param uri
+     * @throws XMLStreamException
+     */
+    public void setDefaultNamespace( String uri )
+        throws XMLStreamException
+    {
+        out.setDefaultNamespace( uri );
+    } //-- void setDefaultNamespace( String )
+
+    /**
+     * Method setNamespaceContext.
+     * 
+     * @param context
+     * @throws XMLStreamException
+     */
+    public void setNamespaceContext( NamespaceContext context )
+        throws XMLStreamException
+    {
+        out.setNamespaceContext( context );
+    } //-- void setNamespaceContext( NamespaceContext )
+
+    /**
+     * Method setPrefix.
+     * 
+     * @param prefix
+     * @param uri
+     * @throws XMLStreamException
+     */
+    public void setPrefix( String prefix, String uri )
+        throws XMLStreamException
+    {
+        out.setPrefix( prefix, uri );
+    } //-- void setPrefix( String, String )
+
+    /**
+     * Method writeAttribute.
+     * 
+     * @param localName
+     * @param value
+     * @throws XMLStreamException
+     */
+    public void writeAttribute( String localName, String value )
+        throws XMLStreamException
+    {
+        out.writeAttribute( localName, value );
+    } //-- void writeAttribute( String, String )
+
+    /**
+     * Method writeAttribute.
+     * 
+     * @param namespaceURI
+     * @param value
+     * @param localName
+     * @throws XMLStreamException
+     */
+    public void writeAttribute( String namespaceURI, String localName, String value )
+        throws XMLStreamException
+    {
+        out.writeAttribute( namespaceURI, localName, value );
+    } //-- void writeAttribute( String, String, String )
+
+    /**
+     * Method writeAttribute.
+     * 
+     * @param prefix
+     * @param value
+     * @param localName
+     * @param namespaceURI
+     * @throws XMLStreamException
+     */
+    public void writeAttribute( String prefix, String namespaceURI, String localName, String value )
+        throws XMLStreamException
+    {
+        out.writeAttribute( prefix, namespaceURI, localName, value );
+    } //-- void writeAttribute( String, String, String, String )
+
+    /**
+     * Method writeCData.
+     * 
+     * @param data
+     * @throws XMLStreamException
+     */
+    public void writeCData( String data )
+        throws XMLStreamException
+    {
+        out.writeCData( data );
+        afterData();
+    } //-- void writeCData( String )
+
+    /**
+     * Method writeCharacters.
+     * 
+     * @param text
+     * @throws XMLStreamException
+     */
+    public void writeCharacters( String text )
+        throws XMLStreamException
+    {
+        out.writeCharacters( text );
+        afterData();
+    } //-- void writeCharacters( String )
+
+    /**
+     * Method writeCharacters.
+     * 
+     * @param text
+     * @param len
+     * @param start
+     * @throws XMLStreamException
+     */
+    public void writeCharacters( char[] text, int start, int len )
+        throws XMLStreamException
+    {
+        out.writeCharacters( text, start, len );
+        afterData();
+    } //-- void writeCharacters( char[], int, int )
+
+    /**
+     * Method writeComment.
+     * 
+     * @param data
+     * @throws XMLStreamException
+     */
+    public void writeComment( String data )
+        throws XMLStreamException
+    {
+        beforeMarkup();
+        out.writeComment( data );
+        afterMarkup();
+    } //-- void writeComment( String )
+
+    /**
+     * Method writeDTD.
+     * 
+     * @param dtd
+     * @throws XMLStreamException
+     */
+    public void writeDTD( String dtd )
+        throws XMLStreamException
+    {
+        beforeMarkup();
+        out.writeDTD( dtd );
+        afterMarkup();
+    } //-- void writeDTD( String )
+
+    /**
+     * Method writeDefaultNamespace.
+     * 
+     * @param namespaceURI
+     * @throws XMLStreamException
+     */
+    public void writeDefaultNamespace( String namespaceURI )
+        throws XMLStreamException
+    {
+        out.writeDefaultNamespace( namespaceURI );
+    } //-- void writeDefaultNamespace( String )
+
+    /**
+     * Method writeEmptyElement.
+     * 
+     * @param localName
+     * @throws XMLStreamException
+     */
+    public void writeEmptyElement( String localName )
+        throws XMLStreamException
+    {
+        beforeMarkup();
+        out.writeEmptyElement( localName );
+        afterMarkup();
+    } //-- void writeEmptyElement( String )
+
+    /**
+     * Method writeEmptyElement.
+     * 
+     * @param namespaceURI
+     * @param localName
+     * @throws XMLStreamException
+     */
+    public void writeEmptyElement( String namespaceURI, String localName )
+        throws XMLStreamException
+    {
+        beforeMarkup();
+        out.writeEmptyElement( namespaceURI, localName );
+        afterMarkup();
+    } //-- void writeEmptyElement( String, String )
+
+    /**
+     * Method writeEmptyElement.
+     * 
+     * @param prefix
+     * @param localName
+     * @param namespaceURI
+     * @throws XMLStreamException
+     */
+    public void writeEmptyElement( String prefix, String namespaceURI, String localName )
+        throws XMLStreamException
+    {
+        beforeMarkup();
+        out.writeEmptyElement( prefix, namespaceURI, localName );
+        afterMarkup();
+    } //-- void writeEmptyElement( String, String, String )
+
+    /**
+     * Method writeEndDocument.
+     * 
+     * @throws XMLStreamException
+     */
+    public void writeEndDocument()
+        throws XMLStreamException
+    {
+        out.writeEndDocument(  );
+    } //-- void writeEndDocument()
+
+    /**
+     * Method writeEndElement.
+     * 
+     * @throws XMLStreamException
+     */
+    public void writeEndElement()
+        throws XMLStreamException
+    {
+        beforeEndElement();
+        out.writeEndElement(  );
+        afterEndElement();
+    } //-- void writeEndElement()
+
+    /**
+     * Method writeEntityRef.
+     * 
+     * @param name
+     * @throws XMLStreamException
+     */
+    public void writeEntityRef( String name )
+        throws XMLStreamException
+    {
+        out.writeEntityRef( name );
+        afterData();
+    } //-- void writeEntityRef( String )
+
+    /**
+     * Method writeNamespace.
+     * 
+     * @param prefix
+     * @param namespaceURI
+     * @throws XMLStreamException
+     */
+    public void writeNamespace( String prefix, String namespaceURI )
+        throws XMLStreamException
+    {
+        out.writeNamespace( prefix, namespaceURI );
+    } //-- void writeNamespace( String, String )
+
+    /**
+     * Method writeProcessingInstruction.
+     * 
+     * @param target
+     * @throws XMLStreamException
+     */
+    public void writeProcessingInstruction( String target )
+        throws XMLStreamException
+    {
+        beforeMarkup();
+        out.writeProcessingInstruction( target );
+        afterMarkup();
+    } //-- void writeProcessingInstruction( String )
+
+    /**
+     * Method writeProcessingInstruction.
+     * 
+     * @param target
+     * @param data
+     * @throws XMLStreamException
+     */
+    public void writeProcessingInstruction( String target, String data )
+        throws XMLStreamException
+    {
+        beforeMarkup();
+        out.writeProcessingInstruction( target, data );
+        afterMarkup();
+    } //-- void writeProcessingInstruction( String, String )
+
+    /**
+     * Method writeStartDocument.
+     * 
+     * @throws XMLStreamException
+     */
+    public void writeStartDocument()
+        throws XMLStreamException
+    {
+        beforeMarkup();
+        out.writeStartDocument(  );
+        afterMarkup();
+    } //-- void writeStartDocument()
+
+    /**
+     * Method writeStartDocument.
+     * 
+     * @param version
+     * @throws XMLStreamException
+     */
+    public void writeStartDocument( String version )
+        throws XMLStreamException
+    {
+        beforeMarkup();
+        out.writeStartDocument( version );
+        afterMarkup();
+    } //-- void writeStartDocument( String )
+
+    /**
+     * Method writeStartDocument.
+     * 
+     * @param encoding
+     * @param version
+     * @throws XMLStreamException
+     */
+    public void writeStartDocument( String encoding, String version )
+        throws XMLStreamException
+    {
+        beforeMarkup();
+        out.writeStartDocument( encoding, version );
+        afterMarkup();
+    } //-- void writeStartDocument( String, String )
+
+    /**
+     * Method writeStartElement.
+     * 
+     * @param localName
+     * @throws XMLStreamException
+     */
+    public void writeStartElement( String localName )
+        throws XMLStreamException
+    {
+        beforeStartElement();
+        out.writeStartElement( localName );
+        afterStartElement();
+    } //-- void writeStartElement( String )
+
+    /**
+     * Method writeStartElement.
+     * 
+     * @param namespaceURI
+     * @param localName
+     * @throws XMLStreamException
+     */
+    public void writeStartElement( String namespaceURI, String localName )
+        throws XMLStreamException
+    {
+        beforeStartElement();
+        out.writeStartElement( namespaceURI, localName );
+        afterStartElement();
+    } //-- void writeStartElement( String, String )
+
+    /**
+     * Method writeStartElement.
+     * 
+     * @param prefix
+     * @param namespaceURI
+     * @param localName
+     * @throws XMLStreamException
+     */
+    public void writeStartElement( String prefix, String localName, String namespaceURI )
+        throws XMLStreamException
+    {
+        beforeStartElement();
+        out.writeStartElement( prefix, localName, namespaceURI );
+        afterStartElement();
+    } //-- void writeStartElement( String, String, String )
+
+    /**
+     * Method afterData.
+     */
+    private void afterData()
+    {
+        states[depth] |= ELEMENT_HAS_DATA;
+    } //-- void afterData()
+
+    /**
+     * Method afterEndElement.
+     */
+    private void afterEndElement()
+    {
+        if ( depth > 0 )
+        {
+            depth--;
+            if ( depth <= 0 )
+            {
+                newLine( 0 );
+            }
+        }
+    } //-- void afterEndElement()
+
+    /**
+     * Method afterMarkup.
+     */
+    private void afterMarkup()
+    {
+        states[depth] |= ELEMENT_HAS_MARKUP;
+    } //-- void afterMarkup()
+
+    /**
+     * Method afterStartElement.
+     */
+    private void afterStartElement()
+    {
+        afterMarkup();
+        depth++;
+    } //-- void afterStartElement()
+
+    /**
+     * Method beforeEndElement.
+     */
+    private void beforeEndElement()
+    {
+        if ( depth > 0 && states[depth] == ELEMENT_HAS_MARKUP )
+        {
+            newLine( depth - 1 );
+        }
+    } //-- void beforeEndElement()
+
+    /**
+     * Method beforeMarkup.
+     */
+    private void beforeMarkup()
+    {
+        int state = states[depth];
+        if ( ( state & ELEMENT_HAS_DATA ) == 0 && ( depth > 0 || state != 0 ) )
+        {
+            newLine( depth );
+            if ( depth > 0 && indent.length() > 0 )
+            {
+                afterMarkup();
+            }
+        }
+    } //-- void beforeMarkup()
+
+    /**
+     * Method beforeStartElement.
+     */
+    private void beforeStartElement()
+    {
+        beforeMarkup();
+        if ( states.length <= depth + 1 )
+        {
+            byte[] tmp = new byte[states.length * 2];
+            System.arraycopy( states, 0, tmp, 0, states.length );
+            states = tmp;
+        }
+        states[depth + 1] = 0;
+    } //-- void beforeStartElement()
+
+    /**
+     * Method getLineSeparator.
+     * 
+     * @return String
+     */
+    public String getLineSeparator()
+    {
+        try
+        {
+            return System.getProperty( "line.separator", NEW_LINE );
+        }
+        catch ( Exception e )
+        {
+            return NEW_LINE;
+        }
+    } //-- String getLineSeparator()
+
+    /**
+     * Method newLine.
+     * 
+     * @param depth
+     */
+    private void newLine( int depth )
+    {
+        try
+        {
+            out.writeCharacters( newLine );
+            int prefixLength = depth * indent.length();
+            while ( linePrefix.length < prefixLength )
+            {
+                char[] tmp = new char[linePrefix.length * 2];
+                System.arraycopy( linePrefix, 0, tmp, 0, linePrefix.length );
+                System.arraycopy( linePrefix, 0, tmp, linePrefix.length, linePrefix.length );
+                linePrefix = tmp;
+            }
+            out.writeCharacters( linePrefix, 0, prefixLength );
+        }
+        catch ( Exception e )
+        {
+        }
+    } //-- void newLine( int )
+
+    /**
+     * Method setNewLine.
+     * 
+     * @param newLine
+     */
+    public void setNewLine( String newLine )
+    {
+        this.newLine = newLine;
+    } //-- void setNewLine( String )
+
+}
diff --git a/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/io/stax/MetadataStaxReader.java b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/io/stax/MetadataStaxReader.java
new file mode 100644
index 0000000..5f9c959
--- /dev/null
+++ b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/io/stax/MetadataStaxReader.java
@@ -0,0 +1,950 @@
+// =================== DO NOT EDIT THIS FILE ====================
+// Generated by Modello 1.8.2,
+// any modifications will be overwritten.
+// ==============================================================
+
+package org.fedoraproject.xmvn.metadata.io.stax;
+
+  //---------------------------------/
+ //- Imported classes and packages -/
+//---------------------------------/
+
+import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.text.DateFormat;
+import java.text.ParsePosition;
+import java.util.Locale;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.xml.stream.*;
+import org.fedoraproject.xmvn.metadata.ArtifactAlias;
+import org.fedoraproject.xmvn.metadata.ArtifactMetadata;
+import org.fedoraproject.xmvn.metadata.Dependency;
+import org.fedoraproject.xmvn.metadata.DependencyExclusion;
+import org.fedoraproject.xmvn.metadata.PackageMetadata;
+import org.fedoraproject.xmvn.metadata.SkippedArtifactMetadata;
+
+/**
+ * Class MetadataStaxReader.
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class MetadataStaxReader
+{
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method read.
+     * 
+     * @param reader
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return PackageMetadata
+     */
+    public PackageMetadata read( Reader reader, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader( reader );
+
+        return read( xmlStreamReader, strict );
+    } //-- PackageMetadata read( Reader, boolean )
+
+    /**
+     * Method read.
+     * 
+     * @param reader
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return PackageMetadata
+     */
+    public PackageMetadata read( Reader reader )
+        throws IOException, XMLStreamException
+    {
+        return read( reader, true );
+    } //-- PackageMetadata read( Reader )
+
+    /**
+     * Method read.
+     * 
+     * @param stream
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return PackageMetadata
+     */
+    public PackageMetadata read( InputStream stream, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader( stream );
+
+        return read( xmlStreamReader, strict );
+    } //-- PackageMetadata read( InputStream, boolean )
+
+    /**
+     * Method read.
+     * 
+     * @param stream
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return PackageMetadata
+     */
+    public PackageMetadata read( InputStream stream )
+        throws IOException, XMLStreamException
+    {
+        return read( stream, true );
+    } //-- PackageMetadata read( InputStream )
+
+    /**
+     * Method read.
+     * 
+     * @param filePath
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return PackageMetadata
+     */
+    public PackageMetadata read( String filePath, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        java.io.File file = new java.io.File( filePath );
+        XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader( file.toURI().toURL().toExternalForm(), new FileInputStream( file ) );
+
+        return read( xmlStreamReader, strict );
+    } //-- PackageMetadata read( String, boolean )
+
+    /**
+     * Method read.
+     * 
+     * @param filePath
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return PackageMetadata
+     */
+    public PackageMetadata read( String filePath )
+        throws IOException, XMLStreamException
+    {
+        return read( filePath, true );
+    } //-- PackageMetadata read( String )
+
+    /**
+     * Method checkFieldWithDuplicate.
+     * 
+     * @param xmlStreamReader
+     * @param parsed
+     * @param alias
+     * @param tagName
+     * @throws XMLStreamException
+     * @return boolean
+     */
+    private boolean checkFieldWithDuplicate( XMLStreamReader xmlStreamReader, String tagName, String alias, java.util.Set parsed )
+        throws XMLStreamException
+    {
+        if ( !( xmlStreamReader.getLocalName().equals( tagName ) || xmlStreamReader.getLocalName().equals( alias ) ) )
+        {
+            return false;
+        }
+        if ( !parsed.add( tagName ) )
+        {
+            throw new XMLStreamException( "Duplicated tag: '" + tagName + "'", xmlStreamReader.getLocation() );
+        }
+        return true;
+    } //-- boolean checkFieldWithDuplicate( XMLStreamReader, String, String, java.util.Set )
+
+    /**
+     * Method checkUnknownElement.
+     * 
+     * @param xmlStreamReader
+     * @param strict
+     * @throws XMLStreamException
+     */
+    private void checkUnknownElement( XMLStreamReader xmlStreamReader, boolean strict )
+        throws XMLStreamException
+    {
+        if ( strict )
+        {
+            throw new XMLStreamException( "Unrecognised tag: '" + xmlStreamReader.getLocalName() + "'", xmlStreamReader.getLocation() );
+        }
+        int unrecognizedTagCount = 1;
+        while( unrecognizedTagCount != 0 )
+        {
+            xmlStreamReader.next();
+            if ( xmlStreamReader.getEventType() == XMLStreamConstants.START_ELEMENT )
+            {
+                unrecognizedTagCount++;
+            }
+            else if ( xmlStreamReader.getEventType() == XMLStreamConstants.END_ELEMENT )
+            {
+                unrecognizedTagCount--;
+            }
+        }
+    } //-- void checkUnknownElement( XMLStreamReader, boolean )
+
+    /**
+     * Method getBooleanValue.
+     * 
+     * @param s
+     * @param xmlStreamReader
+     * @param attribute
+     * @throws XMLStreamException
+     * @return boolean
+     */
+    private boolean getBooleanValue( String s, String attribute, XMLStreamReader xmlStreamReader )
+        throws XMLStreamException
+    {
+        if ( s != null )
+        {
+            return Boolean.valueOf( s ).booleanValue();
+        }
+        return false;
+    } //-- boolean getBooleanValue( String, String, XMLStreamReader )
+
+    /**
+     * Method getByteValue.
+     * 
+     * @param s
+     * @param strict
+     * @param xmlStreamReader
+     * @param attribute
+     * @throws XMLStreamException
+     * @return byte
+     */
+    private byte getByteValue( String s, String attribute, XMLStreamReader xmlStreamReader, boolean strict )
+        throws XMLStreamException
+    {
+        if ( s != null )
+        {
+            try
+            {
+                return Byte.valueOf( s ).byteValue();
+            }
+            catch ( NumberFormatException nfe )
+            {
+                if ( strict )
+                {
+                    throw new XMLStreamException( "Unable to parse element '" + attribute + "', must be a byte but was '" + s + "'", xmlStreamReader.getLocation(), nfe );
+                }
+            }
+        }
+        return 0;
+    } //-- byte getByteValue( String, String, XMLStreamReader, boolean )
+
+    /**
+     * Method getCharacterValue.
+     * 
+     * @param s
+     * @param xmlStreamReader
+     * @param attribute
+     * @throws XMLStreamException
+     * @return char
+     */
+    private char getCharacterValue( String s, String attribute, XMLStreamReader xmlStreamReader )
+        throws XMLStreamException
+    {
+        if ( s != null )
+        {
+            return s.charAt( 0 );
+        }
+        return 0;
+    } //-- char getCharacterValue( String, String, XMLStreamReader )
+
+    /**
+     * Method getDateValue.
+     * 
+     * @param s
+     * @param xmlStreamReader
+     * @param dateFormat
+     * @param attribute
+     * @throws XMLStreamException
+     * @return Date
+     */
+    private java.util.Date getDateValue( String s, String attribute, String dateFormat, XMLStreamReader xmlStreamReader )
+        throws XMLStreamException
+    {
+        if ( s != null )
+        {
+            String effectiveDateFormat = dateFormat;
+            if ( dateFormat == null )
+            {
+                effectiveDateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS";
+            }
+            if ( "long".equals( effectiveDateFormat ) )
+            {
+                try
+                {
+                    return new java.util.Date( Long.parseLong( s ) );
+                }
+                catch ( NumberFormatException e )
+                {
+                    throw new XMLStreamException( e.getMessage(), xmlStreamReader.getLocation(), e );
+                }
+            }
+            else
+            {
+                try
+                {
+                    DateFormat dateParser = new java.text.SimpleDateFormat( effectiveDateFormat, java.util.Locale.US );
+                    return dateParser.parse( s );
+                }
+                catch ( java.text.ParseException e )
+                {
+                    throw new XMLStreamException( e.getMessage(), xmlStreamReader.getLocation(), e );
+                }
+            }
+        }
+        return null;
+    } //-- java.util.Date getDateValue( String, String, String, XMLStreamReader )
+
+    /**
+     * Method getDefaultValue.
+     * 
+     * @param s
+     * @param v
+     * @return String
+     */
+    private String getDefaultValue( String s, String v )
+    {
+        if ( s == null )
+        {
+            s = v;
+        }
+        return s;
+    } //-- String getDefaultValue( String, String )
+
+    /**
+     * Method getDoubleValue.
+     * 
+     * @param s
+     * @param strict
+     * @param xmlStreamReader
+     * @param attribute
+     * @throws XMLStreamException
+     * @return double
+     */
+    private double getDoubleValue( String s, String attribute, XMLStreamReader xmlStreamReader, boolean strict )
+        throws XMLStreamException
+    {
+        if ( s != null )
+        {
+            try
+            {
+                return Double.valueOf( s ).doubleValue();
+            }
+            catch ( NumberFormatException nfe )
+            {
+                if ( strict )
+                {
+                    throw new XMLStreamException( "Unable to parse element '" + attribute + "', must be a floating point number but was '" + s + "'", xmlStreamReader.getLocation(), nfe );
+                }
+            }
+        }
+        return 0;
+    } //-- double getDoubleValue( String, String, XMLStreamReader, boolean )
+
+    /**
+     * Method getFloatValue.
+     * 
+     * @param s
+     * @param strict
+     * @param xmlStreamReader
+     * @param attribute
+     * @throws XMLStreamException
+     * @return float
+     */
+    private float getFloatValue( String s, String attribute, XMLStreamReader xmlStreamReader, boolean strict )
+        throws XMLStreamException
+    {
+        if ( s != null )
+        {
+            try
+            {
+                return Float.valueOf( s ).floatValue();
+            }
+            catch ( NumberFormatException nfe )
+            {
+                if ( strict )
+                {
+                    throw new XMLStreamException( "Unable to parse element '" + attribute + "', must be a floating point number but was '" + s + "'", xmlStreamReader.getLocation(), nfe );
+                }
+            }
+        }
+        return 0;
+    } //-- float getFloatValue( String, String, XMLStreamReader, boolean )
+
+    /**
+     * Method getIntegerValue.
+     * 
+     * @param s
+     * @param strict
+     * @param xmlStreamReader
+     * @param attribute
+     * @throws XMLStreamException
+     * @return int
+     */
+    private int getIntegerValue( String s, String attribute, XMLStreamReader xmlStreamReader, boolean strict )
+        throws XMLStreamException
+    {
+        if ( s != null )
+        {
+            try
+            {
+                return Integer.valueOf( s ).intValue();
+            }
+            catch ( NumberFormatException nfe )
+            {
+                if ( strict )
+                {
+                    throw new XMLStreamException( "Unable to parse element '" + attribute + "', must be an integer but was '" + s + "'", xmlStreamReader.getLocation(), nfe );
+                }
+            }
+        }
+        return 0;
+    } //-- int getIntegerValue( String, String, XMLStreamReader, boolean )
+
+    /**
+     * Method getLongValue.
+     * 
+     * @param s
+     * @param strict
+     * @param xmlStreamReader
+     * @param attribute
+     * @throws XMLStreamException
+     * @return long
+     */
+    private long getLongValue( String s, String attribute, XMLStreamReader xmlStreamReader, boolean strict )
+        throws XMLStreamException
+    {
+        if ( s != null )
+        {
+            try
+            {
+                return Long.valueOf( s ).longValue();
+            }
+            catch ( NumberFormatException nfe )
+            {
+                if ( strict )
+                {
+                    throw new XMLStreamException( "Unable to parse element '" + attribute + "', must be a long integer but was '" + s + "'", xmlStreamReader.getLocation(), nfe );
+                }
+            }
+        }
+        return 0;
+    } //-- long getLongValue( String, String, XMLStreamReader, boolean )
+
+    /**
+     * Method getRequiredAttributeValue.
+     * 
+     * @param s
+     * @param strict
+     * @param xmlStreamReader
+     * @param attribute
+     * @throws XMLStreamException
+     * @return String
+     */
+    private String getRequiredAttributeValue( String s, String attribute, XMLStreamReader xmlStreamReader, boolean strict )
+        throws XMLStreamException
+    {
+        if ( s == null )
+        {
+            if ( strict )
+            {
+                throw new XMLStreamException( "Missing required value for attribute '" + attribute + "'", xmlStreamReader.getLocation() );
+            }
+        }
+        return s;
+    } //-- String getRequiredAttributeValue( String, String, XMLStreamReader, boolean )
+
+    /**
+     * Method getShortValue.
+     * 
+     * @param s
+     * @param strict
+     * @param xmlStreamReader
+     * @param attribute
+     * @throws XMLStreamException
+     * @return short
+     */
+    private short getShortValue( String s, String attribute, XMLStreamReader xmlStreamReader, boolean strict )
+        throws XMLStreamException
+    {
+        if ( s != null )
+        {
+            try
+            {
+                return Short.valueOf( s ).shortValue();
+            }
+            catch ( NumberFormatException nfe )
+            {
+                if ( strict )
+                {
+                    throw new XMLStreamException( "Unable to parse element '" + attribute + "', must be a short integer but was '" + s + "'", xmlStreamReader.getLocation(), nfe );
+                }
+            }
+        }
+        return 0;
+    } //-- short getShortValue( String, String, XMLStreamReader, boolean )
+
+    /**
+     * Method getTrimmedValue.
+     * 
+     * @param s
+     * @return String
+     */
+    private String getTrimmedValue( String s )
+    {
+        if ( s != null )
+        {
+            s = s.trim();
+        }
+        return s;
+    } //-- String getTrimmedValue( String )
+
+    /**
+     * Method nextTag.
+     * 
+     * @param xmlStreamReader
+     * @throws XMLStreamException
+     * @return int
+     */
+    private int nextTag( XMLStreamReader xmlStreamReader )
+        throws XMLStreamException
+    {
+        while ( true )
+        {
+            int eventType = xmlStreamReader.next();
+            switch ( eventType )
+            {
+                case XMLStreamConstants.CHARACTERS:
+                case XMLStreamConstants.CDATA:
+                case XMLStreamConstants.SPACE:
+                case XMLStreamConstants.PROCESSING_INSTRUCTION:
+                case XMLStreamConstants.COMMENT:
+                    break;
+                case XMLStreamConstants.START_ELEMENT:
+                case XMLStreamConstants.END_ELEMENT:
+                    return eventType;
+                default:
+                    throw new XMLStreamException( "expected start or end tag", xmlStreamReader.getLocation() );
+            }
+        }
+    } //-- int nextTag( XMLStreamReader )
+
+    /**
+     * Method parseArtifactAlias.
+     * 
+     * @param xmlStreamReader
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return ArtifactAlias
+     */
+    private ArtifactAlias parseArtifactAlias( XMLStreamReader xmlStreamReader, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        ArtifactAlias artifactAlias = new ArtifactAlias();
+        java.util.Set parsed = new java.util.HashSet();
+        while ( ( strict ? xmlStreamReader.nextTag() : nextTag( xmlStreamReader ) ) == XMLStreamConstants.START_ELEMENT )
+        {
+            if ( checkFieldWithDuplicate( xmlStreamReader, "groupId", null, parsed ) )
+            {
+                artifactAlias.setGroupId( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "artifactId", null, parsed ) )
+            {
+                artifactAlias.setArtifactId( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "extension", null, parsed ) )
+            {
+                artifactAlias.setExtension( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "jar" ) ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "classifier", null, parsed ) )
+            {
+                artifactAlias.setClassifier( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "" ) ) );
+            }
+            else
+            {
+                checkUnknownElement( xmlStreamReader, strict );
+            }
+        }
+        return artifactAlias;
+    } //-- ArtifactAlias parseArtifactAlias( XMLStreamReader, boolean )
+
+    /**
+     * Method parseArtifactMetadata.
+     * 
+     * @param xmlStreamReader
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return ArtifactMetadata
+     */
+    private ArtifactMetadata parseArtifactMetadata( XMLStreamReader xmlStreamReader, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        ArtifactMetadata artifactMetadata = new ArtifactMetadata();
+        java.util.Set parsed = new java.util.HashSet();
+        while ( ( strict ? xmlStreamReader.nextTag() : nextTag( xmlStreamReader ) ) == XMLStreamConstants.START_ELEMENT )
+        {
+            if ( checkFieldWithDuplicate( xmlStreamReader, "groupId", null, parsed ) )
+            {
+                artifactMetadata.setGroupId( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "artifactId", null, parsed ) )
+            {
+                artifactMetadata.setArtifactId( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "extension", null, parsed ) )
+            {
+                artifactMetadata.setExtension( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "jar" ) ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "classifier", null, parsed ) )
+            {
+                artifactMetadata.setClassifier( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "" ) ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "version", null, parsed ) )
+            {
+                artifactMetadata.setVersion( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "path", null, parsed ) )
+            {
+                artifactMetadata.setPath( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "namespace", null, parsed ) )
+            {
+                artifactMetadata.setNamespace( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "" ) ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "uuid", null, parsed ) )
+            {
+                artifactMetadata.setUuid( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "properties", null, parsed ) )
+            {
+                while ( xmlStreamReader.nextTag() == XMLStreamConstants.START_ELEMENT )
+                {
+                    String key = xmlStreamReader.getLocalName();
+                    String value = xmlStreamReader.getElementText().trim();
+                    artifactMetadata.addProperty( key, value );
+                }
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "compatVersions", null, parsed ) )
+            {
+                java.util.List compatVersions = new java.util.ArrayList/*<String>*/();
+                artifactMetadata.setCompatVersions( compatVersions );
+                while ( xmlStreamReader.nextTag() == XMLStreamConstants.START_ELEMENT )
+                {
+                    if ( "version".equals( xmlStreamReader.getLocalName() ) )
+                    {
+                        compatVersions.add( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "new java.util.ArrayList/*<String>*/()" ) ) );
+                    }
+                    else
+                    {
+                        throw new XMLStreamException( "Unrecognised tag: '" + xmlStreamReader.getLocalName() + "'", xmlStreamReader.getLocation() );
+                    }
+                }
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "aliases", null, parsed ) )
+            {
+                java.util.List aliases = new java.util.ArrayList/*<ArtifactAlias>*/();
+                artifactMetadata.setAliases( aliases );
+                while ( xmlStreamReader.nextTag() == XMLStreamConstants.START_ELEMENT )
+                {
+                    if ( "alias".equals( xmlStreamReader.getLocalName() ) )
+                    {
+                        aliases.add( parseArtifactAlias( xmlStreamReader, strict ) );
+                    }
+                    else
+                    {
+                        throw new XMLStreamException( "Unrecognised tag: '" + xmlStreamReader.getLocalName() + "'", xmlStreamReader.getLocation() );
+                    }
+                }
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "dependencies", null, parsed ) )
+            {
+                java.util.List dependencies = new java.util.ArrayList/*<Dependency>*/();
+                artifactMetadata.setDependencies( dependencies );
+                while ( xmlStreamReader.nextTag() == XMLStreamConstants.START_ELEMENT )
+                {
+                    if ( "dependency".equals( xmlStreamReader.getLocalName() ) )
+                    {
+                        artifactMetadata.addDependency( parseDependency( xmlStreamReader, strict ) );
+                    }
+                    else
+                    {
+                        throw new XMLStreamException( "Unrecognised tag: '" + xmlStreamReader.getLocalName() + "'", xmlStreamReader.getLocation() );
+                    }
+                }
+            }
+            else
+            {
+                checkUnknownElement( xmlStreamReader, strict );
+            }
+        }
+        return artifactMetadata;
+    } //-- ArtifactMetadata parseArtifactMetadata( XMLStreamReader, boolean )
+
+    /**
+     * Method parseDependency.
+     * 
+     * @param xmlStreamReader
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return Dependency
+     */
+    private Dependency parseDependency( XMLStreamReader xmlStreamReader, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        Dependency dependency = new Dependency();
+        java.util.Set parsed = new java.util.HashSet();
+        while ( ( strict ? xmlStreamReader.nextTag() : nextTag( xmlStreamReader ) ) == XMLStreamConstants.START_ELEMENT )
+        {
+            if ( checkFieldWithDuplicate( xmlStreamReader, "groupId", null, parsed ) )
+            {
+                dependency.setGroupId( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "artifactId", null, parsed ) )
+            {
+                dependency.setArtifactId( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "extension", null, parsed ) )
+            {
+                dependency.setExtension( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "jar" ) ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "classifier", null, parsed ) )
+            {
+                dependency.setClassifier( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "" ) ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "requestedVersion", null, parsed ) )
+            {
+                dependency.setRequestedVersion( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "SYSTEM" ) ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "resolvedVersion", null, parsed ) )
+            {
+                dependency.setResolvedVersion( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "SYSTEM" ) ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "namespace", null, parsed ) )
+            {
+                dependency.setNamespace( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "" ) ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "exclusions", null, parsed ) )
+            {
+                java.util.List exclusions = new java.util.ArrayList/*<DependencyExclusion>*/();
+                dependency.setExclusions( exclusions );
+                while ( xmlStreamReader.nextTag() == XMLStreamConstants.START_ELEMENT )
+                {
+                    if ( "exclusion".equals( xmlStreamReader.getLocalName() ) )
+                    {
+                        dependency.addExclusion( parseDependencyExclusion( xmlStreamReader, strict ) );
+                    }
+                    else
+                    {
+                        throw new XMLStreamException( "Unrecognised tag: '" + xmlStreamReader.getLocalName() + "'", xmlStreamReader.getLocation() );
+                    }
+                }
+            }
+            else
+            {
+                checkUnknownElement( xmlStreamReader, strict );
+            }
+        }
+        return dependency;
+    } //-- Dependency parseDependency( XMLStreamReader, boolean )
+
+    /**
+     * Method parseDependencyExclusion.
+     * 
+     * @param xmlStreamReader
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return DependencyExclusion
+     */
+    private DependencyExclusion parseDependencyExclusion( XMLStreamReader xmlStreamReader, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        DependencyExclusion dependencyExclusion = new DependencyExclusion();
+        java.util.Set parsed = new java.util.HashSet();
+        while ( ( strict ? xmlStreamReader.nextTag() : nextTag( xmlStreamReader ) ) == XMLStreamConstants.START_ELEMENT )
+        {
+            if ( checkFieldWithDuplicate( xmlStreamReader, "groupId", null, parsed ) )
+            {
+                dependencyExclusion.setGroupId( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "artifactId", null, parsed ) )
+            {
+                dependencyExclusion.setArtifactId( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else
+            {
+                checkUnknownElement( xmlStreamReader, strict );
+            }
+        }
+        return dependencyExclusion;
+    } //-- DependencyExclusion parseDependencyExclusion( XMLStreamReader, boolean )
+
+    /**
+     * Method parsePackageMetadata.
+     * 
+     * @param xmlStreamReader
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return PackageMetadata
+     */
+    private PackageMetadata parsePackageMetadata( XMLStreamReader xmlStreamReader, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        PackageMetadata packageMetadata = new PackageMetadata();
+        java.util.Set parsed = new java.util.HashSet();
+        while ( ( strict ? xmlStreamReader.nextTag() : nextTag( xmlStreamReader ) ) == XMLStreamConstants.START_ELEMENT )
+        {
+            if ( checkFieldWithDuplicate( xmlStreamReader, "uuid", null, parsed ) )
+            {
+                packageMetadata.setUuid( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "properties", null, parsed ) )
+            {
+                while ( xmlStreamReader.nextTag() == XMLStreamConstants.START_ELEMENT )
+                {
+                    String key = xmlStreamReader.getLocalName();
+                    String value = xmlStreamReader.getElementText().trim();
+                    packageMetadata.addProperty( key, value );
+                }
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "artifacts", null, parsed ) )
+            {
+                java.util.List artifacts = new java.util.ArrayList/*<ArtifactMetadata>*/();
+                packageMetadata.setArtifacts( artifacts );
+                while ( xmlStreamReader.nextTag() == XMLStreamConstants.START_ELEMENT )
+                {
+                    if ( "artifact".equals( xmlStreamReader.getLocalName() ) )
+                    {
+                        packageMetadata.addArtifact( parseArtifactMetadata( xmlStreamReader, strict ) );
+                    }
+                    else
+                    {
+                        throw new XMLStreamException( "Unrecognised tag: '" + xmlStreamReader.getLocalName() + "'", xmlStreamReader.getLocation() );
+                    }
+                }
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "skippedArtifacts", null, parsed ) )
+            {
+                java.util.List skippedArtifacts = new java.util.ArrayList/*<SkippedArtifactMetadata>*/();
+                packageMetadata.setSkippedArtifacts( skippedArtifacts );
+                while ( xmlStreamReader.nextTag() == XMLStreamConstants.START_ELEMENT )
+                {
+                    if ( "skippedArtifact".equals( xmlStreamReader.getLocalName() ) )
+                    {
+                        packageMetadata.addSkippedArtifact( parseSkippedArtifactMetadata( xmlStreamReader, strict ) );
+                    }
+                    else
+                    {
+                        throw new XMLStreamException( "Unrecognised tag: '" + xmlStreamReader.getLocalName() + "'", xmlStreamReader.getLocation() );
+                    }
+                }
+            }
+            else
+            {
+                checkUnknownElement( xmlStreamReader, strict );
+            }
+        }
+        return packageMetadata;
+    } //-- PackageMetadata parsePackageMetadata( XMLStreamReader, boolean )
+
+    /**
+     * Method parseSkippedArtifactMetadata.
+     * 
+     * @param xmlStreamReader
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return SkippedArtifactMetadata
+     */
+    private SkippedArtifactMetadata parseSkippedArtifactMetadata( XMLStreamReader xmlStreamReader, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        SkippedArtifactMetadata skippedArtifactMetadata = new SkippedArtifactMetadata();
+        java.util.Set parsed = new java.util.HashSet();
+        while ( ( strict ? xmlStreamReader.nextTag() : nextTag( xmlStreamReader ) ) == XMLStreamConstants.START_ELEMENT )
+        {
+            if ( checkFieldWithDuplicate( xmlStreamReader, "groupId", null, parsed ) )
+            {
+                skippedArtifactMetadata.setGroupId( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "artifactId", null, parsed ) )
+            {
+                skippedArtifactMetadata.setArtifactId( getTrimmedValue( xmlStreamReader.getElementText() ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "extension", null, parsed ) )
+            {
+                skippedArtifactMetadata.setExtension( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "jar" ) ) );
+            }
+            else if ( checkFieldWithDuplicate( xmlStreamReader, "classifier", null, parsed ) )
+            {
+                skippedArtifactMetadata.setClassifier( getTrimmedValue( getDefaultValue( xmlStreamReader.getElementText(), "" ) ) );
+            }
+            else
+            {
+                checkUnknownElement( xmlStreamReader, strict );
+            }
+        }
+        return skippedArtifactMetadata;
+    } //-- SkippedArtifactMetadata parseSkippedArtifactMetadata( XMLStreamReader, boolean )
+
+    /**
+     * Method read.
+     * 
+     * @param xmlStreamReader
+     * @param strict
+     * @throws IOException
+     * @throws XMLStreamException
+     * @return PackageMetadata
+     */
+    private PackageMetadata read( XMLStreamReader xmlStreamReader, boolean strict )
+        throws IOException, XMLStreamException
+    {
+        int eventType = xmlStreamReader.getEventType();
+        String encoding = null;
+        while ( eventType != XMLStreamConstants.END_DOCUMENT )
+        {
+            if ( eventType == XMLStreamConstants.START_DOCUMENT )
+            {
+                encoding = xmlStreamReader.getCharacterEncodingScheme();
+            }
+            if ( eventType == XMLStreamConstants.START_ELEMENT )
+            {
+                if ( strict && ! "metadata".equals( xmlStreamReader.getLocalName() ) )
+                {
+                    throw new XMLStreamException( "Expected root element 'metadata' but found '" + xmlStreamReader.getLocalName() + "'", xmlStreamReader.getLocation(), null );
+                }
+                PackageMetadata packageMetadata = parsePackageMetadata( xmlStreamReader, strict );
+                packageMetadata.setModelEncoding( encoding );
+                resolveReferences( packageMetadata );
+                return packageMetadata;
+            }
+            eventType = xmlStreamReader.next();
+        }
+        throw new XMLStreamException( "Expected root element 'metadata' but found no element at all: invalid XML document", xmlStreamReader.getLocation(), null );
+    } //-- PackageMetadata read( XMLStreamReader, boolean )
+
+    /**
+     * Method resolveReferences.
+     * 
+     * @param value
+     */
+    private void resolveReferences( PackageMetadata value )
+    {
+        java.util.Map refs;
+    } //-- void resolveReferences( PackageMetadata )
+
+}
diff --git a/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/io/stax/MetadataStaxWriter.java b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/io/stax/MetadataStaxWriter.java
new file mode 100644
index 0000000..36eddd4
--- /dev/null
+++ b/xmvn-core/target/generated-sources/modello/org/fedoraproject/xmvn/metadata/io/stax/MetadataStaxWriter.java
@@ -0,0 +1,490 @@
+// =================== DO NOT EDIT THIS FILE ====================
+// Generated by Modello 1.8.2,
+// any modifications will be overwritten.
+// ==============================================================
+
+package org.fedoraproject.xmvn.metadata.io.stax;
+
+  //---------------------------------/
+ //- Imported classes and packages -/
+//---------------------------------/
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.text.DateFormat;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.jar.Manifest;
+import javax.xml.stream.*;
+import org.fedoraproject.xmvn.metadata.ArtifactAlias;
+import org.fedoraproject.xmvn.metadata.ArtifactMetadata;
+import org.fedoraproject.xmvn.metadata.Dependency;
+import org.fedoraproject.xmvn.metadata.DependencyExclusion;
+import org.fedoraproject.xmvn.metadata.PackageMetadata;
+import org.fedoraproject.xmvn.metadata.SkippedArtifactMetadata;
+
+/**
+ * Class MetadataStaxWriter.
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class MetadataStaxWriter
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * Field curId.
+     */
+    private int curId;
+
+    /**
+     * Field idMap.
+     */
+    private java.util.Map idMap;
+
+
+      //----------------/
+     //- Constructors -/
+    //----------------/
+
+    public MetadataStaxWriter()
+    {
+        idMap = new java.util.HashMap();
+    } //-- org.fedoraproject.xmvn.metadata.io.stax.MetadataStaxWriter()
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method write.
+     * 
+     * @param writer
+     * @param packageMetadata
+     * @throws java.io.IOException
+     * @throws XMLStreamException
+     */
+    public void write( Writer writer, PackageMetadata packageMetadata )
+        throws java.io.IOException, XMLStreamException
+    {
+        XMLOutputFactory factory = XMLOutputFactory.newInstance();
+        boolean supportWindowsLineEndings = false;
+        if ( factory.isPropertySupported( "com.ctc.wstx.outputEscapeCr" ) )
+        {
+            factory.setProperty( "com.ctc.wstx.outputEscapeCr", Boolean.FALSE );
+            supportWindowsLineEndings = true;
+        }
+        if ( factory.isPropertySupported( "org.codehaus.stax2.automaticEmptyElements" ) )
+        {
+            factory.setProperty( "org.codehaus.stax2.automaticEmptyElements", Boolean.FALSE );
+        }
+        IndentingXMLStreamWriter serializer = new IndentingXMLStreamWriter( factory.createXMLStreamWriter( writer ) );
+        if ( supportWindowsLineEndings )
+        {
+            serializer.setNewLine( serializer.getLineSeparator() );
+        }
+        serializer.writeStartDocument( packageMetadata.getModelEncoding(), "1.0" );
+        writePackageMetadata( packageMetadata, "metadata", serializer );
+        serializer.writeEndDocument();
+    } //-- void write( Writer, PackageMetadata )
+
+    /**
+     * Method write.
+     * 
+     * @param stream
+     * @param packageMetadata
+     * @throws java.io.IOException
+     * @throws XMLStreamException
+     */
+    public void write( OutputStream stream, PackageMetadata packageMetadata )
+        throws java.io.IOException, XMLStreamException
+    {
+        XMLOutputFactory factory = XMLOutputFactory.newInstance();
+        boolean supportWindowsLineEndings = false;
+        if ( factory.isPropertySupported( "com.ctc.wstx.outputEscapeCr" ) )
+        {
+            factory.setProperty( "com.ctc.wstx.outputEscapeCr", Boolean.FALSE );
+            supportWindowsLineEndings = true;
+        }
+        if ( factory.isPropertySupported( "org.codehaus.stax2.automaticEmptyElements" ) )
+        {
+            factory.setProperty( "org.codehaus.stax2.automaticEmptyElements", Boolean.FALSE );
+        }
+        IndentingXMLStreamWriter serializer = new IndentingXMLStreamWriter( factory.createXMLStreamWriter( stream, packageMetadata.getModelEncoding() ) );
+        if ( supportWindowsLineEndings )
+        {
+            serializer.setNewLine( serializer.getLineSeparator() );
+        }
+        serializer.writeStartDocument( packageMetadata.getModelEncoding(), "1.0" );
+        writePackageMetadata( packageMetadata, "metadata", serializer );
+        serializer.writeEndDocument();
+    } //-- void write( OutputStream, PackageMetadata )
+
+    /**
+     * Method writeArtifactAlias.
+     * 
+     * @param artifactAlias
+     * @param serializer
+     * @param tagName
+     * @throws java.io.IOException
+     * @throws XMLStreamException
+     */
+    private void writeArtifactAlias( ArtifactAlias artifactAlias, String tagName, XMLStreamWriter serializer )
+        throws java.io.IOException, XMLStreamException
+    {
+        if ( artifactAlias != null )
+        {
+            serializer.writeStartElement( tagName );
+            if ( artifactAlias.getGroupId() != null )
+            {
+                serializer.writeStartElement( "groupId" );
+                serializer.writeCharacters( artifactAlias.getGroupId() );
+                serializer.writeEndElement();
+            }
+            if ( artifactAlias.getArtifactId() != null )
+            {
+                serializer.writeStartElement( "artifactId" );
+                serializer.writeCharacters( artifactAlias.getArtifactId() );
+                serializer.writeEndElement();
+            }
+            if ( ( artifactAlias.getExtension() != null ) && !artifactAlias.getExtension().equals( "jar" ) )
+            {
+                serializer.writeStartElement( "extension" );
+                serializer.writeCharacters( artifactAlias.getExtension() );
+                serializer.writeEndElement();
+            }
+            if ( ( artifactAlias.getClassifier() != null ) && !artifactAlias.getClassifier().equals( "" ) )
+            {
+                serializer.writeStartElement( "classifier" );
+                serializer.writeCharacters( artifactAlias.getClassifier() );
+                serializer.writeEndElement();
+            }
+            serializer.writeEndElement();
+        }
+    } //-- void writeArtifactAlias( ArtifactAlias, String, XMLStreamWriter )
+
+    /**
+     * Method writeArtifactMetadata.
+     * 
+     * @param artifactMetadata
+     * @param serializer
+     * @param tagName
+     * @throws java.io.IOException
+     * @throws XMLStreamException
+     */
+    private void writeArtifactMetadata( ArtifactMetadata artifactMetadata, String tagName, XMLStreamWriter serializer )
+        throws java.io.IOException, XMLStreamException
+    {
+        if ( artifactMetadata != null )
+        {
+            serializer.writeStartElement( tagName );
+            if ( artifactMetadata.getGroupId() != null )
+            {
+                serializer.writeStartElement( "groupId" );
+                serializer.writeCharacters( artifactMetadata.getGroupId() );
+                serializer.writeEndElement();
+            }
+            if ( artifactMetadata.getArtifactId() != null )
+            {
+                serializer.writeStartElement( "artifactId" );
+                serializer.writeCharacters( artifactMetadata.getArtifactId() );
+                serializer.writeEndElement();
+            }
+            if ( ( artifactMetadata.getExtension() != null ) && !artifactMetadata.getExtension().equals( "jar" ) )
+            {
+                serializer.writeStartElement( "extension" );
+                serializer.writeCharacters( artifactMetadata.getExtension() );
+                serializer.writeEndElement();
+            }
+            if ( ( artifactMetadata.getClassifier() != null ) && !artifactMetadata.getClassifier().equals( "" ) )
+            {
+                serializer.writeStartElement( "classifier" );
+                serializer.writeCharacters( artifactMetadata.getClassifier() );
+                serializer.writeEndElement();
+            }
+            if ( artifactMetadata.getVersion() != null )
+            {
+                serializer.writeStartElement( "version" );
+                serializer.writeCharacters( artifactMetadata.getVersion() );
+                serializer.writeEndElement();
+            }
+            if ( artifactMetadata.getPath() != null )
+            {
+                serializer.writeStartElement( "path" );
+                serializer.writeCharacters( artifactMetadata.getPath() );
+                serializer.writeEndElement();
+            }
+            if ( ( artifactMetadata.getNamespace() != null ) && !artifactMetadata.getNamespace().equals( "" ) )
+            {
+                serializer.writeStartElement( "namespace" );
+                serializer.writeCharacters( artifactMetadata.getNamespace() );
+                serializer.writeEndElement();
+            }
+            if ( artifactMetadata.getUuid() != null )
+            {
+                serializer.writeStartElement( "uuid" );
+                serializer.writeCharacters( artifactMetadata.getUuid() );
+                serializer.writeEndElement();
+            }
+            if ( ( artifactMetadata.getProperties() != null ) && ( artifactMetadata.getProperties().size() > 0 ) )
+            {
+                serializer.writeStartElement( "properties" );
+                for ( Iterator iter = artifactMetadata.getProperties().keySet().iterator(); iter.hasNext(); )
+                {
+                    String key = (String) iter.next();
+                    String value = (String) artifactMetadata.getProperties().get( key );
+                    serializer.writeStartElement( "" + key + "" );
+                    serializer.writeCharacters( value );
+                    serializer.writeEndElement();
+                }
+                serializer.writeEndElement();
+            }
+            if ( ( artifactMetadata.getCompatVersions() != null ) && ( artifactMetadata.getCompatVersions().size() > 0 ) )
+            {
+                serializer.writeStartElement( "compatVersions" );
+                for ( Iterator iter = artifactMetadata.getCompatVersions().iterator(); iter.hasNext(); )
+                {
+                    String compatVersion = (String) iter.next();
+                    serializer.writeStartElement( "version" );
+                    serializer.writeCharacters( compatVersion );
+                    serializer.writeEndElement();
+                }
+                serializer.writeEndElement();
+            }
+            if ( ( artifactMetadata.getAliases() != null ) && ( artifactMetadata.getAliases().size() > 0 ) )
+            {
+                serializer.writeStartElement( "aliases" );
+                for ( Iterator iter = artifactMetadata.getAliases().iterator(); iter.hasNext(); )
+                {
+                    ArtifactAlias o = (ArtifactAlias) iter.next();
+                    writeArtifactAlias( o, "alias", serializer );
+                }
+                serializer.writeEndElement();
+            }
+            if ( ( artifactMetadata.getDependencies() != null ) && ( artifactMetadata.getDependencies().size() > 0 ) )
+            {
+                serializer.writeStartElement( "dependencies" );
+                for ( Iterator iter = artifactMetadata.getDependencies().iterator(); iter.hasNext(); )
+                {
+                    Dependency o = (Dependency) iter.next();
+                    writeDependency( o, "dependency", serializer );
+                }
+                serializer.writeEndElement();
+            }
+            serializer.writeEndElement();
+        }
+    } //-- void writeArtifactMetadata( ArtifactMetadata, String, XMLStreamWriter )
+
+    /**
+     * Method writeDependency.
+     * 
+     * @param dependency
+     * @param serializer
+     * @param tagName
+     * @throws java.io.IOException
+     * @throws XMLStreamException
+     */
+    private void writeDependency( Dependency dependency, String tagName, XMLStreamWriter serializer )
+        throws java.io.IOException, XMLStreamException
+    {
+        if ( dependency != null )
+        {
+            serializer.writeStartElement( tagName );
+            if ( dependency.getGroupId() != null )
+            {
+                serializer.writeStartElement( "groupId" );
+                serializer.writeCharacters( dependency.getGroupId() );
+                serializer.writeEndElement();
+            }
+            if ( dependency.getArtifactId() != null )
+            {
+                serializer.writeStartElement( "artifactId" );
+                serializer.writeCharacters( dependency.getArtifactId() );
+                serializer.writeEndElement();
+            }
+            if ( ( dependency.getExtension() != null ) && !dependency.getExtension().equals( "jar" ) )
+            {
+                serializer.writeStartElement( "extension" );
+                serializer.writeCharacters( dependency.getExtension() );
+                serializer.writeEndElement();
+            }
+            if ( ( dependency.getClassifier() != null ) && !dependency.getClassifier().equals( "" ) )
+            {
+                serializer.writeStartElement( "classifier" );
+                serializer.writeCharacters( dependency.getClassifier() );
+                serializer.writeEndElement();
+            }
+            if ( ( dependency.getRequestedVersion() != null ) && !dependency.getRequestedVersion().equals( "SYSTEM" ) )
+            {
+                serializer.writeStartElement( "requestedVersion" );
+                serializer.writeCharacters( dependency.getRequestedVersion() );
+                serializer.writeEndElement();
+            }
+            if ( ( dependency.getResolvedVersion() != null ) && !dependency.getResolvedVersion().equals( "SYSTEM" ) )
+            {
+                serializer.writeStartElement( "resolvedVersion" );
+                serializer.writeCharacters( dependency.getResolvedVersion() );
+                serializer.writeEndElement();
+            }
+            if ( ( dependency.getNamespace() != null ) && !dependency.getNamespace().equals( "" ) )
+            {
+                serializer.writeStartElement( "namespace" );
+                serializer.writeCharacters( dependency.getNamespace() );
+                serializer.writeEndElement();
+            }
+            if ( ( dependency.getExclusions() != null ) && ( dependency.getExclusions().size() > 0 ) )
+            {
+                serializer.writeStartElement( "exclusions" );
+                for ( Iterator iter = dependency.getExclusions().iterator(); iter.hasNext(); )
+                {
+                    DependencyExclusion o = (DependencyExclusion) iter.next();
+                    writeDependencyExclusion( o, "exclusion", serializer );
+                }
+                serializer.writeEndElement();
+            }
+            serializer.writeEndElement();
+        }
+    } //-- void writeDependency( Dependency, String, XMLStreamWriter )
+
+    /**
+     * Method writeDependencyExclusion.
+     * 
+     * @param dependencyExclusion
+     * @param serializer
+     * @param tagName
+     * @throws java.io.IOException
+     * @throws XMLStreamException
+     */
+    private void writeDependencyExclusion( DependencyExclusion dependencyExclusion, String tagName, XMLStreamWriter serializer )
+        throws java.io.IOException, XMLStreamException
+    {
+        if ( dependencyExclusion != null )
+        {
+            serializer.writeStartElement( tagName );
+            if ( dependencyExclusion.getGroupId() != null )
+            {
+                serializer.writeStartElement( "groupId" );
+                serializer.writeCharacters( dependencyExclusion.getGroupId() );
+                serializer.writeEndElement();
+            }
+            if ( dependencyExclusion.getArtifactId() != null )
+            {
+                serializer.writeStartElement( "artifactId" );
+                serializer.writeCharacters( dependencyExclusion.getArtifactId() );
+                serializer.writeEndElement();
+            }
+            serializer.writeEndElement();
+        }
+    } //-- void writeDependencyExclusion( DependencyExclusion, String, XMLStreamWriter )
+
+    /**
+     * Method writePackageMetadata.
+     * 
+     * @param packageMetadata
+     * @param serializer
+     * @param tagName
+     * @throws java.io.IOException
+     * @throws XMLStreamException
+     */
+    private void writePackageMetadata( PackageMetadata packageMetadata, String tagName, XMLStreamWriter serializer )
+        throws java.io.IOException, XMLStreamException
+    {
+        if ( packageMetadata != null )
+        {
+            serializer.setDefaultNamespace( "http://fedorahosted.org/xmvn/METADATA/2.0.0" );
+            serializer.writeStartElement( tagName );
+            serializer.writeDefaultNamespace( "http://fedorahosted.org/xmvn/METADATA/2.0.0" );
+            if ( packageMetadata.getUuid() != null )
+            {
+                serializer.writeStartElement( "uuid" );
+                serializer.writeCharacters( packageMetadata.getUuid() );
+                serializer.writeEndElement();
+            }
+            if ( ( packageMetadata.getProperties() != null ) && ( packageMetadata.getProperties().size() > 0 ) )
+            {
+                serializer.writeStartElement( "properties" );
+                for ( Iterator iter = packageMetadata.getProperties().keySet().iterator(); iter.hasNext(); )
+                {
+                    String key = (String) iter.next();
+                    String value = (String) packageMetadata.getProperties().get( key );
+                    serializer.writeStartElement( "" + key + "" );
+                    serializer.writeCharacters( value );
+                    serializer.writeEndElement();
+                }
+                serializer.writeEndElement();
+            }
+            if ( ( packageMetadata.getArtifacts() != null ) && ( packageMetadata.getArtifacts().size() > 0 ) )
+            {
+                serializer.writeStartElement( "artifacts" );
+                for ( Iterator iter = packageMetadata.getArtifacts().iterator(); iter.hasNext(); )
+                {
+                    ArtifactMetadata o = (ArtifactMetadata) iter.next();
+                    writeArtifactMetadata( o, "artifact", serializer );
+                }
+                serializer.writeEndElement();
+            }
+            if ( ( packageMetadata.getSkippedArtifacts() != null ) && ( packageMetadata.getSkippedArtifacts().size() > 0 ) )
+            {
+                serializer.writeStartElement( "skippedArtifacts" );
+                for ( Iterator iter = packageMetadata.getSkippedArtifacts().iterator(); iter.hasNext(); )
+                {
+                    SkippedArtifactMetadata o = (SkippedArtifactMetadata) iter.next();
+                    writeSkippedArtifactMetadata( o, "skippedArtifact", serializer );
+                }
+                serializer.writeEndElement();
+            }
+            serializer.writeEndElement();
+        }
+    } //-- void writePackageMetadata( PackageMetadata, String, XMLStreamWriter )
+
+    /**
+     * Method writeSkippedArtifactMetadata.
+     * 
+     * @param skippedArtifactMetadata
+     * @param serializer
+     * @param tagName
+     * @throws java.io.IOException
+     * @throws XMLStreamException
+     */
+    private void writeSkippedArtifactMetadata( SkippedArtifactMetadata skippedArtifactMetadata, String tagName, XMLStreamWriter serializer )
+        throws java.io.IOException, XMLStreamException
+    {
+        if ( skippedArtifactMetadata != null )
+        {
+            serializer.writeStartElement( tagName );
+            if ( skippedArtifactMetadata.getGroupId() != null )
+            {
+                serializer.writeStartElement( "groupId" );
+                serializer.writeCharacters( skippedArtifactMetadata.getGroupId() );
+                serializer.writeEndElement();
+            }
+            if ( skippedArtifactMetadata.getArtifactId() != null )
+            {
+                serializer.writeStartElement( "artifactId" );
+                serializer.writeCharacters( skippedArtifactMetadata.getArtifactId() );
+                serializer.writeEndElement();
+            }
+            if ( ( skippedArtifactMetadata.getExtension() != null ) && !skippedArtifactMetadata.getExtension().equals( "jar" ) )
+            {
+                serializer.writeStartElement( "extension" );
+                serializer.writeCharacters( skippedArtifactMetadata.getExtension() );
+                serializer.writeEndElement();
+            }
+            if ( ( skippedArtifactMetadata.getClassifier() != null ) && !skippedArtifactMetadata.getClassifier().equals( "" ) )
+            {
+                serializer.writeStartElement( "classifier" );
+                serializer.writeCharacters( skippedArtifactMetadata.getClassifier() );
+                serializer.writeEndElement();
+            }
+            serializer.writeEndElement();
+        }
+    } //-- void writeSkippedArtifactMetadata( SkippedArtifactMetadata, String, XMLStreamWriter )
+
+}
diff --git a/xmvn-parent/pom.xml b/xmvn-parent/pom.xml
index 5f7544b..9ed9ff0 100644
--- a/xmvn-parent/pom.xml
+++ b/xmvn-parent/pom.xml
@@ -104,7 +104,7 @@
     <junitVersion>4.11</junitVersion>
     <jxrPluginVersion>2.3</jxrPluginVersion>
     <mavenWagonVersion>1.0</mavenWagonVersion>
-    <modelloVersion>1.8.2</modelloVersion>
+    <modelloVersion>1.7</modelloVersion>
     <pmdPluginVersion>3.0.1</pmdPluginVersion>
     <projectInfoReportsPluginVersion>2.7</projectInfoReportsPluginVersion>
     <resourcesPluginVersion>2.7</resourcesPluginVersion>
-- 
2.7.4