diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..f58e938
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache.maven.shared</groupId>
+    <artifactId>maven-shared-components</artifactId>
+    <version>4-SNAPSHOT</version>
+  </parent>
+  <artifactId>maven-repository-builder</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <name>Maven Repository Builder</name>
+  <url>http://maven.apache.org</url>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-artifact</artifactId>
+      <version>2.0.3</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-artifact-manager</artifactId>
+      <version>2.0.3</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-project</artifactId>
+      <version>2.0.3</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.shared</groupId>
+      <artifactId>maven-common-artifact-filters</artifactId>
+      <version>1.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.shared</groupId>
+      <artifactId>maven-test-tools</artifactId>
+      <version>1.0-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>easymock</groupId>
+      <artifactId>easymock</artifactId>
+      <version>1.2_Java1.3</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.plexus</groupId>
+        <artifactId>plexus-maven-plugin</artifactId>
+        <version>1.3</version>
+        <executions>
+          <execution>
+            <id>create-component-descriptor</id>
+            <goals>
+              <goal>descriptor</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/src/main/java/org/apache/maven/shared/repository/DefaultRepositoryAssembler.java b/src/main/java/org/apache/maven/shared/repository/DefaultRepositoryAssembler.java
new file mode 100755
index 0000000..d533e43
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/repository/DefaultRepositoryAssembler.java
@@ -0,0 +1,518 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.shared.repository;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.lang.reflect.Field;
+import java.security.NoSuchAlgorithmException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TimeZone;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
+import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
+import org.apache.maven.artifact.repository.DefaultArtifactRepository;
+import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
+import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
+import org.apache.maven.artifact.repository.metadata.Versioning;
+import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Writer;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
+import org.apache.maven.artifact.resolver.ArtifactResolver;
+import org.apache.maven.artifact.resolver.filter.AndArtifactFilter;
+import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+import org.apache.maven.project.DefaultMavenProjectBuilder;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.MavenProjectBuilder;
+import org.apache.maven.project.ProjectBuildingException;
+import org.apache.maven.shared.artifact.filter.PatternExcludesArtifactFilter;
+import org.apache.maven.shared.artifact.filter.PatternIncludesArtifactFilter;
+import org.apache.maven.shared.artifact.filter.ScopeArtifactFilter;
+import org.apache.maven.shared.repository.model.GroupVersionAlignment;
+import org.apache.maven.shared.repository.model.RepositoryInfo;
+import org.apache.maven.shared.repository.utils.DigestUtils;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.codehaus.plexus.logging.Logger;
+import org.codehaus.plexus.util.FileUtils;
+import org.codehaus.plexus.util.IOUtil;
+
+/**
+ * @author Jason van Zyl
+ * @plexus.component role="org.apache.maven.shared.repository.RepositoryAssembler" role-hint="default"
+ */
+
+// todo will need to pop the processed project cache using reflection
+public class DefaultRepositoryAssembler
+    extends AbstractLogEnabled
+    implements RepositoryAssembler
+{
+    protected static final TimeZone UTC_TIME_ZONE = TimeZone.getTimeZone( "UTC" );
+
+    protected static final String UTC_TIMESTAMP_PATTERN = "yyyyMMddHHmmss";
+
+    /**
+     * @plexus.requirement
+     */
+    protected ArtifactFactory artifactFactory;
+
+    /**
+     * @plexus.requirement
+     */
+    protected ArtifactResolver artifactResolver;
+
+    /**
+     * @plexus.requirement
+     */
+    protected ArtifactRepositoryLayout repositoryLayout;
+
+    /**
+     * @plexus.requirement
+     */
+    protected ArtifactRepositoryFactory artifactRepositoryFactory;
+
+    /**
+     * @plexus.requirement
+     */
+    protected ArtifactMetadataSource metadataSource;
+
+    /**
+     * @plexus.requirement
+     */
+    protected MavenProjectBuilder projectBuilder;
+
+    public void buildRemoteRepository( File repositoryDirectory, RepositoryInfo repository,
+                                       RepositoryBuilderConfigSource configSource )
+        throws RepositoryAssemblyException
+    {
+        MavenProject project = configSource.getProject();
+        ArtifactRepository localRepository = configSource.getLocalRepository();
+
+        Map groupVersionAlignments = createGroupVersionAlignments( repository.getGroupVersionAlignments() );
+
+        ArtifactRepository targetRepository = createLocalRepository( repositoryDirectory );
+
+        ArtifactResolutionResult result = null;
+
+        Set dependencyArtifacts = project.getDependencyArtifacts();
+
+        if ( dependencyArtifacts == null )
+        {
+            Logger logger = getLogger();
+
+            if ( logger.isDebugEnabled() )
+            {
+                logger.debug( "dependency-artifact set for project: " + project.getId()
+                    + " is null. Skipping repository processing." );
+            }
+
+            return;
+        }
+
+        try
+        {
+            // i have to get everything first as a filter or transformation here
+            // doesn't seem to work
+            // to align everything. If I use a filter to change the version on
+            // the fly then I get the
+            // I get JARs but no POMs, and in some directories POMs with no
+            // JARs.
+
+            // FIXME I'm not getting runtime dependencies here
+            result = artifactResolver.resolveTransitively( dependencyArtifacts, project.getArtifact(), project
+                .getRemoteArtifactRepositories(), localRepository, metadataSource );
+        }
+        catch ( ArtifactResolutionException e )
+        {
+            throw new RepositoryAssemblyException( "Error resolving artifacts: " + e.getMessage(), e );
+        }
+        catch ( ArtifactNotFoundException e )
+        {
+            throw new RepositoryAssemblyException( "Error resolving artifacts: " + e.getMessage(), e );
+        }
+
+        try
+        {
+            // Blow the cache in the project builder so that we get POMs again
+            // on this next download
+            invalidateProccessedProjectCache();
+        }
+        catch ( Exception e )
+        {
+            throw new RepositoryAssemblyException( "Error invalidating the processed project cache.", e );
+        }
+
+        ArtifactFilter filter = buildRepositoryFilter( repository, project );
+
+        assembleRepositoryArtifacts( result, filter, project, localRepository, targetRepository, repositoryDirectory,
+                                     groupVersionAlignments );
+
+        ArtifactRepository centralRepository = findCentralRepository( project );
+
+        if ( repository.isIncludeMetadata() )
+        {
+            assembleRepositoryMetadata( result, filter, centralRepository, targetRepository );
+        }
+    }
+
+    private ArtifactFilter buildRepositoryFilter( RepositoryInfo repository, MavenProject project )
+    {
+        AndArtifactFilter filter = new AndArtifactFilter();
+
+        ArtifactFilter scopeFilter = new ScopeArtifactFilter( repository.getScope() );
+        filter.add( scopeFilter );
+
+        // ----------------------------------------------------------------------------
+        // Includes
+        //
+        // We'll take everything if no includes are specified to try and make
+        // this
+        // process more maintainable. Don't want to have to update the assembly
+        // descriptor everytime the POM is updated.
+        // ----------------------------------------------------------------------------
+
+        if ( repository.getIncludes().isEmpty() )
+        {
+            List patterns = new ArrayList();
+
+            Set projectArtifacts = project.getDependencyArtifacts();
+
+            if ( projectArtifacts != null )
+            {
+                for ( Iterator it = projectArtifacts.iterator(); it.hasNext(); )
+                {
+                    Artifact artifact = (Artifact) it.next();
+
+                    patterns.add( artifact.getDependencyConflictId() );
+                }
+            }
+
+            PatternIncludesArtifactFilter includeFilter = new PatternIncludesArtifactFilter( patterns, true );
+
+            filter.add( includeFilter );
+        }
+        else
+        {
+            filter.add( new PatternIncludesArtifactFilter( repository.getIncludes(), true ) );
+        }
+
+        // ----------------------------------------------------------------------------
+        // Excludes
+        //
+        // We still want to make it easy to exclude a few things even if we
+        // slurp
+        // up everything.
+        // ----------------------------------------------------------------------------
+
+        if ( !repository.getExcludes().isEmpty() )
+        {
+            filter.add( new PatternExcludesArtifactFilter( repository.getExcludes(), true ) );
+        }
+
+        return filter;
+    }
+
+    private void assembleRepositoryArtifacts( ArtifactResolutionResult result, ArtifactFilter filter,
+                                              MavenProject project, ArtifactRepository localRepository,
+                                              ArtifactRepository targetRepository, File repositoryDirectory,
+                                              Map groupVersionAlignments )
+        throws RepositoryAssemblyException
+    {
+        try
+        {
+            // Now that we have the graph, let's try to align it to versions
+            // that we want and remove
+            // the repository we previously populated.
+            FileUtils.deleteDirectory( repositoryDirectory );
+
+            FileUtils.mkdir( repositoryDirectory.getAbsolutePath() );
+
+            for ( Iterator i = result.getArtifacts().iterator(); i.hasNext(); )
+            {
+                Artifact a = (Artifact) i.next();
+
+                if ( filter.include( a ) )
+                {
+                    setAlignment( a, groupVersionAlignments );
+
+                    // We need to flip it back to not being resolved so we can
+                    // look for it again!
+                    a.setResolved( false );
+
+                    artifactResolver.resolve( a, project.getRemoteArtifactRepositories(), localRepository );
+
+                    File targetFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( a ) );
+                    FileUtils.copyFile( a.getFile(), targetFile );
+
+                    writeChecksums( targetFile );
+
+                    if ( !"pom".equals( a.getType() ) )
+                    {
+                        a = artifactFactory.createProjectArtifact( a.getGroupId(), a.getArtifactId(), a.getVersion() );
+
+                        MavenProject p = projectBuilder.buildFromRepository( a,
+                                                                             project.getRemoteArtifactRepositories(),
+                                                                             localRepository );
+
+                        do
+                        {
+                            a = artifactFactory.createProjectArtifact( p.getGroupId(), p.getArtifactId(), p
+                                .getVersion() );
+
+                            setAlignment( a, groupVersionAlignments );
+
+                            File sourceFile = new File( localRepository.getBasedir(), localRepository.pathOf( a ) );
+
+                            if ( !sourceFile.exists() )
+                            {
+                                break;
+                            }
+
+                            targetFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( a ) );
+
+                            FileUtils.copyFile( sourceFile, targetFile );
+
+                            writeChecksums( targetFile );
+
+                            p = p.getParent();
+                        }
+                        while ( p != null );
+                    }
+                }
+            }
+        }
+        catch ( ArtifactResolutionException e )
+        {
+            throw new RepositoryAssemblyException( "Error resolving artifacts: " + e.getMessage(), e );
+        }
+        catch ( ArtifactNotFoundException e )
+        {
+            throw new RepositoryAssemblyException( "Error resolving artifacts: " + e.getMessage(), e );
+        }
+        catch ( IOException e )
+        {
+            throw new RepositoryAssemblyException( "Error writing artifact metdata.", e );
+        }
+        catch ( ProjectBuildingException e )
+        {
+            throw new RepositoryAssemblyException( "Error reading POM.", e );
+        }
+    }
+
+    private ArtifactRepository findCentralRepository( MavenProject project )
+    {
+        ArtifactRepository centralRepository = null;
+        for ( Iterator i = project.getRemoteArtifactRepositories().iterator(); i.hasNext(); )
+        {
+            ArtifactRepository r = (ArtifactRepository) i.next();
+            if ( "central".equals( r.getId() ) )
+            {
+                centralRepository = r;
+            }
+        }
+
+        return centralRepository;
+    }
+
+    private void assembleRepositoryMetadata( ArtifactResolutionResult result, ArtifactFilter filter,
+                                             ArtifactRepository centralRepository, ArtifactRepository targetRepository )
+        throws RepositoryAssemblyException
+    {
+        for ( Iterator i = result.getArtifacts().iterator(); i.hasNext(); )
+        {
+            Artifact a = (Artifact) i.next();
+
+            if ( filter.include( a ) )
+            {
+                Versioning v = new Versioning();
+
+                v.setRelease( a.getVersion() );
+
+                v.setLatest( a.getVersion() );
+
+                v.addVersion( a.getVersion() );
+
+                v.setLastUpdated( getUtcDateFormatter().format( new Date() ) );
+
+                ArtifactRepositoryMetadata metadata = new ArtifactRepositoryMetadata( a, v );
+                String path = targetRepository.pathOfLocalRepositoryMetadata( metadata, centralRepository );
+                File metadataFile = new File( targetRepository.getBasedir(), path );
+
+                MetadataXpp3Writer metadataWriter = new MetadataXpp3Writer();
+
+                Writer writer = null;
+                try
+                {
+                    writer = new FileWriter( metadataFile );
+
+                    metadataWriter.write( writer, metadata.getMetadata() );
+                }
+                catch ( IOException e )
+                {
+                    throw new RepositoryAssemblyException( "Error writing artifact metdata.", e );
+                }
+                finally
+                {
+                    IOUtil.close( writer );
+                }
+
+                try
+                {
+                    writeChecksums( metadataFile );
+
+                    File metadataFileRemote = new File( targetRepository.getBasedir(), targetRepository
+                        .pathOfRemoteRepositoryMetadata( metadata ) );
+
+                    FileUtils.copyFile( metadataFile, metadataFileRemote );
+
+                    FileUtils.copyFile( new File( metadataFile.getParentFile(), metadataFile.getName() + ".sha1" ),
+                                        new File( metadataFileRemote.getParentFile(), metadataFileRemote.getName()
+                                            + ".sha1" ) );
+
+                    FileUtils.copyFile( new File( metadataFile.getParentFile(), metadataFile.getName() + ".md5" ),
+                                        new File( metadataFileRemote.getParentFile(), metadataFileRemote.getName()
+                                            + ".md5" ) );
+                }
+                catch ( IOException e )
+                {
+                    throw new RepositoryAssemblyException( "Error writing artifact metdata.", e );
+                }
+            }
+        }
+    }
+
+    private void writeChecksums( File file )
+        throws IOException, RepositoryAssemblyException
+    {
+        try
+        {
+            String md5 = DigestUtils.createChecksum( file, "MD5" );
+            String sha1 = DigestUtils.createChecksum( file, "SHA-1" );
+
+            FileUtils.fileWrite( new File( file.getParentFile(), file.getName() + ".md5" ).getAbsolutePath(), md5
+                .toLowerCase() );
+            FileUtils.fileWrite( new File( file.getParentFile(), file.getName() + ".sha1" ).getAbsolutePath(), sha1
+                .toLowerCase() );
+        }
+        catch ( NoSuchAlgorithmException e )
+        {
+            throw new RepositoryAssemblyException( "Unable to get write checksums: " + e.getMessage(), e );
+        }
+    }
+
+    protected Map createGroupVersionAlignments( List versionAlignments )
+    {
+        Map groupVersionAlignments = new HashMap();
+
+        for ( Iterator i = versionAlignments.iterator(); i.hasNext(); )
+        {
+            GroupVersionAlignment alignment = (GroupVersionAlignment) i.next();
+
+            groupVersionAlignments.put( alignment.getId(), alignment );
+        }
+
+        return groupVersionAlignments;
+    }
+
+    protected static DateFormat getUtcDateFormatter()
+    {
+        DateFormat utcDateFormatter = new SimpleDateFormat( UTC_TIMESTAMP_PATTERN );
+        utcDateFormatter.setTimeZone( UTC_TIME_ZONE );
+        return utcDateFormatter;
+    }
+
+    protected ArtifactRepository createLocalRepository( File directory )
+    {
+        String localRepositoryUrl = directory.getAbsolutePath();
+
+        if ( !localRepositoryUrl.startsWith( "file:" ) )
+        {
+            localRepositoryUrl = "file://" + localRepositoryUrl;
+        }
+
+        return createRepository( "local", localRepositoryUrl, false, true,
+                                 ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN );
+    }
+
+    public ArtifactRepository createRepository( String repositoryId, String repositoryUrl, boolean offline,
+                                                boolean updateSnapshots, String globalChecksumPolicy )
+    {
+        ArtifactRepository localRepository = new DefaultArtifactRepository( repositoryId, repositoryUrl,
+                                                                            repositoryLayout );
+
+        boolean snapshotPolicySet = false;
+
+        if ( offline )
+        {
+            snapshotPolicySet = true;
+        }
+
+        if ( !snapshotPolicySet && updateSnapshots )
+        {
+            artifactRepositoryFactory.setGlobalUpdatePolicy( ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS );
+        }
+
+        artifactRepositoryFactory.setGlobalChecksumPolicy( globalChecksumPolicy );
+
+        return localRepository;
+    }
+
+    private void invalidateProccessedProjectCache()
+        throws Exception
+    {
+        Class klass = DefaultMavenProjectBuilder.class;
+
+        Field field = klass.getDeclaredField( "processedProjectCache" );
+
+        field.setAccessible( true );
+
+        Object cache = field.get( projectBuilder );
+
+        cache.getClass().getDeclaredMethod( "clear", null ).invoke( cache, null );
+
+        field.setAccessible( false );
+    }
+
+    private void setAlignment( Artifact artifact, Map groupVersionAlignments )
+    {
+        GroupVersionAlignment alignment = (GroupVersionAlignment) groupVersionAlignments.get( artifact.getGroupId() );
+
+        if ( alignment != null )
+        {
+            if ( !alignment.getExcludes().contains( artifact.getArtifactId() ) )
+            {
+                artifact.setVersion( alignment.getVersion() );
+            }
+        }
+    }
+}
diff --git a/src/main/java/org/apache/maven/shared/repository/RepositoryAssembler.java b/src/main/java/org/apache/maven/shared/repository/RepositoryAssembler.java
new file mode 100755
index 0000000..4fe3772
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/repository/RepositoryAssembler.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.shared.repository;
+
+import java.io.File;
+
+import org.apache.maven.shared.repository.model.RepositoryInfo;
+
+/**
+ * @author Jason van Zyl
+ */
+public interface RepositoryAssembler
+{
+    String ROLE = RepositoryAssembler.class.getName();
+
+    public void buildRemoteRepository( File repositoryDirectory, RepositoryInfo repository,
+                                       RepositoryBuilderConfigSource configSource )
+        throws RepositoryAssemblyException;
+}
diff --git a/src/main/java/org/apache/maven/shared/repository/RepositoryAssemblyException.java b/src/main/java/org/apache/maven/shared/repository/RepositoryAssemblyException.java
new file mode 100755
index 0000000..6148a1d
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/repository/RepositoryAssemblyException.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.shared.repository;
+
+/**
+ * @author Jason van Zyl
+ */
+public class RepositoryAssemblyException
+    extends Exception
+{
+    private static final long serialVersionUID = 1L;
+
+    public RepositoryAssemblyException( String string )
+    {
+        super( string );
+    }
+
+    public RepositoryAssemblyException( String string, Throwable throwable )
+    {
+        super( string, throwable );
+    }
+
+    public RepositoryAssemblyException( Throwable throwable )
+    {
+        super( throwable );
+    }
+}
diff --git a/src/main/java/org/apache/maven/shared/repository/RepositoryBuilderConfigSource.java b/src/main/java/org/apache/maven/shared/repository/RepositoryBuilderConfigSource.java
new file mode 100644
index 0000000..33545ea
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/repository/RepositoryBuilderConfigSource.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.shared.repository;
+
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.project.MavenProject;
+
+public interface RepositoryBuilderConfigSource
+{
+
+    MavenProject getProject();
+
+    ArtifactRepository getLocalRepository();
+
+}
diff --git a/src/main/java/org/apache/maven/shared/repository/model/DefaultRepositoryInfo.java b/src/main/java/org/apache/maven/shared/repository/model/DefaultRepositoryInfo.java
new file mode 100644
index 0000000..b3aa5b6
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/repository/model/DefaultRepositoryInfo.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.shared.repository.model;
+
+import java.util.List;
+
+public class DefaultRepositoryInfo
+    implements RepositoryInfo
+{
+
+    private boolean includeMetadata;
+
+    private String scope;
+
+    private List includes;
+
+    private List groupVersionAlignments;
+
+    private List excludes;
+
+    public List getExcludes()
+    {
+        return excludes;
+    }
+
+    public void setGroupVersionAlignments( List groupVersionAlignments )
+    {
+        this.groupVersionAlignments = groupVersionAlignments;
+    }
+
+    public void setIncludeMetadata( boolean includeMetadata )
+    {
+        this.includeMetadata = includeMetadata;
+    }
+
+    public void setIncludes( List includes )
+    {
+        this.includes = includes;
+    }
+
+    public void setScope( String scope )
+    {
+        this.scope = scope;
+    }
+
+    public List getGroupVersionAlignments()
+    {
+        return groupVersionAlignments;
+    }
+
+    public List getIncludes()
+    {
+        return includes;
+    }
+
+    public String getScope()
+    {
+        return scope;
+    }
+
+    public boolean isIncludeMetadata()
+    {
+        return includeMetadata;
+    }
+
+    public void setExcludes( List excludes )
+    {
+        this.excludes = excludes;
+    }
+
+}
diff --git a/src/main/java/org/apache/maven/shared/repository/model/GroupVersionAlignment.java b/src/main/java/org/apache/maven/shared/repository/model/GroupVersionAlignment.java
new file mode 100644
index 0000000..5352c07
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/repository/model/GroupVersionAlignment.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.shared.repository.model;
+
+import java.util.List;
+
+public interface GroupVersionAlignment
+{
+
+    String getId();
+
+    List getExcludes();
+
+    String getVersion();
+
+}
diff --git a/src/main/java/org/apache/maven/shared/repository/model/RepositoryInfo.java b/src/main/java/org/apache/maven/shared/repository/model/RepositoryInfo.java
new file mode 100644
index 0000000..e0a01a0
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/repository/model/RepositoryInfo.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.shared.repository.model;
+
+import java.util.List;
+
+public interface RepositoryInfo
+{
+
+    List getGroupVersionAlignments();
+
+    boolean isIncludeMetadata();
+
+    String getScope();
+
+    List getIncludes();
+
+    List getExcludes();
+
+}
diff --git a/src/main/java/org/apache/maven/shared/repository/utils/DigestUtils.java b/src/main/java/org/apache/maven/shared/repository/utils/DigestUtils.java
new file mode 100755
index 0000000..f5435ba
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/repository/utils/DigestUtils.java
@@ -0,0 +1,150 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.shared.repository.utils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.codehaus.plexus.util.IOUtil;
+
+/**
+ * Create a digest for a file. Stolen from repository-utils - once released, use that instead.
+ *
+ * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ * @todo [jdcasey] This needs unit tests.
+ */
+public final class DigestUtils
+{
+    private static final int CHECKSUM_BUFFER_SIZE = 16384;
+
+    private static final int BYTE_MASK = 0xFF;
+
+    private DigestUtils()
+    {
+    }
+
+    public static String createChecksum( File file, String algorithm )
+        throws IOException, NoSuchAlgorithmException
+    {
+        MessageDigest digest = MessageDigest.getInstance( algorithm );
+
+        InputStream fis = new FileInputStream( file );
+        try
+        {
+            byte[] buffer = new byte[CHECKSUM_BUFFER_SIZE];
+            int numRead;
+            do
+            {
+                numRead = fis.read( buffer );
+                if ( numRead > 0 )
+                {
+                    digest.update( buffer, 0, numRead );
+                }
+            }
+            while ( numRead != -1 );
+        }
+        finally
+        {
+            IOUtil.close( fis );
+        }
+
+        return byteArrayToHexStr( digest.digest() );
+    }
+
+    public boolean verifyChecksum( File file, String checksum, String algorithm )
+        throws NoSuchAlgorithmException, IOException
+    {
+        boolean result = true;
+
+        String trimmedChecksum = checksum.replace( '\n', ' ' ).trim();
+        // Free-BSD / openssl
+        Matcher m = Pattern.compile( algorithm.replaceAll( "-", "" ) + "\\s*\\((.*?)\\)\\s*=\\s*([a-zA-Z0-9]+)" )
+            .matcher( trimmedChecksum );
+        if ( m.matches() )
+        {
+            String filename = m.group( 1 );
+            if ( !filename.equals( file.getName() ) )
+            {
+                // TODO: provide better warning
+                result = false;
+            }
+            trimmedChecksum = m.group( 2 );
+        }
+        else
+        {
+            // GNU tools
+            m = Pattern.compile( "([a-zA-Z0-9]+)\\s\\*?(.+)" ).matcher( trimmedChecksum );
+            if ( m.matches() )
+            {
+                String filename = m.group( 2 );
+                if ( !filename.equals( file.getName() ) )
+                {
+                    // TODO: provide better warning
+                    result = false;
+                }
+                trimmedChecksum = m.group( 1 );
+            }
+        }
+
+        if ( result )
+        {
+            //Create checksum for jar file
+            String sum = createChecksum( file, algorithm );
+            result = trimmedChecksum.toUpperCase().equals( sum.toUpperCase() );
+        }
+        return result;
+    }
+
+    /**
+     * Convert an incoming array of bytes into a string that represents each of
+     * the bytes as two hex characters.
+     *
+     * @param data
+     */
+    private static String byteArrayToHexStr( byte[] data )
+    {
+        String output = "";
+
+        for ( int cnt = 0; cnt < data.length; cnt++ )
+        {
+            //Deposit a byte into the 8 lsb of an int.
+            int tempInt = data[cnt] & BYTE_MASK;
+
+            //Get hex representation of the int as a string.
+            String tempStr = Integer.toHexString( tempInt );
+
+            //Append a leading 0 if necessary so that each hex string will contain 2 characters.
+            if ( tempStr.length() == 1 )
+            {
+                tempStr = "0" + tempStr;
+            }
+
+            //Concatenate the two characters to the output string.
+            output = output + tempStr;
+        }
+
+        return output.toUpperCase();
+    }
+}
