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:23 UTC

[maven] branch mvn4 updated (cc589d6 -> 5eea23c)

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

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


    from cc589d6  mvn4 aggregator
     new 44b8c18  [MNG-7391] add execution strategy+runner required by Maven Build Cache
     new 5eea23c  Maven API (draft)

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 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         |   0
 .../repo}/org/apache/apache/3/apache-3.pom.md5     |   0
 .../repo}/org/apache/apache/3/apache-3.pom.sha1    |   0
 .../3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar   | Bin
 .../maven-artifact-3.0-SNAPSHOT.jar.md5            |   0
 .../maven-artifact-3.0-SNAPSHOT.jar.sha1           |   0
 .../3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom   |   0
 .../maven-artifact-3.0-SNAPSHOT.pom.md5            |   0
 .../maven-artifact-3.0-SNAPSHOT.pom.sha1           |   0
 .../test/test-extension/1/test-extension-1.jar     | Bin
 .../test/test-extension/1/test-extension-1.pom     |   0
 .../test/test-extension/1/test-extension-1.pom.md5 |   0
 .../test-extension/1/test-extension-1.pom.sha1     |   0
 .../1/test-lifecycle-and-artifactHandler-1.jar     | Bin
 .../1/test-lifecycle-and-artifactHandler-1.pom     |   0
 .../1/test-lifecycle-and-artifactHandler-1.pom.md5 |   0
 .../test-lifecycle-and-artifactHandler-1.pom.sha1  |   0
 .../apache/maven/maven-parent/4/maven-parent-4.pom |   0
 .../maven/maven-parent/4/maven-parent-4.pom.md5    |   0
 .../maven/maven-parent/4/maven-parent-4.pom.sha1   |   0
 .../apache/maven/maven-parent/5/maven-parent-5.pom |   0
 .../maven/maven-parent/5/maven-parent-5.pom.md5    |   0
 .../maven/maven-parent/5/maven-parent-5.pom.sha1   |   0
 .../1.0-beta-2/wagon-provider-api-1.0-beta-2.jar   | Bin
 .../wagon-provider-api-1.0-beta-2.jar.md5          |   0
 .../wagon-provider-api-1.0-beta-2.jar.sha1         |   0
 .../1.0-beta-2/wagon-provider-api-1.0-beta-2.pom   |   0
 .../wagon-provider-api-1.0-beta-2.pom.md5          |   0
 .../wagon-provider-api-1.0-beta-2.pom.sha1         |   0
 .../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    |   0
 .../wagon/1.0-beta-2/wagon-1.0-beta-2.pom.md5      |   0
 .../wagon/1.0-beta-2/wagon-1.0-beta-2.pom.sha1     |   0
 .../plexus-active-collections-1.0-beta-1.jar       | Bin
 .../plexus-active-collections-1.0-beta-1.jar.md5   |   0
 .../plexus-active-collections-1.0-beta-1.jar.sha1  |   0
 .../plexus-active-collections-1.0-beta-1.pom       |   0
 .../plexus-active-collections-1.0-beta-1.pom.md5   |   0
 .../plexus-active-collections-1.0-beta-1.pom.sha1  |   0
 .../plexus-classworlds-1.2-alpha-10.jar            | Bin
 .../plexus-classworlds-1.2-alpha-10.jar.md5        |   0
 .../plexus-classworlds-1.2-alpha-10.jar.sha1       |   0
 .../plexus-classworlds-1.2-alpha-10.pom            |   0
 .../plexus-classworlds-1.2-alpha-10.pom.md5        |   0
 .../plexus-classworlds-1.2-alpha-10.pom.sha1       |   0
 .../1.2-alpha-7/plexus-classworlds-1.2-alpha-7.jar | Bin
 .../plexus-classworlds-1.2-alpha-7.jar.md5         |   0
 .../plexus-classworlds-1.2-alpha-7.jar.sha1        |   0
 .../1.2-alpha-7/plexus-classworlds-1.2-alpha-7.pom |   0
 .../plexus-classworlds-1.2-alpha-7.pom.md5         |   0
 .../plexus-classworlds-1.2-alpha-7.pom.sha1        |   0
 .../plexus-component-api-1.0-alpha-16.jar          | Bin
 .../plexus-component-api-1.0-alpha-16.jar.md5      |   0
 .../plexus-component-api-1.0-alpha-16.jar.sha1     |   0
 .../plexus-component-api-1.0-alpha-16.pom          |   0
 .../plexus-component-api-1.0-alpha-16.pom.md5      |   0
 .../plexus-component-api-1.0-alpha-16.pom.sha1     |   0
 .../plexus-component-api-1.0-alpha-32.jar          | Bin
 .../plexus-component-api-1.0-alpha-32.jar.md5      |   0
 .../plexus-component-api-1.0-alpha-32.jar.sha1     |   0
 .../plexus-component-api-1.0-alpha-32.pom          |   0
 .../plexus-component-api-1.0-alpha-32.pom.md5      |   0
 .../plexus-component-api-1.0-alpha-32.pom.sha1     |   0
 .../1.1.6/plexus-components-1.1.6.pom              |   0
 .../1.1.6/plexus-components-1.1.6.pom.md5          |   0
 .../1.1.6/plexus-components-1.1.6.pom.sha1         |   0
 .../plexus-container-default-1.0-alpha-16.jar      | Bin
 .../plexus-container-default-1.0-alpha-16.jar.md5  |   0
 .../plexus-container-default-1.0-alpha-16.jar.sha1 |   0
 .../plexus-container-default-1.0-alpha-16.pom      |   0
 .../plexus-container-default-1.0-alpha-16.pom.md5  |   0
 .../plexus-container-default-1.0-alpha-16.pom.sha1 |   0
 .../plexus-container-default-1.0-alpha-32.jar      | Bin
 .../plexus-container-default-1.0-alpha-32.jar.md5  |   0
 .../plexus-container-default-1.0-alpha-32.jar.sha1 |   0
 .../plexus-container-default-1.0-alpha-32.pom      |   0
 .../plexus-container-default-1.0-alpha-32.pom.md5  |   0
 .../plexus-container-default-1.0-alpha-32.pom.sha1 |   0
 .../plexus-containers-1.0-alpha-16.pom             |   0
 .../plexus-containers-1.0-alpha-16.pom.md5         |   0
 .../plexus-containers-1.0-alpha-16.pom.sha1        |   0
 .../plexus-containers-1.0-alpha-32.pom             |   0
 .../plexus-containers-1.0-alpha-32.pom.md5         |   0
 .../plexus-containers-1.0-alpha-32.pom.sha1        |   0
 .../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
 .../plexus-utils/1.1/plexus-utils-1.1.jar.md5      |   0
 .../plexus-utils/1.1/plexus-utils-1.1.jar.sha1     |   0
 .../plexus/plexus-utils/1.1/plexus-utils-1.1.pom   |   0
 .../plexus-utils/1.1/plexus-utils-1.1.pom.md5      |   0
 .../plexus-utils/1.1/plexus-utils-1.1.pom.sha1     |   0
 .../plexus-utils/1.4.5/plexus-utils-1.4.5.jar      | Bin
 .../plexus-utils/1.4.5/plexus-utils-1.4.5.jar.md5  |   0
 .../plexus-utils/1.4.5/plexus-utils-1.4.5.jar.sha1 |   0
 .../plexus-utils/1.4.5/plexus-utils-1.4.5.pom      |   0
 .../plexus-utils/1.4.5/plexus-utils-1.4.5.pom.md5  |   0
 .../plexus-utils/1.4.5/plexus-utils-1.4.5.pom.sha1 |   0
 .../plexus/plexus/1.0.10/plexus-1.0.10.pom         |   0
 .../plexus/plexus/1.0.10/plexus-1.0.10.pom.md5     |   0
 .../plexus/plexus/1.0.10/plexus-1.0.10.pom.sha1    |   0
 .../plexus/plexus/1.0.11/plexus-1.0.11.pom         |   0
 .../plexus/plexus/1.0.11/plexus-1.0.11.pom.md5     |   0
 .../plexus/plexus/1.0.11/plexus-1.0.11.pom.sha1    |   0
 .../codehaus/plexus/plexus/1.0.4/plexus-1.0.4.pom  |   0
 .../plexus/plexus/1.0.4/plexus-1.0.4.pom.md5       |   0
 .../plexus/plexus/1.0.4/plexus-1.0.4.pom.sha1      |   0
 .../codehaus/plexus/plexus/1.0.8/plexus-1.0.8.pom  |   0
 .../plexus/plexus/1.0.8/plexus-1.0.8.pom.md5       |   0
 .../plexus/plexus/1.0.8/plexus-1.0.8.pom.sha1      |   0
 .../codehaus/plexus/plexus/1.0.9/plexus-1.0.9.pom  |   0
 .../plexus/plexus/1.0.9/plexus-1.0.9.pom.md5       |   0
 .../plexus/plexus/1.0.9/plexus-1.0.9.pom.sha1      |   0
 ...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 +
 .../apache/maven/lifecycle/DefaultLifecycles.java  |   3 +
 .../internal/DefaultLifecyclePluginAnalyzer.java   |   2 +-
 .../maven/lifecycle/internal/MojoExecutor.java     |  28 +-
 .../plugin/DefaultMojosExecutionStrategy.java      |  46 ++
 .../apache/maven/plugin/MojoExecutionRunner.java   |  36 ++
 .../maven/plugin/MojosExecutionStrategy.java       |  45 ++
 .../plugin/internal/DefaultMavenPluginManager.java |  15 +
 .../lifecycle/internal/stub/MojoExecutorStub.java  |  18 +-
 pom.xml                                            |   2 +
 256 files changed, 8580 insertions(+), 18 deletions(-)
 create mode 100644 maven-core-api/pom.xml
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/Artifact.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/ArtifactMetadata.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/Dependency.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/Exclusion.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/LocalRepository.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/Node.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/NodeVisitor.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/Project.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/RemoteRepository.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/Repository.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/RepositoryMetadata.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/Session.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployer.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployerException.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactDeployerRequest.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactory.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactoryException.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactFactoryRequest.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstaller.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstallerException.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactInstallerRequest.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactManager.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolver.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverException.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverRequest.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ArtifactResolverResult.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/BaseRequest.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollector.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorException.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorRequest.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/DependencyCollectorResult.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactory.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactoryException.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/DependencyFactoryRequest.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolver.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverException.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverRequest.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/DependencyResolverResult.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilder.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderException.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderProblem.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderRequest.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderResult.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ProjectBuilderSource.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployer.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployerException.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ProjectDeployerRequest.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstaller.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstallerException.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ProjectInstallerRequest.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/ProjectManager.java
 create mode 100644 maven-core-api/src/main/java/org/apache/maven/api/services/Service.java
 create mode 100644 maven-core-impl/pom.xml
 create mode 100644 maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifact.java
 create mode 100644 maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactDeployer.java
 create mode 100644 maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactFactory.java
 create mode 100644 maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactInstaller.java
 create mode 100644 maven-core-impl/src/main/java/org/apache/maven/impl/DefaultArtifactResolver.java
 create mode 100644 maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependency.java
 create mode 100644 maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyCollector.java
 create mode 100644 maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyFactory.java
 create mode 100644 maven-core-impl/src/main/java/org/apache/maven/impl/DefaultDependencyResolver.java
 create mode 100644 maven-core-impl/src/main/java/org/apache/maven/impl/DefaultLocalRepository.java
 create mode 100644 maven-core-impl/src/main/java/org/apache/maven/impl/DefaultNode.java
 create mode 100644 maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProject.java
 create mode 100644 maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectBuilder.java
 create mode 100644 maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectDeployer.java
 create mode 100644 maven-core-impl/src/main/java/org/apache/maven/impl/DefaultProjectInstaller.java
 create mode 100644 maven-core-impl/src/main/java/org/apache/maven/impl/DefaultRemoteRepository.java
 create mode 100644 maven-core-impl/src/main/java/org/apache/maven/impl/DefaultSession.java
 create mode 100644 maven-core-impl/src/main/java/org/apache/maven/impl/MappedCollection.java
 create mode 100644 maven-core-impl/src/main/java/org/apache/maven/impl/MappedList.java
 create mode 100644 maven-core-impl/src/test/java/org/apache/maven/impl/TestApi.java
 create mode 100644 maven-core-impl/src/test/java/org/apache/maven/impl/TestArtifactHandler.java
 create mode 100644 maven-core-impl/src/test/java/org/apache/maven/impl/TestRepositorySystem.java
 create mode 100644 maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar
 create mode 100644 maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.pom
 create mode 100644 maven-core-impl/src/test/resources/repo/commons-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.pom.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.jar
 create mode 100644 maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.jar.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.pom
 create mode 100644 maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.3/commons-logging-1.0.3.pom.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4-javadoc-resources.jar.lastUpdated
 create mode 100644 maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar
 create mode 100644 maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.pom
 create mode 100644 maven-core-impl/src/test/resources/repo/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.pom.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.jar
 create mode 100644 maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.jar.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.pom
 create mode 100644 maven-core-impl/src/test/resources/repo/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.pom.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.jar
 create mode 100644 maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.jar.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.pom
 create mode 100644 maven-core-impl/src/test/resources/repo/jdom/jdom/1.0/jdom-1.0.pom.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc-resources.jar.lastUpdated
 create mode 100644 maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc.jar
 create mode 100644 maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-javadoc.jar.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-sources.jar
 create mode 100644 maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1-sources.jar.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.jar
 create mode 100644 maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.jar.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.pom
 create mode 100644 maven-core-impl/src/test/resources/repo/junit/junit/4.13.1/junit-4.13.1.pom.sha1
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/apache/3/apache-3.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/apache/3/apache-3.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/apache/3/apache-3.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/core/test/test-extension/1/test-extension-1.jar (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/core/test/test-extension/1/test-extension-1.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/core/test/test-extension/1/test-extension-1.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/core/test/test-extension/1/test-extension-1.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.jar (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/maven-parent/4/maven-parent-4.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/maven-parent/4/maven-parent-4.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/maven-parent/4/maven-parent-4.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/maven-parent/5/maven-parent-5.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/maven-parent/5/maven-parent-5.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/maven-parent/5/maven-parent-5.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/wagon/wagon-provider-api/1.0-beta-2/wagon-provider-api-1.0-beta-2.jar (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/wagon/wagon-provider-api/1.0-beta-2/wagon-provider-api-1.0-beta-2.jar.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/wagon/wagon-provider-api/1.0-beta-2/wagon-provider-api-1.0-beta-2.jar.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/wagon/wagon-provider-api/1.0-beta-2/wagon-provider-api-1.0-beta-2.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/wagon/wagon-provider-api/1.0-beta-2/wagon-provider-api-1.0-beta-2.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/wagon/wagon-provider-api/1.0-beta-2/wagon-provider-api-1.0-beta-2.pom.sha1 (100%)
 create mode 100644 maven-core-impl/src/test/resources/repo/org/apache/maven/wagon/wagon-providers/1.0-beta-2/wagon-providers-1.0-beta-2.pom
 create mode 100644 maven-core-impl/src/test/resources/repo/org/apache/maven/wagon/wagon-providers/1.0-beta-2/wagon-providers-1.0-beta-2.pom.md5
 create mode 100644 maven-core-impl/src/test/resources/repo/org/apache/maven/wagon/wagon-providers/1.0-beta-2/wagon-providers-1.0-beta-2.pom.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/org/apache/maven/wagon/wagon-webdav/1.0-beta-2/wagon-webdav-1.0-beta-2.jar
 create mode 100644 maven-core-impl/src/test/resources/repo/org/apache/maven/wagon/wagon-webdav/1.0-beta-2/wagon-webdav-1.0-beta-2.jar.md5
 create mode 100644 maven-core-impl/src/test/resources/repo/org/apache/maven/wagon/wagon-webdav/1.0-beta-2/wagon-webdav-1.0-beta-2.jar.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/org/apache/maven/wagon/wagon-webdav/1.0-beta-2/wagon-webdav-1.0-beta-2.pom
 create mode 100644 maven-core-impl/src/test/resources/repo/org/apache/maven/wagon/wagon-webdav/1.0-beta-2/wagon-webdav-1.0-beta-2.pom.md5
 create mode 100644 maven-core-impl/src/test/resources/repo/org/apache/maven/wagon/wagon-webdav/1.0-beta-2/wagon-webdav-1.0-beta-2.pom.sha1
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/wagon/wagon/1.0-beta-2/wagon-1.0-beta-2.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/wagon/wagon/1.0-beta-2/wagon-1.0-beta-2.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/apache/maven/wagon/wagon/1.0-beta-2/wagon-1.0-beta-2.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-active-collections/1.0-beta-1/plexus-active-collections-1.0-beta-1.jar (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-active-collections/1.0-beta-1/plexus-active-collections-1.0-beta-1.jar.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-active-collections/1.0-beta-1/plexus-active-collections-1.0-beta-1.jar.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-active-collections/1.0-beta-1/plexus-active-collections-1.0-beta-1.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-active-collections/1.0-beta-1/plexus-active-collections-1.0-beta-1.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-active-collections/1.0-beta-1/plexus-active-collections-1.0-beta-1.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-classworlds/1.2-alpha-10/plexus-classworlds-1.2-alpha-10.jar (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-classworlds/1.2-alpha-10/plexus-classworlds-1.2-alpha-10.jar.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-classworlds/1.2-alpha-10/plexus-classworlds-1.2-alpha-10.jar.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-classworlds/1.2-alpha-10/plexus-classworlds-1.2-alpha-10.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-classworlds/1.2-alpha-10/plexus-classworlds-1.2-alpha-10.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-classworlds/1.2-alpha-10/plexus-classworlds-1.2-alpha-10.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-classworlds/1.2-alpha-7/plexus-classworlds-1.2-alpha-7.jar (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-classworlds/1.2-alpha-7/plexus-classworlds-1.2-alpha-7.jar.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-classworlds/1.2-alpha-7/plexus-classworlds-1.2-alpha-7.jar.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-classworlds/1.2-alpha-7/plexus-classworlds-1.2-alpha-7.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-classworlds/1.2-alpha-7/plexus-classworlds-1.2-alpha-7.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-classworlds/1.2-alpha-7/plexus-classworlds-1.2-alpha-7.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-component-api/1.0-alpha-16/plexus-component-api-1.0-alpha-16.jar (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-component-api/1.0-alpha-16/plexus-component-api-1.0-alpha-16.jar.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-component-api/1.0-alpha-16/plexus-component-api-1.0-alpha-16.jar.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-component-api/1.0-alpha-16/plexus-component-api-1.0-alpha-16.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-component-api/1.0-alpha-16/plexus-component-api-1.0-alpha-16.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-component-api/1.0-alpha-16/plexus-component-api-1.0-alpha-16.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-component-api/1.0-alpha-32/plexus-component-api-1.0-alpha-32.jar (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-component-api/1.0-alpha-32/plexus-component-api-1.0-alpha-32.jar.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-component-api/1.0-alpha-32/plexus-component-api-1.0-alpha-32.jar.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-component-api/1.0-alpha-32/plexus-component-api-1.0-alpha-32.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-component-api/1.0-alpha-32/plexus-component-api-1.0-alpha-32.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-component-api/1.0-alpha-32/plexus-component-api-1.0-alpha-32.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-components/1.1.6/plexus-components-1.1.6.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-components/1.1.6/plexus-components-1.1.6.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-components/1.1.6/plexus-components-1.1.6.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-container-default/1.0-alpha-16/plexus-container-default-1.0-alpha-16.jar (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-container-default/1.0-alpha-16/plexus-container-default-1.0-alpha-16.jar.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-container-default/1.0-alpha-16/plexus-container-default-1.0-alpha-16.jar.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-container-default/1.0-alpha-16/plexus-container-default-1.0-alpha-16.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-container-default/1.0-alpha-16/plexus-container-default-1.0-alpha-16.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-container-default/1.0-alpha-16/plexus-container-default-1.0-alpha-16.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-container-default/1.0-alpha-32/plexus-container-default-1.0-alpha-32.jar (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-container-default/1.0-alpha-32/plexus-container-default-1.0-alpha-32.jar.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-container-default/1.0-alpha-32/plexus-container-default-1.0-alpha-32.jar.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-container-default/1.0-alpha-32/plexus-container-default-1.0-alpha-32.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-container-default/1.0-alpha-32/plexus-container-default-1.0-alpha-32.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-container-default/1.0-alpha-32/plexus-container-default-1.0-alpha-32.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-containers/1.0-alpha-16/plexus-containers-1.0-alpha-16.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-containers/1.0-alpha-16/plexus-containers-1.0-alpha-16.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-containers/1.0-alpha-16/plexus-containers-1.0-alpha-16.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-containers/1.0-alpha-32/plexus-containers-1.0-alpha-32.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-containers/1.0-alpha-32/plexus-containers-1.0-alpha-32.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-containers/1.0-alpha-32/plexus-containers-1.0-alpha-32.pom.sha1 (100%)
 create mode 100644 maven-core-impl/src/test/resources/repo/org/codehaus/plexus/plexus-utils/1.0.4/plexus-utils-1.0.4.jar
 create mode 100644 maven-core-impl/src/test/resources/repo/org/codehaus/plexus/plexus-utils/1.0.4/plexus-utils-1.0.4.jar.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/org/codehaus/plexus/plexus-utils/1.0.4/plexus-utils-1.0.4.pom
 create mode 100644 maven-core-impl/src/test/resources/repo/org/codehaus/plexus/plexus-utils/1.0.4/plexus-utils-1.0.4.pom.sha1
 copy {maven-core/src/test/resources => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar.md5 (100%)
 copy {maven-core/src/test/resources => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar.sha1 (100%)
 copy {maven-core/src/test/resources => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.pom.md5 (100%)
 copy {maven-core/src/test/resources => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-utils/1.4.5/plexus-utils-1.4.5.jar (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-utils/1.4.5/plexus-utils-1.4.5.jar.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-utils/1.4.5/plexus-utils-1.4.5.jar.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-utils/1.4.5/plexus-utils-1.4.5.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-utils/1.4.5/plexus-utils-1.4.5.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus-utils/1.4.5/plexus-utils-1.4.5.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus/1.0.10/plexus-1.0.10.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus/1.0.10/plexus-1.0.10.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus/1.0.10/plexus-1.0.10.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus/1.0.11/plexus-1.0.11.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus/1.0.11/plexus-1.0.11.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus/1.0.11/plexus-1.0.11.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus/1.0.4/plexus-1.0.4.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus/1.0.4/plexus-1.0.4.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus/1.0.4/plexus-1.0.4.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus/1.0.8/plexus-1.0.8.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus/1.0.8/plexus-1.0.8.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus/1.0.8/plexus-1.0.8.pom.sha1 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus/1.0.9/plexus-1.0.9.pom (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus/1.0.9/plexus-1.0.9.pom.md5 (100%)
 copy {maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo => maven-core-impl/src/test/resources/repo}/org/codehaus/plexus/plexus/1.0.9/plexus-1.0.9.pom.sha1 (100%)
 create mode 100644 maven-core-impl/src/test/resources/repo/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-javadoc-resources.jar.lastUpdated
 create mode 100644 maven-core-impl/src/test/resources/repo/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-javadoc.jar
 create mode 100644 maven-core-impl/src/test/resources/repo/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-javadoc.jar.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-sources.jar
 create mode 100644 maven-core-impl/src/test/resources/repo/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-sources.jar.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar
 create mode 100644 maven-core-impl/src/test/resources/repo/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.pom
 create mode 100644 maven-core-impl/src/test/resources/repo/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.pom.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/org/hamcrest/hamcrest-parent/1.3/hamcrest-parent-1.3.pom
 create mode 100644 maven-core-impl/src/test/resources/repo/org/hamcrest/hamcrest-parent/1.3/hamcrest-parent-1.3.pom.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/slide/slide-webdavlib/2.1/slide-webdavlib-2.1.jar
 create mode 100644 maven-core-impl/src/test/resources/repo/slide/slide-webdavlib/2.1/slide-webdavlib-2.1.jar.md5
 create mode 100644 maven-core-impl/src/test/resources/repo/slide/slide-webdavlib/2.1/slide-webdavlib-2.1.jar.sha1
 create mode 100644 maven-core-impl/src/test/resources/repo/slide/slide-webdavlib/2.1/slide-webdavlib-2.1.pom
 create mode 100644 maven-core-impl/src/test/resources/repo/slide/slide-webdavlib/2.1/slide-webdavlib-2.1.pom.md5
 create mode 100644 maven-core-impl/src/test/resources/repo/slide/slide-webdavlib/2.1/slide-webdavlib-2.1.pom.sha1
 create mode 100644 maven-core/src/main/java/org/apache/maven/plugin/DefaultMojosExecutionStrategy.java
 create mode 100644 maven-core/src/main/java/org/apache/maven/plugin/MojoExecutionRunner.java
 create mode 100644 maven-core/src/main/java/org/apache/maven/plugin/MojosExecutionStrategy.java

[maven] 01/02: [MNG-7391] add execution strategy+runner required by Maven Build Cache

Posted by gn...@apache.org.
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 44b8c1851393f7d38a119d4f24da8407cd45d35f
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Fri Nov 26 13:41:27 2021 +0100

    [MNG-7391] add execution strategy+runner required by Maven Build Cache
---
 .../apache/maven/lifecycle/DefaultLifecycles.java  |  3 ++
 .../internal/DefaultLifecyclePluginAnalyzer.java   |  2 +-
 .../maven/lifecycle/internal/MojoExecutor.java     | 28 +++++++++----
 .../plugin/DefaultMojosExecutionStrategy.java      | 46 ++++++++++++++++++++++
 .../apache/maven/plugin/MojoExecutionRunner.java   | 36 +++++++++++++++++
 .../maven/plugin/MojosExecutionStrategy.java       | 45 +++++++++++++++++++++
 .../plugin/internal/DefaultMavenPluginManager.java | 15 +++++++
 .../lifecycle/internal/stub/MojoExecutorStub.java  | 18 ++++-----
 8 files changed, 175 insertions(+), 18 deletions(-)

diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycles.java b/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycles.java
index 1160e88..b8f0c39 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycles.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycles.java
@@ -117,6 +117,9 @@ public class DefaultLifecycles
         return phaseToLifecycleMap;
     }
 
+    /**
+     * Returns an ordered list of lifecycles
+     */
     public List<Lifecycle> getLifeCycles()
     {
         List<String> lifecycleIds = Arrays.asList( STANDARD_LIFECYCLES );
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecyclePluginAnalyzer.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecyclePluginAnalyzer.java
index 65843f8..0a936ad 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecyclePluginAnalyzer.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecyclePluginAnalyzer.java
@@ -110,7 +110,7 @@ public class DefaultLifecyclePluginAnalyzer
 
         Map<Plugin, Plugin> plugins = new LinkedHashMap<>();
 
-        for ( Lifecycle lifecycle : getOrderedLifecycles() )
+        for ( Lifecycle lifecycle : defaultLifeCycles.getLifeCycles() )
         {
             org.apache.maven.lifecycle.mapping.Lifecycle lifecycleConfiguration =
                 lifecycleMappingForPackaging.getLifecycles().get( lifecycle.getId() );
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java
index a06cd9f..28847ca 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java
@@ -48,6 +48,8 @@ import org.apache.maven.plugin.BuildPluginManager;
 import org.apache.maven.plugin.MavenPluginManager;
 import org.apache.maven.plugin.MojoExecution;
 import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoExecutionRunner;
+import org.apache.maven.plugin.MojosExecutionStrategy;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugin.PluginConfigurationException;
 import org.apache.maven.plugin.PluginIncompatibleException;
@@ -80,17 +82,21 @@ public class MojoExecutor
 
     private final ReadWriteLock aggregatorLock = new ReentrantReadWriteLock();
 
+    private final MojosExecutionStrategy mojosExecutionStrategy;
+
     @Inject
     public MojoExecutor(
             BuildPluginManager pluginManager,
             MavenPluginManager mavenPluginManager,
             LifecycleDependencyResolver lifeCycleDependencyResolver,
-            ExecutionEventCatapult eventCatapult )
+            ExecutionEventCatapult eventCatapult,
+            MojosExecutionStrategy mojosExecutionStrategy )
     {
         this.pluginManager = pluginManager;
         this.mavenPluginManager = mavenPluginManager;
         this.lifeCycleDependencyResolver = lifeCycleDependencyResolver;
         this.eventCatapult = eventCatapult;
+        this.mojosExecutionStrategy = mojosExecutionStrategy;
     }
 
     public DependencyContext newDependencyContext( MavenSession session, List<MojoExecution> mojoExecutions )
@@ -148,21 +154,27 @@ public class MojoExecutor
         return Collections.unmodifiableCollection( scopes );
     }
 
-    public void execute( MavenSession session, List<MojoExecution> mojoExecutions, ProjectIndex projectIndex )
+    public void execute( final MavenSession session,
+                         final List<MojoExecution> mojoExecutions,
+                         final ProjectIndex projectIndex )
         throws LifecycleExecutionException
 
     {
-        DependencyContext dependencyContext = newDependencyContext( session, mojoExecutions );
+        final DependencyContext dependencyContext = newDependencyContext( session, mojoExecutions );
 
-        PhaseRecorder phaseRecorder = new PhaseRecorder( session.getCurrentProject() );
+        final PhaseRecorder phaseRecorder = new PhaseRecorder( session.getCurrentProject() );
 
-        for ( MojoExecution mojoExecution : mojoExecutions )
+        mojosExecutionStrategy.execute( mojoExecutions, session, new MojoExecutionRunner()
         {
-            execute( session, mojoExecution, projectIndex, dependencyContext, phaseRecorder );
-        }
+            @Override
+            public void run( MojoExecution mojoExecution ) throws LifecycleExecutionException
+            {
+                MojoExecutor.this.execute( session, mojoExecution, projectIndex, dependencyContext, phaseRecorder );
+            }
+        } );
     }
 
-    public void execute( MavenSession session, MojoExecution mojoExecution, ProjectIndex projectIndex,
+    private void execute( MavenSession session, MojoExecution mojoExecution, ProjectIndex projectIndex,
                          DependencyContext dependencyContext, PhaseRecorder phaseRecorder )
         throws LifecycleExecutionException
     {
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/DefaultMojosExecutionStrategy.java b/maven-core/src/main/java/org/apache/maven/plugin/DefaultMojosExecutionStrategy.java
new file mode 100644
index 0000000..9507c7a
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/plugin/DefaultMojosExecutionStrategy.java
@@ -0,0 +1,46 @@
+package org.apache.maven.plugin;
+
+/*
+ * 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.execution.MavenSession;
+import org.apache.maven.lifecycle.LifecycleExecutionException;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+import java.util.List;
+
+/**
+ * Default mojo execution strategy. It just iterates over mojo executions and runs one by one
+ */
+@Named
+@Singleton
+public class DefaultMojosExecutionStrategy implements MojosExecutionStrategy
+{
+    @Override
+    public void execute( List<MojoExecution> mojos, MavenSession session, MojoExecutionRunner mojoRunner )
+            throws LifecycleExecutionException
+    {
+        for ( MojoExecution mojoExecution : mojos )
+        {
+            mojoRunner.run( mojoExecution );
+        }
+
+    }
+}
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/MojoExecutionRunner.java b/maven-core/src/main/java/org/apache/maven/plugin/MojoExecutionRunner.java
new file mode 100644
index 0000000..314e041
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/plugin/MojoExecutionRunner.java
@@ -0,0 +1,36 @@
+package org.apache.maven.plugin;
+
+/*
+ * 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.lifecycle.LifecycleExecutionException;
+
+/**
+ * Provides context for mojo execution. Invocation of #run will result in actual execution
+ */
+public interface MojoExecutionRunner
+{
+    /**
+     * Runs mojo execution
+     *
+     * @param execution mojo execution
+     * @throws LifecycleExecutionException
+     */
+    void run( MojoExecution execution ) throws LifecycleExecutionException;
+}
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/MojosExecutionStrategy.java b/maven-core/src/main/java/org/apache/maven/plugin/MojosExecutionStrategy.java
new file mode 100644
index 0000000..e4babf6
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/plugin/MojosExecutionStrategy.java
@@ -0,0 +1,45 @@
+package org.apache.maven.plugin;
+
+/*
+ * 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.execution.MavenSession;
+import org.apache.maven.lifecycle.LifecycleExecutionException;
+
+import java.util.List;
+
+/**
+ * Interface allows overriding default mojo execution strategy For example it is possible wrap some mojo execution to
+ * decorate default functionality or skip some executions
+ */
+public interface MojosExecutionStrategy
+{
+
+    /**
+     * Entry point to the execution strategy
+     *
+     * @param mojos             list of mojos representing a project build
+     * @param session           current session
+     * @param mojoExecutionRunner mojo execution task which must be invoked by a strategy to actually run it
+     * @throws LifecycleExecutionException
+     */
+    void execute( List<MojoExecution> mojos, MavenSession session, MojoExecutionRunner mojoExecutionRunner )
+            throws LifecycleExecutionException;
+
+}
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
index 6d55988..8b3e176 100644
--- a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
+++ b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
@@ -493,6 +493,21 @@ public class DefaultMavenPluginManager
 
         ClassRealm pluginRealm = pluginDescriptor.getClassRealm();
 
+        if ( pluginRealm == null )
+        {
+            try
+            {
+                setupPluginRealm( pluginDescriptor, session, null, null, null );
+            }
+            catch ( PluginResolutionException e )
+            {
+                String msg = "Cannot setup plugin realm [mojoDescriptor=" + mojoDescriptor.getId()
+                        + ", pluginDescriptor=" + pluginDescriptor.getId() + "]";
+                throw new PluginConfigurationException( pluginDescriptor, msg, e );
+            }
+            pluginRealm = pluginDescriptor.getClassRealm();
+        }
+
         if ( logger.isDebugEnabled() )
         {
             logger.debug( "Configuring mojo " + mojoDescriptor.getId() + " from plugin realm " + pluginRealm );
diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/MojoExecutorStub.java b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/MojoExecutorStub.java
index feedd1e..57eacb1 100644
--- a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/MojoExecutorStub.java
+++ b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/MojoExecutorStub.java
@@ -21,14 +21,15 @@ import org.apache.maven.lifecycle.internal.DependencyContext;
 import org.apache.maven.lifecycle.internal.ExecutionEventCatapult;
 import org.apache.maven.lifecycle.internal.LifecycleDependencyResolver;
 import org.apache.maven.lifecycle.internal.MojoExecutor;
-import org.apache.maven.lifecycle.internal.PhaseRecorder;
 import org.apache.maven.lifecycle.internal.ProjectIndex;
 import org.apache.maven.plugin.BuildPluginManager;
 import org.apache.maven.plugin.MavenPluginManager;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.plugin.MojoExecution;
+import org.apache.maven.plugin.MojosExecutionStrategy;
 import org.apache.maven.plugin.descriptor.MojoDescriptor;
 import org.apache.maven.plugin.descriptor.PluginDescriptor;
+import org.apache.maven.project.MavenProject;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -47,24 +48,23 @@ public class MojoExecutorStub
             BuildPluginManager pluginManager,
             MavenPluginManager mavenPluginManager,
             LifecycleDependencyResolver lifeCycleDependencyResolver,
-            ExecutionEventCatapult eventCatapult )
+            ExecutionEventCatapult eventCatapult,
+            MojosExecutionStrategy mojosExecutionStrategy )
     {
-        super( pluginManager, mavenPluginManager, lifeCycleDependencyResolver, eventCatapult );
+        super( pluginManager, mavenPluginManager, lifeCycleDependencyResolver, eventCatapult, mojosExecutionStrategy );
     }
 
     @Override
-    public void execute( MavenSession session, MojoExecution mojoExecution, ProjectIndex projectIndex,
-                         DependencyContext dependencyContext, PhaseRecorder phaseRecorder )
+    public void execute( MavenSession session, List<MojoExecution> mojoExecutions, ProjectIndex projectIndex )
         throws LifecycleExecutionException
     {
-        executions.add( mojoExecution );
+        executions.addAll( mojoExecutions );
     }
 
     @Override
-    public void execute( MavenSession session, List<MojoExecution> mojoExecutions, ProjectIndex projectIndex )
-        throws LifecycleExecutionException
+    public List<MavenProject> executeForkedExecutions( MojoExecution mojoExecution, MavenSession session, ProjectIndex projectIndex ) throws LifecycleExecutionException
     {
-        executions.addAll(mojoExecutions);
+        return null;
     }
 
 

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

Posted by gn...@apache.org.
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 ...