You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by rf...@apache.org on 2019/10/27 19:06:38 UTC

[maven-artifact-transfer] 01/01: Refactor code to improve separation of Maven APIs and Aether code. All transfer internal Maven3x implementations should not use (close to) any Maven Core code, only a few classes are allowed.

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

rfscholte pushed a commit to branch refactor
in repository https://gitbox.apache.org/repos/asf/maven-artifact-transfer.git

commit d23716a0c901fd6c6e9626b61758584f82b4d08c
Author: rfscholte <rf...@apache.org>
AuthorDate: Sun Oct 27 20:05:25 2019 +0100

    Refactor code to improve separation of Maven APIs and Aether code. All transfer internal Maven3x implementations should not use (close to) any Maven Core code, only a few classes are allowed.
---
 pom.xml                                            | 15 +++-
 .../deploy/internal/DefaultArtifactDeployer.java   | 37 ++++++---
 .../deploy/internal/Maven30ArtifactDeployer.java   | 28 +++----
 .../deploy/internal/Maven31ArtifactDeployer.java   | 31 ++++---
 .../deploy/internal/MavenArtifactDeployer.java     | 42 ++++++++++
 .../install/internal/DefaultArtifactInstaller.java | 44 +++++++---
 .../install/internal/Maven30ArtifactInstaller.java | 46 ++++-------
 .../install/internal/Maven31ArtifactInstaller.java | 39 +++------
 .../install/internal/MavenArtifactInstaller.java   | 36 +++++++++
 .../resolve/internal/DefaultArtifactResolver.java  | 56 ++++++++++---
 .../resolve/internal/Maven30ArtifactResolver.java  | 45 +++++------
 .../resolve/internal/Maven31ArtifactResolver.java  | 47 +++++------
 .../resolve/internal/MavenArtifactResolver.java    | 38 +++++++++
 .../internal/DefaultDependencyCollector.java       | 54 +++++++++++--
 .../internal/Maven30DependencyCollector.java       | 49 +++++------
 .../internal/Maven31DependencyCollector.java       | 48 +++++------
 .../collect/internal/MavenDependencyCollector.java | 44 ++++++++++
 .../internal/DefaultDependencyResolver.java        | 65 +++++++++++----
 .../internal/Maven30DependencyResolver.java        | 63 ++++++---------
 .../internal/Maven31DependencyResolver.java        | 61 ++++++--------
 .../resolve/internal/MavenDependencyResolver.java  | 51 ++++++++++++
 .../internal/DefaultRepositoryManager.java         | 94 ++++++++++++----------
 .../internal/Maven302RepositoryManager.java        |  9 ++-
 .../internal/Maven30RepositoryManager.java         | 65 ++++-----------
 .../internal/Maven31RepositoryManager.java         | 67 ++++-----------
 .../internal/MavenRepositoryManager.java           | 67 +++++++++++++++
 .../internal/Maven30ArtifactInstallerTest.java     |  9 ++-
 .../internal/Maven30RepositoryManagerTest.java     | 12 ++-
 28 files changed, 778 insertions(+), 484 deletions(-)

diff --git a/pom.xml b/pom.xml
index 8511433..0b26abd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -53,6 +53,10 @@
       <url>scm:svn:https://svn.apache.org/repos/asf/maven/website/components/${maven.site.path}</url>
     </site>
   </distributionManagement>
+  
+  <properties>
+    <javaVersion>7</javaVersion>
+  </properties>
 
   <build>
     <plugins>
@@ -83,7 +87,7 @@
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>animal-sniffer-maven-plugin</artifactId>
-        <version>1.15</version>
+        <version>1.18</version>
         <executions>
           <execution>
             <id>sniff</id>
@@ -94,10 +98,13 @@
           </execution>
         </executions>
         <configuration>
+          <ignores>
+            <ignore>java.lang.invoke.MethodHandle</ignore>
+          </ignores>
           <signature>
             <groupId>org.codehaus.mojo.signature</groupId>
-            <artifactId>java16</artifactId>
-            <version>1.1</version>
+            <artifactId>java17</artifactId>
+            <version>1.0</version>
           </signature>
         </configuration>
       </plugin>
@@ -110,7 +117,7 @@
             <configuration>
               <rules>
                 <enforceBytecodeVersion>
-                  <maxJdkVersion>1.6</maxJdkVersion>
+                  <maxJdkVersion>1.${javaVersion}</maxJdkVersion>
                 </enforceBytecodeVersion>
               </rules>
             </configuration>
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/DefaultArtifactDeployer.java b/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/DefaultArtifactDeployer.java
index 345e85d..c6f2858 100644
--- a/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/DefaultArtifactDeployer.java
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/DefaultArtifactDeployer.java
@@ -52,11 +52,7 @@ class DefaultArtifactDeployer
 
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            ArtifactDeployer effectiveArtifactDeployer = container.lookup( ArtifactDeployer.class, hint );
-
-            effectiveArtifactDeployer.deploy( request, mavenArtifacts );
+            getMavenArtifactDeployer( request ).deploy( mavenArtifacts );
         }
         catch ( ComponentLookupException e )
         {
@@ -72,11 +68,7 @@ class DefaultArtifactDeployer
         validateParameters( request, mavenArtifacts );
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            ArtifactDeployer effectiveArtifactDeployer = container.lookup( ArtifactDeployer.class, hint );
-
-            effectiveArtifactDeployer.deploy( request, remoteRepository, mavenArtifacts );
+            getMavenArtifactDeployer( request ).deploy( remoteRepository, mavenArtifacts );
         }
         catch ( ComponentLookupException e )
         {
@@ -133,4 +125,29 @@ class DefaultArtifactDeployer
     {
         container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
     }
+    
+    private MavenArtifactDeployer getMavenArtifactDeployer( ProjectBuildingRequest buildingRequest )
+        throws ComponentLookupException, ArtifactDeployerException
+    {
+        if ( isMaven31() )
+        {
+            org.eclipse.aether.RepositorySystem repositorySystem =
+                            container.lookup( org.eclipse.aether.RepositorySystem.class );
+            
+            org.eclipse.aether.RepositorySystemSession session =
+                (org.eclipse.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+            
+            return new Maven31ArtifactDeployer( repositorySystem, session );
+        }
+        else
+        {
+            org.sonatype.aether.RepositorySystem repositorySystem =
+                            container.lookup( org.sonatype.aether.RepositorySystem.class );
+            
+            org.sonatype.aether.RepositorySystemSession session =
+                (org.sonatype.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+            
+            return new Maven30ArtifactDeployer( repositorySystem, session );
+        }
+    }
 }
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/Maven30ArtifactDeployer.java b/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/Maven30ArtifactDeployer.java
index 83cc6a2..0f5908d 100644
--- a/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/Maven30ArtifactDeployer.java
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/Maven30ArtifactDeployer.java
@@ -25,13 +25,9 @@ import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.metadata.ArtifactMetadata;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.project.artifact.ProjectArtifactMetadata;
-import org.apache.maven.shared.transfer.artifact.deploy.ArtifactDeployer;
 import org.apache.maven.shared.transfer.artifact.deploy.ArtifactDeployerException;
 import org.apache.maven.shared.transfer.metadata.internal.Maven30MetadataBridge;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.sonatype.aether.RepositorySystem;
 import org.sonatype.aether.RepositorySystemSession;
 import org.sonatype.aether.artifact.Artifact;
@@ -43,33 +39,35 @@ import org.sonatype.aether.util.artifact.SubArtifact;
 /**
  * 
  */
-@Component( role = ArtifactDeployer.class, hint = "maven3" )
 class Maven30ArtifactDeployer
-    implements ArtifactDeployer
+    implements MavenArtifactDeployer
 {
 
-    @Requirement
-    private RepositorySystem repositorySystem;
+    private final RepositorySystem repositorySystem;
+    
+    private final RepositorySystemSession session;
+    
+    Maven30ArtifactDeployer( RepositorySystem repositorySystem, RepositorySystemSession session )
+    {
+        this.repositorySystem = repositorySystem;
+        this.session = session;
+    }
 
     @Override
-    public void deploy( ProjectBuildingRequest buildingRequest,
-                        Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
+    public void deploy( Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
                             throws ArtifactDeployerException
     {
-        deploy( buildingRequest, null, mavenArtifacts );
+        deploy( null, mavenArtifacts );
     }
 
     @Override
-    public void deploy( ProjectBuildingRequest buildingRequest, ArtifactRepository remoteRepository,
+    public void deploy( ArtifactRepository remoteRepository,
                         Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
                             throws ArtifactDeployerException
     {
         // prepare request
         DeployRequest request = new DeployRequest();
 
-        RepositorySystemSession session =
-            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
         RemoteRepository defaultRepository = null;
 
         if ( remoteRepository != null )
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/Maven31ArtifactDeployer.java b/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/Maven31ArtifactDeployer.java
index 71594de..1a2b640 100644
--- a/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/Maven31ArtifactDeployer.java
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/Maven31ArtifactDeployer.java
@@ -25,13 +25,9 @@ import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.metadata.ArtifactMetadata;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.project.artifact.ProjectArtifactMetadata;
-import org.apache.maven.shared.transfer.artifact.deploy.ArtifactDeployer;
 import org.apache.maven.shared.transfer.artifact.deploy.ArtifactDeployerException;
 import org.apache.maven.shared.transfer.metadata.internal.Maven31MetadataBridge;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.artifact.Artifact;
@@ -43,33 +39,36 @@ import org.eclipse.aether.util.artifact.SubArtifact;
 /**
  * 
  */
-@Component( role = ArtifactDeployer.class, hint = "maven31" )
 class Maven31ArtifactDeployer
-    implements ArtifactDeployer
+    implements MavenArtifactDeployer
 {
 
-    @Requirement
-    private RepositorySystem repositorySystem;
+    private final RepositorySystem repositorySystem;
+    
+    private final RepositorySystemSession session;
+    
+    Maven31ArtifactDeployer( RepositorySystem repositorySystem, RepositorySystemSession session )
+    {
+        super();
+        this.repositorySystem = repositorySystem;
+        this.session = session;
+    }
 
     @Override
-    public void deploy( ProjectBuildingRequest buildingRequest,
-                        Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
+    public void deploy( Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
                             throws ArtifactDeployerException
     {
-        deploy( buildingRequest, null, mavenArtifacts );
+        deploy( null, mavenArtifacts );
     }
 
-    /** {@inheritDoc} */
-    public void deploy( ProjectBuildingRequest buildingRequest, ArtifactRepository remoteRepository,
+    @Override
+    public void deploy( ArtifactRepository remoteRepository,
                         Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
                             throws ArtifactDeployerException
     {
         // prepare request
         DeployRequest request = new DeployRequest();
 
-        RepositorySystemSession session =
-            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
         RemoteRepository defaultRepository = null;
 
         if ( remoteRepository != null )
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/MavenArtifactDeployer.java b/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/MavenArtifactDeployer.java
new file mode 100644
index 0000000..c4f0446
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/deploy/internal/MavenArtifactDeployer.java
@@ -0,0 +1,42 @@
+package org.apache.maven.shared.transfer.artifact.deploy.internal;
+
+/*
+ * 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.artifact.Artifact;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.shared.transfer.artifact.deploy.ArtifactDeployerException;
+
+/**
+ * 
+ * @author Robert Scholte
+ *
+ */
+public interface MavenArtifactDeployer
+{
+
+    void deploy( Collection<Artifact> mavenArtifacts )
+        throws ArtifactDeployerException;
+
+    void deploy( ArtifactRepository remoteRepository, Collection<Artifact> mavenArtifacts )
+        throws ArtifactDeployerException;
+
+}
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/DefaultArtifactInstaller.java b/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/DefaultArtifactInstaller.java
index 574d208..f8a56f7 100644
--- a/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/DefaultArtifactInstaller.java
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/DefaultArtifactInstaller.java
@@ -26,6 +26,7 @@ import org.apache.maven.artifact.Artifact;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.transfer.artifact.install.ArtifactInstaller;
 import org.apache.maven.shared.transfer.artifact.install.ArtifactInstallerException;
+import org.apache.maven.shared.transfer.repository.RepositoryManager;
 import org.codehaus.plexus.PlexusConstants;
 import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.component.annotations.Component;
@@ -41,8 +42,9 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
 class DefaultArtifactInstaller
     implements ArtifactInstaller, Contextualizable
 {
-
     private PlexusContainer container;
+    
+    private RepositoryManager repositoryManager;
 
     @Override
     public void install( ProjectBuildingRequest request, Collection<Artifact> mavenArtifacts )
@@ -51,11 +53,7 @@ class DefaultArtifactInstaller
         validateParameters( request, mavenArtifacts );
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            ArtifactInstaller effectiveArtifactInstaller = container.lookup( ArtifactInstaller.class, hint );
-
-            effectiveArtifactInstaller.install( request, mavenArtifacts );
+            getMavenArtifactInstaller( request ).install( mavenArtifacts );
         }
         catch ( ComponentLookupException e )
         {
@@ -78,14 +76,13 @@ class DefaultArtifactInstaller
         }
 
         // TODO: Should we check for exists() ?
+        
+        // update local repo in request 
+        ProjectBuildingRequest newRequest = repositoryManager.setLocalRepositoryBasedir( request, localRepositry );
 
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            ArtifactInstaller effectiveArtifactInstaller = container.lookup( ArtifactInstaller.class, hint );
-
-            effectiveArtifactInstaller.install( request, localRepositry, mavenArtifacts );
+            getMavenArtifactInstaller( newRequest ).install( mavenArtifacts );
         }
         catch ( ComponentLookupException e )
         {
@@ -142,4 +139,29 @@ class DefaultArtifactInstaller
     {
         container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
     }
+    
+    private MavenArtifactInstaller getMavenArtifactInstaller( ProjectBuildingRequest buildingRequest )
+        throws ComponentLookupException, ArtifactInstallerException
+    {
+        if ( isMaven31() )
+        {
+            org.eclipse.aether.RepositorySystem repositorySystem =
+                            container.lookup( org.eclipse.aether.RepositorySystem.class );
+            
+            org.eclipse.aether.RepositorySystemSession session =
+                (org.eclipse.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+
+            return new Maven31ArtifactInstaller( repositorySystem, session );
+        }
+        else
+        {
+            org.sonatype.aether.RepositorySystem repositorySystem =
+                            container.lookup( org.sonatype.aether.RepositorySystem.class );
+            
+            org.sonatype.aether.RepositorySystemSession session =
+                (org.sonatype.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+
+            return new Maven30ArtifactInstaller( repositorySystem, session );
+        }
+    }
 }
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven30ArtifactInstaller.java b/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven30ArtifactInstaller.java
index 260beec..2a15dfd 100644
--- a/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven30ArtifactInstaller.java
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven30ArtifactInstaller.java
@@ -19,20 +19,14 @@ package org.apache.maven.shared.transfer.artifact.install.internal;
  * under the License.
  */
 
-import java.io.File;
 import java.util.Collection;
 
 import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.metadata.ArtifactMetadata;
 import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.project.artifact.ProjectArtifactMetadata;
-import org.apache.maven.shared.transfer.artifact.install.ArtifactInstaller;
 import org.apache.maven.shared.transfer.artifact.install.ArtifactInstallerException;
 import org.apache.maven.shared.transfer.metadata.internal.Maven30MetadataBridge;
-import org.apache.maven.shared.transfer.repository.RepositoryManager;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.sonatype.aether.RepositorySystem;
 import org.sonatype.aether.RepositorySystemSession;
 import org.sonatype.aether.artifact.Artifact;
@@ -43,30 +37,24 @@ import org.sonatype.aether.util.artifact.SubArtifact;
 /**
  * 
  */
-@Component( role = ArtifactInstaller.class, hint = "maven3" )
 class Maven30ArtifactInstaller
-    implements ArtifactInstaller
+    implements MavenArtifactInstaller
 {
-    @Requirement
-    private RepositorySystem repositorySystem;
+    private final RepositorySystem repositorySystem;
     
-    @Requirement
-    private RepositoryManager repositoryManager; 
-
-    @Override
-    public void install( ProjectBuildingRequest buildingRequest,
-                         Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
-                             throws ArtifactInstallerException
+    private final RepositorySystemSession session; 
+    
+    Maven30ArtifactInstaller( RepositorySystem repositorySystem, RepositorySystemSession session )
     {
-        install( buildingRequest, null, mavenArtifacts );
+        this.repositorySystem = repositorySystem;
+        this.session = session;
     }
-    
+
     @Override
-    public void install( ProjectBuildingRequest buildingRequest, File localRepository,
-                         Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
-                             throws ArtifactInstallerException
+    public void install( Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
+        throws ArtifactInstallerException
     {
-     // prepare installRequest
+        // prepare installRequest
         InstallRequest request = new InstallRequest();
 
         // transform artifacts
@@ -100,14 +88,10 @@ class Maven30ArtifactInstaller
             }
         }
 
-        if ( localRepository != null )
-        {
-            buildingRequest = repositoryManager.setLocalRepositoryBasedir( buildingRequest, localRepository );
-        }
-
-        RepositorySystemSession session =
-            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
+//        if ( localRepository != null )
+//        {
+//            buildingRequest = repositoryManager.setLocalRepositoryBasedir( buildingRequest, localRepository );
+//        }
         
         // install
         try
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven31ArtifactInstaller.java b/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven31ArtifactInstaller.java
index d922b97..e4eae74 100644
--- a/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven31ArtifactInstaller.java
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven31ArtifactInstaller.java
@@ -19,20 +19,14 @@ package org.apache.maven.shared.transfer.artifact.install.internal;
  * under the License.
  */
 
-import java.io.File;
 import java.util.Collection;
 
 import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.metadata.ArtifactMetadata;
 import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.project.artifact.ProjectArtifactMetadata;
-import org.apache.maven.shared.transfer.artifact.install.ArtifactInstaller;
 import org.apache.maven.shared.transfer.artifact.install.ArtifactInstallerException;
 import org.apache.maven.shared.transfer.metadata.internal.Maven31MetadataBridge;
-import org.apache.maven.shared.transfer.repository.RepositoryManager;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.artifact.Artifact;
@@ -43,27 +37,22 @@ import org.eclipse.aether.util.artifact.SubArtifact;
 /**
  * 
  */
-@Component( role = ArtifactInstaller.class, hint = "maven31" )
 class Maven31ArtifactInstaller
-    implements ArtifactInstaller
+    implements MavenArtifactInstaller
 {
-    @Requirement
-    private RepositorySystem repositorySystem;
+    private final RepositorySystem repositorySystem;
 
-    @Requirement
-    private RepositoryManager repositoryManager;
-
-    @Override
-    public void install( ProjectBuildingRequest buildingRequest,
-                         Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
-                             throws ArtifactInstallerException
+    private final RepositorySystemSession session;
+    
+    Maven31ArtifactInstaller( RepositorySystem repositorySystem,
+                                     RepositorySystemSession session )
     {
-        install( buildingRequest, null, mavenArtifacts );
+        this.repositorySystem = repositorySystem;
+        this.session = session;
     }
-    
+
     @Override
-    public void install( ProjectBuildingRequest buildingRequest, File localRepository,
-                         Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
+    public void install( Collection<org.apache.maven.artifact.Artifact> mavenArtifacts )
                              throws ArtifactInstallerException
     {
         // prepare installRequest
@@ -100,14 +89,6 @@ class Maven31ArtifactInstaller
             }
         }
         
-        if ( localRepository != null )
-        {
-            buildingRequest = repositoryManager.setLocalRepositoryBasedir( buildingRequest, localRepository );
-        }
-
-        RepositorySystemSession session =
-            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
         // install
         try
         {
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/MavenArtifactInstaller.java b/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/MavenArtifactInstaller.java
new file mode 100644
index 0000000..7670d57
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/install/internal/MavenArtifactInstaller.java
@@ -0,0 +1,36 @@
+package org.apache.maven.shared.transfer.artifact.install.internal;
+
+/*
+ * 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.artifact.Artifact;
+import org.apache.maven.shared.transfer.artifact.install.ArtifactInstallerException;
+
+/**
+ * 
+ * @author Robert Scholte
+ *
+ */
+public interface MavenArtifactInstaller
+{
+    void install( Collection<Artifact> mavenArtifacts )
+        throws ArtifactInstallerException;
+}
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/DefaultArtifactResolver.java b/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/DefaultArtifactResolver.java
index ae709a5..9f1826b 100644
--- a/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/DefaultArtifactResolver.java
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/DefaultArtifactResolver.java
@@ -19,6 +19,9 @@ package org.apache.maven.shared.transfer.artifact.resolve.internal;
  * under the License.
  */
 
+import java.util.List;
+
+import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.transfer.artifact.ArtifactCoordinate;
@@ -33,6 +36,7 @@ import org.codehaus.plexus.context.Context;
 import org.codehaus.plexus.context.ContextException;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
 
+
 /**
  * 
  */
@@ -49,11 +53,7 @@ class DefaultArtifactResolver
         validateParameters( buildingRequest, mavenArtifact );
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            ArtifactResolver effectiveArtifactResolver = container.lookup( ArtifactResolver.class, hint );
-
-            return effectiveArtifactResolver.resolveArtifact( buildingRequest, mavenArtifact );
+            return getMavenArtifactResolver( buildingRequest ).resolveArtifact( mavenArtifact );
         }
         catch ( ComponentLookupException e )
         {
@@ -68,11 +68,7 @@ class DefaultArtifactResolver
         validateParameters( buildingRequest, coordinate );
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            ArtifactResolver effectiveArtifactResolver = container.lookup( ArtifactResolver.class, hint );
-
-            return effectiveArtifactResolver.resolveArtifact( buildingRequest, coordinate );
+            return getMavenArtifactResolver( buildingRequest ).resolveArtifact( coordinate );
         }
         catch ( ComponentLookupException e )
         {
@@ -137,4 +133,44 @@ class DefaultArtifactResolver
     {
         container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
     }
+    
+    private MavenArtifactResolver getMavenArtifactResolver( ProjectBuildingRequest buildingRequest )
+        throws ComponentLookupException, ArtifactResolverException
+    {
+        if ( isMaven31() )
+        {
+            org.eclipse.aether.RepositorySystem repositorySystem =
+                            container.lookup( org.eclipse.aether.RepositorySystem.class );
+            
+            @SuppressWarnings( "unchecked" )
+            List<org.eclipse.aether.repository.RemoteRepository> aetherRepositories =
+                (List<org.eclipse.aether.repository.RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos",
+                                                                           List.class,
+                                                                           buildingRequest.getRemoteRepositories() );
+
+            org.eclipse.aether.RepositorySystemSession session =
+                (org.eclipse.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+            
+            return new Maven31ArtifactResolver( repositorySystem, aetherRepositories, session );
+            
+        }
+        else
+        {
+            org.sonatype.aether.RepositorySystem repositorySystem =
+                            container.lookup( org.sonatype.aether.RepositorySystem.class );
+            
+            @SuppressWarnings( "unchecked" )
+            List<org.sonatype.aether.repository.RemoteRepository> aetherRepositories =
+                (List<org.sonatype.aether.repository.RemoteRepository>) Invoker.invoke( RepositoryUtils.class,
+                                                                            "toRepos", List.class,
+                                                                            buildingRequest.getRemoteRepositories() );
+
+            org.sonatype.aether.RepositorySystemSession session =
+                (org.sonatype.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+            
+            return new Maven30ArtifactResolver( repositorySystem, aetherRepositories, session );
+        }
+
+
+    }
 }
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/Maven30ArtifactResolver.java b/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/Maven30ArtifactResolver.java
index f81b243..e5f820c 100644
--- a/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/Maven30ArtifactResolver.java
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/Maven30ArtifactResolver.java
@@ -22,13 +22,8 @@ package org.apache.maven.shared.transfer.artifact.resolve.internal;
 import java.util.List;
 
 import org.apache.maven.RepositoryUtils;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.transfer.artifact.ArtifactCoordinate;
-import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolver;
 import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolverException;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.sonatype.aether.RepositorySystem;
 import org.sonatype.aether.RepositorySystemSession;
 import org.sonatype.aether.artifact.Artifact;
@@ -43,33 +38,38 @@ import org.sonatype.aether.util.artifact.DefaultArtifact;
 /**
  * 
  */
-@Component( role = ArtifactResolver.class, hint = "maven3" )
 class Maven30ArtifactResolver
-    implements ArtifactResolver
+    implements MavenArtifactResolver
 {
-    @Requirement
-    private RepositorySystem repositorySystem;
+    private final RepositorySystem repositorySystem;
 
-    @Requirement
-    private ArtifactHandlerManager artifactHandlerManager;
+    private final List<RemoteRepository> aetherRepositories;
+    
+    private final RepositorySystemSession session;
+
+    Maven30ArtifactResolver( RepositorySystem repositorySystem, List<RemoteRepository> aetherRepositories,
+                                    RepositorySystemSession session )
+    {
+        this.repositorySystem = repositorySystem;
+        this.aetherRepositories = aetherRepositories;
+        this.session = session;
+    }
 
     @Override
     // CHECKSTYLE_OFF: LineLength
-    public org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest,
-                                                                                    org.apache.maven.artifact.Artifact mavenArtifact )
+    public org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( org.apache.maven.artifact.Artifact mavenArtifact )
                                                                                         throws ArtifactResolverException
     // CHECKSTYLE_ON: LineLength
     {
         Artifact aetherArtifact = (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
                                                              org.apache.maven.artifact.Artifact.class, mavenArtifact );
 
-        return resolveArtifact( buildingRequest, aetherArtifact );
+        return resolveArtifact( aetherArtifact );
     }
 
     @Override
     // CHECKSTYLE_OFF: LineLength
-    public org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest,
-                                                                                    ArtifactCoordinate coordinate )
+    public org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( ArtifactCoordinate coordinate )
                                                                                         throws ArtifactResolverException
     // CHECKSTYLE_ON: LineLength
     {
@@ -77,23 +77,14 @@ class Maven30ArtifactResolver
             new DefaultArtifact( coordinate.getGroupId(), coordinate.getArtifactId(), coordinate.getClassifier(),
                                  coordinate.getExtension(), coordinate.getVersion() );
 
-        return resolveArtifact( buildingRequest, aetherArtifact );
+        return resolveArtifact( aetherArtifact );
     }
 
     // CHECKSTYLE_OFF: LineLength
-    private org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest,
-                                                                                     Artifact aetherArtifact )
+    private org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( Artifact aetherArtifact )
                                                                                          throws ArtifactResolverException
     // CHECKSTYLE_ON: LineLength
     {
-        @SuppressWarnings( "unchecked" )
-        List<RemoteRepository> aetherRepositories =
-            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                     buildingRequest.getRemoteRepositories() );
-
-        RepositorySystemSession session =
-            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
         try
         {
             // use descriptor to respect relocation
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/Maven31ArtifactResolver.java b/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/Maven31ArtifactResolver.java
index 56e4519..888a683 100644
--- a/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/Maven31ArtifactResolver.java
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/Maven31ArtifactResolver.java
@@ -22,13 +22,8 @@ package org.apache.maven.shared.transfer.artifact.resolve.internal;
 import java.util.List;
 
 import org.apache.maven.RepositoryUtils;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.transfer.artifact.ArtifactCoordinate;
-import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolver;
 import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolverException;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.artifact.Artifact;
@@ -43,33 +38,38 @@ import org.eclipse.aether.resolution.ArtifactResolutionException;
 /**
  * 
  */
-@Component( role = ArtifactResolver.class, hint = "maven31" )
 class Maven31ArtifactResolver
-    implements ArtifactResolver
+    implements MavenArtifactResolver
 {
-    @Requirement
-    private RepositorySystem repositorySystem;
-
-    @Requirement
-    private ArtifactHandlerManager artifactHandlerManager;
+    private final RepositorySystem repositorySystem;
+    
+    private final List<RemoteRepository> aetherRepositories;
+    
+    private final RepositorySystemSession session;
+
+    Maven31ArtifactResolver( RepositorySystem repositorySystem, List<RemoteRepository> aetherRepositories,
+                                    RepositorySystemSession session )
+    {
+        this.repositorySystem = repositorySystem;
+        this.aetherRepositories = aetherRepositories;
+        this.session = session;
+    }
 
     @Override
     // CHECKSTYLE_OFF: LineLength
-    public org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest,
-                                                                                    org.apache.maven.artifact.Artifact mavenArtifact )
+    public org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( org.apache.maven.artifact.Artifact mavenArtifact )
                                                                                         throws ArtifactResolverException
     // CHECKSTYLE_ON: LineLength
     {
         Artifact aetherArtifact = (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
                                                              org.apache.maven.artifact.Artifact.class, mavenArtifact );
 
-        return resolveArtifact( buildingRequest, aetherArtifact );
+        return resolveArtifact( aetherArtifact );
     }
 
     @Override
     // CHECKSTYLE_OFF: LineLength
-    public org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest,
-                                                                                    ArtifactCoordinate coordinate )
+    public org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( ArtifactCoordinate coordinate )
                                                                                         throws ArtifactResolverException
     // CHECKSTYLE_ON: LineLength
     {
@@ -77,23 +77,14 @@ class Maven31ArtifactResolver
             new DefaultArtifact( coordinate.getGroupId(), coordinate.getArtifactId(), coordinate.getClassifier(),
                                  coordinate.getExtension(), coordinate.getVersion() );
 
-        return resolveArtifact( buildingRequest, aetherArtifact );
+        return resolveArtifact( aetherArtifact );
     }
 
     // CHECKSTYLE_OFF: LineLength
-    private org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest,
-                                                                                     Artifact aetherArtifact )
+    private org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult resolveArtifact( Artifact aetherArtifact )
                                                                                          throws ArtifactResolverException
     // CHECKSTYLE_ON: LineLength
     {
-        @SuppressWarnings( "unchecked" )
-        List<RemoteRepository> aetherRepositories =
-            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                     buildingRequest.getRemoteRepositories() );
-
-        RepositorySystemSession session =
-            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
         try
         {
             // use descriptor to respect relocation
diff --git a/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/MavenArtifactResolver.java b/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/MavenArtifactResolver.java
new file mode 100644
index 0000000..2e9fb74
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/transfer/artifact/resolve/internal/MavenArtifactResolver.java
@@ -0,0 +1,38 @@
+package org.apache.maven.shared.transfer.artifact.resolve.internal;
+
+/*
+ * 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.Artifact;
+import org.apache.maven.shared.transfer.artifact.ArtifactCoordinate;
+import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolverException;
+import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult;
+
+/**
+ * 
+ * @author Robert Scholte
+ *
+ */
+public interface MavenArtifactResolver
+{
+    ArtifactResult resolveArtifact( Artifact mavenArtifact ) throws ArtifactResolverException;
+
+    ArtifactResult resolveArtifact( ArtifactCoordinate coordinate ) throws ArtifactResolverException;
+
+}
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/DefaultDependencyCollector.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/DefaultDependencyCollector.java
index 863c326..9904731 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/DefaultDependencyCollector.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/DefaultDependencyCollector.java
@@ -19,6 +19,10 @@ package org.apache.maven.shared.transfer.dependencies.collect.internal;
  * under the License.
  */
 
+import java.util.List;
+
+import org.apache.maven.RepositoryUtils;
+import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Model;
 import org.apache.maven.project.ProjectBuildingRequest;
@@ -72,11 +76,7 @@ class DefaultDependencyCollector implements DependencyCollector, Contextualizabl
 
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            DependencyCollector effectiveDependencyCollector = container.lookup( DependencyCollector.class, hint );
-
-            return effectiveDependencyCollector.collectDependencies( buildingRequest, root );
+            return getMavenDependencyCollector( buildingRequest ).collectDependencies( root );
         }
         catch ( ComponentLookupException e )
         {
@@ -172,5 +172,49 @@ class DefaultDependencyCollector implements DependencyCollector, Contextualizabl
     {
         container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
     }
+    
+    private MavenDependencyCollector getMavenDependencyCollector( ProjectBuildingRequest buildingRequest )
+        throws ComponentLookupException, DependencyCollectorException
+    {
+        ArtifactHandlerManager artifactHandlerManager = container.lookup( ArtifactHandlerManager.class );
+        
+        if ( isMaven31() )
+        {
+            org.eclipse.aether.RepositorySystem m31RepositorySystem =
+                container.lookup( org.eclipse.aether.RepositorySystem.class );
+
+            org.eclipse.aether.RepositorySystemSession session =
+                (org.eclipse.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+
+            @SuppressWarnings( "unchecked" )
+            List<org.eclipse.aether.repository.RemoteRepository> aetherRepositories =
+                (List<org.eclipse.aether.repository.RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos",
+                                                                           List.class,
+                                                                           buildingRequest.getRemoteRepositories() );
+
+            return new Maven31DependencyCollector( m31RepositorySystem, artifactHandlerManager, session,
+                                                   aetherRepositories );
+            
+        }
+        else
+        {
+
+            org.sonatype.aether.RepositorySystem m30RepositorySystem =
+                            container.lookup( org.sonatype.aether.RepositorySystem.class );
+
+            org.sonatype.aether.RepositorySystemSession session =
+                (org.sonatype.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+
+            @SuppressWarnings( "unchecked" )
+            List<org.sonatype.aether.repository.RemoteRepository> aetherRepositories =
+                (List<org.sonatype.aether.repository.RemoteRepository>) Invoker.invoke( RepositoryUtils.class,
+                                                                            "toRepos", List.class,
+                                                                            buildingRequest.getRemoteRepositories() );
+
+            return new Maven30DependencyCollector( m30RepositorySystem, artifactHandlerManager, session,
+                                                   aetherRepositories );
+        }
+
+    }
 
 }
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30DependencyCollector.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30DependencyCollector.java
index a1abb8c..4b4eaf2 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30DependencyCollector.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30DependencyCollector.java
@@ -26,13 +26,11 @@ import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.handler.ArtifactHandler;
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Model;
-import org.apache.maven.project.ProjectBuildingRequest;
+
 import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
 import org.apache.maven.shared.transfer.dependencies.collect.CollectorResult;
 import org.apache.maven.shared.transfer.dependencies.collect.DependencyCollector;
 import org.apache.maven.shared.transfer.dependencies.collect.DependencyCollectorException;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.sonatype.aether.RepositorySystem;
 import org.sonatype.aether.RepositorySystemSession;
 import org.sonatype.aether.artifact.Artifact;
@@ -49,19 +47,29 @@ import org.sonatype.aether.util.artifact.DefaultArtifact;
  * @author Robert Scholte
  *
  */
-@Component( role = DependencyCollector.class, hint = "maven3" )
 class Maven30DependencyCollector
-    implements DependencyCollector
+    implements MavenDependencyCollector
 {
-    @Requirement
-    private RepositorySystem repositorySystem;
+    private final RepositorySystem repositorySystem;
 
-    @Requirement
-    private ArtifactHandlerManager artifactHandlerManager;
+    private final ArtifactHandlerManager artifactHandlerManager;
+
+    private final RepositorySystemSession session;
+    
+    private final List<RemoteRepository> aetherRepositories;
+    
+    Maven30DependencyCollector( RepositorySystem repositorySystem, ArtifactHandlerManager artifactHandlerManager,
+                                RepositorySystemSession session, List<RemoteRepository> aetherRepositories )
+    {
+        super();
+        this.repositorySystem = repositorySystem;
+        this.artifactHandlerManager = artifactHandlerManager;
+        this.session = session;
+        this.aetherRepositories = aetherRepositories;
+    }
 
     @Override
-    public CollectorResult collectDependencies( final ProjectBuildingRequest buildingRequest,
-                                                org.apache.maven.model.Dependency root )
+    public CollectorResult collectDependencies( org.apache.maven.model.Dependency root )
         throws DependencyCollectorException
     {
         ArtifactTypeRegistry typeRegistry =
@@ -71,11 +79,11 @@ class Maven30DependencyCollector
         CollectRequest request = new CollectRequest();
         request.setRoot( toDependency( root, typeRegistry ) );
 
-        return collectDependencies( buildingRequest, request );
+        return collectDependencies( request );
     }
 
     @Override
-    public CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, DependableCoordinate root )
+    public CollectorResult collectDependencies( DependableCoordinate root )
         throws DependencyCollectorException
     {
         ArtifactHandler artifactHandler = artifactHandlerManager.getArtifactHandler( root.getType() );
@@ -88,11 +96,11 @@ class Maven30DependencyCollector
         CollectRequest request = new CollectRequest();
         request.setRoot( new Dependency( aetherArtifact, null ) );
 
-        return collectDependencies( buildingRequest, request );
+        return collectDependencies( request );
     }
     
     @Override
-    public CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, Model root )
+    public CollectorResult collectDependencies( Model root )
         throws DependencyCollectorException
     {
         // Are there examples where packaging and type are NOT in sync
@@ -130,19 +138,12 @@ class Maven30DependencyCollector
             request.setManagedDependencies( aetherManagerDependencies );
         }
         
-        return collectDependencies( buildingRequest, request );
+        return collectDependencies( request );
     }
 
-    private CollectorResult collectDependencies( final ProjectBuildingRequest buildingRequest, CollectRequest request )
+    private CollectorResult collectDependencies( CollectRequest request )
         throws DependencyCollectorException
     {
-        RepositorySystemSession session =
-            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
-        @SuppressWarnings( "unchecked" )
-        List<RemoteRepository> aetherRepositories =
-            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                     buildingRequest.getRemoteRepositories() );
         request.setRepositories( aetherRepositories );
 
         try
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven31DependencyCollector.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven31DependencyCollector.java
index cc4430d..0ee0385 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven31DependencyCollector.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven31DependencyCollector.java
@@ -26,13 +26,10 @@ import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.handler.ArtifactHandler;
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Model;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
 import org.apache.maven.shared.transfer.dependencies.collect.CollectorResult;
 import org.apache.maven.shared.transfer.dependencies.collect.DependencyCollector;
 import org.apache.maven.shared.transfer.dependencies.collect.DependencyCollectorException;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.artifact.Artifact;
@@ -49,19 +46,29 @@ import org.eclipse.aether.repository.RemoteRepository;
  * @author Robert Scholte
  *
  */
-@Component( role = DependencyCollector.class, hint = "maven31" )
 class Maven31DependencyCollector
-    implements DependencyCollector
+    implements MavenDependencyCollector
 {
-    @Requirement
-    private RepositorySystem repositorySystem;
+    private final RepositorySystem repositorySystem;
 
-    @Requirement
-    private ArtifactHandlerManager artifactHandlerManager;
+    private final ArtifactHandlerManager artifactHandlerManager;
+    
+    private final RepositorySystemSession session;
+    
+    private final List<RemoteRepository> aetherRepositories;
+    
+    Maven31DependencyCollector( RepositorySystem repositorySystem, ArtifactHandlerManager artifactHandlerManager,
+                                RepositorySystemSession session, List<RemoteRepository> aetherRepositories )
+    {
+        super();
+        this.repositorySystem = repositorySystem;
+        this.artifactHandlerManager = artifactHandlerManager;
+        this.session = session;
+        this.aetherRepositories = aetherRepositories;
+    }
 
     @Override
-    public CollectorResult collectDependencies( final ProjectBuildingRequest buildingRequest,
-                                                org.apache.maven.model.Dependency root )
+    public CollectorResult collectDependencies( org.apache.maven.model.Dependency root )
         throws DependencyCollectorException
     {
         ArtifactTypeRegistry typeRegistry =
@@ -71,11 +78,11 @@ class Maven31DependencyCollector
         CollectRequest request = new CollectRequest();
         request.setRoot( toDependency( root, typeRegistry ) );
 
-        return collectDependencies( buildingRequest, request );
+        return collectDependencies( request );
     }
 
     @Override
-    public CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, DependableCoordinate root )
+    public CollectorResult collectDependencies( DependableCoordinate root )
         throws DependencyCollectorException
     {
         ArtifactHandler artifactHandler = artifactHandlerManager.getArtifactHandler( root.getType() );
@@ -88,11 +95,11 @@ class Maven31DependencyCollector
         CollectRequest request = new CollectRequest();
         request.setRoot( new Dependency( aetherArtifact, null ) );
 
-        return collectDependencies( buildingRequest, request );
+        return collectDependencies( request );
     }
     
     @Override
-    public CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, Model root )
+    public CollectorResult collectDependencies( Model root )
         throws DependencyCollectorException
     {
         // Are there examples where packaging and type are NOT in sync
@@ -130,19 +137,12 @@ class Maven31DependencyCollector
             request.setManagedDependencies( aetherManagerDependencies );
         }
 
-        return collectDependencies( buildingRequest, request );
+        return collectDependencies( request );
     }
 
-    private CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, CollectRequest request )
+    private CollectorResult collectDependencies( CollectRequest request )
         throws DependencyCollectorException
     {
-        RepositorySystemSession session =
-            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
-        @SuppressWarnings( "unchecked" )
-        List<RemoteRepository> aetherRepositories =
-            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                     buildingRequest.getRemoteRepositories() );
         request.setRepositories( aetherRepositories );
 
         try
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/MavenDependencyCollector.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/MavenDependencyCollector.java
new file mode 100644
index 0000000..53823f8
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/MavenDependencyCollector.java
@@ -0,0 +1,44 @@
+package org.apache.maven.shared.transfer.dependencies.collect.internal;
+
+/*
+ * 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.model.Dependency;
+import org.apache.maven.model.Model;
+import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
+import org.apache.maven.shared.transfer.dependencies.collect.CollectorResult;
+import org.apache.maven.shared.transfer.dependencies.collect.DependencyCollectorException;
+
+/**
+ * 
+ * @author Robert Scholte
+ */
+public interface MavenDependencyCollector
+{
+
+    CollectorResult collectDependencies( Dependency root )
+        throws DependencyCollectorException;
+
+    CollectorResult collectDependencies( DependableCoordinate root )
+        throws DependencyCollectorException;
+
+    CollectorResult collectDependencies( Model root )
+        throws DependencyCollectorException;
+
+}
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/DefaultDependencyResolver.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/DefaultDependencyResolver.java
index 2c1d7ea..f3a6866 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/DefaultDependencyResolver.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/DefaultDependencyResolver.java
@@ -20,7 +20,10 @@ package org.apache.maven.shared.transfer.dependencies.resolve.internal;
  */
 
 import java.util.Collection;
+import java.util.List;
 
+import org.apache.maven.RepositoryUtils;
+import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Model;
 import org.apache.maven.project.ProjectBuildingRequest;
@@ -57,12 +60,8 @@ class DefaultDependencyResolver
         
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            DependencyResolver effectiveArtifactResolver = container.lookup( DependencyResolver.class, hint );
-
-            return effectiveArtifactResolver.resolveDependencies( buildingRequest, coordinates, managedDependencies,
-                                                                  filter );
+            return getMavenDependencyResolver( buildingRequest ).resolveDependencies( coordinates, managedDependencies,
+                                                                                      filter );
         }
         catch ( ComponentLookupException e )
         {
@@ -78,11 +77,7 @@ class DefaultDependencyResolver
         validateParameters( buildingRequest, coordinate, filter );
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            DependencyResolver effectiveArtifactResolver = container.lookup( DependencyResolver.class, hint );
-
-            return effectiveArtifactResolver.resolveDependencies( buildingRequest, coordinate, filter );
+            return getMavenDependencyResolver( buildingRequest ).resolveDependencies( coordinate, filter );
         }
         catch ( ComponentLookupException e )
         {
@@ -98,11 +93,7 @@ class DefaultDependencyResolver
         validateParameters( buildingRequest, model, filter );
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            DependencyResolver effectiveArtifactResolver = container.lookup( DependencyResolver.class, hint );
-
-            return effectiveArtifactResolver.resolveDependencies( buildingRequest, model, filter );
+            return getMavenDependencyResolver( buildingRequest ).resolveDependencies( model, filter );
         }
         catch ( ComponentLookupException e )
         {
@@ -164,6 +155,48 @@ class DefaultDependencyResolver
         }
 
     }
+    
+    private MavenDependencyResolver getMavenDependencyResolver( ProjectBuildingRequest buildingRequest )
+        throws ComponentLookupException, DependencyResolverException
+    {
+        ArtifactHandlerManager artifactHandlerManager = container.lookup( ArtifactHandlerManager.class );
+        
+        if ( isMaven31() )
+        {
+            org.eclipse.aether.RepositorySystem m31RepositorySystem =
+                container.lookup( org.eclipse.aether.RepositorySystem.class );
+
+            org.eclipse.aether.RepositorySystemSession session =
+                (org.eclipse.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+
+            List<org.eclipse.aether.repository.RemoteRepository> aetherRepositories =
+                (List<org.eclipse.aether.repository.RemoteRepository>) Invoker.invoke( RepositoryUtils.class, 
+                                                                           "toRepos",
+                                                                           List.class,
+                                                                           buildingRequest.getRemoteRepositories() );
+
+            return new Maven31DependencyResolver( m31RepositorySystem, artifactHandlerManager, session,
+                                                  aetherRepositories );
+        }
+        else
+        {
+            org.sonatype.aether.RepositorySystem m30RepositorySystem =
+                container.lookup( org.sonatype.aether.RepositorySystem.class );
+
+            org.sonatype.aether.RepositorySystemSession session =
+                (org.sonatype.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+
+            List<org.sonatype.aether.repository.RemoteRepository> aetherRepositories =
+                (List<org.sonatype.aether.repository.RemoteRepository>) Invoker.invoke( RepositoryUtils.class,
+                                                                            "toRepos", 
+                                                                            List.class,
+                                                                            buildingRequest.getRemoteRepositories() );
+
+            return new Maven30DependencyResolver( m30RepositorySystem, artifactHandlerManager, session,
+                                                  aetherRepositories );
+
+        }
+    }
 
     private void validateBuildingRequest( ProjectBuildingRequest buildingRequest )
     {
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/Maven30DependencyResolver.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/Maven30DependencyResolver.java
index 9182330..806d415 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/Maven30DependencyResolver.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/Maven30DependencyResolver.java
@@ -29,14 +29,10 @@ import org.apache.maven.artifact.handler.ArtifactHandler;
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.DependencyManagement;
 import org.apache.maven.model.Model;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter;
 import org.apache.maven.shared.artifact.filter.resolve.transform.SonatypeAetherFilterTransformer;
 import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
-import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolver;
 import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolverException;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 
 import org.sonatype.aether.RepositorySystem;
 import org.sonatype.aether.RepositorySystemSession;
@@ -56,20 +52,30 @@ import org.sonatype.aether.util.artifact.DefaultArtifactType;
 /**
  * 
  */
-@Component( role = DependencyResolver.class, hint = "maven3" )
 class Maven30DependencyResolver
-    implements DependencyResolver
+    implements MavenDependencyResolver
 {
-    @Requirement
-    private RepositorySystem repositorySystem;
+    private final RepositorySystem repositorySystem;
 
-    @Requirement
-    private ArtifactHandlerManager artifactHandlerManager;
+    private final ArtifactHandlerManager artifactHandlerManager;
+    
+    private final RepositorySystemSession session;
+    
+    private final List<RemoteRepository> aetherRepositories;
+    
+    Maven30DependencyResolver( RepositorySystem repositorySystem, ArtifactHandlerManager artifactHandlerManager,
+                                      RepositorySystemSession session, List<RemoteRepository> aetherRepositories )
+    {
+        super();
+        this.repositorySystem = repositorySystem;
+        this.artifactHandlerManager = artifactHandlerManager;
+        this.session = session;
+        this.aetherRepositories = aetherRepositories;
+    }
 
     @Override
     // CHECKSTYLE_OFF: LineLength
-    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
-                                                                                                  DependableCoordinate coordinate,
+    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( DependableCoordinate coordinate,
                                                                                                   TransformableFilter dependencyFilter )
     // CHECKSTYLE_ON: LineLength
         throws DependencyResolverException
@@ -80,20 +86,14 @@ class Maven30DependencyResolver
 
         Dependency aetherRoot = toDependency( coordinate, typeRegistry );
 
-        @SuppressWarnings( "unchecked" )
-        List<RemoteRepository> aetherRepositories =
-            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                     buildingRequest.getRemoteRepositories() );
-
         CollectRequest request = new CollectRequest( aetherRoot, aetherRepositories );
 
-        return resolveDependencies( buildingRequest, aetherRepositories, dependencyFilter, request );
+        return resolveDependencies( aetherRepositories, dependencyFilter, request );
     }
     
     @Override
     // CHECKSTYLE_OFF: LineLength
-    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
-                                                                                                  Model model,
+    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( Model model,
                                                                                                   TransformableFilter dependencyFilter )
     // CHECKSTYLE_ON: LineLength
         throws DependencyResolverException
@@ -108,11 +108,6 @@ class Maven30DependencyResolver
         
         Dependency aetherRoot = new Dependency( aetherArtifact, null );
         
-        @SuppressWarnings( "unchecked" )
-        List<RemoteRepository> aetherRepositories =
-            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                     buildingRequest.getRemoteRepositories() );
-
         CollectRequest request = new CollectRequest( aetherRoot, aetherRepositories );
         
         ArtifactTypeRegistry typeRegistry =
@@ -140,13 +135,12 @@ class Maven30DependencyResolver
             request.setManagedDependencies( aetherManagerDependencies );
         }
 
-        return resolveDependencies( buildingRequest, aetherRepositories, dependencyFilter, request );
+        return resolveDependencies( aetherRepositories, dependencyFilter, request );
     }
 
     @Override
     // CHECKSTYLE_OFF: LineLength
-    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
-                                                                                                  Collection<org.apache.maven.model.Dependency> mavenDependencies,
+    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( Collection<org.apache.maven.model.Dependency> mavenDependencies,
                                                                                                   Collection<org.apache.maven.model.Dependency> managedMavenDependencies,
                                                                                                   TransformableFilter filter )
     // CHECKSTYLE_ON: LineLength
@@ -193,20 +187,14 @@ class Maven30DependencyResolver
             }
         }
 
-        @SuppressWarnings( "unchecked" )
-        List<RemoteRepository> aetherRepositories =
-            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                     buildingRequest.getRemoteRepositories() );
-
         CollectRequest request =
             new CollectRequest( aetherDependencies, aetherManagedDependencies, aetherRepositories );
 
-        return resolveDependencies( buildingRequest, aetherRepositories, filter, request );
+        return resolveDependencies( aetherRepositories, filter, request );
     }
 
     // CHECKSTYLE_OFF: LineLength
-    private Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
-                                                                                                   List<RemoteRepository> aetherRepositories,
+    private Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( List<RemoteRepository> aetherRepositories,
                                                                                                    TransformableFilter dependencyFilter,
                                                                                                    CollectRequest request )
                                                                                                        throws DependencyResolverException
@@ -220,9 +208,6 @@ class Maven30DependencyResolver
                 depFilter = dependencyFilter.transform( new SonatypeAetherFilterTransformer() );
             }
 
-            RepositorySystemSession session =
-                (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
             final List<ArtifactResult> dependencyResults =
                 repositorySystem.resolveDependencies( session, request, depFilter );
 
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/Maven31DependencyResolver.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/Maven31DependencyResolver.java
index c4f53cf..7bbd6fc 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/Maven31DependencyResolver.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/Maven31DependencyResolver.java
@@ -29,14 +29,10 @@ import org.apache.maven.artifact.handler.ArtifactHandler;
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.DependencyManagement;
 import org.apache.maven.model.Model;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter;
 import org.apache.maven.shared.artifact.filter.resolve.transform.EclipseAetherFilterTransformer;
 import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
-import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolver;
 import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolverException;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.artifact.Artifact;
@@ -56,20 +52,30 @@ import org.eclipse.aether.resolution.DependencyResult;
 /**
  * 
  */
-@Component( role = DependencyResolver.class, hint = "maven31" )
 class Maven31DependencyResolver
-    implements DependencyResolver
+    implements MavenDependencyResolver
 {
-    @Requirement
     private RepositorySystem repositorySystem;
 
-    @Requirement
     private ArtifactHandlerManager artifactHandlerManager;
 
+    private final RepositorySystemSession session;
+
+    private final List<RemoteRepository> aetherRepositories;
+
+    Maven31DependencyResolver( RepositorySystem repositorySystem, ArtifactHandlerManager artifactHandlerManager,
+                                      RepositorySystemSession session, List<RemoteRepository> aetherRepositories )
+    {
+        super();
+        this.repositorySystem = repositorySystem;
+        this.artifactHandlerManager = artifactHandlerManager;
+        this.session = session;
+        this.aetherRepositories = aetherRepositories;
+    }
+
     @Override
     // CHECKSTYLE_OFF: LineLength
-    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
-                                                                                                  DependableCoordinate coordinate,
+    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( DependableCoordinate coordinate,
                                                                                                   TransformableFilter dependencyFilter )
                                                                                                       throws DependencyResolverException
     // CHECKSTYLE_ON: LineLength
@@ -80,20 +86,14 @@ class Maven31DependencyResolver
 
         Dependency aetherRoot = toDependency( coordinate, typeRegistry );
 
-        @SuppressWarnings( "unchecked" )
-        List<RemoteRepository> aetherRepositories =
-            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                     buildingRequest.getRemoteRepositories() );
-
         CollectRequest request = new CollectRequest( aetherRoot, aetherRepositories );
 
-        return resolveDependencies( buildingRequest, aetherRepositories, dependencyFilter, request );
+        return resolveDependencies( aetherRepositories, dependencyFilter, request );
     }
     
     @Override
     // CHECKSTYLE_OFF: LineLength
-    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
-                                                                                                  Model model,
+    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( Model model,
                                                                                                   TransformableFilter dependencyFilter )
     // CHECKSTYLE_ON: LineLength
         throws DependencyResolverException
@@ -108,11 +108,6 @@ class Maven31DependencyResolver
         
         Dependency aetherRoot = new Dependency( aetherArtifact, null );
         
-        @SuppressWarnings( "unchecked" )
-        List<RemoteRepository> aetherRepositories =
-            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                     buildingRequest.getRemoteRepositories() );
-
         CollectRequest request = new CollectRequest( aetherRoot, aetherRepositories );
         
         ArtifactTypeRegistry typeRegistry =
@@ -140,13 +135,12 @@ class Maven31DependencyResolver
             request.setManagedDependencies( aetherManagerDependencies );
         }
 
-        return resolveDependencies( buildingRequest, aetherRepositories, dependencyFilter, request );
+        return resolveDependencies( aetherRepositories, dependencyFilter, request );
     }
 
     @Override
     // CHECKSTYLE_OFF: LineLength
-    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
-                                                                                                  Collection<org.apache.maven.model.Dependency> mavenDependencies,
+    public Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( Collection<org.apache.maven.model.Dependency> mavenDependencies,
                                                                                                   Collection<org.apache.maven.model.Dependency> managedMavenDependencies,
                                                                                                   TransformableFilter filter )
                                                                                                       throws DependencyResolverException
@@ -193,19 +187,13 @@ class Maven31DependencyResolver
             }
         }
 
-        @SuppressWarnings( "unchecked" )
-        List<RemoteRepository> aetherRepos =
-            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                     buildingRequest.getRemoteRepositories() );
+        CollectRequest request = new CollectRequest( aetherDeps, aetherManagedDependencies, aetherRepositories );
 
-        CollectRequest request = new CollectRequest( aetherDeps, aetherManagedDependencies, aetherRepos );
-
-        return resolveDependencies( buildingRequest, aetherRepos, filter, request );
+        return resolveDependencies( aetherRepositories, filter, request );
     }
 
     // CHECKSTYLE_OFF: LineLength
-    private Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
-                                                                                                   List<RemoteRepository> aetherRepositories,
+    private Iterable<org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult> resolveDependencies( List<RemoteRepository> aetherRepositories,
                                                                                                    TransformableFilter dependencyFilter,
                                                                                                    CollectRequest request )
                                                                                                        throws DependencyResolverException
@@ -221,9 +209,6 @@ class Maven31DependencyResolver
 
             DependencyRequest depRequest = new DependencyRequest( request, depFilter );
 
-            RepositorySystemSession session =
-                (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
             final DependencyResult dependencyResults = repositorySystem.resolveDependencies( session, depRequest );
 
             // Keep it lazy! Often artifactsResults aren't used, so transforming up front is too expensive
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/MavenDependencyResolver.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/MavenDependencyResolver.java
new file mode 100644
index 0000000..da0222d
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/resolve/internal/MavenDependencyResolver.java
@@ -0,0 +1,51 @@
+package org.apache.maven.shared.transfer.dependencies.resolve.internal;
+
+/*
+ * 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.model.Dependency;
+import org.apache.maven.model.Model;
+import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter;
+import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult;
+import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
+import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolverException;
+
+/**
+ * 
+ * @author Robert Scholte
+ *
+ */
+public interface MavenDependencyResolver
+{
+
+    Iterable<ArtifactResult> resolveDependencies( DependableCoordinate coordinate,
+                                                  TransformableFilter dependencyFilter )
+        throws DependencyResolverException;
+
+    Iterable<ArtifactResult> resolveDependencies( Model model, TransformableFilter dependencyFilter )
+        throws DependencyResolverException;
+
+    Iterable<ArtifactResult> resolveDependencies( Collection<Dependency> mavenDependencies,
+                                                  Collection<Dependency> managedMavenDependencies,
+                                                  TransformableFilter filter )
+        throws DependencyResolverException;
+
+}
diff --git a/src/main/java/org/apache/maven/shared/transfer/repository/internal/DefaultRepositoryManager.java b/src/main/java/org/apache/maven/shared/transfer/repository/internal/DefaultRepositoryManager.java
index b14ae41..a38dce6 100644
--- a/src/main/java/org/apache/maven/shared/transfer/repository/internal/DefaultRepositoryManager.java
+++ b/src/main/java/org/apache/maven/shared/transfer/repository/internal/DefaultRepositoryManager.java
@@ -28,6 +28,7 @@ import org.apache.maven.project.artifact.ProjectArtifactMetadata;
 import org.apache.maven.shared.transfer.artifact.ArtifactCoordinate;
 import org.apache.maven.shared.transfer.artifact.DefaultArtifactCoordinate;
 import org.apache.maven.shared.transfer.repository.RepositoryManager;
+import org.apache.maven.shared.transfer.repository.RepositoryManagerException;
 import org.codehaus.plexus.PlexusConstants;
 import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.component.annotations.Component;
@@ -41,22 +42,18 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
  */
 @Component( role = RepositoryManager.class )
 class DefaultRepositoryManager
-    implements RepositoryManager, Contextualizable
+    implements RepositoryManager, Contextualizable 
 {
     private PlexusContainer container;
-
+    
     @Override
     public String getPathForLocalArtifact( ProjectBuildingRequest buildingRequest, Artifact artifact )
     {
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            RepositoryManager effectiveRepositoryManager = container.lookup( RepositoryManager.class, hint );
-
-            return effectiveRepositoryManager.getPathForLocalArtifact( buildingRequest, artifact );
+            return getMavenRepositoryManager( buildingRequest ).getPathForLocalArtifact( artifact );
         }
-        catch ( ComponentLookupException e )
+        catch ( ComponentLookupException | RepositoryManagerException e )
         {
             throw new IllegalStateException( e.getMessage(), e );
         }
@@ -67,13 +64,9 @@ class DefaultRepositoryManager
     {
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            RepositoryManager effectiveRepositoryManager = container.lookup( RepositoryManager.class, hint );
-
-            return effectiveRepositoryManager.getPathForLocalArtifact( buildingRequest, coor );
+            return getMavenRepositoryManager( buildingRequest ).getPathForLocalArtifact( coor );
         }
-        catch ( ComponentLookupException e )
+        catch ( ComponentLookupException | RepositoryManagerException e )
         {
             throw new IllegalStateException( e.getMessage(), e );
         }
@@ -91,51 +84,38 @@ class DefaultRepositoryManager
             pomCoordinate.setExtension( "pom" );
             return getPathForLocalArtifact( buildingRequest, pomCoordinate );
         }
-        
+
         try
         {
-            
-            String hint = isMaven31() ? "maven31" : "maven3";
-            
-            RepositoryManager effectiveRepositoryManager = container.lookup( RepositoryManager.class, hint );
-            
-            return effectiveRepositoryManager.getPathForLocalMetadata( buildingRequest, metadata );
+            return getMavenRepositoryManager( buildingRequest ).getPathForLocalMetadata( metadata );
         }
-        catch ( ComponentLookupException e )
+        catch ( ComponentLookupException | RepositoryManagerException e )
         {
             throw new IllegalStateException( e.getMessage(), e );
         }
     }
 
     @Override
-    public ProjectBuildingRequest setLocalRepositoryBasedir( ProjectBuildingRequest request, File basedir )
+    public ProjectBuildingRequest setLocalRepositoryBasedir( ProjectBuildingRequest buildingRequest, File basedir )
     {
         try
         {
-            String hint = isMaven31() ? "maven31" : isMaven302() ? "maven302" : "maven3";
-
-            RepositoryManager effectiveRepositoryManager = container.lookup( RepositoryManager.class, hint );
-
-            return effectiveRepositoryManager.setLocalRepositoryBasedir( request, basedir );
+            return getMavenRepositoryManager( buildingRequest ).setLocalRepositoryBasedir( buildingRequest, basedir );
         }
-        catch ( ComponentLookupException e )
+        catch ( ComponentLookupException | RepositoryManagerException e )
         {
             throw new IllegalStateException( e.getMessage(), e );
         }
     }
 
     @Override
-    public File getLocalRepositoryBasedir( ProjectBuildingRequest request )
+    public File getLocalRepositoryBasedir( ProjectBuildingRequest buildingRequest )
     {
         try
         {
-            String hint = isMaven31() ? "maven31" : isMaven302() ? "maven302" : "maven3";
-
-            RepositoryManager effectiveRepositoryManager = container.lookup( RepositoryManager.class, hint );
-
-            return effectiveRepositoryManager.getLocalRepositoryBasedir( request );
+            return getMavenRepositoryManager( buildingRequest ).getLocalRepositoryBasedir();
         }
-        catch ( ComponentLookupException e )
+        catch ( ComponentLookupException | RepositoryManagerException e )
         {
             throw new IllegalStateException( e.getMessage(), e );
         }
@@ -170,15 +150,41 @@ class DefaultRepositoryManager
             return false;
         }
     }
+    
+    private MavenRepositoryManager getMavenRepositoryManager( ProjectBuildingRequest buildingRequest )
+        throws ComponentLookupException, RepositoryManagerException
+    {
+        if ( isMaven31() )
+        {
+            org.eclipse.aether.RepositorySystem m31RepositorySystem =
+                            container.lookup( org.eclipse.aether.RepositorySystem.class );
 
-    /**
-     * Injects the Plexus content.
-     *
-     * @param context Plexus context to inject.
-     * @throws ContextException if the PlexusContainer could not be located.
-     */
-    public void contextualize( Context context )
-        throws ContextException
+            org.eclipse.aether.RepositorySystemSession session =
+                (org.eclipse.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+
+            return new Maven31RepositoryManager( m31RepositorySystem, session );
+        }
+        else
+        {
+            org.sonatype.aether.RepositorySystem m30RepositorySystem =
+                container.lookup( org.sonatype.aether.RepositorySystem.class );
+
+            org.sonatype.aether.RepositorySystemSession session =
+                (org.sonatype.aether.RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+            
+            if ( isMaven302() )
+            {
+                return new Maven302RepositoryManager( m30RepositorySystem, session );
+                
+            }
+            else
+            {
+                return new Maven30RepositoryManager( m30RepositorySystem, session );
+            }
+        }
+    }
+    
+    public void contextualize( Context context ) throws ContextException
     {
         container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
     }
diff --git a/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven302RepositoryManager.java b/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven302RepositoryManager.java
index 0bd1bab..29178f4 100644
--- a/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven302RepositoryManager.java
+++ b/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven302RepositoryManager.java
@@ -19,17 +19,20 @@ package org.apache.maven.shared.transfer.repository.internal;
  * under the License.
  */
 
-import org.apache.maven.shared.transfer.repository.RepositoryManager;
-import org.codehaus.plexus.component.annotations.Component;
+import org.sonatype.aether.RepositorySystem;
+import org.sonatype.aether.RepositorySystemSession;
 import org.sonatype.aether.repository.LocalRepository;
 
 /**
  * 
  */
-@Component( role = RepositoryManager.class, hint = "maven302" )
 class Maven302RepositoryManager
     extends Maven30RepositoryManager
 {
+    Maven302RepositoryManager( RepositorySystem repositorySystem, RepositorySystemSession session )
+    {
+        super( repositorySystem, session );
+    }
 
     /**
      * Aether-1.9+ (i.e. M3.0.2+) expects "default", not "enhanced" as repositoryType
diff --git a/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven30RepositoryManager.java b/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven30RepositoryManager.java
index 9fbaea9..936ea12 100644
--- a/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven30RepositoryManager.java
+++ b/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven30RepositoryManager.java
@@ -22,15 +22,11 @@ package org.apache.maven.shared.transfer.repository.internal;
 import java.io.File;
 
 import org.apache.maven.RepositoryUtils;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.metadata.ArtifactMetadata;
 import org.apache.maven.project.DefaultProjectBuildingRequest;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.transfer.artifact.ArtifactCoordinate;
-import org.apache.maven.shared.transfer.repository.RepositoryManager;
 import org.apache.maven.shared.transfer.repository.RepositoryManagerException;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.sonatype.aether.RepositorySystem;
 import org.sonatype.aether.RepositorySystemSession;
 import org.sonatype.aether.artifact.Artifact;
@@ -46,32 +42,29 @@ import org.sonatype.aether.util.metadata.DefaultMetadata;
 /**
  * 
  */
-@Component( role = RepositoryManager.class, hint = "maven3" )
 class Maven30RepositoryManager
-    implements RepositoryManager
+    implements MavenRepositoryManager
 {
+    private final RepositorySystem repositorySystem;
 
-    @Requirement
-    private RepositorySystem repositorySystem;
-
-    @Requirement
-    private ArtifactHandlerManager artifactHandlerManager;
+    private final RepositorySystemSession session;
+    
+    Maven30RepositoryManager( RepositorySystem repositorySystem, RepositorySystemSession session )
+    {
+        this.repositorySystem = repositorySystem;
+        this.session = session;
+    }
 
     @Override
-    public String getPathForLocalArtifact( ProjectBuildingRequest buildingRequest,
-                                           org.apache.maven.artifact.Artifact mavenArtifact )
+    public String getPathForLocalArtifact( org.apache.maven.artifact.Artifact mavenArtifact )
     {
         Artifact aetherArtifact;
 
-        RepositorySystemSession session;
-
         // LRM.getPathForLocalArtifact() won't throw an Exception, so translate reflection error to RuntimeException
         try
         {
             aetherArtifact = (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
                                                         org.apache.maven.artifact.Artifact.class, mavenArtifact );
-
-            session = (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
         }
         catch ( RepositoryManagerException e )
         {
@@ -82,29 +75,17 @@ class Maven30RepositoryManager
     }
 
     @Override
-    public String getPathForLocalArtifact( ProjectBuildingRequest buildingRequest, ArtifactCoordinate coordinate )
+    public String getPathForLocalArtifact( ArtifactCoordinate coordinate )
     {
-        Artifact aetherArtifact;
-
-        RepositorySystemSession session;
+        Artifact aetherArtifact = toArtifact( coordinate );
 
         // LRM.getPathForLocalArtifact() won't throw an Exception, so translate reflection error to RuntimeException
-        try
-        {
-            aetherArtifact = toArtifact( coordinate );
-
-            session = (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-        }
-        catch ( RepositoryManagerException e )
-        {
-            throw new RuntimeException( e.getMessage(), e );
-        }
 
         return session.getLocalRepositoryManager().getPathForLocalArtifact( aetherArtifact );
     }
 
     @Override
-    public String getPathForLocalMetadata( ProjectBuildingRequest buildingRequest, ArtifactMetadata metadata )
+    public String getPathForLocalMetadata( ArtifactMetadata metadata )
     {
         Metadata aetherMetadata =
             new DefaultMetadata( metadata.getGroupId(),
@@ -112,15 +93,6 @@ class Maven30RepositoryManager
                                  metadata.storedInArtifactVersionDirectory() ? metadata.getBaseVersion() : null,
                                  "maven-metadata.xml", Nature.RELEASE_OR_SNAPSHOT );
 
-        RepositorySystemSession session;
-        try
-        {
-            session = (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-        }
-        catch ( RepositoryManagerException e )
-        {
-            throw new RuntimeException( e.getMessage(), e );
-        }
         return session.getLocalRepositoryManager().getPathForLocalMetadata( aetherMetadata );
     }
     
@@ -166,17 +138,8 @@ class Maven30RepositoryManager
     }
 
     @Override
-    public File getLocalRepositoryBasedir( ProjectBuildingRequest buildingRequest )
+    public File getLocalRepositoryBasedir()
     {
-        RepositorySystemSession session;
-        try
-        {
-            session = (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-        }
-        catch ( RepositoryManagerException e )
-        {
-            throw new RuntimeException( e.getMessage(), e );
-        }
         return session.getLocalRepository().getBasedir();
     }
 
diff --git a/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven31RepositoryManager.java b/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven31RepositoryManager.java
index d7f4d6e..86ae613 100644
--- a/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven31RepositoryManager.java
+++ b/src/main/java/org/apache/maven/shared/transfer/repository/internal/Maven31RepositoryManager.java
@@ -22,15 +22,11 @@ package org.apache.maven.shared.transfer.repository.internal;
 import java.io.File;
 
 import org.apache.maven.RepositoryUtils;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.metadata.ArtifactMetadata;
 import org.apache.maven.project.DefaultProjectBuildingRequest;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.transfer.artifact.ArtifactCoordinate;
-import org.apache.maven.shared.transfer.repository.RepositoryManager;
 import org.apache.maven.shared.transfer.repository.RepositoryManagerException;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.eclipse.aether.DefaultRepositoryCache;
 import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.RepositorySystem;
@@ -46,30 +42,30 @@ import org.eclipse.aether.repository.LocalRepositoryManager;
 /**
  * 
  */
-@Component( role = RepositoryManager.class, hint = "maven31" )
 class Maven31RepositoryManager
-    implements RepositoryManager
+    implements MavenRepositoryManager
 {
-    @Requirement
-    private RepositorySystem repositorySystem;
+    private final RepositorySystem repositorySystem;
 
-    @Requirement
-    private ArtifactHandlerManager artifactHandlerManager;
+    private final RepositorySystemSession session;
+
+    Maven31RepositoryManager( RepositorySystem repositorySystem, 
+                              RepositorySystemSession session )
+    {
+        this.repositorySystem = repositorySystem;
+        this.session = session;
+    }
 
     @Override
-    public String getPathForLocalArtifact( ProjectBuildingRequest buildingRequest,
-                                           org.apache.maven.artifact.Artifact mavenArtifact )
+    public String getPathForLocalArtifact( org.apache.maven.artifact.Artifact mavenArtifact )
     {
         Artifact aetherArtifact;
-        RepositorySystemSession session;
 
         // LRM.getPathForLocalArtifact() won't throw an Exception, so translate reflection error to RuntimeException
         try
         {
             aetherArtifact = (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
                                                         org.apache.maven.artifact.Artifact.class, mavenArtifact );
-
-            session = (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
         }
         catch ( RepositoryManagerException e )
         {
@@ -80,29 +76,15 @@ class Maven31RepositoryManager
     }
 
     @Override
-    public String getPathForLocalArtifact( ProjectBuildingRequest buildingRequest, ArtifactCoordinate coordinate )
+    public String getPathForLocalArtifact( ArtifactCoordinate coordinate )
     {
-        Artifact aetherArtifact;
-
-        RepositorySystemSession session;
-
-        // LRM.getPathForLocalArtifact() won't throw an Exception, so translate reflection error to RuntimeException
-        try
-        {
-            aetherArtifact = toArtifact( coordinate );
-
-            session = (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-        }
-        catch ( RepositoryManagerException e )
-        {
-            throw new RuntimeException( e.getMessage(), e );
-        }
+        Artifact aetherArtifact = toArtifact( coordinate );
 
         return session.getLocalRepositoryManager().getPathForLocalArtifact( aetherArtifact );
     }
     
     @Override
-    public String getPathForLocalMetadata( ProjectBuildingRequest buildingRequest, ArtifactMetadata metadata )
+    public String getPathForLocalMetadata( ArtifactMetadata metadata )
     {
         Metadata aetherMetadata =
             new DefaultMetadata( metadata.getGroupId(),
@@ -110,15 +92,6 @@ class Maven31RepositoryManager
                                  metadata.storedInArtifactVersionDirectory() ? metadata.getBaseVersion() : null,
                                  "maven-metadata.xml", Nature.RELEASE_OR_SNAPSHOT );
 
-        RepositorySystemSession session;
-        try
-        {
-            session = (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-        }
-        catch ( RepositoryManagerException e )
-        {
-            throw new RuntimeException( e.getMessage(), e );
-        }
         return session.getLocalRepositoryManager().getPathForLocalMetadata( aetherMetadata );
     }
 
@@ -164,18 +137,8 @@ class Maven31RepositoryManager
     }
 
     @Override
-    public File getLocalRepositoryBasedir( ProjectBuildingRequest buildingRequest )
+    public File getLocalRepositoryBasedir()
     {
-        RepositorySystemSession session;
-        try
-        {
-            session = (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-        }
-        catch ( RepositoryManagerException e )
-        {
-            throw new RuntimeException( e.getMessage(), e );
-        }
-
         return session.getLocalRepository().getBasedir();
     }
 
diff --git a/src/main/java/org/apache/maven/shared/transfer/repository/internal/MavenRepositoryManager.java b/src/main/java/org/apache/maven/shared/transfer/repository/internal/MavenRepositoryManager.java
new file mode 100644
index 0000000..e494b15
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/transfer/repository/internal/MavenRepositoryManager.java
@@ -0,0 +1,67 @@
+package org.apache.maven.shared.transfer.repository.internal;
+
+/*
+ * 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.File;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.metadata.ArtifactMetadata;
+import org.apache.maven.project.ProjectBuildingRequest;
+import org.apache.maven.shared.transfer.artifact.ArtifactCoordinate;
+
+/**
+ * 
+ * @author Robert Scholte
+ */
+interface MavenRepositoryManager
+{
+    /**
+     * @param artifact {@link Artifact}
+     * @return the path of the local artifact.
+     */
+    String getPathForLocalArtifact( Artifact artifact );
+
+    /**
+     * @param coordinate {@link ArtifactCoordinate}
+     * @return the path for the local artifact.
+     */
+    String getPathForLocalArtifact( ArtifactCoordinate coordinate );
+    
+    /**
+     * @param metadata {@link ArtifactMetadata}
+     * @return the path of the local metadata.
+     */
+    String getPathForLocalMetadata( ArtifactMetadata metadata );
+
+    /**
+     * Create a new {@code ProjectBuildingRequest} with an adjusted repository session.
+     * 
+     * @param basedir the base directory of the local repository
+     * @return a new project building request
+     */
+    ProjectBuildingRequest setLocalRepositoryBasedir( ProjectBuildingRequest request, File basedir );
+
+    /**
+     * Get the localRepositryBasedir as specified in the repository session of the request
+     * 
+     * @return the local repository base directory
+     */
+    File getLocalRepositoryBasedir();
+}
diff --git a/src/test/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven30ArtifactInstallerTest.java b/src/test/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven30ArtifactInstallerTest.java
index b5693f1..19d1939 100644
--- a/src/test/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven30ArtifactInstallerTest.java
+++ b/src/test/java/org/apache/maven/shared/transfer/artifact/install/internal/Maven30ArtifactInstallerTest.java
@@ -28,22 +28,22 @@ import org.apache.maven.artifact.DefaultArtifact;
 import org.apache.maven.artifact.handler.DefaultArtifactHandler;
 import org.apache.maven.project.DefaultProjectBuildingRequest;
 import org.apache.maven.repository.internal.MavenRepositorySystemSession;
-import org.apache.maven.shared.transfer.artifact.install.ArtifactInstaller;
 import org.apache.maven.shared.transfer.artifact.install.internal.Maven30ArtifactInstaller;
 import org.codehaus.plexus.PlexusTestCase;
+import org.sonatype.aether.RepositorySystem;
 import org.sonatype.aether.impl.internal.SimpleLocalRepositoryManager;
 
 public class Maven30ArtifactInstallerTest extends PlexusTestCase
 {
     private final File localRepo = new File( "target/tests/local-repo" );
     
-    private Maven30ArtifactInstaller installer;
+    private RepositorySystem repositorySystem;
 
     @Override
     public void setUp() throws Exception
     {
         super.setUp();
-        installer = (Maven30ArtifactInstaller) super.lookup( ArtifactInstaller.class, "maven3" );
+        repositorySystem = lookup( RepositorySystem.class );
     }
 
     public void testInstall() throws Exception
@@ -67,7 +67,8 @@ public class Maven30ArtifactInstallerTest extends PlexusTestCase
         
         Collection<Artifact> mavenArtifacts = Arrays.<Artifact>asList( artifact, artifactWithClassifier );
         
-        installer.install( buildingRequest, mavenArtifacts );
+        MavenArtifactInstaller installer = new Maven30ArtifactInstaller( repositorySystem, repositorySession );
+        installer.install( mavenArtifacts );
         
         assertTrue( new File( localRepo, "GROUPID/ARTIFACTID/VERSION/ARTIFACTID-VERSION.EXTENSION" ).exists() );
         assertTrue( new File( localRepo, "GROUPID/ARTIFACTID/VERSION/ARTIFACTID-VERSION-CLASSIFIER.EXTENSION" ).exists() );
diff --git a/src/test/java/org/apache/maven/shared/transfer/repository/internal/Maven30RepositoryManagerTest.java b/src/test/java/org/apache/maven/shared/transfer/repository/internal/Maven30RepositoryManagerTest.java
index faa9e1a..b426316 100644
--- a/src/test/java/org/apache/maven/shared/transfer/repository/internal/Maven30RepositoryManagerTest.java
+++ b/src/test/java/org/apache/maven/shared/transfer/repository/internal/Maven30RepositoryManagerTest.java
@@ -24,9 +24,9 @@ import java.io.File;
 import org.apache.maven.project.DefaultProjectBuildingRequest;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.repository.internal.MavenRepositorySystemSession;
-import org.apache.maven.shared.transfer.repository.RepositoryManager;
 import org.apache.maven.shared.transfer.repository.internal.Maven30RepositoryManager;
 import org.codehaus.plexus.PlexusTestCase;
+import org.sonatype.aether.RepositorySystem;
 import org.sonatype.aether.impl.internal.EnhancedLocalRepositoryManager;
 import org.sonatype.aether.impl.internal.SimpleLocalRepositoryManager;
 
@@ -35,13 +35,13 @@ public class Maven30RepositoryManagerTest extends PlexusTestCase
 
     private final File localRepo = new File( "target/tests/local-repo" );
     
-    private Maven30RepositoryManager repositoryManager;
+    private RepositorySystem repositorySystem;
 
     @Override
     public void setUp() throws Exception
     {
         super.setUp();
-        repositoryManager = (Maven30RepositoryManager) super.lookup( RepositoryManager.class, "maven3" );
+        repositorySystem = lookup( RepositorySystem.class );
     }
     
     public void testSetLocalRepositoryBasedirSimple() throws Exception
@@ -53,6 +53,9 @@ public class Maven30RepositoryManagerTest extends PlexusTestCase
 
         File basedir = new File( "NEW/LOCAL/REPO" );
         
+        Maven30RepositoryManager repositoryManager =
+            new Maven30RepositoryManager( repositorySystem, buildingRequest.getRepositorySession() );
+        
         ProjectBuildingRequest newBuildingRequest = repositoryManager.setLocalRepositoryBasedir( buildingRequest, basedir );
         
         assertEquals( basedir.getAbsoluteFile(), newBuildingRequest.getRepositorySession().getLocalRepository().getBasedir() );
@@ -68,6 +71,9 @@ public class Maven30RepositoryManagerTest extends PlexusTestCase
 
         File basedir = new File( "NEW/LOCAL/REPO" );
         
+        Maven30RepositoryManager repositoryManager =
+            new Maven30RepositoryManager( repositorySystem, buildingRequest.getRepositorySession() );
+        
         ProjectBuildingRequest newBuildingRequest = repositoryManager.setLocalRepositoryBasedir( buildingRequest, basedir );
         
         assertEquals( basedir.getAbsoluteFile(), newBuildingRequest.getRepositorySession().getLocalRepository().getBasedir() );