You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by gn...@apache.org on 2022/02/13 08:57:25 UTC

[maven] 02/02: Maven API (draft)

This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a commit to branch mvn4
in repository https://gitbox.apache.org/repos/asf/maven.git

commit 5eea23c2b48fcc5fd5311f2bf2887143d5672a5b
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Sun Feb 13 09:57:04 2022 +0100

    Maven API (draft)
---
 maven-bom/pom.xml                                  |   5 +
 maven-core-api/pom.xml                             |  41 ++
 .../main/java/org/apache/maven/api/Artifact.java   |  97 ++++
 .../org/apache/maven/api/ArtifactMetadata.java     |  24 +
 .../main/java/org/apache/maven/api/Dependency.java |  73 +++
 .../main/java/org/apache/maven/api/Exclusion.java  |  32 ++
 .../java/org/apache/maven/api/LocalRepository.java |  29 +
 .../src/main/java/org/apache/maven/api/Node.java   |  97 ++++
 .../java/org/apache/maven/api/NodeVisitor.java     |  48 ++
 .../main/java/org/apache/maven/api/Project.java    |  60 +++
 .../org/apache/maven/api/RemoteRepository.java     |  25 +
 .../main/java/org/apache/maven/api/Repository.java |  43 ++
 .../org/apache/maven/api/RepositoryMetadata.java   |  24 +
 .../main/java/org/apache/maven/api/Session.java    | 175 ++++++
 .../maven/api/services/ArtifactDeployer.java       |  61 +++
 .../api/services/ArtifactDeployerException.java    |  44 ++
 .../api/services/ArtifactDeployerRequest.java      | 125 +++++
 .../apache/maven/api/services/ArtifactFactory.java |  36 ++
 .../api/services/ArtifactFactoryException.java     |  36 ++
 .../maven/api/services/ArtifactFactoryRequest.java | 183 +++++++
 .../maven/api/services/ArtifactInstaller.java      |  71 +++
 .../api/services/ArtifactInstallerException.java   |  43 ++
 .../api/services/ArtifactInstallerRequest.java     | 103 ++++
 .../apache/maven/api/services/ArtifactManager.java |  46 ++
 .../maven/api/services/ArtifactResolver.java       |  56 ++
 .../api/services/ArtifactResolverException.java    |  40 ++
 .../api/services/ArtifactResolverRequest.java      | 101 ++++
 .../maven/api/services/ArtifactResolverResult.java |  37 ++
 .../org/apache/maven/api/services/BaseRequest.java |  66 +++
 .../maven/api/services/DependencyCollector.java    | 115 ++++
 .../api/services/DependencyCollectorException.java |  42 ++
 .../api/services/DependencyCollectorRequest.java   | 288 ++++++++++
 .../api/services/DependencyCollectorResult.java    |  47 ++
 .../maven/api/services/DependencyFactory.java      |  37 ++
 .../api/services/DependencyFactoryException.java   |  36 ++
 .../api/services/DependencyFactoryRequest.java     | 167 ++++++
 .../maven/api/services/DependencyResolver.java     |  90 ++++
 .../api/services/DependencyResolverException.java  |  54 ++
 .../api/services/DependencyResolverRequest.java    | 327 ++++++++++++
 .../api/services/DependencyResolverResult.java     |  44 ++
 .../apache/maven/api/services/ProjectBuilder.java  |  57 ++
 .../api/services/ProjectBuilderException.java      |  37 ++
 .../maven/api/services/ProjectBuilderProblem.java  | 101 ++++
 .../maven/api/services/ProjectBuilderRequest.java  | 218 ++++++++
 .../maven/api/services/ProjectBuilderResult.java   |  76 +++
 .../maven/api/services/ProjectBuilderSource.java   |  30 ++
 .../apache/maven/api/services/ProjectDeployer.java |  68 +++
 .../api/services/ProjectDeployerException.java     |  37 ++
 .../maven/api/services/ProjectDeployerRequest.java | 142 +++++
 .../maven/api/services/ProjectInstaller.java       |  79 +++
 .../api/services/ProjectInstallerException.java    |  37 ++
 .../api/services/ProjectInstallerRequest.java      | 101 ++++
 .../apache/maven/api/services/ProjectManager.java  |  48 ++
 .../org/apache/maven/api/services/Service.java     |  27 +
 maven-core-impl/pom.xml                            |  72 +++
 .../org/apache/maven/impl/DefaultArtifact.java     | 101 ++++
 .../apache/maven/impl/DefaultArtifactDeployer.java |  76 +++
 .../apache/maven/impl/DefaultArtifactFactory.java  |  54 ++
 .../maven/impl/DefaultArtifactInstaller.java       | 111 ++++
 .../apache/maven/impl/DefaultArtifactResolver.java |  73 +++
 .../org/apache/maven/impl/DefaultDependency.java   |  95 ++++
 .../maven/impl/DefaultDependencyCollector.java     |  93 ++++
 .../maven/impl/DefaultDependencyFactory.java       |  56 ++
 .../maven/impl/DefaultDependencyResolver.java      | 106 ++++
 .../apache/maven/impl/DefaultLocalRepository.java  |  67 +++
 .../java/org/apache/maven/impl/DefaultNode.java    | 102 ++++
 .../java/org/apache/maven/impl/DefaultProject.java | 172 ++++++
 .../apache/maven/impl/DefaultProjectBuilder.java   | 258 +++++++++
 .../apache/maven/impl/DefaultProjectDeployer.java  | 142 +++++
 .../apache/maven/impl/DefaultProjectInstaller.java |  77 +++
 .../apache/maven/impl/DefaultRemoteRepository.java |  53 ++
 .../java/org/apache/maven/impl/DefaultSession.java | 386 ++++++++++++++
 .../org/apache/maven/impl/MappedCollection.java    |  63 +++
 .../java/org/apache/maven/impl/MappedList.java     |  48 ++
 .../test/java/org/apache/maven/impl/TestApi.java   | 105 ++++
 .../org/apache/maven/impl/TestArtifactHandler.java |  83 +++
 .../apache/maven/impl/TestRepositorySystem.java    | 341 ++++++++++++
 .../2.0.2/commons-httpclient-2.0.2.jar             | Bin 0 -> 225375 bytes
 .../2.0.2/commons-httpclient-2.0.2.jar.sha1        |   1 +
 .../2.0.2/commons-httpclient-2.0.2.pom             | 220 ++++++++
 .../2.0.2/commons-httpclient-2.0.2.pom.sha1        |   1 +
 .../1.0.3/commons-logging-1.0.3.jar                | Bin 0 -> 31605 bytes
 .../1.0.3/commons-logging-1.0.3.jar.sha1           |   1 +
 .../1.0.3/commons-logging-1.0.3.pom                |  31 ++
 .../1.0.3/commons-logging-1.0.3.pom.sha1           |   1 +
 ...logging-1.0.4-javadoc-resources.jar.lastUpdated |   4 +
 .../1.0.4/commons-logging-1.0.4.jar                | Bin 0 -> 38015 bytes
 .../1.0.4/commons-logging-1.0.4.jar.sha1           |   1 +
 .../1.0.4/commons-logging-1.0.4.pom                | 165 ++++++
 .../1.0.4/commons-logging-1.0.4.pom.sha1           |   1 +
 .../xml-im-exporter/1.1/xml-im-exporter-1.1.jar    | Bin 0 -> 24168 bytes
 .../1.1/xml-im-exporter-1.1.jar.sha1               |   1 +
 .../xml-im-exporter/1.1/xml-im-exporter-1.1.pom    |   8 +
 .../1.1/xml-im-exporter-1.1.pom.sha1               |   1 +
 .../test/resources/repo/jdom/jdom/1.0/jdom-1.0.jar | Bin 0 -> 153253 bytes
 .../resources/repo/jdom/jdom/1.0/jdom-1.0.jar.sha1 |   1 +
 .../test/resources/repo/jdom/jdom/1.0/jdom-1.0.pom |  40 ++
 .../resources/repo/jdom/jdom/1.0/jdom-1.0.pom.sha1 |   1 +
 .../junit-4.13.1-javadoc-resources.jar.lastUpdated |   4 +
 .../junit/junit/4.13.1/junit-4.13.1-javadoc.jar    | Bin 0 -> 1674093 bytes
 .../junit/4.13.1/junit-4.13.1-javadoc.jar.sha1     |   1 +
 .../junit/junit/4.13.1/junit-4.13.1-sources.jar    | Bin 0 -> 232161 bytes
 .../junit/4.13.1/junit-4.13.1-sources.jar.sha1     |   1 +
 .../repo/junit/junit/4.13.1/junit-4.13.1.jar       | Bin 0 -> 382708 bytes
 .../repo/junit/junit/4.13.1/junit-4.13.1.jar.sha1  |   1 +
 .../repo/junit/junit/4.13.1/junit-4.13.1.pom       | 587 +++++++++++++++++++++
 .../repo/junit/junit/4.13.1/junit-4.13.1.pom.sha1  |   1 +
 .../repo/org/apache/apache/3/apache-3.pom          |  82 +++
 .../repo/org/apache/apache/3/apache-3.pom.md5      |   1 +
 .../repo/org/apache/apache/3/apache-3.pom.sha1     |   1 +
 .../3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar   | Bin 0 -> 163984 bytes
 .../maven-artifact-3.0-SNAPSHOT.jar.md5            |   1 +
 .../maven-artifact-3.0-SNAPSHOT.jar.sha1           |   1 +
 .../3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom   | 112 ++++
 .../maven-artifact-3.0-SNAPSHOT.pom.md5            |   1 +
 .../maven-artifact-3.0-SNAPSHOT.pom.sha1           |   1 +
 .../test/test-extension/1/test-extension-1.jar     | Bin 0 -> 4208 bytes
 .../test/test-extension/1/test-extension-1.pom     |  73 +++
 .../test/test-extension/1/test-extension-1.pom.md5 |   1 +
 .../test-extension/1/test-extension-1.pom.sha1     |   1 +
 .../1/test-lifecycle-and-artifactHandler-1.jar     | Bin 0 -> 2582 bytes
 .../1/test-lifecycle-and-artifactHandler-1.pom     |  44 ++
 .../1/test-lifecycle-and-artifactHandler-1.pom.md5 |   1 +
 .../test-lifecycle-and-artifactHandler-1.pom.sha1  |   1 +
 .../apache/maven/maven-parent/4/maven-parent-4.pom | 304 +++++++++++
 .../maven/maven-parent/4/maven-parent-4.pom.md5    |   1 +
 .../maven/maven-parent/4/maven-parent-4.pom.sha1   |   1 +
 .../apache/maven/maven-parent/5/maven-parent-5.pom | 466 ++++++++++++++++
 .../maven/maven-parent/5/maven-parent-5.pom.md5    |   1 +
 .../maven/maven-parent/5/maven-parent-5.pom.sha1   |   1 +
 .../1.0-beta-2/wagon-provider-api-1.0-beta-2.jar   | Bin 0 -> 46326 bytes
 .../wagon-provider-api-1.0-beta-2.jar.md5          |   1 +
 .../wagon-provider-api-1.0-beta-2.jar.sha1         |   1 +
 .../1.0-beta-2/wagon-provider-api-1.0-beta-2.pom   |  21 +
 .../wagon-provider-api-1.0-beta-2.pom.md5          |   1 +
 .../wagon-provider-api-1.0-beta-2.pom.sha1         |   1 +
 .../1.0-beta-2/wagon-providers-1.0-beta-2.pom      |  51 ++
 .../1.0-beta-2/wagon-providers-1.0-beta-2.pom.md5  |   1 +
 .../1.0-beta-2/wagon-providers-1.0-beta-2.pom.sha1 |   1 +
 .../1.0-beta-2/wagon-webdav-1.0-beta-2.jar         | Bin 0 -> 17297 bytes
 .../1.0-beta-2/wagon-webdav-1.0-beta-2.jar.md5     |   1 +
 .../1.0-beta-2/wagon-webdav-1.0-beta-2.jar.sha1    |   1 +
 .../1.0-beta-2/wagon-webdav-1.0-beta-2.pom         |  50 ++
 .../1.0-beta-2/wagon-webdav-1.0-beta-2.pom.md5     |   1 +
 .../1.0-beta-2/wagon-webdav-1.0-beta-2.pom.sha1    |   1 +
 .../wagon/wagon/1.0-beta-2/wagon-1.0-beta-2.pom    | 170 ++++++
 .../wagon/1.0-beta-2/wagon-1.0-beta-2.pom.md5      |   1 +
 .../wagon/1.0-beta-2/wagon-1.0-beta-2.pom.sha1     |   1 +
 .../plexus-active-collections-1.0-beta-1.jar       | Bin 0 -> 15961 bytes
 .../plexus-active-collections-1.0-beta-1.jar.md5   |   1 +
 .../plexus-active-collections-1.0-beta-1.jar.sha1  |   1 +
 .../plexus-active-collections-1.0-beta-1.pom       |  51 ++
 .../plexus-active-collections-1.0-beta-1.pom.md5   |   1 +
 .../plexus-active-collections-1.0-beta-1.pom.sha1  |   1 +
 .../plexus-classworlds-1.2-alpha-10.jar            | Bin 0 -> 42472 bytes
 .../plexus-classworlds-1.2-alpha-10.jar.md5        |   1 +
 .../plexus-classworlds-1.2-alpha-10.jar.sha1       |   1 +
 .../plexus-classworlds-1.2-alpha-10.pom            |  94 ++++
 .../plexus-classworlds-1.2-alpha-10.pom.md5        |   1 +
 .../plexus-classworlds-1.2-alpha-10.pom.sha1       |   1 +
 .../1.2-alpha-7/plexus-classworlds-1.2-alpha-7.jar | Bin 0 -> 42636 bytes
 .../plexus-classworlds-1.2-alpha-7.jar.md5         |   1 +
 .../plexus-classworlds-1.2-alpha-7.jar.sha1        |   1 +
 .../1.2-alpha-7/plexus-classworlds-1.2-alpha-7.pom |  78 +++
 .../plexus-classworlds-1.2-alpha-7.pom.md5         |   1 +
 .../plexus-classworlds-1.2-alpha-7.pom.sha1        |   1 +
 .../plexus-component-api-1.0-alpha-16.jar          | Bin 0 -> 33149 bytes
 .../plexus-component-api-1.0-alpha-16.jar.md5      |   1 +
 .../plexus-component-api-1.0-alpha-16.jar.sha1     |   1 +
 .../plexus-component-api-1.0-alpha-16.pom          |  63 +++
 .../plexus-component-api-1.0-alpha-16.pom.md5      |   1 +
 .../plexus-component-api-1.0-alpha-16.pom.sha1     |   1 +
 .../plexus-component-api-1.0-alpha-32.jar          | Bin 0 -> 36108 bytes
 .../plexus-component-api-1.0-alpha-32.jar.md5      |   1 +
 .../plexus-component-api-1.0-alpha-32.jar.sha1     |   1 +
 .../plexus-component-api-1.0-alpha-32.pom          |  61 +++
 .../plexus-component-api-1.0-alpha-32.pom.md5      |   1 +
 .../plexus-component-api-1.0-alpha-32.pom.sha1     |   1 +
 .../1.1.6/plexus-components-1.1.6.pom              |  60 +++
 .../1.1.6/plexus-components-1.1.6.pom.md5          |   1 +
 .../1.1.6/plexus-components-1.1.6.pom.sha1         |   1 +
 .../plexus-container-default-1.0-alpha-16.jar      | Bin 0 -> 210679 bytes
 .../plexus-container-default-1.0-alpha-16.jar.md5  |   1 +
 .../plexus-container-default-1.0-alpha-16.jar.sha1 |   1 +
 .../plexus-container-default-1.0-alpha-16.pom      |  56 ++
 .../plexus-container-default-1.0-alpha-16.pom.md5  |   1 +
 .../plexus-container-default-1.0-alpha-16.pom.sha1 |   1 +
 .../plexus-container-default-1.0-alpha-32.jar      | Bin 0 -> 238880 bytes
 .../plexus-container-default-1.0-alpha-32.jar.md5  |   1 +
 .../plexus-container-default-1.0-alpha-32.jar.sha1 |   1 +
 .../plexus-container-default-1.0-alpha-32.pom      |  98 ++++
 .../plexus-container-default-1.0-alpha-32.pom.md5  |   1 +
 .../plexus-container-default-1.0-alpha-32.pom.sha1 |   1 +
 .../plexus-containers-1.0-alpha-16.pom             |  49 ++
 .../plexus-containers-1.0-alpha-16.pom.md5         |   1 +
 .../plexus-containers-1.0-alpha-16.pom.sha1        |   1 +
 .../plexus-containers-1.0-alpha-32.pom             |  49 ++
 .../plexus-containers-1.0-alpha-32.pom.md5         |   1 +
 .../plexus-containers-1.0-alpha-32.pom.sha1        |   1 +
 .../plexus-utils/1.0.4/plexus-utils-1.0.4.jar      | Bin 0 -> 163803 bytes
 .../plexus-utils/1.0.4/plexus-utils-1.0.4.jar.sha1 |   1 +
 .../plexus-utils/1.0.4/plexus-utils-1.0.4.pom      | 235 +++++++++
 .../plexus-utils/1.0.4/plexus-utils-1.0.4.pom.sha1 |   1 +
 .../plexus/plexus-utils/1.1/plexus-utils-1.1.jar   | Bin 0 -> 168568 bytes
 .../plexus-utils/1.1/plexus-utils-1.1.jar.md5      |   1 +
 .../plexus-utils/1.1/plexus-utils-1.1.jar.sha1     |   1 +
 .../plexus/plexus-utils/1.1/plexus-utils-1.1.pom   |  27 +
 .../plexus-utils/1.1/plexus-utils-1.1.pom.md5      |   1 +
 .../plexus-utils/1.1/plexus-utils-1.1.pom.sha1     |   1 +
 .../plexus-utils/1.4.5/plexus-utils-1.4.5.jar      | Bin 0 -> 205043 bytes
 .../plexus-utils/1.4.5/plexus-utils-1.4.5.jar.md5  |   1 +
 .../plexus-utils/1.4.5/plexus-utils-1.4.5.jar.sha1 |   1 +
 .../plexus-utils/1.4.5/plexus-utils-1.4.5.pom      |  61 +++
 .../plexus-utils/1.4.5/plexus-utils-1.4.5.pom.md5  |   1 +
 .../plexus-utils/1.4.5/plexus-utils-1.4.5.pom.sha1 |   1 +
 .../plexus/plexus/1.0.10/plexus-1.0.10.pom         | 273 ++++++++++
 .../plexus/plexus/1.0.10/plexus-1.0.10.pom.md5     |   1 +
 .../plexus/plexus/1.0.10/plexus-1.0.10.pom.sha1    |   1 +
 .../plexus/plexus/1.0.11/plexus-1.0.11.pom         | 308 +++++++++++
 .../plexus/plexus/1.0.11/plexus-1.0.11.pom.md5     |   1 +
 .../plexus/plexus/1.0.11/plexus-1.0.11.pom.sha1    |   1 +
 .../codehaus/plexus/plexus/1.0.4/plexus-1.0.4.pom  | 205 +++++++
 .../plexus/plexus/1.0.4/plexus-1.0.4.pom.md5       |   1 +
 .../plexus/plexus/1.0.4/plexus-1.0.4.pom.sha1      |   1 +
 .../codehaus/plexus/plexus/1.0.8/plexus-1.0.8.pom  | 259 +++++++++
 .../plexus/plexus/1.0.8/plexus-1.0.8.pom.md5       |   1 +
 .../plexus/plexus/1.0.8/plexus-1.0.8.pom.sha1      |   1 +
 .../codehaus/plexus/plexus/1.0.9/plexus-1.0.9.pom  | 257 +++++++++
 .../plexus/plexus/1.0.9/plexus-1.0.9.pom.md5       |   1 +
 .../plexus/plexus/1.0.9/plexus-1.0.9.pom.sha1      |   1 +
 ...rest-core-1.3-javadoc-resources.jar.lastUpdated |   4 +
 .../1.3/hamcrest-core-1.3-javadoc.jar              | Bin 0 -> 242519 bytes
 .../1.3/hamcrest-core-1.3-javadoc.jar.sha1         |   1 +
 .../1.3/hamcrest-core-1.3-sources.jar              | Bin 0 -> 32624 bytes
 .../1.3/hamcrest-core-1.3-sources.jar.sha1         |   1 +
 .../hamcrest-core/1.3/hamcrest-core-1.3.jar        | Bin 0 -> 45024 bytes
 .../hamcrest-core/1.3/hamcrest-core-1.3.jar.sha1   |   1 +
 .../hamcrest-core/1.3/hamcrest-core-1.3.pom        |  18 +
 .../hamcrest-core/1.3/hamcrest-core-1.3.pom.sha1   |   1 +
 .../hamcrest-parent/1.3/hamcrest-parent-1.3.pom    |  72 +++
 .../1.3/hamcrest-parent-1.3.pom.sha1               |   1 +
 .../slide-webdavlib/2.1/slide-webdavlib-2.1.jar    | Bin 0 -> 172727 bytes
 .../2.1/slide-webdavlib-2.1.jar.md5                |   1 +
 .../2.1/slide-webdavlib-2.1.jar.sha1               |   1 +
 .../slide-webdavlib/2.1/slide-webdavlib-2.1.pom    |  23 +
 .../2.1/slide-webdavlib-2.1.pom.md5                |   1 +
 .../2.1/slide-webdavlib-2.1.pom.sha1               |   1 +
 pom.xml                                            |   2 +
 248 files changed, 11798 insertions(+)

diff --git a/maven-bom/pom.xml b/maven-bom/pom.xml
index 814fbcb..c3401df 100644
--- a/maven-bom/pom.xml
+++ b/maven-bom/pom.xml
@@ -96,6 +96,11 @@ under the License.
       </dependency>
       <dependency>
         <groupId>org.apache.maven</groupId>
+        <artifactId>maven-core-api</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.maven</groupId>
         <artifactId>maven-model-builder</artifactId>
         <version>${project.version}</version>
       </dependency>
diff --git a/maven-core-api/pom.xml b/maven-core-api/pom.xml
new file mode 100644
index 0000000..853b64a
--- /dev/null
+++ b/maven-core-api/pom.xml
@@ -0,0 +1,41 @@
+<?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/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.maven</groupId>
+    <artifactId>maven</artifactId>
+    <version>4.0.0-alpha-1-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>maven-core-api</artifactId>
+  <name>Apache Maven Core API</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>com.google.code.findbugs</groupId>
+      <artifactId>jsr305</artifactId>
+      <version>3.0.2</version>
+      <scope>compile</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/Artifact.java b/maven-core-api/src/main/java/org/apache/maven/api/Artifact.java
new file mode 100644
index 0000000..6ef6856
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/Artifact.java
@@ -0,0 +1,97 @@
+package org.apache.maven.api;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+import javax.annotation.concurrent.Immutable;
+
+import java.nio.file.Path;
+import java.util.Optional;
+
+@Immutable
+public interface Artifact
+{
+
+    /**
+     * The groupId of the artifact.
+     *
+     * @return The groupId.
+     */
+    @Nonnull
+    String getGroupId();
+
+    /**
+     * The artifactId of the artifact.
+     *
+     * @return The artifactId.
+     */
+    @Nonnull
+    String getArtifactId();
+
+    /**
+     * The version of the artifact.
+     *
+     * @return The version.
+     */
+    @Nonnull
+    String getVersion();
+
+    /**
+     * The file-extension of the artifact.
+     *
+     * @return The extension.
+     */
+    @Nonnull
+    String getExtension();
+
+    /**
+     * The classifier of the artifact.
+     *
+     * @return The classifier.
+     */
+    @Nonnull
+    String getClassifier();
+
+    /**
+     * Gets the base version of this artifact, for example "1.0-SNAPSHOT". In contrast to the {@link #getVersion()}, the
+     * base version will always refer to the unresolved meta version.
+     *
+     * @return The base version, never {@code null}.
+     */
+    @Nonnull
+    String getBaseVersion();
+
+    /**
+     * Determines whether this artifact uses a snapshot version.
+     *
+     * @return {@code true} if the artifact is a snapshot, {@code false} otherwise.
+     */
+    boolean isSnapshot();
+
+    /**
+     * Gets the file of this artifact. Note that only resolved artifacts have a file associated with them. In general,
+     * callers must not assume any relationship between an artifact's filename and its coordinates.
+     *
+     * @return The file or {@link Optional#empty()} if the artifact isn't resolved.
+     */
+    @Nonnull
+    Optional<Path> getPath();
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/ArtifactMetadata.java b/maven-core-api/src/main/java/org/apache/maven/api/ArtifactMetadata.java
new file mode 100644
index 0000000..6cee8b6
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/ArtifactMetadata.java
@@ -0,0 +1,24 @@
+package org.apache.maven.api;
+
+/*
+ * 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.
+ */
+
+public interface ArtifactMetadata
+{
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/Dependency.java b/maven-core-api/src/main/java/org/apache/maven/api/Dependency.java
new file mode 100644
index 0000000..b0e0fe3
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/Dependency.java
@@ -0,0 +1,73 @@
+package org.apache.maven.api;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.annotation.concurrent.Immutable;
+
+import java.util.Collection;
+
+@Immutable
+public interface Dependency
+{
+    @Nonnull
+    Artifact getArtifact();
+
+    String getScope();
+
+    @Nullable
+    Boolean getOptional();
+
+    @Nonnull
+    Collection<Exclusion> getExclusions();
+
+    @Nonnull
+    default String getGroupId()
+    {
+        return getArtifact().getGroupId();
+    }
+
+    @Nonnull
+    default String getArtifactId()
+    {
+        return getArtifact().getArtifactId();
+    }
+
+    @Nonnull
+    default String getVersion()
+    {
+        return getArtifact().getVersion();
+    }
+
+    @Nonnull
+    default String getType()
+    {
+        // TODO
+        throw new UnsupportedOperationException( "Not implemented yet" );
+    }
+
+    @Nonnull
+    default String getClassifier()
+    {
+        return getArtifact().getClassifier();
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/Exclusion.java b/maven-core-api/src/main/java/org/apache/maven/api/Exclusion.java
new file mode 100644
index 0000000..c87b99b
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/Exclusion.java
@@ -0,0 +1,32 @@
+package org.apache.maven.api;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nullable;
+
+public interface Exclusion
+{
+    @Nullable
+    String getGroupId();
+
+    @Nullable
+    String getArtifactId();
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/LocalRepository.java b/maven-core-api/src/main/java/org/apache/maven/api/LocalRepository.java
new file mode 100644
index 0000000..d113567
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/LocalRepository.java
@@ -0,0 +1,29 @@
+package org.apache.maven.api;
+
+/*
+ * 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.
+ */
+
+import java.nio.file.Path;
+
+public interface LocalRepository extends Repository
+{
+
+    Path getPath();
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/Node.java b/maven-core-api/src/main/java/org/apache/maven/api/Node.java
new file mode 100644
index 0000000..6b42a0a
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/Node.java
@@ -0,0 +1,97 @@
+package org.apache.maven.api;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.concurrent.Immutable;
+
+import java.util.List;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+
+/**
+ * Represents a dependency node within a Maven project's dependency collector.
+ *
+ * @author Pim Moerenhout
+ * @since 0.12
+ */
+@Immutable
+public interface Node
+{
+    /**
+     * @return artifact for this node
+     */
+    Artifact getArtifact();
+
+    /**
+     * @return dependency for this node
+     */
+    Dependency getDependency();
+
+    /**
+     * Gets the child nodes of this node.
+     *
+     * @return the child nodes of this node, never {@code null}
+     */
+    List<Node> getChildren();
+
+    /**
+     * @return repositories of this node
+     */
+    List<Repository> getRemoteRepositories();
+
+    /**
+     * @return true for an optional dependency.
+     */
+    Boolean getOptional();
+
+    /**
+     * @return The scope on the dependency.
+     */
+    String getScope();
+
+    /**
+     * Traverses this node and potentially its children using the specified visitor.
+     *
+     * @param visitor The visitor to call back, must not be {@code null}.
+     * @return {@code true} to visit siblings nodes of this node as well, {@code false} to skip siblings.
+     */
+    boolean accept( NodeVisitor visitor );
+
+    /**
+     * Returns a new tree starting at this node, filtering the children.
+     * Note that this node will not be filtered and only the children
+     * and its descendant will be checked.
+     *
+     * @param filter the filter to apply
+     * @return a new filtered graph
+     */
+    Node filter( Predicate<Node> filter );
+
+    /**
+     * Obtain a Stream containing this node and all its descendant.
+     *
+     * @return a stream containing this node and its descendant
+     */
+    default Stream<Node> stream()
+    {
+        return Stream.concat( Stream.of( this ), getChildren().stream().flatMap( Node::stream ) );
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/NodeVisitor.java b/maven-core-api/src/main/java/org/apache/maven/api/NodeVisitor.java
new file mode 100644
index 0000000..102c13c
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/NodeVisitor.java
@@ -0,0 +1,48 @@
+package org.apache.maven.api;
+
+/*
+ * 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.
+ */
+
+
+/**
+ * Defines a hierarchical visitor for collecting dependency node trees.
+ * 
+ * @author Pim Moerenhout
+ * @since 0.12
+ */
+public interface NodeVisitor
+{
+    /**
+     * Starts the visit to the specified dependency node.
+     * 
+     * @param node the dependency node to visit
+     * @return <code>true</code> to visit the specified dependency node's children, <code>false</code> to skip the
+     *         specified dependency node's children and proceed to its next sibling
+     */
+    boolean enter( Node node );
+
+    /**
+     * Ends the visit to the specified dependency node.
+     *
+     * @param node the dependency node to visit
+     * @return <code>true</code> to visit the specified dependency node's next sibling, <code>false</code> to skip the
+     *         specified dependency node's next siblings and proceed to its parent
+     */
+    boolean leave( Node node );
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/Project.java b/maven-core-api/src/main/java/org/apache/maven/api/Project.java
new file mode 100644
index 0000000..037f718
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/Project.java
@@ -0,0 +1,60 @@
+package org.apache.maven.api;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+
+import java.nio.file.Path;
+import java.util.List;
+
+/**
+ * Interface representing a Maven project.
+ */
+public interface Project
+{
+
+    @Nonnull
+    String getGroupId();
+
+    @Nonnull
+    String getArtifactId();
+
+    @Nonnull
+    String getVersion();
+
+    @Nonnull
+    String getPackaging();
+
+    @Nonnull
+    Artifact getArtifact();
+
+    @Nonnull
+    Object getModel();
+
+    @Nonnull
+    Path getPomPath();
+
+    @Nonnull
+    List<Dependency> getDependencies();
+
+    @Nonnull
+    List<Dependency> getManagedDependencies();
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/RemoteRepository.java b/maven-core-api/src/main/java/org/apache/maven/api/RemoteRepository.java
new file mode 100644
index 0000000..6b8c3ea
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/RemoteRepository.java
@@ -0,0 +1,25 @@
+package org.apache.maven.api;
+
+/*
+ * 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.
+ */
+
+public interface RemoteRepository extends Repository
+{
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/Repository.java b/maven-core-api/src/main/java/org/apache/maven/api/Repository.java
new file mode 100644
index 0000000..dd7ac92
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/Repository.java
@@ -0,0 +1,43 @@
+package org.apache.maven.api;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+
+public interface Repository
+{
+
+    /**
+     * Gets the identifier of this repository.
+     *
+     * @return The (case-sensitive) identifier, never {@code null}.
+     */
+    @Nonnull
+    String getId();
+
+    /**
+     * Gets the type of the repository, for example "default".
+     *
+     * @return The (case-sensitive) type of the repository, never {@code null}.
+     */
+    @Nonnull
+    String getType();
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/RepositoryMetadata.java b/maven-core-api/src/main/java/org/apache/maven/api/RepositoryMetadata.java
new file mode 100644
index 0000000..2ff856d
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/RepositoryMetadata.java
@@ -0,0 +1,24 @@
+package org.apache.maven.api;
+
+/*
+ * 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.
+ */
+
+public interface RepositoryMetadata extends ArtifactMetadata
+{
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/Session.java b/maven-core-api/src/main/java/org/apache/maven/api/Session.java
new file mode 100644
index 0000000..6fbc7cd
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/Session.java
@@ -0,0 +1,175 @@
+package org.apache.maven.api;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+import javax.annotation.concurrent.ThreadSafe;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import org.apache.maven.api.services.ArtifactDeployer;
+import org.apache.maven.api.services.ArtifactDeployerException;
+import org.apache.maven.api.services.ArtifactFactory;
+import org.apache.maven.api.services.ArtifactFactoryException;
+import org.apache.maven.api.services.ArtifactInstaller;
+import org.apache.maven.api.services.ArtifactInstallerException;
+import org.apache.maven.api.services.ArtifactResolver;
+import org.apache.maven.api.services.ArtifactResolverException;
+import org.apache.maven.api.services.ArtifactResolverResult;
+import org.apache.maven.api.services.DependencyCollector;
+import org.apache.maven.api.services.DependencyCollectorException;
+import org.apache.maven.api.services.DependencyCollectorResult;
+import org.apache.maven.api.services.DependencyFactory;
+import org.apache.maven.api.services.DependencyResolver;
+import org.apache.maven.api.services.DependencyResolverException;
+import org.apache.maven.api.services.DependencyResolverResult;
+import org.apache.maven.api.services.Service;
+
+/**
+ * The session to install / deploy / resolve artifacts and dependencies.
+ */
+@ThreadSafe
+public interface Session
+{
+
+    @Nonnull
+    LocalRepository getLocalRepository();
+
+    @Nonnull
+    List<RemoteRepository> getRemoteRepositories();
+
+    /**
+     * Retrieves the service for the interface
+     *
+     * @throws NoSuchElementException if the service could not be found
+     */
+    @Nonnull
+    <T extends Service> T getService( Class<T> clazz ) throws NoSuchElementException;
+
+    /**
+     * Creates a derived session using the given local repository.
+     *
+     * @param localRepository the new local repository
+     * @return the derived session
+     */
+    @Nonnull
+    Session withLocalRepository( @Nonnull LocalRepository localRepository );
+
+    /**
+     * Creates a derived session using the given remote repositories.
+     *
+     * @param repositories the new list of remote repositories
+     * @return the derived session
+     */
+    @Nonnull
+    Session withRemoteRepositories( @Nonnull List<RemoteRepository> repositories );
+
+    /**
+     * Shortcut for <code>getService(ArtifactFactory.class).create(...)</code>
+     */
+    default Artifact createArtifact( String groupId, String artifactId, String version, String type )
+            throws ArtifactFactoryException, IllegalArgumentException
+    {
+        return getService( ArtifactFactory.class )
+                .create( this, groupId, artifactId, version, type );
+    }
+
+    /**
+     * Shortcut for <code>getService(ArtifactResolver.class).resolve(...)</code>
+     */
+    default ArtifactResolverResult resolveArtifact( Artifact artifact )
+            throws ArtifactResolverException, IllegalArgumentException
+    {
+        return getService( ArtifactResolver.class )
+                .resolve( this, artifact );
+    }
+
+    /**
+     * Shortcut for <code>getService(ArtifactResolver.class).install(...)</code>
+     */
+    default void installArtifact( Artifact... artifacts )
+        throws ArtifactInstallerException, IllegalArgumentException
+    {
+        getService( ArtifactInstaller.class )
+                .install( this, Arrays.asList( artifacts ) );
+    }
+
+    /**
+     * Shortcut for <code>getService(ArtifactResolver.class).deploy(...)</code>
+     */
+    default void deployArtifact( RemoteRepository repository, Artifact... artifacts )
+        throws ArtifactDeployerException, IllegalArgumentException
+    {
+        getService( ArtifactDeployer.class )
+                .deploy( this, repository, Arrays.asList( artifacts ) );
+    }
+
+    /**
+     * Shortcut for <code>getService(DependencyFactory.class).create(...)</code>
+     */
+    default Dependency createDependency( Artifact artifact )
+    {
+        return getService( DependencyFactory.class )
+                .create( this, artifact );
+    }
+
+    /**
+     * Shortcut for <code>getService(DependencyCollector.class).collect(...)</code>
+     */
+    default DependencyCollectorResult collectDependencies( Artifact artifact )
+            throws DependencyCollectorException, IllegalArgumentException
+    {
+        return getService( DependencyCollector.class )
+                .collect( this, artifact );
+    }
+
+    /**
+     * Shortcut for <code>getService(DependencyCollector.class).collect(...)</code>
+     */
+    default DependencyCollectorResult collectDependencies( Project project )
+            throws DependencyCollectorException, IllegalArgumentException
+    {
+        return getService( DependencyCollector.class )
+                .collect( this, project );
+    }
+
+    /**
+     * Shortcut for <code>getService(DependencyCollector.class).collect(...)</code>
+     */
+    default DependencyCollectorResult collectDependencies( Dependency dependency )
+            throws DependencyCollectorException, IllegalArgumentException
+    {
+        return getService( DependencyCollector.class )
+                .collect( this, dependency );
+    }
+
+    /**
+     * Shortcut for <code>getService(DependencyResolver.class).resolve(...)</code>
+     */
+    default DependencyResolverResult resolveDependencies( Dependency dependency )
+            throws DependencyResolverException, IllegalArgumentException
+    {
+        return getService( DependencyResolver.class )
+                .resolve( this, dependency, null );
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployer.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployer.java
new file mode 100644
index 0000000..c78f1ad
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployer.java
@@ -0,0 +1,61 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import java.util.Collection;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.RemoteRepository;
+
+/**
+ * 
+ */
+public interface ArtifactDeployer extends Service
+{
+
+    /**
+     * @param request {@link ArtifactDeployerRequest}
+     * @throws ArtifactDeployerException in case of an error.
+     * @throws IllegalArgumentException in case of parameter <code>request</code> is <code>null</code> or parameter
+     *             <code>mavenArtifacts</code> is <code>null</code> or <code>mavenArtifacts.isEmpty()</code> is
+     *             <code>true</code>.
+     */
+    void deploy( ArtifactDeployerRequest request )
+        throws ArtifactDeployerException, IllegalArgumentException;
+
+    /**
+     * @param session the repository session
+     * @param repository the repository to deploy to
+     * @param artifacts the collection of artifacts to deploy
+     * @throws ArtifactDeployerException in case of an error.
+     * @throws IllegalArgumentException in case of parameter <code>request</code> is <code>null</code> or parameter
+     *             <code>artifacts</code> is <code>null</code> or <code>artifacts.isEmpty()</code> is
+     *             <code>true</code>.
+     */
+    default void deploy( Session session,
+                         RemoteRepository repository,
+                         Collection<Artifact> artifacts )
+        throws ArtifactDeployerException, IllegalArgumentException
+    {
+        deploy( ArtifactDeployerRequest.build( session, repository, artifacts ) );
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployerException.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployerException.java
new file mode 100644
index 0000000..a5ac23a
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployerException.java
@@ -0,0 +1,44 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+/**
+ * An artifact could not correctly being deployed.
+ * 
+ */
+public class ArtifactDeployerException
+    extends Exception
+{
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 7421964724059077698L;
+
+    /**
+     * @param message The message of the error.
+     * @param e {@link Exception}
+     */
+    public ArtifactDeployerException( String message, Exception e )
+    {
+        super( message, e );
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployerRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployerRequest.java
new file mode 100644
index 0000000..f3363eb
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployerRequest.java
@@ -0,0 +1,125 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+
+import java.util.Collection;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.RemoteRepository;
+
+/**
+ * A request for deploying one or more artifacts to a remote repository.
+ */
+public interface ArtifactDeployerRequest
+{
+
+    @Nonnull
+    Session getSession();
+
+    @Nonnull
+    RemoteRepository getRepository();
+
+    @Nonnull
+    Collection<Artifact> getArtifacts();
+
+    @Nonnull
+    static ArtifactDeployerRequestBuilder builder()
+    {
+        return new ArtifactDeployerRequestBuilder();
+    }
+
+    @Nonnull
+    static ArtifactDeployerRequest build( Session session, RemoteRepository repository, Collection<Artifact> artifacts )
+    {
+        return builder()
+                .session( session )
+                .repository( repository )
+                .artifacts( artifacts )
+                .build();
+    }
+
+    class ArtifactDeployerRequestBuilder
+    {
+        Session session;
+        RemoteRepository repository;
+        Collection<Artifact> artifacts;
+
+        @Nonnull
+        public ArtifactDeployerRequestBuilder session( Session session )
+        {
+            this.session = session;
+            return this;
+        }
+
+        @Nonnull
+        public ArtifactDeployerRequestBuilder repository( RemoteRepository repository )
+        {
+            this.repository = repository;
+            return this;
+        }
+
+        public ArtifactDeployerRequestBuilder artifacts( Collection<Artifact> artifacts )
+        {
+            this.artifacts = artifacts;
+            return this;
+        }
+
+        @Nonnull
+        public ArtifactDeployerRequest build()
+        {
+            return new DefaultArtifactDeployerRequest( session, repository, artifacts );
+        }
+
+        private static class DefaultArtifactDeployerRequest extends BaseRequest
+                implements ArtifactDeployerRequest
+        {
+
+            private final RemoteRepository repository;
+            private final Collection<Artifact> artifacts;
+
+            DefaultArtifactDeployerRequest( @Nonnull Session session,
+                                            @Nonnull RemoteRepository repository,
+                                            @Nonnull Collection<Artifact> artifacts )
+            {
+                super( session );
+                this.repository = requireNonNull( repository, "repository" );
+                this.artifacts = unmodifiable( artifacts, "artifacts" );
+            }
+
+            @Nonnull
+            @Override
+            public RemoteRepository getRepository()
+            {
+                return repository;
+            }
+
+            @Nonnull
+            @Override
+            public Collection<Artifact> getArtifacts()
+            {
+                return artifacts;
+            }
+        }
+
+    }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactory.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactory.java
new file mode 100644
index 0000000..2459409
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactory.java
@@ -0,0 +1,36 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+
+public interface ArtifactFactory extends Service
+{
+
+    Artifact create( ArtifactFactoryRequest request )
+            throws ArtifactFactoryException, IllegalArgumentException;
+
+    default Artifact create( Session session, String groupId, String artifactId, String version, String type )
+            throws ArtifactFactoryException, IllegalArgumentException
+    {
+        return create( ArtifactFactoryRequest.build( session, groupId, artifactId, version, type ) );
+    }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactoryException.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactoryException.java
new file mode 100644
index 0000000..ee2f7a0
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactoryException.java
@@ -0,0 +1,36 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+public class ArtifactFactoryException
+    extends RuntimeException
+{
+
+    public ArtifactFactoryException( String message )
+    {
+        super( message );
+    }
+
+    public ArtifactFactoryException( String message, Throwable cause )
+    {
+        super( message, cause );
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactoryRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactoryRequest.java
new file mode 100644
index 0000000..4bdf288
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactoryRequest.java
@@ -0,0 +1,183 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+
+import org.apache.maven.api.Session;
+
+public interface ArtifactFactoryRequest
+{
+
+    @Nonnull
+    Session getSession();
+
+    String getGroupId();
+
+    String getArtifactId();
+
+    String getVersion();
+
+    String getType();
+
+    String getExtension();
+
+    String getClassifier();
+
+    static ArtifactFactoryRequest build( Session session, String groupId, String artifactId,
+                                         String version, String type )
+    {
+        return ArtifactFactoryRequest.builder()
+                .session( session )
+                .groupId( groupId )
+                .artifactId( artifactId )
+                .version( version )
+                .type( type )
+                .build();
+    }
+
+    static ArtifactFactoryRequestBuilder builder()
+    {
+        return new ArtifactFactoryRequestBuilder();
+    }
+
+    class ArtifactFactoryRequestBuilder
+    {
+        private Session session;
+        private String groupId;
+        private String artifactId;
+        private String version;
+        private String type;
+        private String extension;
+        private String classifier;
+
+        public ArtifactFactoryRequestBuilder session( Session session )
+        {
+            this.session = session;
+            return this;
+        }
+
+        public ArtifactFactoryRequestBuilder groupId( String groupId )
+        {
+            this.groupId = groupId;
+            return this;
+        }
+
+        public ArtifactFactoryRequestBuilder artifactId( String artifactId )
+        {
+            this.artifactId = artifactId;
+            return this;
+        }
+
+        public ArtifactFactoryRequestBuilder version( String version )
+        {
+            this.version = version;
+            return this;
+        }
+
+        public ArtifactFactoryRequestBuilder type( String type )
+        {
+            this.type = type;
+            return this;
+        }
+
+        public ArtifactFactoryRequestBuilder extension( String extension )
+        {
+            this.extension = extension;
+            return this;
+        }
+
+        public ArtifactFactoryRequestBuilder classifier( String classifier )
+        {
+            this.classifier = classifier;
+            return this;
+        }
+
+        public ArtifactFactoryRequest build()
+        {
+            return new DefaultArtifactFactoryRequest( session, groupId, artifactId,
+                                                      version, type, extension, classifier );
+        }
+
+        private static class DefaultArtifactFactoryRequest extends BaseRequest implements ArtifactFactoryRequest
+        {
+            private final String groupId;
+            private final String artifactId;
+            private final String version;
+            private final String type;
+            private final String extension;
+            private final String classifier;
+
+            DefaultArtifactFactoryRequest( @Nonnull Session session,
+                                           String groupId,
+                                           String artifactId,
+                                           String version,
+                                           String type,
+                                           String extension,
+                                           String classifier )
+            {
+                super( session );
+                this.groupId = groupId;
+                this.artifactId = artifactId;
+                this.version = version;
+                this.type = type;
+                this.extension = extension;
+                this.classifier = classifier;
+            }
+
+            @Override
+            public String getGroupId()
+            {
+                return groupId;
+            }
+
+            @Override
+            public String getArtifactId()
+            {
+                return artifactId;
+            }
+
+            @Override
+            public String getVersion()
+            {
+                return version;
+            }
+
+            @Override
+            public String getType()
+            {
+                return type;
+            }
+
+            @Override
+            public String getExtension()
+            {
+                return extension;
+            }
+
+            @Override
+            public String getClassifier()
+            {
+                return classifier;
+            }
+        }
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstaller.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstaller.java
new file mode 100644
index 0000000..b440a28
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstaller.java
@@ -0,0 +1,71 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import java.util.Collection;
+import java.util.Collections;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+
+/**
+ * @author Robert Scholte
+ */
+public interface ArtifactInstaller extends Service
+{
+    /**
+     * @param request {@link ArtifactInstallerRequest}
+     * @throws ArtifactInstallerException in case of an error.
+     * @throws IllegalArgumentException in case <code>request</code> is <code>null</code>.
+     */
+    void install( ArtifactInstallerRequest request )
+        throws ArtifactInstallerException, IllegalArgumentException;
+
+    /**
+     * @param session the repository session
+     * @param artifact the {@link Artifact} to install
+     * @throws ArtifactInstallerException In case of an error which can be the a given artifact can not be found or the
+     *             installation has failed.
+     * @throws IllegalArgumentException in case of parameter <code>session</code> is <code>null</code> or
+     *          <code>artifact</code> is <code>null</code>.
+     */
+    default void install( Session session, Artifact artifact )
+            throws ArtifactInstallerException, IllegalArgumentException
+    {
+        install( session, Collections.singletonList( artifact ) );
+    }
+
+    /**
+     * @param session the repository session
+     * @param artifacts Collection of {@link Artifact MavenArtifacts}
+     * @throws ArtifactInstallerException In case of an error which can be the a given artifact can not be found or the
+     *             installation has failed.
+     * @throws IllegalArgumentException in case of parameter <code>request</code> is <code>null</code> or parameter
+     *             <code>localRepository</code> is <code>null</code> or <code>localRepository</code> is not a directory
+     *             or parameter <code>mavenArtifacts</code> is <code>null</code> or
+     *             <code>mavenArtifacts.isEmpty()</code> is <code>true</code>.
+     */
+    default void install( Session session, Collection<Artifact> artifacts )
+            throws ArtifactInstallerException
+    {
+        install( ArtifactInstallerRequest.build( session, artifacts ) );
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstallerException.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstallerException.java
new file mode 100644
index 0000000..77c3f20
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstallerException.java
@@ -0,0 +1,43 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+/**
+ * 
+ */
+public class ArtifactInstallerException
+    extends Exception
+{
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 3652561971360586373L;
+
+    /**
+     * @param message The message of the error.
+     * @param e {@link Exception}
+     */
+    public ArtifactInstallerException( String message, Exception e )
+    {
+        super( message, e );
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstallerRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstallerRequest.java
new file mode 100644
index 0000000..dd6874e
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstallerRequest.java
@@ -0,0 +1,103 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import java.util.Collection;
+import java.util.Collections;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+
+/**
+ * A request for installing one or more artifacts in the local repository.
+ */
+public interface ArtifactInstallerRequest
+{
+
+    @Nonnull
+    Session getSession();
+
+    @Nonnull
+    Collection<Artifact> getArtifacts();
+
+    static ArtifactInstallerRequestBuilder builder()
+    {
+        return new ArtifactInstallerRequestBuilder();
+    }
+
+    static ArtifactInstallerRequest build( Session session, Collection<Artifact> artifacts )
+    {
+        return builder()
+                .session( session )
+                .artifacts( artifacts )
+                .build();
+    }
+
+    class ArtifactInstallerRequestBuilder
+    {
+        Session session;
+        Collection<Artifact> artifacts = Collections.emptyList();
+
+        @Nonnull
+        public ArtifactInstallerRequestBuilder session( @Nonnull Session session )
+        {
+            this.session = session;
+            return this;
+        }
+
+        @Nonnull
+        public ArtifactInstallerRequestBuilder artifacts( @Nullable Collection<Artifact> artifacts )
+        {
+            this.artifacts = artifacts != null ? artifacts : Collections.emptyList();
+            return this;
+        }
+
+        @Nonnull
+        public ArtifactInstallerRequest build()
+        {
+            return new DefaultArtifactInstallerRequest( session, artifacts );
+        }
+
+        static class DefaultArtifactInstallerRequest extends BaseRequest
+                implements ArtifactInstallerRequest
+        {
+
+            private final Collection<Artifact> artifacts;
+
+            DefaultArtifactInstallerRequest( @Nonnull Session session,
+                                             @Nonnull Collection<Artifact> artifacts )
+            {
+                super( session );
+                this.artifacts = unmodifiable( artifacts, "artifacts" );
+            }
+
+            @Nonnull
+            @Override
+            public Collection<Artifact> getArtifacts()
+            {
+                return artifacts;
+            }
+        }
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactManager.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactManager.java
new file mode 100644
index 0000000..f96b014
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactManager.java
@@ -0,0 +1,46 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+
+import java.nio.file.Path;
+import java.util.Collection;
+import java.util.Optional;
+
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.ArtifactMetadata;
+
+public interface ArtifactManager extends Service
+{
+
+    /**
+     * Returns the path to the resolved file in the local repository
+     * if the artifact has been resolved.
+     *
+     * @return the path of the resolved artifact
+     */
+    @Nonnull
+    Optional<Path> getPath( Artifact artifact );
+
+    @Nonnull
+    Collection<ArtifactMetadata> getAttachedMetadatas( Artifact artifact );
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolver.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolver.java
new file mode 100644
index 0000000..25b6d13
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolver.java
@@ -0,0 +1,56 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+
+/**
+ * Resolves the artifact, i.e download the file when required and attach it to the artifact
+ */
+public interface ArtifactResolver extends Service
+{
+
+    /**
+     * @param request {@link ArtifactResolverRequest}
+     * @return {@link ArtifactResolverResult}
+     * @throws ArtifactResolverException in case of an error.
+     * @throws NullPointerException in case of parameter <code>buildingRequest</code> is <code>null</code> or
+     *             parameter <code>mavenArtifact</code> is <code>null</code>.
+     */
+    ArtifactResolverResult resolve( ArtifactResolverRequest request )
+            throws ArtifactResolverException, IllegalArgumentException;
+
+    /**
+     * @param session {@link Session}
+     * @param artifact {@link Artifact}
+     * @return {@link ArtifactResolverResult}
+     * @throws ArtifactResolverException in case of an error.
+     * @throws NullPointerException in case of parameter <code>buildingRequest</code> is <code>null</code> or
+     *             parameter <code>coordinate</code> is <code>null</code>.
+     */
+    default ArtifactResolverResult resolve( Session session,
+                                            Artifact artifact )
+            throws ArtifactResolverException, IllegalArgumentException
+    {
+        return resolve( ArtifactResolverRequest.build( session, artifact ) );
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverException.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverException.java
new file mode 100644
index 0000000..d243fc9
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverException.java
@@ -0,0 +1,40 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+/**
+ * 
+ */
+public class ArtifactResolverException
+    extends Exception
+{
+
+    private static final long serialVersionUID = 7252294837746943917L;
+
+    /**
+     * @param message The message for the exception.
+     * @param e The exception itself.
+     */
+    public ArtifactResolverException( String message, Exception e )
+    {
+        super( message, e );
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverRequest.java
new file mode 100644
index 0000000..b902d56
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverRequest.java
@@ -0,0 +1,101 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+
+import java.util.Objects;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+
+/**
+ * A request for resolving an artifact.
+ */
+public interface ArtifactResolverRequest
+{
+    @Nonnull
+    Session getSession();
+
+    @Nonnull
+    Artifact getArtifact();
+
+    @Nonnull
+    static ArtifactResolverRequestBuilder builder()
+    {
+        return new ArtifactResolverRequestBuilder();
+    }
+
+    @Nonnull
+    static ArtifactResolverRequest build( Session session, Artifact artifact )
+    {
+        return builder()
+                .session( session )
+                .artifact( artifact )
+                .build();
+    }
+
+    class ArtifactResolverRequestBuilder
+    {
+        Session session;
+        Artifact artifact;
+
+        @Nonnull
+        public ArtifactResolverRequestBuilder session( Session session )
+        {
+            this.session = session;
+            return this;
+        }
+
+        @Nonnull
+        public ArtifactResolverRequestBuilder artifact( Artifact artifact )
+        {
+            this.artifact = artifact;
+            return this;
+        }
+
+        @Nonnull
+        public ArtifactResolverRequest build()
+        {
+            return new DefaultArtifactResolverRequest( session, artifact );
+        }
+
+        private static class DefaultArtifactResolverRequest extends BaseRequest implements ArtifactResolverRequest
+        {
+            @Nonnull
+            private final Artifact artifact;
+
+            DefaultArtifactResolverRequest( @Nonnull Session session,
+                                            @Nonnull Artifact artifact )
+            {
+                super( session );
+                this.artifact = Objects.requireNonNull( artifact );
+            }
+
+            @Nonnull
+            @Override
+            public Artifact getArtifact()
+            {
+                return artifact;
+            }
+        }
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverResult.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverResult.java
new file mode 100644
index 0000000..9011405
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverResult.java
@@ -0,0 +1,37 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import org.apache.maven.api.Artifact;
+
+/**
+ * The Artifact Result
+ * 
+ * @author Robert Scholte
+ * @since 3.0
+ */
+public interface ArtifactResolverResult
+{
+    /**
+     * @return {@link Artifact}
+     */
+    Artifact getArtifact();
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/BaseRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/BaseRequest.java
new file mode 100644
index 0000000..c5eb047
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/BaseRequest.java
@@ -0,0 +1,66 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+import org.apache.maven.api.Session;
+
+/**
+ * Base class for requests.
+ */
+abstract class BaseRequest
+{
+
+    private final Session session;
+
+    protected BaseRequest( @Nonnull Session session )
+    {
+        this.session = requireNonNull( session, "session" );
+    }
+
+    @Nonnull
+    public Session getSession()
+    {
+        return session;
+    }
+
+    public static <T> T requireNonNull( T obj, String message )
+    {
+        if ( obj == null )
+        {
+            throw new IllegalArgumentException( message + " must mot be null" );
+        }
+        return obj;
+    }
+
+    protected static <T> Collection<T> unmodifiable( Collection<T> obj, String message )
+    {
+        if ( requireNonNull( obj, message ).isEmpty() )
+        {
+            throw new IllegalArgumentException( message + " must not be empty" );
+        }
+        return Collections.unmodifiableCollection( new ArrayList<>( obj ) );
+    }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollector.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollector.java
new file mode 100644
index 0000000..8c8cc53
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollector.java
@@ -0,0 +1,115 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Dependency;
+import org.apache.maven.api.Project;
+
+/**
+ * The DependencyCollector service can be used to collect dependencies
+ * for a given artifact and builds a graph of them.
+ * The dependencies collection mechanism will not download any artifacts,
+ * and only the pom files will be downloaded.
+ *
+ * @author Robert Scholte
+ * @author Guillaume Nodet
+ */
+public interface DependencyCollector extends Service
+{
+
+    /**
+     * Collects the transitive dependencies and builds a dependency graph.
+     * Note that this operation is only concerned about determining the coordinates of the
+     * transitive dependencies and does not actually resolve the artifact files.
+     *
+     * @param request The dependency collection request, must not be {@code null}.
+     * @return The collection result, never {@code null}.
+     * @throws DependencyCollectorException If the dependency tree could not be built.
+     *
+     * @see DependencyCollector#collect(Session, Project)
+     * @see DependencyCollector#collect(Session, Dependency)
+     * @see DependencyCollector#collect(Session, Artifact)
+     */
+    @Nonnull
+    DependencyCollectorResult collect( @Nonnull DependencyCollectorRequest request )
+            throws DependencyCollectorException, IllegalArgumentException;
+
+    /**
+     * Collects the transitive dependencies of some artifacts and builds a dependency graph. Note that this operation is
+     * only concerned about determining the coordinates of the transitive dependencies and does not actually resolve the
+     * artifact files.
+     *
+     * @param session The {@link Session}, must not be {@code null}.
+     * @param root The Maven Dependency, must not be {@code null}.
+     * @return The collection result, never {@code null}.
+     * @throws DependencyCollectorException If the dependency tree could not be built.
+     * @see #collect(DependencyCollectorRequest)
+     */
+    @Nonnull
+    default DependencyCollectorResult collect( @Nonnull Session session,
+                                               @Nonnull Dependency root )
+        throws DependencyCollectorException
+    {
+        return collect( DependencyCollectorRequest.build( session, root ) );
+    }
+
+    /**
+     * Collects the transitive dependencies of some artifacts and builds a dependency graph. Note that this operation is
+     * only concerned about determining the coordinates of the transitive dependencies and does not actually resolve the
+     * artifact files.
+     *
+     * @param session The {@link Session}, must not be {@code null}.
+     * @param project The {@link Project}, must not be {@code null}.
+     * @return The collection result, never {@code null}.
+     * @throws DependencyCollectorException If the dependency tree could not be built.
+     * @see #collect(DependencyCollectorRequest)
+     */
+    @Nonnull
+    default DependencyCollectorResult collect( @Nonnull Session session,
+                                               @Nonnull Project project )
+        throws DependencyCollectorException
+    {
+        return collect( DependencyCollectorRequest.build( session, project ) );
+    }
+
+    /**
+     * Collects the transitive dependencies of some artifacts and builds a dependency graph. Note that this operation is
+     * only concerned about determining the coordinates of the transitive dependencies and does not actually resolve the
+     * artifact files.
+     *
+     * @param session The {@link Session}, must not be {@code null}.
+     * @param artifact The {@link Artifact}, must not be {@code null}.
+     * @return The collection result, never {@code null}.
+     * @throws DependencyCollectorException If the dependency tree could not be built.
+     * @see #collect(DependencyCollectorRequest)
+     */
+    @Nonnull
+    default DependencyCollectorResult collect( @Nonnull Session session,
+                                               @Nonnull Artifact artifact )
+        throws DependencyCollectorException
+    {
+        return collect( DependencyCollectorRequest.build( session, artifact ) );
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorException.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorException.java
new file mode 100644
index 0000000..733e2f9
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorException.java
@@ -0,0 +1,42 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+/**
+ * Thrown in case of bad artifact descriptors, version ranges or other issues encountered during calculation of the
+ * dependency graph.
+ */
+public class DependencyCollectorException
+    extends Exception
+{
+    /**
+     *
+     */
+    private static final long serialVersionUID = -3134726259840210686L;
+
+    /**
+     * @param message The message you would give for the exception.
+     * @param cause The cause which is related to the message.
+     */
+    public DependencyCollectorException( String message, Throwable cause )
+    {
+        super( message, cause );
+    }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorRequest.java
new file mode 100644
index 0000000..d3e2aaa
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorRequest.java
@@ -0,0 +1,288 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+import org.apache.maven.api.Dependency;
+import org.apache.maven.api.Project;
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+
+/**
+ * A request to collect the transitive dependencies and to build a dependency graph from them. There are three ways to
+ * create a dependency graph. First, only the root dependency can be given. Second, a root dependency and direct
+ * dependencies can be specified in which case the specified direct dependencies are merged with the direct dependencies
+ * retrieved from the artifact descriptor of the root dependency. And last, only direct dependencies can be specified in
+ * which case the root node of the resulting graph has no associated dependency.
+ *
+ * @see DependencyCollector#collect(DependencyCollectorRequest)
+ */
+public interface DependencyCollectorRequest
+{
+
+    @Nonnull
+    Session getSession();
+
+    @Nonnull
+    Optional<Artifact> getRootArtifact();
+
+    @Nonnull
+    Optional<Dependency> getRoot();
+
+    @Nonnull
+    Collection<Dependency> getDependencies();
+
+    @Nonnull
+    Collection<Dependency> getManagedDependencies();
+
+    static DependencyCollectorRequest build( Session session, Artifact root )
+    {
+        BaseRequest.requireNonNull( session, "session" );
+        return builder()
+                .session( session )
+                .root( session.createDependency( root ) )
+                .build();
+    }
+
+    static DependencyCollectorRequest build( Session session, Dependency root )
+    {
+        return builder()
+                .session( session )
+                .root( root )
+                .build();
+    }
+
+    static DependencyCollectorRequest build( Session session, Project project )
+    {
+        BaseRequest.requireNonNull( session, "session" );
+        return builder()
+                .session( session )
+                .root( session.createDependency( project.getArtifact() ) )
+                .dependencies( project.getDependencies() )
+                .managedDependencies( project.getManagedDependencies() )
+                .build();
+    }
+
+    static DependencyCollectorRequestBuilder builder()
+    {
+        return new DependencyCollectorRequestBuilder();
+    }
+
+    class DependencyCollectorRequestBuilder
+    {
+
+        Session session;
+        Artifact rootArtifact;
+        Dependency root;
+        List<Dependency> dependencies = Collections.emptyList();
+        List<Dependency> managedDependencies = Collections.emptyList();
+
+        @Nonnull
+        public DependencyCollectorRequestBuilder session( @Nonnull Session session )
+        {
+            this.session = session;
+            return this;
+        }
+
+        /**
+         * Sets the root artifact for the dependency graph.
+         * This must not be confused with {@link #root(Dependency)}: The root <em>dependency</em>, like any
+         * other specified dependency, will be subject to dependency collection/resolution, i.e. should have an artifact
+         * descriptor and a corresponding artifact file. The root <em>artifact</em> on the other hand is only used
+         * as a label for the root node of the graph in case no root dependency was specified. As such, the configured
+         * root artifact is ignored if {@link #root(Dependency)} has been set.
+         *
+         * @param rootArtifact The root artifact for the dependency graph, may be {@code null}.
+         * @return This request for chaining, never {@code null}.
+         */
+        @Nonnull
+        public DependencyCollectorRequestBuilder rootArtifact( Artifact rootArtifact )
+        {
+            this.rootArtifact = rootArtifact;
+            return this;
+        }
+
+        /**
+         * @param root The root dependency
+         * @return This request for chaining, never {@code null}.
+         */
+        @Nonnull
+        public DependencyCollectorRequestBuilder root( @Nonnull Dependency root )
+        {
+            this.root = root;
+            return this;
+        }
+
+        /**
+         * Sets the direct dependencies. If both a root dependency and direct dependencies are given in the request, the
+         * direct dependencies from the request will be merged with the direct dependencies from the root dependency's
+         * artifact descriptor, giving higher priority to the dependencies from the request.
+         *
+         * @param dependencies The direct dependencies, may be {@code null}.
+         * @return This request for chaining, never {@code null}.
+         */
+        @Nonnull
+        public DependencyCollectorRequestBuilder dependencies( List<Dependency> dependencies )
+        {
+            this.dependencies = ( dependencies != null ) ? dependencies : Collections.emptyList();
+            return this;
+        }
+
+        /**
+         * Adds the specified direct dependency.
+         *
+         * @param dependency The dependency to add, may be {@code null}.
+         * @return This request for chaining, never {@code null}.
+         */
+        public DependencyCollectorRequestBuilder dependency( Dependency dependency )
+        {
+            if ( dependency != null )
+            {
+                if ( this.dependencies.isEmpty() )
+                {
+                    this.dependencies = new ArrayList<>();
+                }
+                this.dependencies.add( dependency );
+            }
+            return this;
+        }
+
+
+        /**
+         * Sets the dependency management to apply to transitive dependencies. To clarify, this management does not
+         * apply to
+         * the direct dependencies of the root node.
+         *
+         * @param managedDependencies The dependency management, may be {@code null}.
+         * @return This request for chaining, never {@code null}.
+         */
+        public DependencyCollectorRequestBuilder managedDependencies( List<Dependency> managedDependencies )
+        {
+            this.managedDependencies = ( managedDependencies != null ) ? managedDependencies : Collections.emptyList();
+            return this;
+        }
+
+        /**
+         * Adds the specified managed dependency.
+         *
+         * @param managedDependency The managed dependency to add, may be {@code null}.
+         * @return This request for chaining, never {@code null}.
+         */
+        public DependencyCollectorRequestBuilder managedDependency( Dependency managedDependency )
+        {
+            if ( managedDependency != null )
+            {
+                if ( this.managedDependencies.isEmpty() )
+                {
+                    this.managedDependencies = new ArrayList<>();
+                }
+                this.managedDependencies.add( managedDependency );
+            }
+            return this;
+        }
+
+        public DependencyCollectorRequest build()
+        {
+            return new DefaultDependencyCollectorRequest(
+                    session,
+                    rootArtifact,
+                    root,
+                    dependencies,
+                    managedDependencies );
+        }
+
+        static class DefaultDependencyCollectorRequest extends BaseRequest
+                implements DependencyCollectorRequest
+        {
+            private final Artifact rootArtifact;
+            private final Dependency root;
+            private final Collection<Dependency> dependencies;
+            private final Collection<Dependency> managedDependencies;
+
+
+            /**
+             * Creates a request with the specified properties.
+             *
+             * @param session      {@link Session}
+             * @param rootArtifact The root dependency whose transitive dependencies should be collected, may be {@code
+             *                     null}.
+             */
+            DefaultDependencyCollectorRequest(
+                    Session session,
+                    Artifact rootArtifact,
+                    Dependency root,
+                    Collection<Dependency> dependencies,
+                    Collection<Dependency> managedDependencies )
+            {
+                super( session );
+                this.rootArtifact = rootArtifact;
+                this.root = root;
+                this.dependencies = dependencies != null && !dependencies.isEmpty()
+                        ? unmodifiable( dependencies, "dependencies" ) : Collections.emptyList();
+                this.managedDependencies = managedDependencies != null && !managedDependencies.isEmpty()
+                        ? unmodifiable( managedDependencies, "managedDependencies" ) : Collections.emptyList();
+
+            }
+
+            @Nonnull
+            @Override
+            public Optional<Artifact> getRootArtifact()
+            {
+                return Optional.ofNullable( rootArtifact );
+            }
+
+            @Nonnull
+            @Override
+            public Optional<Dependency> getRoot()
+            {
+                return Optional.ofNullable( root );
+            }
+
+            @Nonnull
+            @Override
+            public Collection<Dependency> getDependencies()
+            {
+                return dependencies;
+            }
+
+            @Nonnull
+            @Override
+            public Collection<Dependency> getManagedDependencies()
+            {
+                return managedDependencies;
+            }
+
+            @Override
+            public String toString()
+            {
+                return getRoot() + " -> " + getDependencies();
+            }
+
+        }
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorResult.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorResult.java
new file mode 100644
index 0000000..6020bff
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorResult.java
@@ -0,0 +1,47 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import java.util.List;
+
+import org.apache.maven.api.Node;
+
+/**
+ * The result of a dependency collection request.
+ *
+ * @see DependencyCollector#collect(DependencyCollectorRequest)
+ */
+public interface DependencyCollectorResult
+{
+  /**
+   * Gets the exceptions that occurred while building the dependency graph.
+   *
+   * @return The exceptions that occurred, never {@code null}.
+   */
+  List<Exception> getExceptions();
+
+  /**
+   * Gets the root node of the dependency graph.
+   *
+   * @return The root node of the dependency graph or {@code null} if none.
+   */
+  Node getRoot();
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactory.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactory.java
new file mode 100644
index 0000000..50e5849
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactory.java
@@ -0,0 +1,37 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Dependency;
+
+public interface DependencyFactory extends Service
+{
+
+    Dependency create( DependencyFactoryRequest request )
+        throws DependencyFactoryException, IllegalArgumentException;
+
+    default Dependency create( Session session, Artifact artifact )
+        throws DependencyFactoryException, IllegalArgumentException
+    {
+        return create( DependencyFactoryRequest.build( session, artifact ) );
+    }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactoryException.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactoryException.java
new file mode 100644
index 0000000..5ca1d43
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactoryException.java
@@ -0,0 +1,36 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+public class DependencyFactoryException
+    extends RuntimeException
+{
+
+    public DependencyFactoryException( String message )
+    {
+        super( message );
+    }
+
+    public DependencyFactoryException( String message, Throwable cause )
+    {
+        super( message, cause );
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactoryRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactoryRequest.java
new file mode 100644
index 0000000..85b079d
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactoryRequest.java
@@ -0,0 +1,167 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Exclusion;
+
+public interface DependencyFactoryRequest
+{
+
+    @Nonnull
+    Session getSession();
+
+    Artifact getArtifact();
+
+    String getScope();
+
+    boolean isOptional();
+
+    @Nonnull
+    Collection<Exclusion> getExclusions();
+
+    static DependencyFactoryRequest build( Session session, Artifact artifact )
+    {
+        return builder()
+                .session( session )
+                .artifact( artifact )
+                .build();
+    }
+
+    static DependencyFactoryRequestBuilder builder()
+    {
+        return new DependencyFactoryRequestBuilder();
+    }
+
+    class DependencyFactoryRequestBuilder
+    {
+        private Session session;
+        private Artifact artifact;
+        private String scope;
+        private boolean optional;
+        private Collection<Exclusion> exclusions = Collections.emptyList();
+
+        public DependencyFactoryRequestBuilder session( Session session )
+        {
+            this.session = session;
+            return this;
+        }
+
+        public DependencyFactoryRequestBuilder artifact( Artifact artifact )
+        {
+            this.artifact = artifact;
+            return this;
+        }
+
+        public DependencyFactoryRequestBuilder scope( String scope )
+        {
+            this.scope = scope;
+            return this;
+        }
+
+        public DependencyFactoryRequestBuilder optional( boolean optional )
+        {
+            this.optional = optional;
+            return this;
+        }
+
+        public DependencyFactoryRequestBuilder exclusions( Collection<Exclusion> exclusions )
+        {
+            if ( exclusions != null )
+            {
+                if ( this.exclusions.isEmpty() )
+                {
+                    this.exclusions = new ArrayList<>();
+                }
+                this.exclusions.addAll( exclusions );
+            }
+            return this;
+        }
+
+        public DependencyFactoryRequestBuilder exclusion( Exclusion exclusion )
+        {
+            if ( exclusion != null )
+            {
+                if ( this.exclusions.isEmpty() )
+                {
+                    this.exclusions = new ArrayList<>();
+                }
+                this.exclusions.add( exclusion );
+            }
+            return this;
+        }
+
+        public DependencyFactoryRequest build()
+        {
+            return new DefaultDependencyFactoryRequest( session, artifact, scope, optional, exclusions );
+        }
+
+        private static class DefaultDependencyFactoryRequest extends BaseRequest implements DependencyFactoryRequest
+        {
+            private final Artifact artifact;
+            private final String scope;
+            private final boolean optional;
+            private final Collection<Exclusion> exclusions;
+
+            private DefaultDependencyFactoryRequest( @Nonnull Session session, Artifact artifact, String scope,
+                                                     boolean optional, Collection<Exclusion> exclusions )
+            {
+                super( session );
+                this.artifact = artifact;
+                this.scope = scope;
+                this.optional = optional;
+                this.exclusions = exclusions;
+            }
+
+            @Override
+            public Artifact getArtifact()
+            {
+                return artifact;
+            }
+
+            @Override
+            public String getScope()
+            {
+                return scope;
+            }
+
+            @Override
+            public boolean isOptional()
+            {
+                return optional;
+            }
+
+            @Nonnull
+            @Override
+            public Collection<Exclusion> getExclusions()
+            {
+                return exclusions;
+            }
+        }
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolver.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolver.java
new file mode 100644
index 0000000..c4549d5
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolver.java
@@ -0,0 +1,90 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import java.util.List;
+import java.util.function.Predicate;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Dependency;
+import org.apache.maven.api.Node;
+import org.apache.maven.api.Project;
+
+/**
+ * The DependencyResolver service can be used to collect the dependencies
+ * and download the artifacts.
+ *
+ * @author Robert Scholte
+ * @author Guillaume Nodet
+ */
+public interface DependencyResolver extends Service
+{
+    /**
+     * Collect dependencies and resolve the artifacts.
+     *
+     * @param request {@link DependencyResolverRequest}
+     * @return the resolved dependencies.
+     * @throws DependencyResolverException in case of an error.
+     */
+    DependencyResolverResult resolve( DependencyResolverRequest request )
+            throws DependencyResolverException;
+
+    /**
+     * This will resolve the dependencies of the coordinate, not resolving the artifact of the coordinate itself. If
+     * the coordinate needs to be resolved too, use
+     * {@link #resolveDependencies(Session, List, List, Predicate< Node >)} passing
+     * {@code Collections.singletonList(coordinate)}
+     *
+     * @param session The {@link Session}, must not be {@code null}.
+     * @param root {@link Dependency}
+     * @param filter {@link Predicate} used to eventually filter out some dependencies
+     *               when downloading (can be {@code null}).
+     * @return the resolved dependencies.
+     * @throws DependencyResolverException in case of an error.
+     */
+    default DependencyResolverResult resolve( Session session,
+                                              Dependency root,
+                                              Predicate<Node> filter )
+        throws DependencyResolverException
+    {
+        return resolve( DependencyResolverRequest.build( session, root, filter ) );
+    }
+
+    /**
+     * This will resolve the dependencies of the coordinate, not resolving the artifact of the coordinate itself. If
+     * the coordinate needs to be resolved too, use
+     * {@link #resolveDependencies(Session, List, List, Predicate< Node >)} passing
+     * {@code Collections.singletonList(coordinate)}
+     *
+     * @param session The {@link Session}, must not be {@code null}.
+     * @param project {@link Project}
+     * @param filter {@link Predicate< Node >} (can be {@code null}).
+     * @return the resolved dependencies.
+     * @throws DependencyResolverException in case of an error.
+     */
+    default DependencyResolverResult resolve( Session session,
+                                              Project project,
+                                              Predicate<Node> filter )
+        throws DependencyResolverException
+    {
+        return resolve( DependencyResolverRequest.build( session, project, filter ) );
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverException.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverException.java
new file mode 100644
index 0000000..77ee118
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverException.java
@@ -0,0 +1,54 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+/**
+ * The Exception class in case a resolving does not work.
+ */
+public class DependencyResolverException
+    extends Exception
+{
+    private static final long serialVersionUID = 5320065249974323888L;
+
+    /**
+     * @param cause The {@link Exception cause} of the problem.
+     */
+    protected DependencyResolverException( Exception cause )
+    {
+        super( cause );
+    }
+
+    /**
+     * @param message The message to give.
+     * @param e The {@link Exception}.
+     */
+    public DependencyResolverException( String message, Exception e )
+    {
+        super( message, e );
+    }
+
+    /**
+     * @return {@link DependencyResolverResult}
+     */
+    public DependencyResolverResult getResult()
+    {
+        return null;
+    }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverRequest.java
new file mode 100644
index 0000000..0f8c67c
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverRequest.java
@@ -0,0 +1,327 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.function.Predicate;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Dependency;
+import org.apache.maven.api.Node;
+import org.apache.maven.api.Project;
+
+/**
+ * A request to collect and resolve a dependency graph.
+ */
+public interface DependencyResolverRequest extends DependencyCollectorRequest
+{
+
+    @Nonnull
+    Optional<Predicate<Node>> getFilter();
+
+    @Nonnull
+    static DependencyResolverRequest build( @Nonnull Session session,
+                                            @Nonnull Artifact root )
+    {
+        return build( session, root , null );
+    }
+
+    @Nonnull
+    static DependencyResolverRequest build( @Nonnull Session session,
+                                            @Nonnull Artifact root,
+                                            @Nullable Predicate<Node> filter )
+    {
+        return builder()
+                .session( session )
+                .rootArtifact( root )
+                .filter( filter )
+                .build();
+    }
+
+    @Nonnull
+    static DependencyResolverRequest build( @Nonnull Session session,
+                                            @Nonnull Dependency root )
+    {
+        return build( session, root, null );
+    }
+
+    @Nonnull
+    static DependencyResolverRequest build( @Nonnull Session session,
+                                            @Nonnull Dependency root,
+                                            @Nullable Predicate<Node> filter )
+    {
+        return builder()
+                .session( session )
+                .root( root )
+                .filter( filter )
+                .build();
+    }
+
+    @Nonnull
+    static DependencyResolverRequest build( @Nonnull Session session,
+                                            @Nonnull Project project )
+    {
+        return build( session, project, null );
+    }
+
+    @Nonnull
+    static DependencyResolverRequest build( @Nonnull Session session,
+                                            @Nonnull Project project,
+                                            @Nullable Predicate<Node> filter )
+    {
+        BaseRequest.requireNonNull( session, "session" );
+        return builder()
+                .session( session )
+                .root( session.createDependency( project.getArtifact() ) )
+                .dependencies( project.getDependencies() )
+                .managedDependencies( project.getManagedDependencies() )
+                .filter( filter )
+                .build();
+    }
+
+    @Nonnull
+    static DependencyResolverRequestBuilder builder()
+    {
+        return new DependencyResolverRequestBuilder();
+    }
+
+    class DependencyResolverRequestBuilder 
+    {
+        Session session;
+        Artifact rootArtifact;
+        Dependency root;
+        List<Dependency> dependencies = Collections.emptyList();
+        List<Dependency> managedDependencies = Collections.emptyList();
+        Predicate<Node> filter;
+
+        @Nonnull
+        public DependencyResolverRequestBuilder session( @Nonnull Session session )
+        {
+            this.session = session;
+            return this;
+        }
+
+        /**
+         * Sets the root artifact for the dependency graph.
+         * This must not be confused with {@link #root(Dependency)}: The root <em>dependency</em>, like
+         * any other  specified dependency, will be subject to dependency collection/resolution, i.e. should have an
+         * artifact descriptor and a corresponding artifact file. The root <em>artifact</em> on the other hand is only
+         * used as a label for the root node of the graph in case no root dependency was specified. As such, the
+         * configured root artifact is ignored if {@link #root(Dependency)} has not been called.
+         *
+         * @param rootArtifact The root artifact for the dependency graph, may be {@code null}.
+         * @return This request for chaining, never {@code null}.
+         */
+        @Nonnull
+        public DependencyResolverRequestBuilder rootArtifact( Artifact rootArtifact )
+        {
+            this.rootArtifact = rootArtifact;
+            return this;
+        }
+
+        /**
+         *
+         * @param root The root dependency
+         * @return
+         */
+        @Nonnull
+        public DependencyResolverRequestBuilder root( @Nonnull Dependency root )
+        {
+            this.root = root;
+            return this;
+        }
+
+        /**
+         * Sets the direct dependencies. If both a root dependency and direct dependencies are given in the request, the
+         * direct dependencies from the request will be merged with the direct dependencies from the root dependency's
+         * artifact descriptor, giving higher priority to the dependencies from the request.
+         *
+         * @param dependencies The direct dependencies, may be {@code null}.
+         * @return This request for chaining, never {@code null}.
+         */
+        @Nonnull
+        public DependencyResolverRequestBuilder dependencies( List<Dependency> dependencies )
+        {
+            this.dependencies = ( dependencies != null ) ? dependencies : Collections.emptyList();
+            return this;
+        }
+
+        /**
+         * Adds the specified direct dependency.
+         *
+         * @param dependency The dependency to add, may be {@code null}.
+         * @return This request for chaining, never {@code null}.
+         */
+        @Nonnull
+        public DependencyResolverRequestBuilder dependency( Dependency dependency )
+        {
+            if ( dependency != null )
+            {
+                if ( this.dependencies.isEmpty() )
+                {
+                    this.dependencies = new ArrayList<>();
+                }
+                this.dependencies.add( dependency );
+            }
+            return this;
+        }
+
+
+        /**
+         * Sets the dependency management to apply to transitive dependencies. To clarify, this management does not
+         * apply to
+         * the direct dependencies of the root node.
+         *
+         * @param managedDependencies The dependency management, may be {@code null}.
+         * @return This request for chaining, never {@code null}.
+         */
+        @Nonnull
+        public DependencyResolverRequestBuilder managedDependencies( List<Dependency> managedDependencies )
+        {
+            this.managedDependencies = ( managedDependencies != null ) ? managedDependencies : Collections.emptyList();
+            return this;
+        }
+
+        /**
+         * Adds the specified managed dependency.
+         *
+         * @param managedDependency The managed dependency to add, may be {@code null}.
+         * @return This request for chaining, never {@code null}.
+         */
+        @Nonnull
+        public DependencyResolverRequestBuilder managedDependency( Dependency managedDependency )
+        {
+            if ( managedDependency != null )
+            {
+                if ( this.managedDependencies.isEmpty() )
+                {
+                    this.managedDependencies = new ArrayList<>();
+                }
+                this.managedDependencies.add( managedDependency );
+            }
+            return this;
+        }
+
+        @Nonnull
+        public DependencyResolverRequestBuilder filter( Predicate<Node> filter )
+        {
+            this.filter = filter;
+            return this;
+        }
+
+        @Nonnull
+        public DependencyResolverRequest build()
+        {
+            return new DefaultDependencyResolverRequest(
+                    session,
+                    rootArtifact,
+                    root,
+                    dependencies,
+                    managedDependencies,
+                    filter );
+        }
+
+        private static class DefaultDependencyResolverRequest extends BaseRequest
+                implements DependencyResolverRequest
+        {
+            private final Artifact rootArtifact;
+            private final Dependency root;
+            private final Collection<Dependency> dependencies;
+            private final Collection<Dependency> managedDependencies;
+            private final Predicate<Node> filter;
+
+
+            /**
+             * Creates a request with the specified properties.
+             *
+             * @param session      {@link Session}
+             * @param rootArtifact The root dependency whose transitive dependencies should be collected, may be {@code
+             *                     null}.
+             */
+            DefaultDependencyResolverRequest(
+                    @Nonnull Session session,
+                    @Nullable Artifact rootArtifact,
+                    @Nullable Dependency root,
+                    @Nullable Collection<Dependency> dependencies,
+                    @Nullable Collection<Dependency> managedDependencies,
+                    @Nullable Predicate<Node> filter )
+            {
+                super( session );
+                this.rootArtifact = rootArtifact;
+                this.root = root;
+                this.dependencies = dependencies != null && !dependencies.isEmpty()
+                        ? unmodifiable( dependencies, "dependencies" ) : Collections.emptyList();
+                this.managedDependencies = managedDependencies != null && !managedDependencies.isEmpty()
+                        ? unmodifiable( managedDependencies, "managedDependencies" ) : Collections.emptyList();
+                this.filter = filter;
+            }
+
+            @Nonnull
+            @Override
+            public Optional<Artifact> getRootArtifact()
+            {
+                return Optional.ofNullable( rootArtifact );
+            }
+
+            @Nonnull
+            @Override
+            public Optional<Dependency> getRoot()
+            {
+                return Optional.ofNullable( root );
+            }
+
+            @Nonnull
+            @Override
+            public Collection<Dependency> getDependencies()
+            {
+                return dependencies;
+            }
+
+            @Nonnull
+            @Override
+            public Collection<Dependency> getManagedDependencies()
+            {
+                return managedDependencies;
+            }
+
+            @Nonnull
+            @Override
+            public Optional<Predicate<Node>> getFilter()
+            {
+                return Optional.ofNullable( filter );
+            }
+
+            @Override
+            public String toString()
+            {
+                return getRoot() + " -> " + getDependencies();
+            }
+
+        }
+    }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverResult.java b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverResult.java
new file mode 100644
index 0000000..ff24cf6
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverResult.java
@@ -0,0 +1,44 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import java.util.List;
+
+import org.apache.maven.api.Node;
+
+/**
+ * 
+ * @author Robert Scholte
+ *
+ */
+public interface DependencyResolverResult
+{
+    /**
+     * Gets the exceptions that occurred while building the dependency graph.
+     * 
+     * @return The list of exceptions {@link Exception}.
+     */
+    List<Exception> getCollectorExceptions();
+
+    Node getRoot();
+
+    List<ArtifactResolverResult> getArtifactResults();
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilder.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilder.java
new file mode 100644
index 0000000..58d479c
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilder.java
@@ -0,0 +1,57 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+
+import java.nio.file.Path;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+
+public interface ProjectBuilder extends Service
+{
+
+    @Nonnull
+    ProjectBuilderResult build( ProjectBuilderRequest request )
+        throws ProjectBuilderException, IllegalArgumentException;
+
+    @Nonnull
+    default ProjectBuilderResult build( @Nonnull Session session, @Nonnull ProjectBuilderSource source )
+            throws ProjectBuilderException, IllegalArgumentException
+    {
+        return build( ProjectBuilderRequest.build( session, source ) );
+    }
+
+    @Nonnull
+    default ProjectBuilderResult build( @Nonnull Session session, @Nonnull Path path )
+            throws ProjectBuilderException, IllegalArgumentException
+    {
+        return build( ProjectBuilderRequest.build( session, path ) );
+    }
+
+    @Nonnull
+    default ProjectBuilderResult build( @Nonnull Session session, @Nonnull Artifact artifact )
+            throws ProjectBuilderException, IllegalArgumentException
+    {
+        return build( ProjectBuilderRequest.build( session, artifact ) );
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderException.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderException.java
new file mode 100644
index 0000000..a71c5e7
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderException.java
@@ -0,0 +1,37 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+/**
+ * The Exception class in case a resolving does not work.
+ */
+public class ProjectBuilderException
+    extends Exception
+{
+    /**
+     * @param message The message to give.
+     * @param e The {@link Exception}.
+     */
+    public ProjectBuilderException( String message, Exception e )
+    {
+        super( message, e );
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderProblem.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderProblem.java
new file mode 100644
index 0000000..af9dc47
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderProblem.java
@@ -0,0 +1,101 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+/**
+ * Describes a problem that was encountered during settings building. A problem can either be an exception that was
+ * thrown or a simple string message. In addition, a problem carries a hint about its source, e.g. the settings file
+ * that exhibits the problem.
+ *
+ * @author Benjamin Bentmann
+ * @author Robert Scholte
+ */
+public interface ProjectBuilderProblem
+{
+
+    /**
+     * The different severity levels for a problem, in decreasing order.
+     */
+    enum Severity
+    {
+
+        FATAL, //
+        ERROR, //
+        WARNING //
+
+    }
+
+    /**
+     * Gets the hint about the source of the problem. While the syntax of this hint is unspecified and depends on the
+     * creator of the problem, the general expectation is that the hint provides sufficient information to the user to
+     * track the problem back to its origin. A concrete example for such a source hint can be the file path or URL from
+     * which the settings were read.
+     *
+     * @return The hint about the source of the problem or an empty string if unknown, never {@code null}.
+     */
+    String getSource();
+
+    /**
+     * Gets the one-based index of the line containing the problem. The line number should refer to some text file that
+     * is given by {@link #getSource()}.
+     *
+     * @return The one-based index of the line containing the problem or a non-positive value if unknown.
+     */
+    int getLineNumber();
+
+    /**
+     * Gets the one-based index of the column containing the problem. The column number should refer to some text file
+     * that is given by {@link #getSource()}.
+     *
+     * @return The one-based index of the column containing the problem or non-positive value if unknown.
+     */
+    int getColumnNumber();
+
+    /**
+     * Gets the location of the problem. The location is a user-friendly combination of the values from
+     * {@link #getSource()}, {@link #getLineNumber()} and {@link #getColumnNumber()}. The exact syntax of the returned
+     * value is undefined.
+     *
+     * @return The location of the problem, never {@code null}.
+     */
+    String getLocation();
+
+    /**
+     * Gets the exception that caused this problem (if any).
+     *
+     * @return The exception that caused this problem or {@code null} if not applicable.
+     */
+    Exception getException();
+
+    /**
+     * Gets the message that describes this problem.
+     *
+     * @return The message describing this problem, never {@code null}.
+     */
+    String getMessage();
+
+    /**
+     * Gets the severity level of this problem.
+     *
+     * @return The severity level of this problem, never {@code null}.
+     */
+    Severity getSeverity();
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderRequest.java
new file mode 100644
index 0000000..2c36c56
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderRequest.java
@@ -0,0 +1,218 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import java.nio.file.Path;
+import java.util.Optional;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+
+public interface ProjectBuilderRequest
+{
+
+    @Nonnull
+    Session getSession();
+
+    @Nonnull
+    Optional<Path> getPath();
+
+    @Nonnull
+    Optional<ProjectBuilderSource> getSource();
+
+    @Nonnull
+    Optional<Artifact> getArtifact();
+
+    boolean isAllowStubModel();
+
+    boolean isRecursive();
+
+    boolean isProcessPlugins();
+
+    boolean isResolveDependencies();
+
+    @Nonnull
+    static ProjectBuilderRequest build( @Nonnull Session session, @Nonnull ProjectBuilderSource source )
+    {
+        return builder()
+                .session( session )
+                .source( source )
+                .build();
+    }
+
+    @Nonnull
+    static ProjectBuilderRequest build( @Nonnull Session session, @Nonnull Path path )
+    {
+        return builder()
+                .session( session )
+                .path( path )
+                .build();
+    }
+
+    @Nonnull
+    static ProjectBuilderRequest build( @Nonnull Session session, @Nonnull Artifact artifact )
+    {
+        return builder()
+                .session( session )
+                .artifact( artifact )
+                .build();
+    }
+
+    @Nonnull
+    static ProjectBuilderRequestBuilder builder()
+    {
+        return new ProjectBuilderRequestBuilder();
+    }
+
+    class ProjectBuilderRequestBuilder
+    {
+        Session session;
+        Path path;
+        ProjectBuilderSource source;
+        Artifact artifact;
+        boolean allowStubModel;
+        boolean recursive;
+        boolean processPlugins = true;
+        boolean resolveDependencies = true;
+
+        public ProjectBuilderRequestBuilder session( Session session )
+        {
+            this.session = session;
+            return this;
+        }
+
+        public ProjectBuilderRequestBuilder path( Path path )
+        {
+            this.path = path;
+            return this;
+        }
+
+        public ProjectBuilderRequestBuilder source( ProjectBuilderSource source )
+        {
+            this.source = source;
+            return this;
+        }
+
+        public ProjectBuilderRequestBuilder artifact( Artifact artifact )
+        {
+            this.artifact = artifact;
+            return this;
+        }
+
+        public ProjectBuilderRequestBuilder processPlugins( boolean processPlugins )
+        {
+            this.processPlugins = processPlugins;
+            return this;
+        }
+
+        public ProjectBuilderRequestBuilder resolveDependencies( boolean resolveDependencies )
+        {
+            this.resolveDependencies = resolveDependencies;
+            return this;
+        }
+
+        public ProjectBuilderRequest build()
+        {
+            return new DefaultProjectBuilderRequest( session, path, source, artifact,
+                    allowStubModel, recursive, processPlugins, resolveDependencies );
+        }
+
+        private static class DefaultProjectBuilderRequest extends BaseRequest
+            implements ProjectBuilderRequest
+        {
+            private final Path path;
+            private final ProjectBuilderSource source;
+            private final Artifact artifact;
+            private final boolean allowStubModel;
+            private final boolean recursive;
+            private final boolean processPlugins;
+            private final boolean resolveDependencies;
+
+            @SuppressWarnings( "checkstyle:ParameterNumber" )
+            DefaultProjectBuilderRequest( @Nonnull Session session,
+                                          @Nullable Path path,
+                                          @Nullable ProjectBuilderSource source,
+                                          @Nullable Artifact artifact,
+                                          boolean allowStubModel,
+                                          boolean recursive,
+                                          boolean processPlugins,
+                                          boolean resolveDependencies )
+            {
+                super( session );
+                this.path = path;
+                this.source = source;
+                this.artifact = artifact;
+                this.allowStubModel = allowStubModel;
+                this.recursive = recursive;
+                this.processPlugins = processPlugins;
+                this.resolveDependencies = resolveDependencies;
+            }
+
+            @Nonnull
+            @Override
+            public Optional<Path> getPath()
+            {
+                return Optional.ofNullable( path );
+            }
+
+            @Nonnull
+            @Override
+            public Optional<ProjectBuilderSource> getSource()
+            {
+                return Optional.ofNullable( source );
+            }
+
+            @Nonnull
+            @Override
+            public Optional<Artifact> getArtifact()
+            {
+                return Optional.ofNullable( artifact );
+            }
+
+            @Override
+            public boolean isAllowStubModel()
+            {
+                return allowStubModel;
+            }
+
+            @Override
+            public boolean isRecursive()
+            {
+                return recursive;
+            }
+
+            @Override
+            public boolean isProcessPlugins()
+            {
+                return processPlugins;
+            }
+
+            @Override
+            public boolean isResolveDependencies()
+            {
+                return resolveDependencies;
+            }
+        }
+
+    }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderResult.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderResult.java
new file mode 100644
index 0000000..6476a85
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderResult.java
@@ -0,0 +1,76 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+
+import java.nio.file.Path;
+import java.util.Collection;
+import java.util.Optional;
+
+import org.apache.maven.api.Project;
+
+public interface ProjectBuilderResult
+{
+
+    /**
+     * Gets the identifier of the project that could not be built. The general format of the identifier is {@code
+     * <groupId>:<artifactId>:<version>} but some of these coordinates may still be unknown at the point the exception
+     * is thrown so this information is merely meant to assist the user.
+     *
+     * @return The identifier of the project or an empty string if not known, never {@code null}.
+     */
+    @Nonnull
+    String getProjectId();
+
+    /**
+     * Gets the POM file from which the project was built.
+     *
+     * @return The optional POM file.
+     */
+    @Nonnull
+    Optional<Path> getPomFile();
+
+    /**
+     * Gets the project that was built.
+     *
+     * @return The project that was built or {@code null} if an error occurred and this result accompanies a
+     *         {@link ProjectBuilderException}.
+     */
+    @Nonnull
+    Optional<Project> getProject();
+
+    /**
+     * Gets the problems that were encountered during the project building.
+     *
+     * @return The problems that were encountered during the project building, can be empty but never {@code null}.
+     */
+    @Nonnull
+    Collection<ProjectBuilderProblem> getProblems();
+
+    /**
+     * Gets the result of the dependency resolution for the project.
+     *
+     * @return The result of the dependency resolution for the project.
+     */
+    @Nonnull
+    Optional<DependencyResolverResult> getDependencyResolverResult();
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderSource.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderSource.java
new file mode 100644
index 0000000..fd8c50d
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderSource.java
@@ -0,0 +1,30 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+
+public interface ProjectBuilderSource
+{
+    InputStream getInputStream() throws IOException;
+
+    String getLocation();
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployer.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployer.java
new file mode 100644
index 0000000..8fc5281
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployer.java
@@ -0,0 +1,68 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Project;
+
+/**
+ * This defines the interface to deploy a single Maven Project.
+ * 
+ * @author Karl Heinz Marbaise <a href="mailto:khmarbaise@apache.org">khmarbaise@apache.org</a>
+ */
+public interface ProjectDeployer extends Service
+{
+    /**
+     * This will deploy a single project which may contain several artifacts. Those artifacts will be deployed into the
+     * appropriate remote repository.
+     * 
+     * <pre class="java">
+     *  &#64;Parameter( defaultValue = "${session}", required = true, readonly = true )
+     *  MavenSession session;
+     *  &#64;Parameter( defaultValue = "${project}", required = true, readonly = true )
+     *  MavenProject project;
+     *  ..
+     *  &#64;Component
+     *  ProjectDeployer deployer;
+     *  ...
+     *  public void execute()
+     *  {
+     *    ProjectDeployerRequest pdr = 
+     *      new ProjectDeployerRequest()
+     *        .setProject( project );
+     *  
+     *    deployer.deploy( session.getProjectBuildingRequest(), pdr, artifactRepository );
+     *  }
+     * </pre>
+     * 
+     * @param request {@link ProjectDeployerRequest}
+     * @throws ProjectDeployerException in case of artifact could not correctly deployed.
+     * @throws IllegalArgumentException in case <code>buildingRequest</code> is <code>null</code>, <code>request</code>
+     *             is <code>null</code> or <code>artifactRepository</code> is <code>null</code>.
+     */
+    void deploy( ProjectDeployerRequest request )
+        throws ProjectDeployerException, IllegalArgumentException;
+
+    default void deploy( Session session, Project project )
+            throws ProjectDeployerException, IllegalArgumentException
+    {
+        deploy( ProjectDeployerRequest.build( session, project ) );
+    }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployerException.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployerException.java
new file mode 100644
index 0000000..0884364
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployerException.java
@@ -0,0 +1,37 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+/**
+ * The Exception class in case a resolving does not work.
+ */
+public class ProjectDeployerException
+    extends Exception
+{
+    /**
+     * @param message The message to give.
+     * @param e The {@link Exception}.
+     */
+    public ProjectDeployerException( String message, Exception e )
+    {
+        super( message, e );
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployerRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployerRequest.java
new file mode 100644
index 0000000..27eeffc
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployerRequest.java
@@ -0,0 +1,142 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Project;
+import org.apache.maven.api.RemoteRepository;
+
+public interface ProjectDeployerRequest
+{
+    @Nonnull
+    Session getSession();
+
+    @Nonnull
+    Project getProject();
+
+    @Nonnull
+    RemoteRepository getRepository();
+
+    int getRetryFailedDeploymentCount();
+
+//    @Nonnull
+//    Optional<String> getAltDeploymentRepository();
+
+//    @Nonnull
+//    Optional<String> getAltSnapshotDeploymentRepository();
+
+//    @Nonnull
+//    Optional<String> getAltReleaseDeploymentRepository();
+
+    static ProjectDeployerRequest build( Session session, Project project )
+    {
+        return builder()
+                .session( session )
+                .project( project )
+                .build();
+    }
+
+    static ProjectDeployerRequestBuilder builder()
+    {
+        return new ProjectDeployerRequestBuilder();
+    }
+
+    class ProjectDeployerRequestBuilder
+    {
+        Session session;
+        Project project;
+        RemoteRepository repository;
+        int retryFailedDeploymentCount;
+
+        @Nonnull
+        public ProjectDeployerRequestBuilder session( @Nonnull Session session )
+        {
+            this.session = session;
+            return this;
+        }
+
+        @Nonnull
+        public ProjectDeployerRequestBuilder project( @Nonnull Project project )
+        {
+            this.project = project;
+            return this;
+        }
+
+        @Nonnull
+        public ProjectDeployerRequestBuilder repository( @Nonnull RemoteRepository repository )
+        {
+            this.repository = repository;
+            return this;
+        }
+
+        @Nonnull
+        public ProjectDeployerRequestBuilder retryFailedDeploymentCount( int retryFailedDeploymentCount )
+        {
+            this.retryFailedDeploymentCount = retryFailedDeploymentCount;
+            return this;
+        }
+
+        public ProjectDeployerRequest build()
+        {
+            return new DefaultProjectDeployerRequest( session, project, repository, retryFailedDeploymentCount );
+        }
+
+        private static class DefaultProjectDeployerRequest extends BaseRequest
+                implements ProjectDeployerRequest
+        {
+            private final Project project;
+            private final RemoteRepository repository;
+            private final int retryFailedDeploymentCount;
+
+            DefaultProjectDeployerRequest( @Nonnull Session session,
+                                           @Nonnull Project project,
+                                           @Nonnull RemoteRepository repository,
+                                           int retryFailedDeploymentCount )
+            {
+                super( session );
+                this.project = requireNonNull( project, "project" );
+                this.repository = requireNonNull( repository, "repository" );
+                this.retryFailedDeploymentCount = retryFailedDeploymentCount;
+            }
+
+            @Nonnull
+            @Override
+            public Project getProject()
+            {
+                return project;
+            }
+
+            @Nonnull
+            @Override
+            public RemoteRepository getRepository()
+            {
+                return repository;
+            }
+
+            @Override
+            public int getRetryFailedDeploymentCount()
+            {
+                return retryFailedDeploymentCount;
+            }
+        }
+    }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstaller.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstaller.java
new file mode 100644
index 0000000..0095bed
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstaller.java
@@ -0,0 +1,79 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Project;
+
+/**
+ * This defines the interface to install a single Maven Project.
+ * 
+ * @author Karl Heinz Marbaise <a href="mailto:khmarbaise@apache.org">khmarbaise@apache.org</a>
+ */
+public interface ProjectInstaller extends Service
+{
+    /**
+     * This will install a single project which may contain several artifacts. Those artifacts will be installed into
+     * the appropriate repository.
+     * 
+     * <pre class="java">
+     *  &#64;Parameter( defaultValue = "${session}", required = true, readonly = true )
+     *  private MavenSession session;
+     *  &#64;Parameter( defaultValue = "${project}", required = true, readonly = true )
+     *  private MavenProject project;
+     *  ..
+     *  &#64;Component
+     *  private ProjectInstaller installer;
+     *  ...
+     *  public void execute()
+     *  {
+     *    ProjectInstallerRequest pir =
+     *      new ProjectInstallerRequest()
+     *         .setProject( mavenProject );
+     * 
+     *    installer.install( session.getProjectBuildingRequest(), pir );
+     *  }
+     * </pre>
+     * 
+     * To set a different local repository than the current one in the Maven session, you can inject an instance of the
+     * <code>RepositoryManager</code> and set the path to the local repository, called <code>localRepositoryPath</code>,
+     * as such:
+     * 
+     * <pre class="java">
+     * &#64;Component
+     * private RepositoryManager repositoryManager;
+     * 
+     * buildingRequest = repositoryManager.setLocalRepositoryBasedir( buildingRequest, localRepositoryPath );
+     * </pre>
+     * 
+     * @param request {@link ProjectInstallerRequest}
+     * @throws ProjectInstallerException In case of problems to install artifacts.
+     * @throws IllegalArgumentException in case of parameter <code>projectBuildingRequest</code> is <code>null</code> or
+     *             parameter <code>projectInstallerRequest</code> is <code>null</code>.
+     */
+    void install( ProjectInstallerRequest request )
+        throws ProjectInstallerException, IllegalArgumentException;
+
+    default void install( Session session, Project project )
+        throws ProjectInstallerException, IllegalArgumentException
+    {
+        install( ProjectInstallerRequest.build( session, project ) );
+    }
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstallerException.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstallerException.java
new file mode 100644
index 0000000..1aaf536
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstallerException.java
@@ -0,0 +1,37 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+/**
+ * The Exception class in case a resolving does not work.
+ */
+public class ProjectInstallerException
+    extends Exception
+{
+    /**
+     * @param message The message to give.
+     * @param e The {@link Exception}.
+     */
+    public ProjectInstallerException( String message, Exception e )
+    {
+        super( message, e );
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstallerRequest.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstallerRequest.java
new file mode 100644
index 0000000..ca545b8
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstallerRequest.java
@@ -0,0 +1,101 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Project;
+
+/**
+ * @author Guillaume Nodet
+ */
+
+public interface ProjectInstallerRequest
+{
+
+    @Nonnull
+    Session getSession();
+
+    @Nonnull
+    Project getProject();
+
+    @Nonnull
+    static ProjectInstallerRequest build( @Nonnull Session session, @Nonnull Project project )
+    {
+        return builder()
+                .session( session )
+                .project( project )
+                .build();
+    }
+
+    @Nonnull
+    static ProjectInstallerRequestBuilder builder()
+    {
+        return new ProjectInstallerRequestBuilder();
+    }
+
+    class ProjectInstallerRequestBuilder
+    {
+        Session session;
+        Project project;
+
+        @Nonnull
+        public ProjectInstallerRequestBuilder session( Session session )
+        {
+            this.session = session;
+            return this;
+        }
+
+        @Nonnull
+        public ProjectInstallerRequestBuilder project( Project project )
+        {
+            this.project = project;
+            return this;
+        }
+
+        @Nonnull
+        public ProjectInstallerRequest build()
+        {
+            return new DefaultProjectInstallerRequest( session, project );
+        }
+
+        private static class DefaultProjectInstallerRequest extends BaseRequest
+                implements ProjectInstallerRequest
+        {
+
+            final Project project;
+
+            DefaultProjectInstallerRequest( @Nonnull Session session, @Nonnull Project project )
+            {
+                super( session );
+                this.project = requireNonNull( project, "project" );
+            }
+
+            @Nonnull
+            @Override
+            public Project getProject()
+            {
+                return project;
+            }
+        }
+    }
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectManager.java b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectManager.java
new file mode 100644
index 0000000..494882a
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/ProjectManager.java
@@ -0,0 +1,48 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+
+import java.nio.file.Path;
+import java.util.Collection;
+import java.util.Optional;
+
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Project;
+
+/**
+ * Interface to manage the project during its lifecycle
+ */
+public interface ProjectManager extends Service
+{
+    /**
+     * Returns the path to the resolved file in the local repository
+     * if the artifact has been resolved.
+     *
+     * @return the path of the resolved artifact
+     */
+    @Nonnull
+    Optional<Path> getPath( Project project );
+
+    @Nonnull
+    Collection<Artifact> getAttachedArtifacts( Project project );
+
+}
diff --git a/maven-core-api/src/main/java/org/apache/maven/api/services/Service.java b/maven-core-api/src/main/java/org/apache/maven/api/services/Service.java
new file mode 100644
index 0000000..d43da3a
--- /dev/null
+++ b/maven-core-api/src/main/java/org/apache/maven/api/services/Service.java
@@ -0,0 +1,27 @@
+package org.apache.maven.api.services;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.concurrent.ThreadSafe;
+
+@ThreadSafe
+public interface Service
+{
+}
diff --git a/maven-core-impl/pom.xml b/maven-core-impl/pom.xml
new file mode 100644
index 0000000..df573ad
--- /dev/null
+++ b/maven-core-impl/pom.xml
@@ -0,0 +1,72 @@
+<?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/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.maven</groupId>
+    <artifactId>maven</artifactId>
+    <version>4.0.0-alpha-1-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>maven-core-api-impl</artifactId>
+  <name>Apache Maven Core API Implementation</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-core-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-core</artifactId>
+    </dependency>
+
+    <!-- Testing -->
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-testing</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.resolver</groupId>
+      <artifactId>maven-resolver-impl</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.resolver</groupId>
+      <artifactId>maven-resolver-connector-basic</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.resolver</groupId>
+      <artifactId>maven-resolver-transport-http</artifactId>
+      <version>${resolverVersion}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.resolver</groupId>
+      <artifactId>maven-resolver-transport-file</artifactId>
+      <version>${resolverVersion}</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifact.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifact.java
new file mode 100644
index 0000000..5f5917c
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifact.java
@@ -0,0 +1,101 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+
+import java.io.File;
+import java.nio.file.Path;
+import java.util.Objects;
+import java.util.Optional;
+
+import org.apache.maven.api.Artifact;
+
+public class DefaultArtifact implements Artifact
+{
+    private final DefaultSession session;
+    private final org.eclipse.aether.artifact.Artifact artifact;
+
+    public DefaultArtifact( @Nonnull DefaultSession session, @Nonnull org.eclipse.aether.artifact.Artifact artifact )
+    {
+        this.session = Objects.requireNonNull( session );
+        this.artifact = Objects.requireNonNull( artifact );
+    }
+
+    public org.eclipse.aether.artifact.Artifact getArtifact()
+    {
+        return artifact;
+    }
+
+    @Nonnull
+    @Override
+    public String getGroupId()
+    {
+        return artifact.getGroupId();
+    }
+
+    @Nonnull
+    @Override
+    public String getArtifactId()
+    {
+        return artifact.getArtifactId();
+    }
+
+    @Nonnull
+    @Override
+    public String getVersion()
+    {
+        return artifact.getVersion();
+    }
+
+    @Nonnull
+    @Override
+    public String getExtension()
+    {
+        return artifact.getExtension();
+    }
+
+    @Nonnull
+    @Override
+    public String getClassifier()
+    {
+        return artifact.getClassifier();
+    }
+
+    @Nonnull
+    @Override
+    public String getBaseVersion()
+    {
+        return artifact.getBaseVersion();
+    }
+
+    @Override
+    public boolean isSnapshot()
+    {
+        return artifact.isSnapshot();
+    }
+
+    @Nonnull
+    @Override
+    public Optional<Path> getPath()
+    {
+        return Optional.ofNullable( artifact.getFile() ).map( File::toPath );
+    }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactDeployer.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactDeployer.java
new file mode 100644
index 0000000..bc4d9a2
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactDeployer.java
@@ -0,0 +1,76 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import org.apache.maven.api.services.ArtifactDeployer;
+import org.apache.maven.api.services.ArtifactDeployerException;
+import org.apache.maven.api.services.ArtifactDeployerRequest;
+import org.apache.maven.api.services.ArtifactManager;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.deployment.DeployRequest;
+import org.eclipse.aether.deployment.DeployResult;
+import org.eclipse.aether.deployment.DeploymentException;
+import org.eclipse.aether.metadata.Metadata;
+
+@Named
+public class DefaultArtifactDeployer implements ArtifactDeployer
+{
+    private final RepositorySystem repositorySystem;
+
+    @Inject
+    DefaultArtifactDeployer( @Nonnull RepositorySystem repositorySystem )
+    {
+        this.repositorySystem = Objects.requireNonNull( repositorySystem );
+    }
+
+    @Override
+    public void deploy( ArtifactDeployerRequest request ) throws ArtifactDeployerException, IllegalArgumentException
+    {
+        DefaultSession session = ( DefaultSession ) request.getSession();
+        try
+        {
+            ArtifactManager artifactManager = session.getService( ArtifactManager.class );
+            List<Metadata> metadatas = request.getArtifacts().stream()
+                    .map( artifactManager::getAttachedMetadatas )
+                    .flatMap( Collection::stream )
+                    .map( session::toMetadata )
+                    .collect( Collectors.toList() );
+            DeployRequest deployRequest = new DeployRequest()
+                    .setRepository( session.toRepository( request.getRepository() ) )
+                    .setArtifacts( session.toArtifacts( request.getArtifacts() ) )
+                    .setMetadata( metadatas );
+
+            DeployResult result = repositorySystem.deploy( session.getSession(), deployRequest );
+        }
+        catch ( DeploymentException e )
+        {
+            throw new ArtifactDeployerException( "Unable to deploy artifacts", e );
+        }
+    }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactFactory.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactFactory.java
new file mode 100644
index 0000000..c1fa7ca
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactFactory.java
@@ -0,0 +1,54 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import javax.inject.Named;
+
+import java.security.InvalidParameterException;
+
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.services.ArtifactFactory;
+import org.apache.maven.api.services.ArtifactFactoryException;
+import org.apache.maven.api.services.ArtifactFactoryRequest;
+import org.eclipse.aether.artifact.ArtifactType;
+
+@Named
+public class DefaultArtifactFactory implements ArtifactFactory
+{
+    @Override
+    public Artifact create( ArtifactFactoryRequest request ) throws ArtifactFactoryException, InvalidParameterException
+    {
+        DefaultSession session = (DefaultSession) request.getSession();
+        ArtifactType type = null;
+        if ( request.getType() != null )
+        {
+            type = session.getSession().getArtifactTypeRegistry().get( request.getType() );
+        }
+        return new DefaultArtifact(
+                session,
+                new org.eclipse.aether.artifact.DefaultArtifact(
+                    request.getGroupId(),
+                    request.getArtifactId(),
+                    request.getClassifier(),
+                    request.getExtension(),
+                    request.getVersion(),
+                    type ) );
+    }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactInstaller.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactInstaller.java
new file mode 100644
index 0000000..2c45534
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactInstaller.java
@@ -0,0 +1,111 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import org.apache.maven.api.services.ArtifactInstaller;
+import org.apache.maven.api.services.ArtifactInstallerException;
+import org.apache.maven.api.services.ArtifactInstallerRequest;
+import org.apache.maven.api.services.ArtifactManager;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.installation.InstallRequest;
+import org.eclipse.aether.installation.InstallResult;
+import org.eclipse.aether.installation.InstallationException;
+import org.eclipse.aether.metadata.Metadata;
+
+@Named
+public class DefaultArtifactInstaller implements ArtifactInstaller
+{
+
+    private final RepositorySystem repositorySystem;
+
+    @Inject
+    DefaultArtifactInstaller( @Nonnull RepositorySystem repositorySystem )
+    {
+        this.repositorySystem = Objects.requireNonNull( repositorySystem );
+    }
+
+    @Override
+    public void install( ArtifactInstallerRequest request ) throws ArtifactInstallerException, IllegalArgumentException
+    {
+
+        /*
+        // prepare installRequest
+        InstallRequest request = new InstallRequest();
+
+        // transform artifacts
+        for ( org.apache.maven.artifact.Artifact mavenArtifact : mavenArtifacts )
+        {
+            Artifact mainArtifact = RepositoryUtils.toArtifact( mavenArtifact );
+            request.addArtifact( mainArtifact );
+
+            for ( ArtifactMetadata metadata : mavenArtifact.getMetadataList() )
+            {
+                if ( metadata instanceof ProjectArtifactMetadata )
+                {
+                    Artifact pomArtifact = new SubArtifact( mainArtifact, "", "pom" );
+                    pomArtifact = pomArtifact.setFile( ( (ProjectArtifactMetadata) metadata ).getFile() );
+                    request.addArtifact( pomArtifact );
+                }
+                else if ( // metadata instanceof SnapshotArtifactRepositoryMetadata ||
+                        metadata instanceof ArtifactRepositoryMetadata )
+                {
+                    // eaten, handled by repo system
+                }
+                else if ( metadata instanceof org.apache.maven.shared.transfer.metadata.ArtifactMetadata )
+                {
+                    org.apache.maven.shared.transfer.metadata.ArtifactMetadata transferMetadata =
+                            (org.apache.maven.shared.transfer.metadata.ArtifactMetadata) metadata;
+
+                    request.addMetadata( new Maven31MetadataBridge( metadata ).setFile( transferMetadata.getFile() ) );
+                }
+            }
+        }
+        */
+
+        DefaultSession session = ( DefaultSession ) request.getSession();
+        try
+        {
+            ArtifactManager artifactManager = session.getService( ArtifactManager.class );
+            List<Metadata> metadatas = request.getArtifacts().stream()
+                    .map( artifactManager::getAttachedMetadatas )
+                    .flatMap( Collection::stream )
+                    .map( session::toMetadata )
+                    .collect( Collectors.toList() );
+            InstallRequest installRequest = new InstallRequest()
+                    .setArtifacts( session.toArtifacts( request.getArtifacts() ) )
+                    .setMetadata( metadatas );
+
+            InstallResult result = repositorySystem.install( session.getSession(), installRequest );
+        }
+        catch ( InstallationException e )
+        {
+            throw new ArtifactInstallerException( e.getMessage(), e );
+        }
+    }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactResolver.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactResolver.java
new file mode 100644
index 0000000..0f87137
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactResolver.java
@@ -0,0 +1,73 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+import javax.inject.Inject;
+
+import java.util.Objects;
+
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.services.ArtifactResolver;
+import org.apache.maven.api.services.ArtifactResolverException;
+import org.apache.maven.api.services.ArtifactResolverRequest;
+import org.apache.maven.api.services.ArtifactResolverResult;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.resolution.ArtifactRequest;
+import org.eclipse.aether.resolution.ArtifactResolutionException;
+import org.eclipse.aether.resolution.ArtifactResult;
+
+public class DefaultArtifactResolver implements ArtifactResolver
+{
+    private final RepositorySystem repositorySystem;
+
+    @Inject
+    DefaultArtifactResolver( @Nonnull RepositorySystem repositorySystem )
+    {
+        this.repositorySystem = Objects.requireNonNull( repositorySystem );
+    }
+
+    @Override
+    public ArtifactResolverResult resolve( ArtifactResolverRequest request )
+            throws ArtifactResolverException, IllegalArgumentException
+    {
+        DefaultSession session = ( DefaultSession ) request.getSession();
+        try
+        {
+            ArtifactRequest req = new ArtifactRequest()
+                    .setArtifact( session.toArtifact( request.getArtifact() ) )
+                    .setRepositories( session.toRepositories( session.getRemoteRepositories() ) );
+            ArtifactResult res = repositorySystem.resolveArtifact( session.getSession(), req );
+            return new ArtifactResolverResult()
+            {
+                @Override
+                public Artifact getArtifact()
+                {
+                    return session.getArtifact( res.getArtifact() );
+                }
+            };
+        }
+        catch ( ArtifactResolutionException e )
+        {
+            throw new ArtifactResolverException( "Unable to resolve artifact", e );
+        }
+    }
+
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependency.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependency.java
new file mode 100644
index 0000000..27c76c4
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependency.java
@@ -0,0 +1,95 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import java.util.Collection;
+import java.util.Objects;
+
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Dependency;
+import org.apache.maven.api.Exclusion;
+
+public class DefaultDependency implements Dependency
+{
+    private final DefaultSession session;
+    private final org.eclipse.aether.graph.Dependency dependency;
+
+    public DefaultDependency( @Nonnull DefaultSession session, @Nonnull org.eclipse.aether.graph.Dependency dependency )
+    {
+        this.session = Objects.requireNonNull( session, "session" );
+        this.dependency = Objects.requireNonNull( dependency, "dependency" );
+    }
+
+    @Nonnull
+    public org.eclipse.aether.graph.Dependency getDependency()
+    {
+        return dependency;
+    }
+
+    @Nonnull
+    @Override
+    public Artifact getArtifact()
+    {
+        return session.getArtifact( dependency.getArtifact() );
+    }
+
+    @Override
+    public String getScope()
+    {
+        return dependency.getScope();
+    }
+
+    @Nullable
+    @Override
+    public Boolean getOptional()
+    {
+        return dependency.getOptional();
+    }
+
+    @Nonnull
+    @Override
+    public Collection<Exclusion> getExclusions()
+    {
+        return new MappedCollection<>( dependency.getExclusions(), this::toExclusion );
+    }
+
+    private Exclusion toExclusion( org.eclipse.aether.graph.Exclusion exclusion )
+    {
+        return new Exclusion()
+        {
+            @Nullable
+            @Override
+            public String getGroupId()
+            {
+                return exclusion.getGroupId();
+            }
+
+            @Nullable
+            @Override
+            public String getArtifactId()
+            {
+                return exclusion.getArtifactId();
+            }
+        };
+    }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyCollector.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyCollector.java
new file mode 100644
index 0000000..469b541
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyCollector.java
@@ -0,0 +1,93 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import java.util.List;
+
+import org.apache.maven.api.Node;
+import org.apache.maven.api.services.DependencyCollector;
+import org.apache.maven.api.services.DependencyCollectorException;
+import org.apache.maven.api.services.DependencyCollectorRequest;
+import org.apache.maven.api.services.DependencyCollectorResult;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.collection.CollectRequest;
+import org.eclipse.aether.collection.CollectResult;
+import org.eclipse.aether.collection.DependencyCollectionException;
+import org.eclipse.aether.graph.Dependency;
+
+@Named
+public class DefaultDependencyCollector implements DependencyCollector
+{
+
+    private final RepositorySystem repositorySystem;
+
+    @Inject
+    DefaultDependencyCollector( @Nonnull RepositorySystem repositorySystem )
+    {
+        this.repositorySystem = repositorySystem;
+    }
+
+    @Nonnull
+    @Override
+    public DependencyCollectorResult collect( @Nonnull DependencyCollectorRequest request )
+            throws DependencyCollectorException, IllegalArgumentException
+    {
+        DefaultSession session = ( DefaultSession ) request.getSession();
+
+        Artifact rootArtifact = request.getRootArtifact().map( session::toArtifact ).orElse( null );
+        Dependency root = request.getRoot().map( session::toDependency ).orElse( null );
+        CollectRequest collectRequest = new CollectRequest()
+                .setRootArtifact( rootArtifact )
+                .setRoot( root != null ? root : new Dependency( rootArtifact, null ) )
+                .setDependencies( session.toDependencies( request.getDependencies() ) )
+                .setManagedDependencies( session.toDependencies( request.getManagedDependencies() ) )
+                .setRepositories( session.toRepositories( session.getRemoteRepositories() ) );
+
+        try
+        {
+            final CollectResult
+                    result = repositorySystem.collectDependencies( session.getSession(), collectRequest );
+            return new DependencyCollectorResult()
+            {
+                @Override
+                public List<Exception> getExceptions()
+                {
+                    return result.getExceptions();
+                }
+
+                @Override
+                public Node getRoot()
+                {
+                    return session.getNode( result.getRoot() );
+                }
+            };
+        }
+        catch ( DependencyCollectionException e )
+        {
+            throw new DependencyCollectorException( "Unable to collect dependencies", e );
+        }
+    }
+
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyFactory.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyFactory.java
new file mode 100644
index 0000000..7424b22
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyFactory.java
@@ -0,0 +1,56 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import javax.inject.Named;
+
+import java.util.stream.Collectors;
+
+import org.apache.maven.api.Dependency;
+import org.apache.maven.api.Exclusion;
+import org.apache.maven.api.services.DependencyFactory;
+import org.apache.maven.api.services.DependencyFactoryException;
+import org.apache.maven.api.services.DependencyFactoryRequest;
+
+@Named
+public class DefaultDependencyFactory implements DependencyFactory
+{
+
+    @Override
+    public Dependency create( DependencyFactoryRequest request )
+            throws DependencyFactoryException, IllegalArgumentException
+    {
+        DefaultSession session = ( DefaultSession ) request.getSession();
+        return new DefaultDependency(
+                session,
+                new org.eclipse.aether.graph.Dependency(
+                        session.toArtifact( request.getArtifact() ),
+                        request.getScope(),
+                        request.isOptional(),
+                        request.getExclusions().stream().map( this::toExclusion ).collect( Collectors.toList() ) ) );
+    }
+
+    private org.eclipse.aether.graph.Exclusion toExclusion( Exclusion exclusion )
+    {
+        return new org.eclipse.aether.graph.Exclusion(
+                exclusion.getGroupId(), exclusion.getArtifactId(), "*", "*" );
+    }
+
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyResolver.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyResolver.java
new file mode 100644
index 0000000..ab7af8c
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyResolver.java
@@ -0,0 +1,106 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import java.util.List;
+import java.util.function.Predicate;
+
+import org.apache.maven.api.Node;
+import org.apache.maven.api.services.ArtifactResolverResult;
+import org.apache.maven.api.services.DependencyResolver;
+import org.apache.maven.api.services.DependencyResolverException;
+import org.apache.maven.api.services.DependencyResolverRequest;
+import org.apache.maven.api.services.DependencyResolverResult;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.collection.CollectRequest;
+import org.eclipse.aether.graph.DependencyFilter;
+import org.eclipse.aether.resolution.DependencyRequest;
+import org.eclipse.aether.resolution.DependencyResolutionException;
+import org.eclipse.aether.resolution.DependencyResult;
+
+@Named
+public class DefaultDependencyResolver implements DependencyResolver
+{
+
+    private final RepositorySystem repositorySystem;
+
+    @Inject
+    DefaultDependencyResolver( RepositorySystem repositorySystem )
+    {
+        this.repositorySystem = repositorySystem;
+    }
+
+    @Override
+    public DependencyResolverResult resolve( DependencyResolverRequest request )
+            throws DependencyResolverException
+    {
+        DefaultSession session = ( DefaultSession ) request.getSession();
+
+        CollectRequest collectRequest = new CollectRequest()
+                .setRootArtifact( request.getRootArtifact().map( session::toArtifact ).orElse( null ) )
+                .setRoot( request.getRoot().map( session::toDependency ).orElse( null ) )
+                .setDependencies( session.toDependencies( request.getDependencies() ) )
+                .setManagedDependencies( session.toDependencies( request.getManagedDependencies() ) )
+                .setRepositories( session.toRepositories( request.getSession().getRemoteRepositories() ) );
+        DependencyFilter filter = request.getFilter()
+                .map( f -> toDependencyFilter( session, f ) )
+                .orElse( null );
+        DependencyRequest dependencyRequest = new DependencyRequest()
+                .setCollectRequest( collectRequest )
+                .setFilter( filter );
+
+        try
+        {
+            DependencyResult result = repositorySystem.resolveDependencies( session.getSession(), dependencyRequest );
+            return new DependencyResolverResult()
+            {
+                @Override
+                public List<Exception> getCollectorExceptions()
+                {
+                    return result.getCollectExceptions();
+                }
+
+                @Override
+                public Node getRoot()
+                {
+                    return session.getNode( result.getRoot() );
+                }
+
+                @Override
+                public List<ArtifactResolverResult> getArtifactResults()
+                {
+                    return null;
+                }
+            };
+        }
+        catch ( DependencyResolutionException e )
+        {
+            throw new DependencyResolverException( "Unable to resolve dependencies", e );
+        }
+    }
+
+    private DependencyFilter toDependencyFilter( DefaultSession session, Predicate<Node> filter )
+    {
+        return ( node, parents ) -> filter.test( session.getNode( node ) );
+    }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultLocalRepository.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultLocalRepository.java
new file mode 100644
index 0000000..5867af8
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultLocalRepository.java
@@ -0,0 +1,67 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+import javax.inject.Inject;
+
+import java.nio.file.Path;
+import java.util.Objects;
+
+import org.apache.maven.api.LocalRepository;
+
+public class DefaultLocalRepository implements LocalRepository
+{
+
+    private final org.eclipse.aether.repository.LocalRepository repository;
+
+    @Inject
+    DefaultLocalRepository( @Nonnull org.eclipse.aether.repository.LocalRepository repository )
+    {
+        this.repository = Objects.requireNonNull( repository, "repository" );
+    }
+
+    public org.eclipse.aether.repository.LocalRepository getRepository()
+    {
+        return repository;
+    }
+
+    @Nonnull
+    @Override
+    public String getId()
+    {
+        return repository.getId();
+    }
+
+    @Nonnull
+    @Override
+    public String getType()
+    {
+        return repository.getContentType();
+    }
+
+    @Nonnull
+    @Override
+    public Path getPath()
+    {
+        return repository.getBasedir().toPath();
+    }
+
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultNode.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultNode.java
new file mode 100644
index 0000000..6d97e94
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultNode.java
@@ -0,0 +1,102 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import java.util.List;
+import java.util.function.Predicate;
+
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Dependency;
+import org.apache.maven.api.Node;
+import org.apache.maven.api.NodeVisitor;
+import org.apache.maven.api.Repository;
+
+public class DefaultNode implements Node
+{
+
+    private final DefaultSession session;
+    private final org.eclipse.aether.graph.DependencyNode node;
+
+    public DefaultNode( DefaultSession session,
+                        org.eclipse.aether.graph.DependencyNode node )
+    {
+        this.session = session;
+        this.node = node;
+    }
+
+    @Override
+    public Artifact getArtifact()
+    {
+        return session.getArtifact( node.getArtifact() );
+    }
+
+    @Override
+    public Dependency getDependency()
+    {
+        return session.getDependency( node.getDependency() );
+    }
+
+    @Override
+    public List<Node> getChildren()
+    {
+        return new MappedList<>( node.getChildren(), session::getNode );
+    }
+
+    @Override
+    public List<Repository> getRemoteRepositories()
+    {
+        return new MappedList<>( node.getRepositories(), session::getRemoteRepository );
+    }
+
+    @Override
+    public Boolean getOptional()
+    {
+        return node.getDependency().getOptional();
+    }
+
+    @Override
+    public String getScope()
+    {
+        return node.getDependency().getScope();
+    }
+
+    @Override
+    public boolean accept( NodeVisitor visitor )
+    {
+        if ( visitor.enter( this ) )
+        {
+            for ( Node child : getChildren() )
+            {
+                if ( !child.accept( visitor ) )
+                {
+                    break;
+                }
+            }
+        }
+        return visitor.leave( this );
+    }
+
+    @Override
+    public Node filter( Predicate<Node> filter )
+    {
+        // TODO
+        throw new UnsupportedOperationException( "Not implemented yet" );
+    }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProject.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProject.java
new file mode 100644
index 0000000..e9b90df
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProject.java
@@ -0,0 +1,172 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import java.nio.file.Path;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Dependency;
+import org.apache.maven.api.Exclusion;
+import org.apache.maven.api.Project;
+import org.apache.maven.model.DependencyManagement;
+import org.apache.maven.model.Model;
+import org.apache.maven.project.MavenProject;
+
+public class DefaultProject implements Project
+{
+
+    private final DefaultSession session;
+    private final MavenProject project;
+
+    public DefaultProject( DefaultSession session, MavenProject project )
+    {
+        this.session = session;
+        this.project = project;
+    }
+
+    @Nonnull
+    @Override
+    public String getGroupId()
+    {
+        return project.getGroupId();
+    }
+
+    @Nonnull
+    @Override
+    public String getArtifactId()
+    {
+        return project.getArtifactId();
+    }
+
+    @Nonnull
+    @Override
+    public String getVersion()
+    {
+        return project.getVersion();
+    }
+
+    @Nonnull
+    @Override
+    public Artifact getArtifact()
+    {
+        // TODO
+        throw new UnsupportedOperationException( "Not implemented yet" );
+    }
+
+    @Nonnull
+    @Override
+    public String getPackaging()
+    {
+        return project.getPackaging();
+    }
+
+    @Nonnull
+    @Override
+    public Model getModel()
+    {
+        return project.getModel();
+    }
+
+    @Nonnull
+    @Override
+    public Path getPomPath()
+    {
+        // TODO
+        throw new UnsupportedOperationException( "Not implemented yet" );
+    }
+
+    @Nonnull
+    @Override
+    public List<Dependency> getDependencies()
+    {
+        return new MappedList<>( project.getDependencies(), this::toDependency );
+    }
+
+    @Nonnull
+    @Override
+    public List<Dependency> getManagedDependencies()
+    {
+        DependencyManagement dependencyManagement = project.getModel().getDependencyManagement();
+        if ( dependencyManagement != null )
+        {
+            return new MappedList<>( dependencyManagement.getDependencies(), this::toDependency );
+        }
+        return Collections.emptyList();
+    }
+
+    private Dependency toDependency( org.apache.maven.model.Dependency dependency )
+    {
+        return new Dependency()
+        {
+            @Nonnull
+            @Override
+            public Artifact getArtifact()
+            {
+                return session.createArtifact( dependency.getGroupId(), dependency.getArtifactId(),
+                        dependency.getVersion(), dependency.getType() );
+            }
+
+            @Override
+            public String getScope()
+            {
+                return dependency.getScope();
+            }
+
+            @Override
+            public Boolean getOptional()
+            {
+                return dependency.isOptional();
+            }
+
+            @Nonnull
+            @Override
+            public Collection<Exclusion> getExclusions()
+            {
+                return new MappedCollection<>( dependency.getExclusions(), this::toExclusion );
+            }
+
+            private Exclusion toExclusion( org.apache.maven.model.Exclusion exclusion )
+            {
+                return new Exclusion()
+                {
+                    @Nullable
+                    @Override
+                    public String getGroupId()
+                    {
+                        return exclusion.getGroupId();
+                    }
+
+                    @Nullable
+                    @Override
+                    public String getArtifactId()
+                    {
+                        return exclusion.getArtifactId();
+                    }
+                };
+            }
+        };
+    }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectBuilder.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectBuilder.java
new file mode 100644
index 0000000..e287ccf
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectBuilder.java
@@ -0,0 +1,258 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+import javax.inject.Inject;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Path;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+import org.apache.maven.RepositoryUtils;
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Node;
+import org.apache.maven.api.Project;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.model.building.ModelProblem;
+import org.apache.maven.model.building.ModelSource;
+import org.apache.maven.project.DefaultProjectBuildingRequest;
+import org.apache.maven.project.ProjectBuildingException;
+import org.apache.maven.project.ProjectBuildingRequest;
+import org.apache.maven.project.ProjectBuildingResult;
+import org.apache.maven.api.services.ArtifactResolverResult;
+import org.apache.maven.api.services.DependencyResolverResult;
+import org.apache.maven.api.services.ProjectBuilder;
+import org.apache.maven.api.services.ProjectBuilderException;
+import org.apache.maven.api.services.ProjectBuilderProblem;
+import org.apache.maven.api.services.ProjectBuilderRequest;
+import org.apache.maven.api.services.ProjectBuilderResult;
+import org.apache.maven.api.services.ProjectBuilderSource;
+
+public class DefaultProjectBuilder implements ProjectBuilder
+{
+
+    private final org.apache.maven.project.ProjectBuilder builder;
+
+    @Inject
+    public DefaultProjectBuilder( org.apache.maven.project.ProjectBuilder builder )
+    {
+        this.builder = builder;
+    }
+
+    @SuppressWarnings( "MethodLength" )
+    @Nonnull
+    @Override
+    public ProjectBuilderResult build( ProjectBuilderRequest request )
+            throws ProjectBuilderException, IllegalArgumentException
+    {
+        DefaultSession session = ( DefaultSession ) request.getSession();
+        try
+        {
+            List<ArtifactRepository> repositories =
+                    session.toArtifactRepositories( session.getRemoteRepositories() );
+            ProjectBuildingRequest req = new DefaultProjectBuildingRequest()
+                    .setRepositorySession( session.getSession() )
+                    .setRemoteRepositories( repositories )
+                    .setPluginArtifactRepositories( repositories )
+                    .setProcessPlugins( request.isProcessPlugins() );
+            ProjectBuildingResult res;
+            if ( request.getPath().isPresent() )
+            {
+                Path path = request.getPath().get();
+                res = builder.build( path.toFile(), req );
+            }
+            else if ( request.getSource().isPresent() )
+            {
+                ProjectBuilderSource source = request.getSource().get();
+                ModelSource modelSource = new ModelSource()
+                {
+                    @Override
+                    public InputStream getInputStream() throws IOException
+                    {
+                        return source.getInputStream();
+                    }
+
+                    @Override
+                    public String getLocation()
+                    {
+                        return source.getLocation();
+                    }
+                };
+                res = builder.build( modelSource, req );
+            }
+            else if ( request.getArtifact().isPresent() )
+            {
+                Artifact a = request.getArtifact().get();
+                org.eclipse.aether.artifact.Artifact aetherArtifact = session.toArtifact( a );
+                org.apache.maven.artifact.Artifact artifact = RepositoryUtils.toArtifact( aetherArtifact );
+                res = builder.build( artifact, request.isAllowStubModel(), req );
+            }
+            else
+            {
+                throw new IllegalArgumentException( "Invalid request" );
+            }
+            return new ProjectBuilderResult()
+            {
+                @Nonnull
+                @Override
+                public String getProjectId()
+                {
+                    return res.getProjectId();
+                }
+
+                @Nonnull
+                @Override
+                public Optional<Path> getPomFile()
+                {
+                    return Optional.ofNullable( res.getPomFile() ).map( File::toPath );
+                }
+
+                @Nonnull
+                @Override
+                public Optional<Project> getProject()
+                {
+                    return Optional.ofNullable( res.getProject() )
+                            .map( session::getProject );
+                }
+
+                @Nonnull
+                @Override
+                public Collection<ProjectBuilderProblem> getProblems()
+                {
+                    return new MappedCollection<>( res.getProblems(), this::toProblem );
+                }
+
+                private ProjectBuilderProblem toProblem( ModelProblem problem )
+                {
+                    return new ProjectBuilderProblem()
+                    {
+                        @Override
+                        public String getSource()
+                        {
+                            return problem.getSource();
+                        }
+
+                        @Override
+                        public int getLineNumber()
+                        {
+                            return problem.getLineNumber();
+                        }
+
+                        @Override
+                        public int getColumnNumber()
+                        {
+                            return problem.getColumnNumber();
+                        }
+
+                        @Override
+                        public String getLocation()
+                        {
+                            StringBuilder buffer = new StringBuilder( 256 );
+
+                            if ( getSource().length() > 0 )
+                            {
+                                if ( buffer.length() > 0 )
+                                {
+                                    buffer.append( ", " );
+                                }
+                                buffer.append( getSource() );
+                            }
+
+                            if ( getLineNumber() > 0 )
+                            {
+                                if ( buffer.length() > 0 )
+                                {
+                                    buffer.append( ", " );
+                                }
+                                buffer.append( "line " ).append( getLineNumber() );
+                            }
+
+                            if ( getColumnNumber() > 0 )
+                            {
+                                if ( buffer.length() > 0 )
+                                {
+                                    buffer.append( ", " );
+                                }
+                                buffer.append( "column " ).append( getColumnNumber() );
+                            }
+
+                            return buffer.toString();
+                        }
+
+                        @Override
+                        public Exception getException()
+                        {
+                            return problem.getException();
+                        }
+
+                        @Override
+                        public String getMessage()
+                        {
+                            return problem.getMessage();
+                        }
+
+                        @Override
+                        public Severity getSeverity()
+                        {
+                            return Severity.valueOf( problem.getSeverity().name() );
+                        }
+                    };
+                }
+
+                @Nonnull
+                @Override
+                public Optional<DependencyResolverResult> getDependencyResolverResult()
+                {
+                    return Optional.ofNullable( res.getDependencyResolutionResult() )
+                            .map( r -> new DependencyResolverResult()
+                            {
+                                @Override
+                                public List<Exception> getCollectorExceptions()
+                                {
+                                    return r.getCollectionErrors();
+                                }
+
+                                @Override
+                                public Node getRoot()
+                                {
+                                    return session.getNode( r.getDependencyGraph() );
+                                }
+
+                                @Override
+                                public List<ArtifactResolverResult> getArtifactResults()
+                                {
+                                    return Collections.emptyList();
+                                }
+                            } );
+                }
+            };
+        }
+        catch ( ProjectBuildingException e )
+        {
+            throw new ProjectBuilderException( "Unable to build project", e );
+        }
+    }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectDeployer.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectDeployer.java
new file mode 100644
index 0000000..b8aabd6
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectDeployer.java
@@ -0,0 +1,142 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.services.ArtifactManager;
+import org.apache.maven.api.services.ProjectDeployer;
+import org.apache.maven.api.services.ProjectDeployerException;
+import org.apache.maven.api.services.ProjectDeployerRequest;
+import org.apache.maven.api.services.ProjectManager;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.deployment.DeployRequest;
+import org.eclipse.aether.deployment.DeployResult;
+import org.eclipse.aether.deployment.DeploymentException;
+import org.eclipse.aether.metadata.Metadata;
+
+@Named
+public class DefaultProjectDeployer implements ProjectDeployer
+{
+
+    private final RepositorySystem repositorySystem;
+
+    @Inject
+    DefaultProjectDeployer( @Nonnull RepositorySystem repositorySystem )
+    {
+        this.repositorySystem = repositorySystem;
+    }
+
+    @Override
+    public void deploy( ProjectDeployerRequest request ) throws ProjectDeployerException, IllegalArgumentException
+    {
+        DefaultSession session = ( DefaultSession ) request.getSession();
+        try
+        {
+            ArtifactManager artifactManager = session.getService( ArtifactManager.class );
+            Collection<Artifact> artifacts = session.getService( ProjectManager.class )
+                    .getAttachedArtifacts( request.getProject() );
+            List<Metadata> metadatas = artifacts.stream()
+                    .map( artifactManager::getAttachedMetadatas )
+                    .flatMap( Collection::stream )
+                    .map( session::toMetadata )
+                    .collect( Collectors.toList() );
+            DeployRequest deployRequest = new DeployRequest()
+                    .setRepository( session.toRepository( request.getRepository() ) )
+                    .setArtifacts( session.toArtifacts( artifacts ) )
+                    .setMetadata( metadatas );
+
+            DeployResult result = repositorySystem.deploy( session.getSession(), deployRequest );
+        }
+        catch ( DeploymentException e )
+        {
+            throw new ProjectDeployerException( "Unable to deploy project", e );
+        }
+    }
+
+    void dumb()
+    {
+        /*
+        Artifact artifact = projectDeployerRequest.getProject().getArtifact();
+        String packaging = projectDeployerRequest.getProject().getPackaging();
+        File pomFile = projectDeployerRequest.getProject().getFile();
+
+        List<Artifact> attachedArtifacts = projectDeployerRequest.getProject().getAttachedArtifacts();
+
+        // Deploy the POM
+        boolean isPomArtifact = "pom".equals( packaging );
+        if ( isPomArtifact )
+        {
+            artifact.setFile( pomFile );
+        }
+        else
+        {
+            ProjectArtifactMetadata metadata = new ProjectArtifactMetadata( artifact, pomFile );
+            artifact.addMetadata( metadata );
+        }
+
+        // What consequence does this have?
+        // artifact.setRelease( true );
+
+        artifact.setRepository( artifactRepository );
+
+        int retryFailedDeploymentCount = projectDeployerRequest.getRetryFailedDeploymentCount();
+
+        List<Artifact> deployableArtifacts = new ArrayList<>();
+        if ( isPomArtifact )
+        {
+            deployableArtifacts.add( artifact );
+        }
+        else
+        {
+            File file = artifact.getFile();
+
+            if ( file != null && file.isFile() )
+            {
+                deployableArtifacts.add( artifact );
+            }
+            else if ( !attachedArtifacts.isEmpty() )
+            {
+                // TODO: Reconsider this exception? Better Exception type?
+                throw new NoFileAssignedException( "The packaging plugin for this project did not assign "
+                    + "a main file to the project but it has attachments. Change packaging to 'pom'." );
+            }
+            else
+            {
+                // TODO: Reconsider this exception? Better Exception type?
+                throw new NoFileAssignedException( "The packaging for this project did not assign "
+                    + "a file to the build artifact" );
+            }
+        }
+
+        deployableArtifacts.addAll( attachedArtifacts );
+
+        deploy( buildingRequest, deployableArtifacts, artifactRepository, retryFailedDeploymentCount );
+
+         */
+    }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectInstaller.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectInstaller.java
new file mode 100644
index 0000000..ed87e56
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectInstaller.java
@@ -0,0 +1,77 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.services.ArtifactManager;
+import org.apache.maven.api.services.ProjectInstaller;
+import org.apache.maven.api.services.ProjectInstallerException;
+import org.apache.maven.api.services.ProjectInstallerRequest;
+import org.apache.maven.api.services.ProjectManager;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.installation.InstallRequest;
+import org.eclipse.aether.installation.InstallResult;
+import org.eclipse.aether.installation.InstallationException;
+import org.eclipse.aether.metadata.Metadata;
+
+@Named
+public class DefaultProjectInstaller implements ProjectInstaller
+{
+    private final RepositorySystem repositorySystem;
+
+    @Inject
+    DefaultProjectInstaller( RepositorySystem repositorySystem )
+    {
+        this.repositorySystem = repositorySystem;
+    }
+
+    @Override
+    public void install( ProjectInstallerRequest request ) throws ProjectInstallerException, IllegalArgumentException
+    {
+        DefaultSession session = ( DefaultSession ) request.getSession();
+        try
+        {
+            ArtifactManager artifactManager = session.getService( ArtifactManager.class );
+            Collection<Artifact> artifacts = session.getService( ProjectManager.class )
+                    .getAttachedArtifacts( request.getProject() );
+            List<Metadata> metadatas = artifacts.stream()
+                    .map( artifactManager::getAttachedMetadatas )
+                    .flatMap( Collection::stream )
+                    .map( session::toMetadata )
+                    .collect( Collectors.toList() );
+            InstallRequest installRequest = new InstallRequest()
+                    .setArtifacts( session.toArtifacts( artifacts ) )
+                    .setMetadata( metadatas );
+
+            InstallResult result = repositorySystem.install( session.getSession(), installRequest );
+        }
+        catch ( InstallationException e )
+        {
+            throw new ProjectInstallerException( "Unable to install project", e );
+        }
+    }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultRemoteRepository.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultRemoteRepository.java
new file mode 100644
index 0000000..73d481f
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultRemoteRepository.java
@@ -0,0 +1,53 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+
+import org.apache.maven.api.RemoteRepository;
+
+public class DefaultRemoteRepository implements RemoteRepository
+{
+    private final org.eclipse.aether.repository.RemoteRepository repository;
+
+    public DefaultRemoteRepository( org.eclipse.aether.repository.RemoteRepository repository )
+    {
+        this.repository = repository;
+    }
+
+    public org.eclipse.aether.repository.RemoteRepository getRepository()
+    {
+        return repository;
+    }
+
+    @Nonnull
+    @Override
+    public String getId()
+    {
+        return repository.getId();
+    }
+
+    @Nonnull
+    @Override
+    public String getType()
+    {
+        return repository.getContentType();
+    }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultSession.java b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultSession.java
new file mode 100644
index 0000000..6b37f63
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/DefaultSession.java
@@ -0,0 +1,386 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import javax.annotation.Nonnull;
+
+import java.nio.file.Path;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Objects;
+import java.util.WeakHashMap;
+import java.util.stream.Collectors;
+
+import org.apache.maven.api.services.Service;
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.ArtifactMetadata;
+import org.apache.maven.api.Dependency;
+import org.apache.maven.api.Node;
+import org.apache.maven.api.Project;
+import org.apache.maven.api.LocalRepository;
+import org.apache.maven.api.RemoteRepository;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.bridge.MavenRepositorySystem;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.api.services.ArtifactResolver;
+import org.apache.maven.api.services.ArtifactDeployer;
+import org.apache.maven.api.services.ArtifactFactory;
+import org.apache.maven.api.services.ArtifactInstaller;
+import org.apache.maven.api.services.DependencyCollector;
+import org.apache.maven.api.services.DependencyFactory;
+import org.apache.maven.api.services.DependencyResolver;
+import org.apache.maven.api.services.ProjectBuilder;
+import org.apache.maven.api.services.ProjectDeployer;
+import org.apache.maven.api.services.ProjectInstaller;
+import org.eclipse.aether.DefaultRepositorySystemSession;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.repository.LocalRepositoryManager;
+import org.eclipse.aether.repository.NoLocalRepositoryManagerException;
+import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory;
+
+public class DefaultSession implements Session
+{
+
+    private final RepositorySystemSession session;
+    private final RepositorySystem repositorySystem;
+    private final LocalRepositoryManagerFactory localRepositoryManagerFactory;
+    private final List<RemoteRepository> repositories;
+    private final org.apache.maven.project.ProjectBuilder projectBuilder;
+    private final MavenRepositorySystem mavenRepositorySystem;
+
+    private final Map<org.eclipse.aether.graph.DependencyNode, Node> allNodes
+            = Collections.synchronizedMap( new WeakHashMap<>() );
+    private final Map<org.eclipse.aether.artifact.Artifact, Artifact> allArtifacts
+            = Collections.synchronizedMap( new WeakHashMap<>() );
+    private final Map<org.eclipse.aether.repository.RemoteRepository, RemoteRepository> allRepositories
+            = Collections.synchronizedMap( new WeakHashMap<>() );
+    private final Map<MavenProject, Project> allProjects
+            = Collections.synchronizedMap( new WeakHashMap<>() );
+    private final Map<org.eclipse.aether.graph.Dependency, Dependency> allDependencies
+            = Collections.synchronizedMap( new WeakHashMap<>() );
+
+    public DefaultSession( @Nonnull RepositorySystemSession session,
+                           @Nonnull RepositorySystem repositorySystem,
+                           @Nonnull LocalRepositoryManagerFactory localRepositoryManagerFactory,
+                           @Nonnull List<RemoteRepository> repositories,
+                           @Nonnull org.apache.maven.project.ProjectBuilder projectBuilder,
+                           @Nonnull MavenRepositorySystem mavenRepositorySystem )
+    {
+        this.session = Objects.requireNonNull( session );
+        this.repositorySystem = Objects.requireNonNull( repositorySystem );
+        this.localRepositoryManagerFactory = Objects.requireNonNull( localRepositoryManagerFactory );
+        this.repositories = Objects.requireNonNull( repositories );
+        this.projectBuilder = projectBuilder;
+        this.mavenRepositorySystem = mavenRepositorySystem;
+    }
+
+    @Nonnull
+    @Override
+    public LocalRepository getLocalRepository()
+    {
+        return new DefaultLocalRepository( session.getLocalRepository() );
+    }
+
+    @Nonnull
+    @Override
+    public List<RemoteRepository> getRemoteRepositories()
+    {
+        return Collections.unmodifiableList( repositories );
+    }
+
+    @Nonnull
+    @Override
+    public Session withLocalRepository( @Nonnull LocalRepository localRepository )
+    {
+        Objects.requireNonNull( localRepository, "localRepository" );
+        if ( session.getLocalRepository() != null
+                && Objects.equals( session.getLocalRepository().getBasedir().toPath(),
+                             localRepository.getPath() ) )
+        {
+            return this;
+        }
+        try
+        {
+            org.eclipse.aether.repository.LocalRepository repository = toRepository( localRepository );
+            LocalRepositoryManager localRepositoryManager
+                    = localRepositoryManagerFactory.newInstance( session, repository );
+
+            RepositorySystemSession newSession = new DefaultRepositorySystemSession( session )
+                    .setLocalRepositoryManager( localRepositoryManager );
+
+            return new DefaultSession( newSession, repositorySystem, localRepositoryManagerFactory,
+                                       repositories, projectBuilder, mavenRepositorySystem );
+        }
+        catch ( NoLocalRepositoryManagerException e )
+        {
+            throw new IllegalArgumentException( "Unsupported repository layout", e );
+        }
+
+    }
+
+    @Nonnull
+    @Override
+    public Session withRemoteRepositories( @Nonnull List<RemoteRepository> repositories )
+    {
+        return new DefaultSession( session, repositorySystem, localRepositoryManagerFactory,
+                                   repositories, projectBuilder, mavenRepositorySystem );
+    }
+
+    @Nonnull
+    @Override
+    @SuppressWarnings( "unchecked" )
+    public <T extends Service> T getService( Class<T> clazz ) throws NoSuchElementException
+    {
+        if ( clazz == ArtifactFactory.class )
+        {
+            return (T) new DefaultArtifactFactory();
+        }
+        else if ( clazz == ArtifactResolver.class )
+        {
+            return (T) new DefaultArtifactResolver( repositorySystem );
+        }
+        else if ( clazz == ArtifactDeployer.class )
+        {
+            return (T) new DefaultArtifactDeployer( repositorySystem );
+        }
+        else if ( clazz == ArtifactInstaller.class )
+        {
+            return (T) new DefaultArtifactInstaller( repositorySystem );
+        }
+        else if ( clazz == DependencyFactory.class )
+        {
+            return (T) new DefaultDependencyFactory();
+        }
+        else if ( clazz == DependencyCollector.class )
+        {
+            return (T) new DefaultDependencyCollector( repositorySystem );
+        }
+        else if ( clazz == DependencyResolver.class )
+        {
+            return (T) new DefaultDependencyResolver( repositorySystem );
+        }
+        else if ( clazz == ProjectBuilder.class )
+        {
+            return (T) new DefaultProjectBuilder( projectBuilder );
+        }
+        else if ( clazz == ProjectDeployer.class )
+        {
+            return (T) new DefaultProjectDeployer( repositorySystem );
+        }
+        else if ( clazz == ProjectInstaller.class )
+        {
+            return (T) new DefaultProjectInstaller( repositorySystem );
+        }
+        throw new NoSuchElementException( clazz.getName() );
+    }
+
+    public RepositorySystemSession getSession()
+    {
+        return session;
+    }
+
+    public RemoteRepository getRemoteRepository( org.eclipse.aether.repository.RemoteRepository repository )
+    {
+        return allRepositories.computeIfAbsent( repository, DefaultRemoteRepository::new );
+    }
+
+    public Node getNode( org.eclipse.aether.graph.DependencyNode node )
+    {
+        return allNodes.computeIfAbsent( node, n -> new DefaultNode( this, n ) );
+    }
+
+    public Artifact getArtifact( org.eclipse.aether.artifact.Artifact artifact )
+    {
+        return allArtifacts.computeIfAbsent( artifact, a -> new DefaultArtifact( this, a ) );
+    }
+
+    public Dependency getDependency( org.eclipse.aether.graph.Dependency dependency )
+    {
+        return allDependencies.computeIfAbsent( dependency, d -> new DefaultDependency( this, d ) );
+    }
+
+    public Project getProject( MavenProject project )
+    {
+        return allProjects.computeIfAbsent( project, p -> new DefaultProject( this, p ) );
+    }
+
+    public List<org.eclipse.aether.repository.RemoteRepository> toRepositories( List<RemoteRepository> repositories )
+    {
+        return repositories == null ? null : repositories.stream()
+                .map( this::toRepository )
+                .collect( Collectors.toList() );
+    }
+
+    public org.eclipse.aether.repository.RemoteRepository toRepository( RemoteRepository repository )
+    {
+        if ( repository instanceof DefaultRemoteRepository )
+        {
+            return ( (DefaultRemoteRepository) repository ).getRepository();
+        }
+        else
+        {
+            // TODO
+            throw new UnsupportedOperationException( "Not implemented yet" );
+        }
+    }
+
+    public org.eclipse.aether.repository.LocalRepository toRepository( LocalRepository repository )
+    {
+        if ( repository instanceof DefaultLocalRepository )
+        {
+            return ( ( DefaultLocalRepository ) repository ).getRepository();
+        }
+        else
+        {
+            // TODO
+            throw new UnsupportedOperationException( "Not implemented yet" );
+        }
+    }
+
+    public List<ArtifactRepository> toArtifactRepositories( List<RemoteRepository> repositories )
+    {
+        return repositories == null ? null : repositories.stream()
+                .map( this::toArtifactRepository )
+                .collect( Collectors.toList() );
+    }
+
+    private ArtifactRepository toArtifactRepository( RemoteRepository repository )
+    {
+        if ( repository instanceof DefaultRemoteRepository )
+        {
+            org.eclipse.aether.repository.RemoteRepository rr
+                    = ( (DefaultRemoteRepository) repository ).getRepository();
+
+            try
+            {
+                return mavenRepositorySystem.createRepository(
+                        rr.getUrl(),
+                        rr.getId(),
+                        rr.getPolicy( false ).isEnabled(),
+                        rr.getPolicy( false ).getUpdatePolicy(),
+                        rr.getPolicy( true ).isEnabled(),
+                        rr.getPolicy( true ).getUpdatePolicy(),
+                        rr.getPolicy( false ).getChecksumPolicy()
+
+                );
+            }
+            catch ( Exception e )
+            {
+                throw new RuntimeException( "Unable to create repository", e );
+            }
+        }
+        else
+        {
+            // TODO
+            throw new UnsupportedOperationException( "Not yet implemented" );
+        }
+    }
+
+    public List<org.eclipse.aether.graph.Dependency> toDependencies( Collection<Dependency> dependencies )
+    {
+        return dependencies == null ? null : dependencies.stream()
+                .map( this::toDependency )
+                .collect( Collectors.toList() );
+    }
+
+    public org.eclipse.aether.graph.Dependency toDependency( Dependency dependency )
+    {
+        if ( dependency instanceof DefaultDependency )
+        {
+            return ( ( DefaultDependency ) dependency ).getDependency();
+        }
+        else
+        {
+            String typeId = dependency.getType();
+            org.eclipse.aether.artifact.ArtifactType type = typeId != null
+                    ? session.getArtifactTypeRegistry().get( typeId ) : null;
+            String extension = type != null ? type.getExtension() : null;
+            return new org.eclipse.aether.graph.Dependency(
+                    new org.eclipse.aether.artifact.DefaultArtifact(
+                            dependency.getGroupId(),
+                            dependency.getArtifactId(),
+                            dependency.getClassifier(),
+                            extension,
+                            dependency.getVersion(),
+                            type
+                    ), null );
+        }
+    }
+
+    public List<org.eclipse.aether.artifact.Artifact> toArtifacts( Collection<Artifact> artifacts )
+    {
+        return artifacts == null ? null : artifacts.stream()
+                .map( this::toArtifact )
+                .collect( Collectors.toList() );
+    }
+
+    public org.eclipse.aether.artifact.Artifact toArtifact( Artifact artifact )
+    {
+        if ( artifact instanceof DefaultArtifact )
+        {
+            return ( ( DefaultArtifact ) artifact ).getArtifact();
+        }
+        else
+        {
+            return new org.eclipse.aether.artifact.DefaultArtifact(
+                    artifact.getGroupId(),
+                    artifact.getArtifactId(),
+                    artifact.getClassifier(),
+                    artifact.getExtension(),
+                    artifact.getVersion(),
+                    null,
+                    ( (Artifact) artifact ).getPath().map( Path::toFile ).orElse( null )
+            );
+        }
+    }
+
+    public org.eclipse.aether.metadata.Metadata toMetadata( ArtifactMetadata metadata )
+    {
+        /*
+        if ( metadata instanceof ProjectArtifactMetadata )
+        {
+            Artifact pomArtifact = new SubArtifact( mainArtifact, "", "pom" );
+            pomArtifact = pomArtifact.setFile( ( (ProjectArtifactMetadata) metadata ).getFile() );
+            request.addArtifact( pomArtifact );
+        }
+        else if ( // metadata instanceof SnapshotArtifactRepositoryMetadata ||
+                metadata instanceof ArtifactRepositoryMetadata )
+        {
+            // eaten, handled by repo system
+        }
+        else if ( metadata instanceof org.apache.maven.shared.transfer.metadata.ArtifactMetadata )
+        {
+            org.apache.maven.shared.transfer.metadata.ArtifactMetadata transferMetadata =
+                    (org.apache.maven.shared.transfer.metadata.ArtifactMetadata) metadata;
+
+            request.addMetadata( new Maven31MetadataBridge( metadata ).setFile( transferMetadata.getFile() ) );
+        }
+
+         */
+        // TODO
+        throw new UnsupportedOperationException( "Not implemented yet" );
+    }
+
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/MappedCollection.java b/maven-core-impl/src/main/java/org/apache/maven/impl/MappedCollection.java
new file mode 100644
index 0000000..1fd3248
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/MappedCollection.java
@@ -0,0 +1,63 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import java.util.AbstractCollection;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.function.Function;
+
+public  class MappedCollection<U, V> extends AbstractCollection<U>
+{
+    private final Collection<V> list;
+    private final Function<V, U> mapper;
+
+    public MappedCollection( Collection<V> list, Function<V, U> mapper )
+    {
+        this.list = list;
+        this.mapper = mapper;
+    }
+
+    @Override
+    public Iterator<U> iterator()
+    {
+        Iterator<V> it = list.iterator();
+        return new Iterator<U>()
+        {
+            @Override
+            public boolean hasNext()
+            {
+                return it.hasNext();
+            }
+
+            @Override
+            public U next()
+            {
+                return mapper.apply( it.next() );
+            }
+        };
+    }
+
+    @Override
+    public int size()
+    {
+        return list.size();
+    }
+}
diff --git a/maven-core-impl/src/main/java/org/apache/maven/impl/MappedList.java b/maven-core-impl/src/main/java/org/apache/maven/impl/MappedList.java
new file mode 100644
index 0000000..a5e8e71
--- /dev/null
+++ b/maven-core-impl/src/main/java/org/apache/maven/impl/MappedList.java
@@ -0,0 +1,48 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import java.util.AbstractList;
+import java.util.List;
+import java.util.function.Function;
+
+public  class MappedList<U, V> extends AbstractList<U>
+{
+    private final List<V> list;
+    private final Function<V, U> mapper;
+
+    public MappedList( List<V> list, Function<V, U> mapper )
+    {
+        this.list = list;
+        this.mapper = mapper;
+    }
+
+    @Override
+    public U get( int index )
+    {
+        return mapper.apply( list.get( index ) );
+    }
+
+    @Override
+    public int size()
+    {
+        return list.size();
+    }
+}
diff --git a/maven-core-impl/src/test/java/org/apache/maven/impl/TestApi.java b/maven-core-impl/src/test/java/org/apache/maven/impl/TestApi.java
new file mode 100644
index 0000000..7736f81
--- /dev/null
+++ b/maven-core-impl/src/test/java/org/apache/maven/impl/TestApi.java
@@ -0,0 +1,105 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import javax.inject.Inject;
+
+import java.util.Collections;
+
+import org.apache.maven.api.Project;
+import org.apache.maven.api.Session;
+import org.apache.maven.api.Artifact;
+import org.apache.maven.api.Node;
+import org.apache.maven.api.services.ProjectBuilder;
+import org.apache.maven.api.services.ProjectBuilderRequest;
+import org.apache.maven.bridge.MavenRepositorySystem;
+import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
+import org.codehaus.plexus.testing.PlexusTest;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.repository.LocalRepository;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+@PlexusTest
+public class TestApi
+{
+
+    Session session;
+
+    @Inject
+    RepositorySystem repositorySystem;
+
+    @Inject
+    LocalRepositoryManagerFactory localRepositoryManagerFactory;
+
+    @Inject
+    org.apache.maven.project.ProjectBuilder projectBuilder;
+
+    @Inject
+    MavenRepositorySystem mavenRepositorySystem;
+
+    @BeforeEach
+    void setup()
+    {
+        RepositorySystemSession rss = MavenRepositorySystemUtils.newSession();
+        DefaultSession session = new DefaultSession( rss, repositorySystem, localRepositoryManagerFactory,
+                                                     Collections.emptyList(), projectBuilder, mavenRepositorySystem );
+        DefaultLocalRepository localRepository = new DefaultLocalRepository(
+                new LocalRepository( "target/repo" ) );
+        org.apache.maven.api.RemoteRepository remoteRepository = session.getRemoteRepository(
+                new RemoteRepository.Builder( "mirror", "default",
+                        "file:target/test-classes/repo" ).build() );
+        this.session = session
+                .withLocalRepository( localRepository )
+                .withRemoteRepositories( Collections.singletonList( remoteRepository ) );
+    }
+
+    @Test
+    void testCreateAndResolveArtifact() throws Exception
+    {
+        Artifact artifact = session.createArtifact( "org.codehaus.plexus", "plexus-utils", "1.4.5", "pom" );
+        assertFalse( artifact.getPath().isPresent() );
+
+        Artifact resolved =  session.resolveArtifact( artifact ).getArtifact();
+        assertNotSame( resolved, artifact );
+        assertTrue( resolved.getPath().isPresent() );
+        assertNotNull( resolved.getPath().get() );
+
+        Project project = session.getService( ProjectBuilder.class ).build(
+                        ProjectBuilderRequest.builder().session( session ).path( resolved.getPath().get() )
+                                .processPlugins( false ).resolveDependencies( false ).build() )
+                .getProject().get();
+        assertNotNull( project );
+
+        artifact = session.createArtifact( "org.codehaus.plexus", "plexus-container-default", "1.0-alpha-32", "jar" );
+        Node root = session.collectDependencies( artifact ).getRoot();
+        assertNotNull( root );
+    }
+
+
+}
diff --git a/maven-core-impl/src/test/java/org/apache/maven/impl/TestArtifactHandler.java b/maven-core-impl/src/test/java/org/apache/maven/impl/TestArtifactHandler.java
new file mode 100644
index 0000000..1411364
--- /dev/null
+++ b/maven-core-impl/src/test/java/org/apache/maven/impl/TestArtifactHandler.java
@@ -0,0 +1,83 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import org.apache.maven.artifact.handler.ArtifactHandler;
+
+/**
+ * Assists unit testing.
+ *
+ * @author Benjamin Bentmann
+ */
+class TestArtifactHandler
+    implements ArtifactHandler
+{
+
+    private String type;
+
+    private String extension;
+
+    public TestArtifactHandler( String type )
+    {
+        this( type, type );
+    }
+
+    public TestArtifactHandler( String type, String extension )
+    {
+        this.type = type;
+        this.extension = extension;
+    }
+
+    public String getClassifier()
+    {
+        return null;
+    }
+
+    public String getDirectory()
+    {
+        return getPackaging() + "s";
+    }
+
+    public String getExtension()
+    {
+        return extension;
+    }
+
+    public String getLanguage()
+    {
+        return "java";
+    }
+
+    public String getPackaging()
+    {
+        return type;
+    }
+
+    public boolean isAddedToClasspath()
+    {
+        return true;
+    }
+
+    public boolean isIncludesDependencies()
+    {
+        return false;
+    }
+
+}
diff --git a/maven-core-impl/src/test/java/org/apache/maven/impl/TestRepositorySystem.java b/maven-core-impl/src/test/java/org/apache/maven/impl/TestRepositorySystem.java
new file mode 100644
index 0000000..824ac27
--- /dev/null
+++ b/maven-core-impl/src/test/java/org/apache/maven/impl/TestRepositorySystem.java
@@ -0,0 +1,341 @@
+package org.apache.maven.impl;
+
+/*
+ * 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.
+ */
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.DefaultArtifact;
+import org.apache.maven.artifact.InvalidRepositoryException;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
+import org.apache.maven.artifact.repository.MavenArtifactRepository;
+import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
+import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
+import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
+import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
+import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
+import org.apache.maven.artifact.versioning.VersionRange;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.model.Repository;
+import org.apache.maven.model.io.ModelReader;
+import org.apache.maven.project.artifact.ArtifactWithDependencies;
+import org.apache.maven.repository.ArtifactDoesNotExistException;
+import org.apache.maven.repository.ArtifactTransferFailedException;
+import org.apache.maven.repository.ArtifactTransferListener;
+import org.apache.maven.repository.RepositorySystem;
+import org.apache.maven.settings.Mirror;
+import org.apache.maven.settings.Proxy;
+import org.apache.maven.settings.Server;
+import org.codehaus.plexus.util.FileUtils;
+import org.codehaus.plexus.util.StringUtils;
+import org.eclipse.aether.RepositorySystemSession;
+
+/**
+ * @author Benjamin Bentmann
+ */
+@Named
+@Singleton
+public class TestRepositorySystem
+        implements RepositorySystem
+{
+
+    private final ModelReader modelReader;
+
+    private final ArtifactFactory artifactFactory;
+
+    @Inject
+    public TestRepositorySystem( ModelReader modelReader, ArtifactFactory artifactFactory )
+    {
+        this.modelReader = modelReader;
+        this.artifactFactory = artifactFactory;
+    }
+
+    public ArtifactRepository buildArtifactRepository( Repository repository )
+        throws InvalidRepositoryException
+    {
+        return new MavenArtifactRepository( repository.getId(), repository.getUrl(), new DefaultRepositoryLayout(),
+                                            new ArtifactRepositoryPolicy(), new ArtifactRepositoryPolicy() );
+    }
+
+    public Artifact createArtifact( String groupId, String artifactId, String version, String packaging )
+    {
+        return createArtifact( groupId, artifactId, version, null, packaging );
+    }
+
+    public Artifact createArtifact( String groupId, String artifactId, String version, String scope, String type )
+    {
+        return new DefaultArtifact( groupId, artifactId, version, scope, type, null, new TestArtifactHandler( type ) );
+    }
+
+    public ArtifactRepository createArtifactRepository( String id, String url,
+                                                        ArtifactRepositoryLayout repositoryLayout,
+                                                        ArtifactRepositoryPolicy snapshots,
+                                                        ArtifactRepositoryPolicy releases )
+    {
+        return new MavenArtifactRepository( id, url, repositoryLayout, snapshots, releases );
+    }
+
+    public Artifact createArtifactWithClassifier( String groupId, String artifactId, String version, String type,
+                                                  String classifier )
+    {
+        return new DefaultArtifact( groupId, artifactId, version, null, type, classifier,
+                                    new TestArtifactHandler( type ) );
+    }
+
+    public ArtifactRepository createDefaultLocalRepository()
+        throws InvalidRepositoryException
+    {
+        return createLocalRepository( new File( System.getProperty( "basedir", "." ), "target/local-repo" ).getAbsoluteFile() );
+    }
+
+    public ArtifactRepository createDefaultRemoteRepository()
+        throws InvalidRepositoryException
+    {
+        return new MavenArtifactRepository( DEFAULT_REMOTE_REPO_ID, "file://"
+            + new File( System.getProperty( "basedir", "." ), "src/test/remote-repo" ).getAbsoluteFile().toURI().getPath(),
+                                            new DefaultRepositoryLayout(), new ArtifactRepositoryPolicy(),
+                                            new ArtifactRepositoryPolicy() );
+    }
+
+    public Artifact createDependencyArtifact( Dependency dependency )
+    {
+        Artifact artifact =
+            new DefaultArtifact( dependency.getGroupId(), dependency.getArtifactId(), dependency.getVersion(),
+                                 dependency.getScope(), dependency.getType(), dependency.getClassifier(),
+                                 new TestArtifactHandler( dependency.getType() ) );
+
+        if ( Artifact.SCOPE_SYSTEM.equals( dependency.getScope() ) )
+        {
+            artifact.setFile( new File( dependency.getSystemPath() ) );
+            artifact.setResolved( true );
+        }
+
+        return artifact;
+    }
+
+    public ArtifactRepository createLocalRepository( File localRepository )
+        throws InvalidRepositoryException
+    {
+        return new MavenArtifactRepository( DEFAULT_LOCAL_REPO_ID, "file://" + localRepository.toURI().getPath(),
+                                            new DefaultRepositoryLayout(), new ArtifactRepositoryPolicy(),
+                                            new ArtifactRepositoryPolicy() );
+    }
+
+    public Artifact createPluginArtifact( Plugin plugin )
+    {
+        VersionRange versionRange;
+        try
+        {
+            String version = plugin.getVersion();
+            if ( StringUtils.isEmpty( version ) )
+            {
+                version = "RELEASE";
+            }
+            versionRange = VersionRange.createFromVersionSpec( version );
+        }
+        catch ( InvalidVersionSpecificationException e )
+        {
+            return null;
+        }
+
+        return artifactFactory.createPluginArtifact( plugin.getGroupId(), plugin.getArtifactId(), versionRange );
+    }
+
+    public Artifact createProjectArtifact( String groupId, String artifactId, String version )
+    {
+        return createArtifact( groupId, artifactId, version, "pom" );
+    }
+
+    public List<ArtifactRepository> getEffectiveRepositories( List<ArtifactRepository> repositories )
+    {
+        return repositories;
+    }
+
+    public Mirror getMirror( ArtifactRepository repository, List<Mirror> mirrors )
+    {
+        return null;
+    }
+
+    public void injectAuthentication( List<ArtifactRepository> repositories, List<Server> servers )
+    {
+    }
+
+    public void injectMirror( List<ArtifactRepository> repositories, List<Mirror> mirrors )
+    {
+    }
+
+    public void injectProxy( List<ArtifactRepository> repositories, List<Proxy> proxies )
+    {
+    }
+
+    public void publish( ArtifactRepository repository, File source, String remotePath,
+                         ArtifactTransferListener transferListener )
+        throws ArtifactTransferFailedException
+    {
+        // TODO Auto-generated method stub
+
+    }
+
+    public ArtifactResolutionResult resolve( ArtifactResolutionRequest request )
+    {
+        ArtifactResolutionResult result = new ArtifactResolutionResult();
+
+        if ( request.isResolveRoot() )
+        {
+            try
+            {
+                resolve( request.getArtifact(), request );
+                result.addArtifact( request.getArtifact() );
+            }
+            catch ( IOException e )
+            {
+                result.addMissingArtifact( request.getArtifact() );
+            }
+        }
+
+        if ( request.isResolveTransitively() )
+        {
+            Map<String, Artifact> artifacts = new LinkedHashMap<>();
+
+            if ( request.getArtifactDependencies() != null )
+            {
+                for ( Artifact artifact : request.getArtifactDependencies() )
+                {
+                    artifacts.put( artifact.getDependencyConflictId(), artifact );
+                }
+            }
+
+            List<Dependency> dependencies = new ArrayList<>();
+            if ( request.getArtifact() instanceof ArtifactWithDependencies )
+            {
+                dependencies = ( (ArtifactWithDependencies) request.getArtifact() ).getDependencies();
+            }
+            else
+            {
+                Artifact pomArtifact =
+                    createProjectArtifact( request.getArtifact().getGroupId(), request.getArtifact().getArtifactId(),
+                                           request.getArtifact().getVersion() );
+                File pomFile =
+                    new File( request.getLocalRepository().getBasedir(),
+                              request.getLocalRepository().pathOf( pomArtifact ) );
+
+                try
+                {
+                    Model model = modelReader.read( pomFile, null );
+
+                    dependencies = model.getDependencies();
+                }
+                catch ( IOException e )
+                {
+                    e.printStackTrace();
+                }
+            }
+
+            for ( Dependency dependency : dependencies )
+            {
+                Artifact artifact = createDependencyArtifact( dependency );
+                if ( !artifacts.containsKey( artifact.getDependencyConflictId() ) )
+                {
+                    artifacts.put( artifact.getDependencyConflictId(), artifact );
+                }
+            }
+
+            for ( Artifact artifact : artifacts.values() )
+            {
+                try
+                {
+                    resolve( artifact, request );
+                    result.addArtifact( artifact );
+                }
+                catch ( IOException e )
+                {
+                    result.addMissingArtifact( artifact );
+                }
+            }
+        }
+
+        return result;
+    }
+
+    private void resolve( Artifact artifact, ArtifactResolutionRequest request )
+        throws IOException
+    {
+        if ( Artifact.SCOPE_SYSTEM.equals( artifact.getScope() ) )
+        {
+            return;
+        }
+
+        ArtifactRepository localRepo = request.getLocalRepository();
+
+        File localFile = new File( localRepo.getBasedir(), localRepo.pathOf( artifact ) );
+
+        artifact.setFile( localFile );
+
+        if ( !localFile.exists() )
+        {
+            if ( request.getRemoteRepositories().isEmpty() )
+            {
+                throw new IOException( localFile + " does not exist and no remote repositories are configured" );
+            }
+
+            ArtifactRepository remoteRepo = request.getRemoteRepositories().get( 0 );
+
+            File remoteFile = new File( remoteRepo.getBasedir(), remoteRepo.pathOf( artifact ) );
+
+            FileUtils.copyFile( remoteFile, localFile );
+        }
+
+        artifact.setResolved( true );
+    }
+
+    public void retrieve( ArtifactRepository repository, File destination, String remotePath,
+                          ArtifactTransferListener transferListener )
+        throws ArtifactTransferFailedException, ArtifactDoesNotExistException
+    {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void injectMirror( RepositorySystemSession session, List<ArtifactRepository> repositories )
+    {
+    }
+
+    public void injectProxy( RepositorySystemSession session, List<ArtifactRepository> repositories )
+    {
+    }
+
+    public void injectAuthentication( RepositorySystemSession session, List<ArtifactRepository> repositories )
+    {
+    }
+
+}
diff --git a/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar b/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar
new file mode 100644
index 0000000..c5c52ad
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar.sha1 b/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar.sha1
new file mode 100644
index 0000000..a52569f
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar.sha1
@@ -0,0 +1 @@
+48856bef6c64eb9689eab125197fdefc399c7858
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.pom b/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.pom
new file mode 100644
index 0000000..ecf6fcf
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.pom
@@ -0,0 +1,220 @@
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>commons-httpclient</groupId>
+  <artifactId>commons-httpclient</artifactId>
+  <name>HttpClient</name>
+  <version>2.0.2</version>
+  <description>The HttpClient  component supports the client-side of RFC 1945 (HTTP/1.0)  and RFC 2616 (HTTP/1.1) , several related specifications (RFC 2109 (Cookies) , RFC 2617 (HTTP Authentication) , etc.), and provides a framework by which new request types (methods) or HTTP extensions can be created easily.</description>
+  <url>http://jakarta.apache.org/commons/httpclient/</url>
+  <issueManagement>
+    <url>http://nagoya.apache.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;component=HttpClient</url>
+  </issueManagement>
+  <ciManagement>
+    <notifiers>
+      <notifier>
+        <configuration>
+          <address>commons-httpclient-dev@jakarta.apache.org</address>
+        </configuration>
+      </notifier>
+    </notifiers>
+  </ciManagement>
+  <inceptionYear>2001</inceptionYear>
+  <mailingLists>
+    <mailingList>
+      <name>HttpClient Mailing List</name>
+      <subscribe>commons-httpclient-dev-subscribe@jakarta.apache.org</subscribe>
+      <unsubscribe>commons-httpclient-dev-unsubscribe@jakarta.apache.org</unsubscribe>
+      <archive>http://nagoya.apache.org/eyebrowse/SummarizeList?listId=128</archive>
+    </mailingList>
+    <mailingList>
+      <name>Commons Developer List</name>
+      <subscribe>commons-dev-subscribe@jakarta.apache.org</subscribe>
+      <unsubscribe>commons-dev-unsubscribe@jakarta.apache.org</unsubscribe>
+      <archive>http://nagoya.apache.org/eyebrowse/SummarizeList?listId=15</archive>
+    </mailingList>
+    <mailingList>
+      <name>Commons User List</name>
+      <subscribe>commons-user-subscribe@jakarta.apache.org</subscribe>
+      <unsubscribe>commons-user-unsubscribe@jakarta.apache.org</unsubscribe>
+      <archive>http://nagoya.apache.org/eyebrowse/SummarizeList?listId=105</archive>
+    </mailingList>
+  </mailingLists>
+  <developers>
+    <developer>
+      <id>mbecke</id>
+      <name>Michael Becke</name>
+      <email>mbecke -at- apache.org</email>
+      <organization></organization>
+      <roles>
+        <role>Release Prime</role>
+        <role>Java Developer</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>jsdever</id>
+      <name>Jeff Dever</name>
+      <email>jsdever -at- apache.org</email>
+      <organization>Vault Technologies</organization>
+      <roles>
+        <role>List Moderator</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>dion</id>
+      <name>dIon Gillard</name>
+      <email>dion -at- apache.org</email>
+      <organization>Multitask Consulting</organization>
+      <roles>
+        <role>Java Developer</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>oglueck</id>
+      <name>Ortwin Glueck</name>
+      <email>oglueck -at -apache.org</email>
+      <organization>Nose Applied Intelligence AG</organization>
+      <roles>
+        <role>Java Developer</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>jericho</id>
+      <name>Sung-Gu</name>
+      <email>jericho -at- apache.org</email>
+      <organization></organization>
+      <roles>
+        <role>Java Developer</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>olegk</id>
+      <name>Oleg Kalnichevski</name>
+      <email>olegk -at- apache.org</email>
+      <roles>
+        <role>Java Developer</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>sullis</id>
+      <name>Sean C. Sullivan</name>
+      <email>sullis -at- apache.org</email>
+      <organization>Independent consultant</organization>
+      <roles>
+        <role>Java Developer</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>adrian</id>
+      <name>Adrian Sutton</name>
+      <email>adrian.sutton -at- ephox.com</email>
+      <organization>Intencha</organization>
+      <roles>
+        <role>Java Developer</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>rwaldhoff</id>
+      <name>Rodney Waldhoff</name>
+      <email>rwaldhoff -at- apache</email>
+      <organization>Britannica</organization>
+      <roles>
+        <role>Java Developer</role>
+      </roles>
+    </developer>
+  </developers>
+  <contributors>
+    <contributor>
+      <name>Armando Anton</name>
+      <email>armando.anton -at- newknow.com</email>
+    </contributor>
+    <contributor>
+      <name>Ola Berg</name>
+      <email></email>
+    </contributor>
+    <contributor>
+      <name>Sam Berlin</name>
+      <email>sberlin -at- limepeer.com</email>
+    </contributor>
+    <contributor>
+      <name>Mike Bowler</name>
+      <email></email>
+    </contributor>
+    <contributor>
+      <name>Eric Johnson</name>
+      <email>eric -at- tibco.com</email>
+    </contributor>
+    <contributor>
+      <name>Christian Kohlschuetter</name>
+      <email>ck -at- newsclub.de</email>
+    </contributor>
+    <contributor>
+      <name>Ryan Lubke</name>
+      <email>Ryan.Lubke -at- Sun.COM</email>
+    </contributor>
+    <contributor>
+      <name>Sam Maloney</name>
+      <email>sam.maloney -at- filogix.com</email>
+    </contributor>
+    <contributor>
+      <name>Rob Di Marco</name>
+      <email>rdimarco -at- hmsonline.com</email>
+    </contributor>
+    <contributor>
+      <name>Juergen Pill</name>
+      <email>Juergen.Pill -at- softwareag.com</email>
+    </contributor>
+    <contributor>
+      <name>Mohammad Rezaei</name>
+      <email>mohammad.rezaei -at- gs.com</email>
+    </contributor>
+    <contributor>
+      <name>Roland Weber</name>
+      <email>ROLWEBER -at- de.ibm.com</email>
+    </contributor>
+    <contributor>
+      <name>Laura Werner</name>
+      <email>laura -at- lwerner.org</email>
+    </contributor>
+  </contributors>
+  <scm>
+    <connection>scm:cvs:pserver:anoncvs@cvs.apache.org:/home/cvspublic:jakarta-commons/httpclient/</connection>
+    <url>http://cvs.apache.org/viewcvs.cgi/jakarta-commons/httpclient/</url>
+  </scm>
+  <organization>
+    <name>Apache Software Foundation</name>
+    <url>http://jakarta.apache.org/</url>
+  </organization>
+  <build>
+    <sourceDirectory>src/java</sourceDirectory>
+    <testSourceDirectory>src/test</testSourceDirectory>
+    <plugins>
+      <plugin>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <includes>
+            <include>**/TestNoHost.java</include>
+          </includes>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  <dependencies>
+    <dependency>
+      <groupId>commons-logging</groupId>
+      <artifactId>commons-logging</artifactId>
+      <version>1.0.3</version>
+    </dependency>
+  </dependencies>
+  <distributionManagement>
+    <repository>
+      <id>default</id>
+      <name>Default Repository</name>
+      <url>file:///www/jakarta.apache.org/builds/jakarta-commons/httpclient</url>
+    </repository>
+    <site>
+      <id>default</id>
+      <name>Default Site</name>
+      <url>scp://jakarta.apache.org//www/jakarta.apache.org/commons/httpclient/</url>
+    </site>
+  </distributionManagement>
+</project>
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.pom.sha1 b/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.pom.sha1
new file mode 100644
index 0000000..df64d3d
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.pom.sha1
@@ -0,0 +1 @@
+550c92401ae1458d4a4a1be4b8ab8ec19ce34e07  /home/projects/maven/repository-staging/to-ibiblio/maven2/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.pom
diff --git a/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.jar b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.jar
new file mode 100644
index 0000000..b99c937
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.jar.sha1 b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.jar.sha1
new file mode 100644
index 0000000..9e50b25
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.jar.sha1
@@ -0,0 +1 @@
+760c711c71588bc273d3e56d196d720a7678cd93
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.pom b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.pom
new file mode 100644
index 0000000..c46b27f
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.pom
@@ -0,0 +1,31 @@
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>commons-logging</groupId>
+  <artifactId>commons-logging</artifactId>
+  <name>Logging</name>
+  <version>1.0.3</version>
+  <description>Commons Logging</description>
+  <url>http://jakarta.apache.org/commons/logging/</url>
+  <inceptionYear>2001</inceptionYear>
+  <build />
+  <dependencies>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <version>1.2.6</version>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>logkit</groupId>
+      <artifactId>logkit</artifactId>
+      <version>1.0.1</version>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.7</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.pom.sha1 b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.pom.sha1
new file mode 100644
index 0000000..d135fea
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.pom.sha1
@@ -0,0 +1 @@
+b7de43bb310eb1dbfd00a34cec30500fa13cb577  /home/projects/maven/repository-staging/to-ibiblio/maven2/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.pom
diff --git a/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4-javadoc-resources.jar.lastUpdated b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4-javadoc-resources.jar.lastUpdated
new file mode 100644
index 0000000..6dcdbc7
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4-javadoc-resources.jar.lastUpdated
@@ -0,0 +1,4 @@
+#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
+#Thu Sep 24 16:40:08 CEST 2020
+https\://repo.maven.apache.org/maven2/.lastUpdated=1600958408640
+https\://repo.maven.apache.org/maven2/.error=
diff --git a/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar
new file mode 100644
index 0000000..b73a80f
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar.sha1 b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar.sha1
new file mode 100644
index 0000000..7e0a60e
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar.sha1
@@ -0,0 +1 @@
+f029a2aefe2b3e1517573c580f948caac31b1056
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.pom b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.pom
new file mode 100644
index 0000000..7c1017d
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.pom
@@ -0,0 +1,165 @@
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>commons-logging</groupId>
+  <artifactId>commons-logging</artifactId>
+  <name>Logging</name>
+  <version>1.0.4</version>
+  <description>Commons Logging is a thin adapter allowing configurable bridging to other,
+    well known logging systems.</description>
+  <url>http://jakarta.apache.org/commons/logging/</url>
+  <issueManagement>
+    <url>http://issues.apache.org/bugzilla/</url>
+  </issueManagement>
+  <ciManagement>
+    <notifiers>
+      <notifier>
+        <configuration>
+          <address>commons-dev@jakarta.apache.org</address>
+        </configuration>
+      </notifier>
+    </notifiers>
+  </ciManagement>
+  <inceptionYear>2001</inceptionYear>
+  <mailingLists>
+    <mailingList>
+      <name>Commons Dev List</name>
+      <subscribe>commons-dev-subscribe@jakarta.apache.org</subscribe>
+      <unsubscribe>commons-dev-unsubscribe@jakarta.apache.org</unsubscribe>
+      <archive>http://nagoya.apache.org/eyebrowse/SummarizeList?listName=commons-dev@jakarta.apache.org</archive>
+    </mailingList>
+    <mailingList>
+      <name>Commons User List</name>
+      <subscribe>commons-user-subscribe@jakarta.apache.org</subscribe>
+      <unsubscribe>commons-user-unsubscribe@jakarta.apache.org</unsubscribe>
+      <archive>http://nagoya.apache.org/eyebrowse/SummarizeList?listName=commons-user@jakarta.apache.org</archive>
+    </mailingList>
+  </mailingLists>
+  <developers>
+    <developer>
+      <id>morgand</id>
+      <name>Morgan Delagrange</name>
+      <email>morgand at apache dot org</email>
+      <organization>Apache</organization>
+      <roles>
+        <role>Java Developer</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>rwaldhoff</id>
+      <name>Rodney Waldhoff</name>
+      <email>rwaldhoff at apache org</email>
+      <organization>Apache Software Foundation</organization>
+    </developer>
+    <developer>
+      <id>craigmcc</id>
+      <name>Craig McClanahan</name>
+      <email>craigmcc at apache org</email>
+      <organization>Apache Software Foundation</organization>
+    </developer>
+    <developer>
+      <id>sanders</id>
+      <name>Scott Sanders</name>
+      <email>sanders at apache dot org</email>
+      <organization>Apache Software Foundation</organization>
+    </developer>
+    <developer>
+      <id>rdonkin</id>
+      <name>Robert Burrell Donkin</name>
+      <email>rdonkin at apache dot org</email>
+      <organization>Apache Software Foundation</organization>
+    </developer>
+    <developer>
+      <id>donaldp</id>
+      <name>Peter Donald</name>
+      <email>donaldp at apache dot org</email>
+      <organization></organization>
+    </developer>
+    <developer>
+      <id>costin</id>
+      <name>Costin Manolache</name>
+      <email>costin at apache dot org</email>
+      <organization>Apache Software Foundation</organization>
+    </developer>
+    <developer>
+      <id>rsitze</id>
+      <name>Richard Sitze</name>
+      <email>rsitze at apache dot org</email>
+      <organization>Apache Software Foundation</organization>
+    </developer>
+    <developer>
+      <id>baliuka</id>
+      <name>Juozas Baliuka</name>
+      <email>baliuka@apache.org</email>
+      <organization></organization>
+      <roles>
+        <role>Java Developer</role>
+      </roles>
+    </developer>
+  </developers>
+  <licenses>
+    <license>
+      <name>The Apache Software License, Version 2.0</name>
+      <url>/LICENSE.txt</url>
+    </license>
+  </licenses>
+  <scm>
+    <connection>scm:cvs:pserver:anoncvs@cvs.apache.org:/home/cvspublic:jakarta-commons/logging</connection>
+    <url>http://cvs.apache.org/viewcvs/jakarta-commons/logging/</url>
+  </scm>
+  <organization>
+    <name>The Apache Software Foundation</name>
+    <url>http://jakarta.apache.org</url>
+  </organization>
+  <build>
+    <sourceDirectory>src/java</sourceDirectory>
+    <testSourceDirectory>src/test</testSourceDirectory>
+    <plugins>
+      <plugin>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <includes>
+            <include>**/AvalonLoggerTest.java</include>
+          </includes>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  <dependencies>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <version>1.2.6</version>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>logkit</groupId>
+      <artifactId>logkit</artifactId>
+      <version>1.0.1</version>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.7</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>avalon-framework</groupId>
+      <artifactId>avalon-framework</artifactId>
+      <version>4.1.3</version>
+      <optional>true</optional>
+    </dependency>
+  </dependencies>
+  <distributionManagement>
+    <repository>
+      <id>default</id>
+      <name>Default Repository</name>
+      <url>file:///www/jakarta.apache.org/builds/jakarta-commons/logging/</url>
+    </repository>
+    <site>
+      <id>default</id>
+      <name>Default Site</name>
+      <url>scp://jakarta.apache.org//www/jakarta.apache.org/commons/logging/</url>
+    </site>
+  </distributionManagement>
+</project>
diff --git a/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.pom.sha1 b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.pom.sha1
new file mode 100644
index 0000000..92265fb
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.pom.sha1
@@ -0,0 +1 @@
+7d32e7520b801cabc3dc704d2afe59d020d00c45  /home/projects/maven/repository-staging/to-ibiblio/maven2/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.pom
diff --git a/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.jar b/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.jar
new file mode 100644
index 0000000..66bf3d8
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.jar.sha1 b/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.jar.sha1
new file mode 100644
index 0000000..0e206f2
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.jar.sha1
@@ -0,0 +1 @@
+c27b09f985eef162b5d335f0460a130cc117596a
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.pom b/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.pom
new file mode 100644
index 0000000..293102d
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.pom
@@ -0,0 +1,8 @@
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>de.zeigermann.xml</groupId>
+  <artifactId>xml-im-exporter</artifactId>
+  <name>XML Im-/Exporter</name>
+  <version>1.1</version>
+  <url>http://xml-im-exporter.sourceforge.net</url>
+</project>
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.pom.sha1 b/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.pom.sha1
new file mode 100644
index 0000000..5745f44
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.pom.sha1
@@ -0,0 +1 @@
+9bb0e7f3066fdfe0978de52b2082211a65b9c70f  /home/projects/maven/repository-staging/to-ibiblio/maven2/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.pom
diff --git a/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.jar b/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.jar
new file mode 100644
index 0000000..288e64c
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.jar.sha1 b/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.jar.sha1
new file mode 100644
index 0000000..da5395e
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.jar.sha1
@@ -0,0 +1 @@
+a2ac1cd690ab4c80defe7f9bce14d35934c35cec
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.pom b/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.pom
new file mode 100644
index 0000000..48bfb49
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.pom
@@ -0,0 +1,40 @@
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>jdom</groupId>
+  <artifactId>jdom</artifactId>
+  <version>1.0</version>
+  <dependencies>
+    <dependency>
+      <groupId>xerces</groupId>
+      <artifactId>xercesImpl</artifactId>
+      <version>2.6.0</version>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>xml-apis</groupId>
+      <artifactId>xml-apis</artifactId>
+      <version>1.0.b2</version>
+      <optional>true</optional>
+    </dependency>
+    <!-- should be replaced jaxen-jdom provided with jdom -->
+    <dependency>
+      <groupId>jaxen</groupId>
+      <artifactId>jaxen</artifactId>
+      <version>1.0-FCS</version>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>saxpath</groupId>
+      <artifactId>saxpath</artifactId>
+      <version>1.0-FCS</version>
+      <optional>true</optional>
+    </dependency>
+    <!-- should be replaced by xalan.jar from jdom, their version was 2.5.D1 -->
+    <dependency>
+      <groupId>xalan</groupId>
+      <artifactId>xalan</artifactId>
+      <version>2.5.0</version>
+      <optional>true</optional>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.pom.sha1 b/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.pom.sha1
new file mode 100644
index 0000000..5da1a33
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.pom.sha1
@@ -0,0 +1 @@
+7d57cf1fa9e1cd07ac40d86b9ce4e4de1b753aa2  /home/projects/maven/repository-staging/to-ibiblio/maven2/jdom/jdom/1.0/jdom-1.0.pom
diff --git a/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc-resources.jar.lastUpdated b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc-resources.jar.lastUpdated
new file mode 100644
index 0000000..d1d0e80
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc-resources.jar.lastUpdated
@@ -0,0 +1,4 @@
+#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
+#Wed Jan 05 14:06:51 CET 2022
+https\://repo.maven.apache.org/maven2/.lastUpdated=1641388011966
+https\://repo.maven.apache.org/maven2/.error=
diff --git a/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc.jar b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc.jar
new file mode 100644
index 0000000..d284bd0
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc.jar.sha1 b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc.jar.sha1
new file mode 100644
index 0000000..730c504
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc.jar.sha1
@@ -0,0 +1 @@
+9d466b5eabb0cb144c8c9ef8b4ee6db15d46d6e6
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-sources.jar b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-sources.jar
new file mode 100644
index 0000000..b68ac35
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-sources.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-sources.jar.sha1 b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-sources.jar.sha1
new file mode 100644
index 0000000..323daab
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-sources.jar.sha1
@@ -0,0 +1 @@
+523bdce923a13622132b263550d06519fc591ec4
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.jar b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.jar
new file mode 100644
index 0000000..b376ffc
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.jar.sha1 b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.jar.sha1
new file mode 100644
index 0000000..a0369ca
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.jar.sha1
@@ -0,0 +1 @@
+cdd00374f1fee76b11e2a9d127405aa3f6be5b6a
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.pom b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.pom
new file mode 100644
index 0000000..4287158
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.pom
@@ -0,0 +1,587 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>junit</groupId>
+    <artifactId>junit</artifactId>
+    <version>4.13.1</version>
+
+    <name>JUnit</name>
+    <description>JUnit is a unit testing framework for Java, created by Erich Gamma and Kent Beck.</description>
+    <url>http://junit.org</url>
+    <inceptionYear>2002</inceptionYear>
+    <organization>
+        <name>JUnit</name>
+        <url>http://www.junit.org</url>
+    </organization>
+    <licenses>
+        <license>
+            <name>Eclipse Public License 1.0</name>
+            <url>http://www.eclipse.org/legal/epl-v10.html</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+
+    <developers>
+        <developer>
+            <id>dsaff</id>
+            <name>David Saff</name>
+            <email>david@saff.net</email>
+        </developer>
+        <developer>
+            <id>kcooney</id>
+            <name>Kevin Cooney</name>
+            <email>kcooney@google.com</email>
+        </developer>
+        <developer>
+            <id>stefanbirkner</id>
+            <name>Stefan Birkner</name>
+            <email>mail@stefan-birkner.de</email>
+        </developer>
+        <developer>
+            <id>marcphilipp</id>
+            <name>Marc Philipp</name>
+            <email>mail@marcphilipp.de</email>
+        </developer>
+    </developers>
+    <contributors>
+        <contributor>
+            <name>JUnit contributors</name>
+            <organization>JUnit</organization>
+            <email>team@junit.org</email>
+            <url>https://github.com/junit-team/junit4/graphs/contributors</url>
+            <roles>
+                <role>developers</role>
+            </roles>
+        </contributor>
+    </contributors>
+
+    <prerequisites>
+        <maven>3.0.4</maven>
+    </prerequisites>
+
+    <scm>
+        <connection>scm:git:git://github.com/junit-team/junit4.git</connection>
+        <developerConnection>scm:git:git@github.com:junit-team/junit4.git</developerConnection>
+        <url>https://github.com/junit-team/junit4</url>
+      <tag>r4.13.1</tag>
+  </scm>
+    <issueManagement>
+        <system>github</system>
+        <url>https://github.com/junit-team/junit4/issues</url>
+    </issueManagement>
+    <ciManagement>
+        <system>travis</system>
+        <url>https://travis-ci.org/junit-team/junit4</url>
+    </ciManagement>
+    <distributionManagement>
+        <downloadUrl>https://github.com/junit-team/junit4/wiki/Download-and-Install</downloadUrl>
+        <snapshotRepository>
+            <id>junit-snapshot-repo</id>
+            <name>Nexus Snapshot Repository</name>
+            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
+        </snapshotRepository>
+        <repository>
+            <id>junit-releases-repo</id>
+            <name>Nexus Release Repository</name>
+            <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
+        </repository>
+        <site>
+            <id>junit.github.io</id>
+            <url>gitsite:git@github.com/junit-team/junit4.git</url>
+        </site>
+    </distributionManagement>
+
+    <properties>
+        <jdkVersion>1.5</jdkVersion>
+        <surefireVersion>2.19.1</surefireVersion>
+        <hamcrestVersion>1.3</hamcrestVersion>
+        <project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
+        <arguments />
+        <gpg.keyname>67893CC4</gpg.keyname>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest-core</artifactId>
+            <version>${hamcrestVersion}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest-library</artifactId>
+            <version>${hamcrestVersion}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+            </resource>
+            <resource>
+                <directory>${project.basedir}</directory>
+                <includes>
+                    <include>LICENSE-junit.txt</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <!--
+            Both "org.apache" and "org.codehaus" are default providers of MOJO plugins
+            which are especially dedicated to Maven projects.
+            The MOJO stands for "Maven plain Old Java Object".
+            Each mojo is an executable goal in Maven, and a plugin is a distribution of
+            one or more related mojos.
+            For more information see http://maven.apache.org/plugin-developers/index.html
+
+            The following plugins are ordered according the Maven build lifecycle.
+            http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
+            -->
+            <plugin>
+                <!--
+                Checks that the version of user's maven installation is 3.0.4,
+                the JDK is 1.5+, no non-standard repositories are specified in
+                the project, requires only release versions of dependencies of other artifacts.
+                -->
+                <artifactId>maven-enforcer-plugin</artifactId>
+                <version>1.4</version>
+                <executions>
+                    <execution>
+                        <id>enforce-versions</id>
+                        <phase>initialize</phase>
+                        <goals>
+                            <goal>enforce</goal>
+                        </goals>
+                        <configuration>
+                            <fail>true</fail>
+                            <rules>
+                                <requireMavenVersion>
+                                    <!-- Some plugin features require a recent Maven runtime to work properly -->
+                                    <message>Current version of Maven ${maven.version} required to build the project
+                                        should be ${project.prerequisites.maven}, or higher!
+                                    </message>
+                                    <version>[${project.prerequisites.maven},)</version>
+                                </requireMavenVersion>
+                                <requireJavaVersion>
+                                    <message>Current JDK version ${java.version} should be ${jdkVersion}, or higher!
+                                    </message>
+                                    <version>${jdkVersion}</version>
+                                </requireJavaVersion>
+                                <requireNoRepositories>
+                                    <message>Best Practice is to never define repositories in pom.xml (use a repository
+                                        manager instead).
+                                    </message>
+                                </requireNoRepositories>
+                                <requireReleaseDeps>
+                                    <message>No Snapshots Dependencies Allowed!</message>
+                                </requireReleaseDeps>
+                            </rules>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <!--
+                Updates Version#id().
+                -->
+                <groupId>com.google.code.maven-replacer-plugin</groupId>
+                <artifactId>replacer</artifactId>
+                <version>1.5.3</version>
+                <executions>
+                    <execution>
+                        <phase>process-sources</phase>
+                        <goals>
+                            <goal>replace</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <ignoreMissingFile>false</ignoreMissingFile>
+                    <file>${project.build.sourceDirectory}/junit/runner/Version.java.template</file>
+                    <outputFile>${project.build.sourceDirectory}/junit/runner/Version.java</outputFile>
+                    <regex>false</regex>
+                    <token>@version@</token>
+                    <value>${project.version}</value>
+                </configuration>
+            </plugin>
+            <plugin><!-- Using jdk 1.5.0_22, package-info.java files are compiled correctly. -->
+                <!--
+                java compiler plugin forked in extra process
+                -->
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.3</version>
+                <configuration>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                    <source>${jdkVersion}</source>
+                    <target>${jdkVersion}</target>
+                    <testSource>${jdkVersion}</testSource>
+                    <testTarget>${jdkVersion}</testTarget>
+                    <compilerVersion>1.5</compilerVersion>
+                    <showDeprecation>true</showDeprecation>
+                    <showWarnings>true</showWarnings>
+                    <debug>true</debug>
+                    <fork>true</fork>
+                    <compilerArgs>
+                        <arg>-Xlint:unchecked</arg>
+                    </compilerArgs>
+                    <maxmem>128m</maxmem>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>animal-sniffer-maven-plugin</artifactId>
+                <version>1.14</version>
+                <executions>
+                    <execution>
+                        <id>signature-check</id>
+                        <phase>test</phase>
+                        <goals>
+                            <goal>check</goal>
+                        </goals>
+                        <configuration>
+                            <signature>
+                                <groupId>org.codehaus.mojo.signature</groupId>
+                                <artifactId>java15</artifactId>
+                                <version>1.0</version>
+                            </signature>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <!--
+                A plugin which uses the JUnit framework in order to start
+                our junit suite "AllTests" after the sources are compiled.
+                -->
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>${surefireVersion}</version>
+                <configuration>
+                    <test>org/junit/tests/AllTests.java</test>
+                    <useSystemClassLoader>true</useSystemClassLoader>
+                    <enableAssertions>false</enableAssertions>
+                </configuration>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.apache.maven.surefire</groupId>
+                        <artifactId>surefire-junit47</artifactId>
+                        <version>${surefireVersion}</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
+            <plugin>
+                <!--
+                This plugin can package the main artifact's sources (src/main/java)
+                in to jar archive. See target/junit-*-sources.jar.
+                -->
+                <artifactId>maven-source-plugin</artifactId>
+                <version>2.4</version>
+            </plugin>
+            <plugin>
+                <!--
+                This plugin can generate Javadoc by a forked
+                process and then package the Javadoc
+                in jar archive target/junit-*-javadoc.jar.
+                -->
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <version>2.10.3</version>
+                <configuration>
+                    <stylesheetfile>${basedir}/src/main/javadoc/stylesheet.css</stylesheetfile>
+                    <show>protected</show>
+                    <author>false</author>
+                    <version>false</version>
+                    <detectLinks>false</detectLinks>
+                    <linksource>true</linksource>
+                    <keywords>true</keywords>
+                    <use>true</use>
+                    <windowtitle>JUnit API</windowtitle>
+                    <encoding>UTF-8</encoding>
+                    <locale>en</locale>
+                    <javadocVersion>${jdkVersion}</javadocVersion>
+                    <javaApiLinks>
+                        <property>
+                            <name>api_${jdkVersion}</name>
+                            <value>http://docs.oracle.com/javase/${jdkVersion}.0/docs/api/</value>
+                        </property>
+                    </javaApiLinks>
+                    <excludePackageNames>*.internal.*</excludePackageNames>
+                    <verbose>true</verbose>
+                    <minmemory>32m</minmemory>
+                    <maxmemory>128m</maxmemory>
+                    <failOnError>true</failOnError>
+                    <includeDependencySources>true</includeDependencySources>
+                    <dependencySourceIncludes>
+                        <dependencySourceInclude>org.hamcrest:hamcrest-core:*</dependencySourceInclude>
+                    </dependencySourceIncludes>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-release-plugin</artifactId>
+                <version>2.5.2</version>
+                <configuration>
+                    <mavenExecutorId>forked-path</mavenExecutorId>
+                    <useReleaseProfile>false</useReleaseProfile>
+                    <arguments>-Pgenerate-docs,junit-release ${arguments}</arguments>
+                    <tagNameFormat>r@{project.version}</tagNameFormat>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-site-plugin</artifactId>
+                <version>3.4</version>
+                <dependencies>
+                    <dependency>
+                        <groupId>com.github.stephenc.wagon</groupId>
+                        <artifactId>wagon-gitsite</artifactId>
+                        <version>0.4.1</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.maven.doxia</groupId>
+                        <artifactId>doxia-module-markdown</artifactId>
+                        <version>1.5</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
+            <plugin>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>2.6</version>
+                <configuration>
+                    <archive>
+                        <addMavenDescriptor>false</addMavenDescriptor>
+                        <manifest>
+                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+                        </manifest>
+                        <manifestEntries>
+                            <Automatic-Module-Name>junit</Automatic-Module-Name>
+                        </manifestEntries>                        
+                    </archive>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-clean-plugin</artifactId>
+                <version>2.6.1</version>
+            </plugin>
+            <plugin>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <version>2.8.2</version>
+            </plugin>
+            <plugin>
+                <artifactId>maven-install-plugin</artifactId>
+                <version>2.5.2</version>
+            </plugin>
+            <plugin>
+                <artifactId>maven-resources-plugin</artifactId>
+                <version>2.7</version>
+            </plugin>
+        </plugins>
+    </build>
+
+    <reporting>
+        <plugins>
+            <plugin>
+                <artifactId>maven-project-info-reports-plugin</artifactId>
+                <version>2.8</version>
+                <configuration>
+                    <dependencyLocationsEnabled>false</dependencyLocationsEnabled>
+                    <!-- waiting for MPIR-267 -->
+                </configuration>
+                <reportSets>
+                    <reportSet>
+                        <reports>
+                            <report>index</report>
+                            <report>dependency-info</report>
+                            <report>modules</report>
+                            <report>license</report>
+                            <report>project-team</report>
+                            <report>scm</report>
+                            <report>issue-tracking</report>
+                            <report>mailing-list</report>
+                            <report>dependency-management</report>
+                            <report>dependencies</report>
+                            <report>dependency-convergence</report>
+                            <report>cim</report>
+                            <report>distribution-management</report>
+                        </reports>
+                    </reportSet>
+                </reportSets>
+            </plugin>
+            <plugin>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <version>2.10.3</version>
+                <configuration>
+                    <destDir>javadoc/latest</destDir>
+                    <stylesheetfile>${basedir}/src/main/javadoc/stylesheet.css</stylesheetfile>
+                    <show>protected</show>
+                    <author>false</author>
+                    <version>false</version>
+                    <detectLinks>false</detectLinks>
+                    <linksource>true</linksource>
+                    <keywords>true</keywords>
+                    <use>true</use>
+                    <windowtitle>JUnit API</windowtitle>
+                    <encoding>UTF-8</encoding>
+                    <locale>en</locale>
+                    <javadocVersion>${jdkVersion}</javadocVersion>
+                    <javaApiLinks>
+                        <property>
+                            <name>api_${jdkVersion}</name>
+                            <value>http://docs.oracle.com/javase/${jdkVersion}.0/docs/api/</value>
+                        </property>
+                    </javaApiLinks>
+                    <excludePackageNames>junit.*,*.internal.*</excludePackageNames>
+                    <verbose>true</verbose>
+                    <minmemory>32m</minmemory>
+                    <maxmemory>128m</maxmemory>
+                    <failOnError>true</failOnError>
+                    <includeDependencySources>true</includeDependencySources>
+                    <dependencySourceIncludes>
+                        <dependencySourceInclude>org.hamcrest:hamcrest-core:*</dependencySourceInclude>
+                    </dependencySourceIncludes>
+                </configuration>
+                <reportSets>
+                    <reportSet>
+                        <reports>
+                            <report>javadoc</report>
+                        </reports>
+                    </reportSet>
+                </reportSets>
+            </plugin>
+        </plugins>
+    </reporting>
+
+    <profiles>
+        <profile>
+            <id>junit-release</id>
+            <!--
+            Signs all artifacts before deploying to Maven Central.
+            -->
+            <build>
+                <plugins>
+                    <plugin>
+                        <!--
+                        The goal is to sign all artifacts so that the user may verify them before downloading.
+                        The automatic build system may reuire your key ID, and passphrase specified using system properties:
+                        -Dgpg.passphrase="<passphrase>" -Dgpg.keyname="<your key ID>"
+                        In order to create the key pair, use the command "gpg &ndash;&ndash;gen-key".
+                        (&ndash;&ndash; stands for double dash)
+                        -->
+                        <artifactId>maven-gpg-plugin</artifactId>
+                        <version>1.6</version>
+                        <executions>
+                            <execution>
+                                <id>gpg-sign</id>
+                                <phase>verify</phase>
+                                <goals>
+                                    <goal>sign</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>generate-docs</id>
+            <!--
+            Generate the documentation artifacts. 
+            Note: this profile is also required to be active for release
+            builds due to the packaging requirements of the Central repo
+            -->
+            <build>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-source-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>attach-sources</id>
+                                <phase>prepare-package</phase>
+                                <goals>
+                                    <goal>jar-no-fork</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-javadoc-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>attach-javadoc</id>
+                                <phase>package</phase>
+                                <goals>
+                                    <goal>jar</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>restrict-doclint</id>
+            <!-- doclint is only supported by JDK 8 -->
+            <activation>
+                <jdk>[1.8,)</jdk>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-compiler-plugin</artifactId>
+                        <configuration>
+                            <compilerArgs>
+                                <arg>-Xlint:unchecked</arg>
+                                <arg>-Xdoclint:accessibility,reference,syntax</arg>
+                            </compilerArgs>
+                        </configuration>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-javadoc-plugin</artifactId>
+                        <configuration>
+                            <additionalparam>-Xdoclint:accessibility -Xdoclint:reference</additionalparam>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+            <reporting>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-javadoc-plugin</artifactId>
+                        <configuration>
+                            <additionalparam>-Xdoclint:accessibility -Xdoclint:reference</additionalparam>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </reporting>
+        </profile>
+        <profile>
+            <id>java9</id>
+            <activation>
+                <jdk>[1.9,)</jdk>
+            </activation>
+            <properties>
+                <!-- JDK 9 minimal source and target versions are 1.6 -->
+                <jdkVersion>1.6</jdkVersion>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-javadoc-plugin</artifactId>
+                        <configuration>
+                            <source>1.6</source>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+            <reporting>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-javadoc-plugin</artifactId>
+                        <configuration>
+                            <source>1.6</source>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </reporting>
+        </profile>
+    </profiles>
+</project>
diff --git a/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.pom.sha1 b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.pom.sha1
new file mode 100644
index 0000000..d843b12
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.pom.sha1
@@ -0,0 +1 @@
+643e8b4c40dca9f0b0abd8125d378d9f47d7d69e
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/apache/3/apache-3.pom b/maven-core-impl/src/test/resources/repo/org/apache/apache/3/apache-3.pom
new file mode 100644
index 0000000..9593e9e
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/apache/3/apache-3.pom
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  ~ Copyright 2005-2006 The Apache Software Foundation.
+  ~
+  ~ Licensed 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <!-- Shared parent. Doesn't define a lot of things about Apache like general mailing lists, but does
+       define the settings common to all projects at Apache -->
+  <groupId>org.apache</groupId>
+  <artifactId>apache</artifactId>
+  <version>3</version>
+  <packaging>pom</packaging>
+  <name>The Apache Software Foundation</name>
+  <description>
+    The Apache Software Foundation provides support for the Apache community of open-source software projects.
+    The Apache projects are characterized by a collaborative, consensus based development process, an open and
+    pragmatic software license, and a desire to create high quality software that leads the way in its field.
+    We consider ourselves not simply a group of projects sharing a server, but rather a community of developers
+    and users.
+  </description>
+  <licenses>
+    <license>
+      <name>The Apache Software License, Version 2.0</name>
+      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
+  <organization>
+    <name>Apache Software Foundation</name>
+    <url>http://www.apache.org/</url>
+  </organization>
+  <url>http://www.apache.org/</url>
+  <repositories>
+    <repository>
+      <id>apache.snapshots</id>
+      <name>Apache Snapshot Repository</name>
+      <url>http://people.apache.org/repo/m2-snapshot-repository</url>
+      <releases>
+        <enabled>false</enabled>
+      </releases>
+    </repository>
+  </repositories>
+  <distributionManagement>
+    <!-- Site omitted - each project must provide their own -->
+    <repository>
+      <id>apache.releases</id>
+      <name>Apache Release Distribution Repository</name>
+      <url>scp://people.apache.org/www/people.apache.org/repo/m2-ibiblio-rsync-repository</url>
+    </repository>
+    <snapshotRepository>
+      <id>apache.snapshots</id>
+      <name>Apache Development Snapshot Repository</name>
+      <url>scp://people.apache.org/www/people.apache.org/repo/m2-snapshot-repository</url>
+    </snapshotRepository>
+  </distributionManagement>
+  <mailingLists>
+    <mailingList>
+      <name>Apache Announce List</name>
+      <subscribe>announce-subscribe@apache.org</subscribe>
+      <unsubscribe>announce-unsubscribe@apache.org</unsubscribe>
+      <post>announce@apache.org</post>
+      <archive>http://mail-archives.apache.org/mod_mbox/www-announce/</archive>
+    </mailingList>
+  </mailingLists>
+</project>
+
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/apache/3/apache-3.pom.md5 b/maven-core-impl/src/test/resources/repo/org/apache/apache/3/apache-3.pom.md5
new file mode 100644
index 0000000..b9d0ea1
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/apache/3/apache-3.pom.md5
@@ -0,0 +1 @@
+c857ebbb5f303f435495e40e6c9e45a2
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/apache/3/apache-3.pom.sha1 b/maven-core-impl/src/test/resources/repo/org/apache/apache/3/apache-3.pom.sha1
new file mode 100644
index 0000000..ffb57bb
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/apache/3/apache-3.pom.sha1
@@ -0,0 +1 @@
+1bc0010136a890e2fd38d901a0b7ecdf0e3f9871
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar
new file mode 100644
index 0000000..5bc9c06
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar.md5 b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar.md5
new file mode 100644
index 0000000..5ff89e8
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar.md5
@@ -0,0 +1 @@
+430da483dcfb2964a9dcd619c29a6c78
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar.sha1 b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar.sha1
new file mode 100644
index 0000000..a341880
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar.sha1
@@ -0,0 +1 @@
+ea9e3f3fdc25f386d5f9ac861a55b6c3bb773d91
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom
new file mode 100644
index 0000000..4c344c8
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom
@@ -0,0 +1,112 @@
+<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>maven-parent</artifactId>
+    <groupId>org.apache.maven</groupId>
+    <version>5</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.maven.artifact</groupId>
+  <artifactId>maven-artifact</artifactId>
+  <version>3.0-SNAPSHOT</version>
+  <name>Maven Artifact</name>
+  <scm>
+    <connection>scm:svn:http://svn.apache.org/repos/asf/maven/artifact/trunk</connection>
+    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/maven/artifact/trunk</developerConnection>
+    <url>http://svn.apache.org/viewcvs.cgi/maven/artifact/trunk</url>
+  </scm>
+  <dependencies>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-utils</artifactId>
+      <version>1.4.5</version>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-container-default</artifactId>
+      <version>1.0-alpha-32</version>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-active-collections</artifactId>
+      <version>1.0-beta-1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.wagon</groupId>
+      <artifactId>wagon-provider-api</artifactId>
+      <version>1.0-beta-2</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.wagon</groupId>
+      <artifactId>wagon-file</artifactId>
+      <version>1.0-beta-2</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.modello</groupId>
+        <artifactId>modello-maven-plugin</artifactId>
+        <version>1.0-alpha-17</version>
+        <configuration>
+          <version>1.0.0</version>
+          <model>src/main/mdo/metadata.mdo</model>
+        </configuration>
+        <executions>
+          <execution>
+            <id>site-docs</id>
+            <phase>pre-site</phase>
+            <goals>
+              <goal>xdoc</goal>
+              <goal>xsd</goal>
+            </goals>
+          </execution>
+          <execution>
+            <id>standard</id>
+            <goals>
+              <goal>java</goal>
+              <goal>xpp3-reader</goal>
+              <goal>xpp3-writer</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <excludes>
+            <exclude>**/testutils/**</exclude>
+          </excludes>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom.md5 b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom.md5
new file mode 100644
index 0000000..11e3536
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom.md5
@@ -0,0 +1 @@
+794377b5385c68c660ee9ca26e6b5cf1
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom.sha1 b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom.sha1
new file mode 100644
index 0000000..4beb688
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom.sha1
@@ -0,0 +1 @@
+358254e73f075bcfb9d587d0da553083abd0cc45
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.jar b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.jar
new file mode 100644
index 0000000..0272ee3
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom
new file mode 100644
index 0000000..fee83c9
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom
@@ -0,0 +1,73 @@
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.maven.core.test</groupId>
+  <artifactId>test-extension</artifactId>
+  <packaging>jar</packaging>
+  <version>1</version>
+  <name>test-extension</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.artifact</groupId>
+      <artifactId>maven-artifact</artifactId>
+      <version>3.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-utils</artifactId>
+      <version>1.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus</artifactId>
+      <version>1.0.11</version>
+      <type>pom</type>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-component-api</artifactId>
+      <version>1.0-alpha-16</version>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-container-default</artifactId>
+      <version>1.0-alpha-16</version>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <version>2.2-beta-2-SNAPSHOT</version>
+        <executions>
+          <execution>
+            <id>repo-assembly</id>
+            <phase>package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+            <configuration>
+              <descriptors>
+                <descriptor>repo.xml</descriptor>
+              </descriptors>
+              <finalName>test-extension</finalName>
+              <appendAssemblyId>true</appendAssemblyId>
+              <outputDirectory>${pom.basedir}/../../resources/org/apache/maven/extension</outputDirectory>
+              <ignoreDirFormatExtensions>true</ignoreDirFormatExtensions>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <distributionManagement>
+    <repository>
+      <id>dummy</id>
+      <url>file:///tmp/dummy-repo</url>
+    </repository>
+  </distributionManagement>
+
+</project>
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom.md5 b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom.md5
new file mode 100644
index 0000000..ad06718
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom.md5
@@ -0,0 +1 @@
+e8f6e0f4ef9c2ed3fb185ef44165fb40
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom.sha1 b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom.sha1
new file mode 100644
index 0000000..6065ee0
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom.sha1
@@ -0,0 +1 @@
+88ace5d78ee32fa0ce59714a4a42a73af3b52bd3
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.jar b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.jar
new file mode 100644
index 0000000..04fe384
Binary files /dev/null and b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.jar differ
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom
new file mode 100644
index 0000000..01aaa42
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom
@@ -0,0 +1,44 @@
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.maven.core.test</groupId>
+  <artifactId>test-lifecycle-and-artifactHandler</artifactId>
+  <packaging>jar</packaging>
+  <version>1</version>
+  <name>test-lifecycle-and-artifactHandler</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <version>2.2-beta-2-SNAPSHOT</version>
+        <executions>
+          <execution>
+            <id>repo-assembly</id>
+            <phase>package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+            <configuration>
+              <descriptors>
+                <descriptor>repo.xml</descriptor>
+              </descriptors>
+              <finalName>test-extension</finalName>
+              <appendAssemblyId>true</appendAssemblyId>
+              <outputDirectory>${pom.basedir}/../../resources/org/apache/maven/extension</outputDirectory>
+              <ignoreDirFormatExtensions>true</ignoreDirFormatExtensions>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <distributionManagement>
+    <repository>
+      <id>dummy</id>
+      <url>file:///tmp/dummy-repo</url>
+    </repository>
+  </distributionManagement>
+
+</project>
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.md5 b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.md5
new file mode 100644
index 0000000..01d5194
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.md5
@@ -0,0 +1 @@
+7f10427af029d20cbea57c21d1aec65e
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.sha1 b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.sha1
new file mode 100644
index 0000000..dac1e45
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.sha1
@@ -0,0 +1 @@
+ed98c808239aefb0ec51a8b9e96f191da7fd92e6
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/4/maven-parent-4.pom b/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/4/maven-parent-4.pom
new file mode 100644
index 0000000..b41037f
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/4/maven-parent-4.pom
@@ -0,0 +1,304 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  ~ Copyright 2005-2006 The Apache Software Foundation.
+  ~
+  ~ Licensed 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache</groupId>
+    <artifactId>apache</artifactId>
+    <version>3</version>
+    <relativePath>../asf/pom.xml</relativePath>
+  </parent>
+  <groupId>org.apache.maven</groupId>
+  <artifactId>maven-parent</artifactId>
+  <version>4</version>
+  <packaging>pom</packaging>
+  <name>Apache Maven</name>
+  <description>
+    Maven is a software project management and comprehension tool. Based on the concept of a project object model
+    (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.
+  </description>
+  <url>http://maven.apache.org/</url>
+  <issueManagement>
+    <system>jira</system>
+    <url>http://jira.codehaus.org/browse/MPA</url>
+  </issueManagement>
+  <ciManagement>
+    <system>continuum</system>
+    <url>http://maven.zones.apache.org:8080/continuum</url>
+    <notifiers>
+      <notifier>
+        <type>mail</type>
+        <configuration>
+          <address>notifications@maven.apache.org</address>
+        </configuration>
+      </notifier>
+    </notifiers>
+  </ciManagement>
+  <inceptionYear>2002</inceptionYear>
+  <mailingLists>
+    <mailingList>
+      <name>Maven Announcements List</name>
+      <post>announce@maven.apache.org</post>
+      <subscribe>announce-subscribe@maven.apache.org</subscribe>
+      <unsubscribe>announce-unsubscribe@maven.apache.org</unsubscribe>
+      <archive>http://mail-archives.apache.org/mod_mbox/maven-announce/</archive>
+    </mailingList>
+    <mailingList>
+      <name>Maven Issues List</name>
+      <post>issues@maven.apache.org</post>
+      <subscribe>issues-subscribe@maven.apache.org</subscribe>
+      <unsubscribe>issues-unsubscribe@maven.apache.org</unsubscribe>
+      <archive>http://mail-archives.apache.org/mod_mbox/maven-issues/</archive>
+    </mailingList>
+    <mailingList>
+      <name>Maven Notifications List</name>
+      <post>notifications@maven.apache.org</post>
+      <subscribe>notifications-subscribe@maven.apache.org</subscribe>
+      <unsubscribe>notifications-unsubscribe@maven.apache.org</unsubscribe>
+      <archive>http://mail-archives.apache.org/mod_mbox/maven-notifications/</archive>
+    </mailingList>
+  </mailingLists>
+
+  <developers>
+    <developer>
+      <id>jvanzyl</id>
+      <name>Jason van Zyl</name>
+      <email>jason@maven.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Chair</role>
+      </roles>
+      <timezone>-5</timezone>
+    </developer>
+    <developer>
+      <id>brett</id>
+      <name>Brett Porter</name>
+      <email>brett@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>+10</timezone>
+    </developer>
+    <developer>
+      <id>evenisse</id>
+      <name>Emmanuel Venisse</name>
+      <email>evenisse@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>+1</timezone>
+    </developer>
+    <developer>
+      <id>kenney</id>
+      <name>Kenney Westerhof</name>
+      <email>kenney@apache.org</email>
+      <organization>Neonics</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+    </developer>
+    <developer>
+      <id>snicoll</id>
+      <name>Stephane Nicoll</name>
+      <email>snicoll@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>+1</timezone>
+    </developer>
+    <developer>
+      <id>vmassol</id>
+      <name>Vincent Massol</name>
+      <email>vmassol@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>+1</timezone>
+    </developer>
+    <developer>
+      <id>fgiust</id>
+      <name>Fabrizio Giustina</name>
+      <email>fgiust@apache.org</email>
+      <organization>openmind</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>+1</timezone>
+    </developer>
+    <developer>
+      <id>epunzalan</id>
+      <name>Edwin Punzalan</name>
+      <email>epunzalan@mergere.com</email>
+      <organization>Mergere</organization>
+      <roles>
+        <role>Committer</role>
+      </roles>
+      <timezone>+8</timezone>
+    </developer>
+    <developer>
+      <id>mperham</id>
+      <name>Mike Perham</name>
+      <email>mperham@gmail.com</email>
+      <organization>IBM</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>-6</timezone>
+    </developer>
+    <developer>
+      <id>jdcasey</id>
+      <name>John Casey</name>
+      <email>jdcasey@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>-5</timezone>
+    </developer>
+    <developer>
+      <id>trygvis</id>
+      <name>Trygve Laugstol</name>
+      <email>trygvis@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>+1</timezone>
+    </developer>
+    <developer>
+      <id>vsiveton</id>
+      <name>Vincent Siveton</name>
+      <email>vsiveton@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>-5</timezone>
+    </developer>
+    <developer>
+      <id>carlos</id>
+      <name>Carlos Sanchez</name>
+      <email>carlos@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>+1</timezone>
+    </developer>
+    <developer>
+      <id>dennisl</id>
+      <name>Dennis Lundberg</name>
+      <email>dennisl@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>+1</timezone>
+    </developer>
+  </developers>
+
+  <distributionManagement>
+    <site>
+      <id>apache.website</id>
+      <url>scp://people.apache.org/www/maven.apache.org</url>
+    </site>
+  </distributionManagement>
+
+<!-- Disabled until projects have been made to comply
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-pmd-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>cpd-check</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+-->
+
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-report-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-checkstyle-plugin</artifactId>
+        <configuration>
+          <configLocation>http://svn.apache.org/repos/asf/maven/plugins/trunk/maven-checkstyle-plugin/src/main/resources/config/maven_checks.xml</configLocation>
+          <headerLocation>http://svn.apache.org/repos/asf/maven/plugins/trunk/maven-checkstyle-plugin/src/main/resources/config/maven-header.txt</headerLocation>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-pmd-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>cobertura-maven-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>taglist-maven-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jxr-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-javadoc-plugin</artifactId>
+        <configuration>
+          <links>
+            <link>http://java.sun.com/j2ee/1.4/docs/api</link>
+            <link>http://java.sun.com/j2se/1.5.0/docs/api</link>
+            <link>http://jakarta.apache.org/commons/collections/apidocs-COLLECTIONS_3_0/</link>
+            <link>http://jakarta.apache.org/commons/dbcp/apidocs/</link>
+            <link>http://jakarta.apache.org/commons/fileupload/apidocs/</link>
+            <link>http://jakarta.apache.org/commons/httpclient/apidocs/</link>
+            <link>http://jakarta.apache.org/commons/logging/apidocs/</link>
+            <link>http://jakarta.apache.org/commons/pool/apidocs/</link>
+            <link>http://www.junit.org/junit/javadoc/</link>
+            <link>http://logging.apache.org/log4j/docs/api/</link>
+            <link>http://jakarta.apache.org/regexp/apidocs/</link>
+            <link>http://jakarta.apache.org/velocity/api/</link>
+          </links>
+        </configuration>
+      </plugin>
+    </plugins>
+  </reporting>
+
+  <scm>
+    <connection>scm:svn:http://svn.apache.org/repos/asf/maven/pom/maven/tags/maven-parent-4</connection>
+    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/maven/pom/maven/tags/maven-parent-4</developerConnection>
+    <url>http://svn.apache.org/viewvc/maven/pom/maven/tags/maven-parent-4</url>
+  </scm>
+</project>
+
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/4/maven-parent-4.pom.md5 b/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/4/maven-parent-4.pom.md5
new file mode 100644
index 0000000..9c41764
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/4/maven-parent-4.pom.md5
@@ -0,0 +1 @@
+2a4e926f3a76c6e74b0b126f513ad4e7
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/4/maven-parent-4.pom.sha1 b/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/4/maven-parent-4.pom.sha1
new file mode 100644
index 0000000..b6caacf
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/4/maven-parent-4.pom.sha1
@@ -0,0 +1 @@
+0fc039b0bd4d17d7c147a30e1d83994629c5297c
\ No newline at end of file
diff --git a/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/5/maven-parent-5.pom b/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/5/maven-parent-5.pom
new file mode 100644
index 0000000..a512366
--- /dev/null
+++ b/maven-core-impl/src/test/resources/repo/org/apache/maven/maven-parent/5/maven-parent-5.pom
@@ -0,0 +1,466 @@
+<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache</groupId>
+    <artifactId>apache</artifactId>
+    <version>3</version>
+    <relativePath>../asf/pom.xml</relativePath>
+  </parent>
+  <groupId>org.apache.maven</groupId>
+  <artifactId>maven-parent</artifactId>
+  <version>5</version>
+  <packaging>pom</packaging>
+  <name>Apache Maven</name>
+  <description>
+    Maven is a software project management and comprehension tool. Based on the concept of a project object model
+    (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.
+  </description>
+  <url>http://maven.apache.org/</url>
+  <issueManagement>
+    <system>jira</system>
+    <url>http://jira.codehaus.org/browse/MPA</url>
+  </issueManagement>
+  <ciManagement>
+    <system>continuum</system>
+    <url>http://maven.zones.apache.org/continuum</url>
+    <notifiers>
+      <notifier>
+        <type>mail</type>
+        <configuration>
+          <address>notifications@maven.apache.org</address>
+        </configuration>
+      </notifier>
+    </notifiers>
+  </ciManagement>
+  <inceptionYear>2002</inceptionYear>
+  <mailingLists>
+    <mailingList>
+      <name>Maven Announcements List</name>
+      <post>announce@maven.apache.org</post>
+      <subscribe>announce-subscribe@maven.apache.org</subscribe>
+      <unsubscribe>announce-unsubscribe@maven.apache.org</unsubscribe>
+      <archive>http://mail-archives.apache.org/mod_mbox/maven-announce/</archive>
+    </mailingList>
+    <mailingList>
+      <name>Maven Issues List</name>
+      <post>issues@maven.apache.org</post>
+      <subscribe>issues-subscribe@maven.apache.org</subscribe>
+      <unsubscribe>issues-unsubscribe@maven.apache.org</unsubscribe>
+      <archive>http://mail-archives.apache.org/mod_mbox/maven-issues/</archive>
+    </mailingList>
+    <mailingList>
+      <name>Maven Notifications List</name>
+      <post>notifications@maven.apache.org</post>
+      <subscribe>notifications-subscribe@maven.apache.org</subscribe>
+      <unsubscribe>notifications-unsubscribe@maven.apache.org</unsubscribe>
+      <archive>http://mail-archives.apache.org/mod_mbox/maven-notifications/</archive>
+    </mailingList>
+  </mailingLists>
+
+  <developers>
+    <developer>
+      <id>jvanzyl</id>
+      <name>Jason van Zyl</name>
+      <email>jason@maven.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Chair</role>
+      </roles>
+      <timezone>-5</timezone>
+    </developer>
+    <developer>
+      <id>brett</id>
+      <name>Brett Porter</name>
+      <email>brett@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>+10</timezone>
+    </developer>
+    <developer>
+      <id>evenisse</id>
+      <name>Emmanuel Venisse</name>
+      <email>evenisse@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>+1</timezone>
+    </developer>
+    <developer>
+      <id>kenney</id>
+      <name>Kenney Westerhof</name>
+      <email>kenney@apache.org</email>
+      <organization>Neonics</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>+1</timezone>
+    </developer>
+    <developer>
+      <id>snicoll</id>
+      <name>Stephane Nicoll</name>
+      <email>snicoll@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>+1</timezone>
+    </developer>
+    <developer>
+      <id>vmassol</id>
+      <name>Vincent Massol</name>
+      <email>vmassol@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>+1</timezone>
+    </developer>
+    <developer>
+      <id>fgiust</id>
+      <name>Fabrizio Giustina</name>
+      <email>fgiust@apache.org</email>
+      <organization>openmind</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>+1</timezone>
+    </developer>
+    <developer>
+      <id>epunzalan</id>
+      <name>Edwin Punzalan</name>
+      <email>epunzalan@mergere.com</email>
+      <organization>Mergere</organization>
+      <roles>
+        <role>Committer</role>
+      </roles>
+      <timezone>+8</timezone>
+    </developer>
+    <developer>
+      <id>mperham</id>
+      <name>Mike Perham</name>
+      <email>mperham@gmail.com</email>
+      <organization>IBM</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>-6</timezone>
+    </developer>
+    <developer>
+      <id>jdcasey</id>
+      <name>John Casey</name>
+      <email>jdcasey@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>-5</timezone>
+    </developer>
+    <developer>
+      <id>trygvis</id>
+      <name>Trygve Laugstol</name>
+      <email>trygvis@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>+1</timezone>
+    </developer>
+    <developer>
+      <id>vsiveton</id>
+      <name>Vincent Siveton</name>
+      <email>vsiveton@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>-5</timezone>
+    </developer>
+    <developer>
+      <id>carlos</id>
+      <name>Carlos Sanchez</name>
+      <email>carlos@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>+1</timezone>
+    </developer>
+    <developer>
+      <id>dennisl</id>
+      <name>Dennis Lundberg</name>
+      <email>dennisl@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>+1</timezone>
+    </developer>
+    <developer>
+      <id>aheritier</id>
+      <name>Arnaud Heritier</name>
+      <email>aheritier@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>+1</timezone>
+    </developer>
+    <developer>
+      <id>handyande</id>
+      <name>Andrew Williams</name>
+      <email>handyande@apache.org</email>
+      <roles>
+        <role>Committer</role>
+      </roles>
+      <timezone>0</timezone>
+    </developer>
+    <developer>
+      <id>jtolentino</id>
+      <name>Ernesto Tolentino Jr.</name>
+      <email>jtolentino@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>+8</timezone>
+    </developer>
+    <developer>
+      <id>joakime</id>
+      <name>Joakim Erdfelt</name>
+      <email>joakime@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>-5</timezone>
+    </developer>
+    <developer>
+      <id>jmcconnell</id>
+      <name>Jesse McConnell</name>
+      <email>jmcconnell@apache.org</email>
+      <organization>ASF</organization>
+      <roles>
+        <role>PMC Member</role>
+      </roles>
+      <timezone>-6</timezone>
+    </developer>
+    <developer>
+      <id>wsmoak</id>
+      <name>Wendy Smoak</name>
+      <email>wsmoak@apache.org</email>
+      <roles>
+        <role>Committer</role>
+      </roles>
+      <timezone>-7</timezone>
+    </developer>
+
+  </developers>
+
+  <distributionManagement>
+    <site>
+      <id>apache.website</id>
+      <url>scp://people.apache.org/www/maven.apache.org</url>
+    </site>
+  </distributionManagement>
+
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-release-plugin</artifactId>
+          <version>2.0-beta-4</version>
+          <configuration>
+            <!-- This element will be overridden by children -->
+            <tagBase>https://svn.apache.org/repos/asf/maven/pom/tags</tagBase>
+            <useReleaseProfile>false</useReleaseProfile>
+            <goals>deploy</goals>
+            <arguments>-Prelease</arguments>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+
+  <profiles>
+    <profile>
+      <id>ci</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-pmd-plugin</artifactId>
+            <executions>
+              <execution>
+                <goals>
+                  <goal>cpd-check</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>reporting</id>
+      <reporting>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-report-plugin</artifactId>
+          </plugin>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-checkstyle-plugin</artifactId>
+            <configuration>
+              <configLocation>http://svn.apache.org/repos/asf/maven/plugins/trunk/maven-checkstyle-plugin/src/main/resources/config/maven_checks.xml</configLocation>
+              <headerLocation>http://svn.apache.org/repos/asf/maven/plugins/trunk/maven-checkstyle-plugin/src/main/resources/config/maven-header.txt</headerLocation>
+            </configuration>
+          </plugin>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-pmd-plugin</artifactId>
+          </plugin>
+          <plugin>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>cobertura-maven-plugin</artifactId>
+          </plugin>
+          <plugin>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>taglist-maven-plugin</artifactId>
+          </plugin>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-jxr-plugin</artifactId>
+          </plugin>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-javadoc-plugin</artifactId>
+            <configuration>
+              <links>
+                <link>http://java.sun.com/j2ee/1.4/docs/api</link>
+                <link>http://java.sun.com/j2se/1.5.0/docs/api</link>
+                <link>http://jakarta.apache.org/commons/collections/apidocs-COLLECTIONS_3_0/</link>
+                <link>http://jakarta.apache.org/commons/dbcp/apidocs/</link>
+                <link>http://jakarta.apache.org/commons/fileupload/apidocs/</link>
+                <link>http://jakarta.apache.org/commons/httpclient/apidocs/</link>
+                <link>http://jakarta.apache.org/commons/logging/apidocs/</link>
+                <link>http://jakarta.apache.org/commons/pool/apidocs/</link>
+                <link>http://www.junit.org/junit/javadoc/</link>
+                <link>http://logging.apache.org/log4j/docs/api/</link>
+                <link>http://jakarta.apache.org/regexp/apidocs/</link>
+                <link>http://jakarta.apache.org/velocity/api/</link>
+              </links>
+            </configuration>
+          </plugin>
+        </plugins>
+      </reporting>
+    </profile>
+    <profile>
+      <id>release</id>
+      <build>
+        <plugins>
+          <!-- We want to sign the artifact, the POM, and all attached artifacts -->
+          <plugin>
+            <artifactId>maven-gpg-plugin</artifactId>
+            <version>1.0-alpha-1</version>
+            <configuration>
+              <passphrase>${gpg.passphrase}</passphrase>
+            </configuration>
+            <executions>
+              <execution>
+                <goals>
+                  <goal>sign</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+          <!-- We want to deploy the artifact to a staging location for perusal -->
+          <plugin>
+            <inherited>true</inherited>
+            <artifactId>maven-deploy-plugin</artifactId>
+            <version>2.3</version>
+            <configuration>
+              <altDeploymentRepository>${deploy.altRepository}</altDeploymentRepository>
+              <updateReleaseInfo>true</updateReleaseInfo>
+            </configuration>
... 3606 lines suppressed ...