Remove AbstractRunGoalsPhase#setMavenExecutor; only used for tests and won't work after M3.0 migration because componentsMap will become immutable.
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRunGoalsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRunGoalsPhase.java
index f5b2ee6..f424668 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRunGoalsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRunGoalsPhase.java
@@ -20,7 +20,6 @@
  */
 
 import java.io.File;
-import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.maven.shared.release.ReleaseExecutionException;
@@ -96,24 +95,6 @@
         return result;
     }
 
-    /**
-     * @deprecated Use {@link AbstractRunGoalsPhase#setMavenExecutor(String, MavenExecutor)} instead.
-     */
-    public void setMavenExecutor( MavenExecutor mavenExecutor )
-    {
-        setMavenExecutor( ReleaseEnvironment.DEFAULT_MAVEN_EXECUTOR_ID, mavenExecutor );
-    }
-
-    public void setMavenExecutor( String id, MavenExecutor executor )
-    {
-        if ( mavenExecutors == null )
-        {
-            mavenExecutors = new HashMap<String, MavenExecutor>();
-        }
-
-        mavenExecutors.put( id, executor );
-    }
-
     protected abstract String getGoals( ReleaseDescriptor releaseDescriptor );
 
     /**
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/DefaultReleaseManagerTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/DefaultReleaseManagerTest.java
index b746f07..8a5e8bc 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/DefaultReleaseManagerTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/DefaultReleaseManagerTest.java
@@ -22,7 +22,6 @@
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
-import org.apache.maven.scm.ScmFile;
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmTag;
 import org.apache.maven.scm.command.checkout.CheckOutScmResult;
@@ -39,11 +38,8 @@
 import org.apache.maven.shared.release.config.ReleaseDescriptorStoreStub;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
-import org.apache.maven.shared.release.exec.MavenExecutor;
-import org.apache.maven.shared.release.phase.IsScmFileSetEquals;
 import org.apache.maven.shared.release.phase.ReleasePhase;
 import org.apache.maven.shared.release.phase.ReleasePhaseStub;
-import org.apache.maven.shared.release.phase.RunPerformGoalsPhase;
 import org.apache.maven.shared.release.scm.DefaultScmRepositoryConfigurator;
 import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
@@ -412,49 +408,7 @@
         verifyNoMoreInteractions( configStoreMock );
     }
 
-    public void testReleasePerform()
-        throws Exception
-    {
-        // prepare
-        DefaultReleaseManager releaseManager = (DefaultReleaseManager) lookup( ReleaseManager.ROLE, "test" );
-
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setPerformGoals( "goal1 goal2" );
-        File checkoutDirectory = getTestFile( "target/checkout-directory" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
-
-        MavenExecutor mock = mock( MavenExecutor.class );
-        RunPerformGoalsPhase phase = (RunPerformGoalsPhase) lookup( ReleasePhase.ROLE, "run-perform-goals" );
-        phase.setMavenExecutor( mock );
-
-        ScmProvider scmProviderMock = mock( ScmProvider.class );
-        when( scmProviderMock.checkOut( isA( ScmRepository.class ), 
-                                        argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ),
-                                        isA( ScmTag.class ),
-                                        isA( CommandParameters.class )) )
-            .thenReturn( new CheckOutScmResult( "...", Collections.<ScmFile>emptyList() ) );
-
-        ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
-        stub.setScmProvider( scmProviderMock );
-
-        // execute
-        releaseManager.perform( releaseDescriptor, new DefaultReleaseEnvironment(), createReactorProjects() );
-
-        // verify
-        verify( mock ).executeGoals( eq( checkoutDirectory ), 
-                                     eq( "goal1 goal2" ), 
-                                     isA( ReleaseEnvironment.class ), 
-                                     eq( true ), 
-                                     eq( "-DperformRelease=true -f pom.xml" ),
-                                     isNull( String.class ), 
-                                     isA( ReleaseResult.class ) );
-        verify( scmProviderMock ).checkOut( isA( ScmRepository.class ), 
-                                            argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ),
-                                            isA( ScmTag.class ),
-                                            isA( CommandParameters.class ));
-        verifyNoMoreInteractions( mock, scmProviderMock );
-    }
+    
 
     private static List<MavenProject> createReactorProjects()
     {
@@ -478,192 +432,6 @@
         assertTrue( result.getOutput().length() > 0 );
     }  
 
-    public void testReleasePerformNoReleaseProfile()
-        throws Exception
-    {
-        // prepare
-        DefaultReleaseManager releaseManager = (DefaultReleaseManager) lookup( ReleaseManager.ROLE, "test" );
-
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setPerformGoals( "goal1 goal2" );
-        File checkoutDirectory = getTestFile( "target/checkout-directory" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
-
-        MavenExecutor mock = mock( MavenExecutor.class );
-        RunPerformGoalsPhase phase = (RunPerformGoalsPhase) lookup( ReleasePhase.ROLE, "run-perform-goals" );
-        phase.setMavenExecutor( mock );
-
-        ScmProvider scmProviderMock = mock( ScmProvider.class );
-        when( scmProviderMock.checkOut( isA( ScmRepository.class ), 
-                                        argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ), 
-                                        isA( ScmTag.class ),
-                                        isA( CommandParameters.class )) )
-            .thenReturn( new CheckOutScmResult( "...", Collections.<ScmFile>emptyList() ) );
-
-        ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
-        stub.setScmProvider( scmProviderMock );
-
-        releaseDescriptor.setUseReleaseProfile( false );
-
-        // execute
-        releaseManager.perform( releaseDescriptor, new DefaultReleaseEnvironment(), createReactorProjects() );
-
-        // verify
-        verify( mock ).executeGoals( eq( checkoutDirectory ), 
-                                     eq( "goal1 goal2" ), 
-                                     isA( ReleaseEnvironment.class ), 
-                                     eq( true ),
-                                     eq( "-f pom.xml" ),
-                                     isNull( String.class ), 
-                                     isA( ReleaseResult.class ) );
-        verify( scmProviderMock ).checkOut( isA( ScmRepository.class ), 
-                                            argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ), 
-                                            isA( ScmTag.class ),
-                                            isA( CommandParameters.class ));
-        verifyNoMoreInteractions( mock, scmProviderMock );
-    }
-
-    public void testReleasePerformWithArguments()
-        throws Exception
-    {
-        // prepare
-        DefaultReleaseManager releaseManager = (DefaultReleaseManager) lookup( ReleaseManager.ROLE, "test" );
-
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setAdditionalArguments( "-Dmaven.test.skip=true" );
-        releaseDescriptor.setPerformGoals( "goal1 goal2" );
-        File checkoutDirectory = getTestFile( "target/checkout-directory" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
-
-        MavenExecutor mock = mock( MavenExecutor.class );
-        RunPerformGoalsPhase phase = (RunPerformGoalsPhase) lookup( ReleasePhase.ROLE, "run-perform-goals" );
-        phase.setMavenExecutor( mock );
-
-        ScmProvider scmProviderMock = mock( ScmProvider.class );
-        when( scmProviderMock.checkOut( isA( ScmRepository.class ),
-                                        argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ),
-                                        isA( ScmTag.class ),
-                                        isA( CommandParameters.class )) )
-            .thenReturn( new CheckOutScmResult( "...", Collections.<ScmFile>emptyList() ) );
-
-        ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
-        stub.setScmProvider( scmProviderMock );
-
-        // execute
-        releaseManager.perform( releaseDescriptor, new DefaultReleaseEnvironment(), createReactorProjects() );
-
-        // verify
-        verify( mock ).executeGoals( eq( checkoutDirectory ),
-                                     eq( "goal1 goal2" ),
-                                     isA( ReleaseEnvironment.class),
-                                     eq( true),
-                                     eq( "-Dmaven.test.skip=true -DperformRelease=true -f pom.xml" ),
-                                     isNull( String.class ),
-                                     isA( ReleaseResult.class ) );
-        verify( scmProviderMock ).checkOut( isA( ScmRepository.class ),
-                                            argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ),
-                                            isA( ScmTag.class ),
-                                            isA( CommandParameters.class ));
-        verifyNoMoreInteractions( mock, scmProviderMock );
-    }
-
-    public void testReleasePerformWithArgumentsNoReleaseProfile()
-        throws Exception
-    {
-        // prepare
-        DefaultReleaseManager releaseManager = (DefaultReleaseManager) lookup( ReleaseManager.ROLE, "test" );
-
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setAdditionalArguments( "-Dmaven.test.skip=true" );
-        releaseDescriptor.setPerformGoals( "goal1 goal2" );
-        File checkoutDirectory = getTestFile( "target/checkout-directory" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
-
-        MavenExecutor mock = mock( MavenExecutor.class );
-        RunPerformGoalsPhase phase = (RunPerformGoalsPhase) lookup( ReleasePhase.ROLE, "run-perform-goals" );
-        phase.setMavenExecutor( mock );
-
-        ScmProvider scmProviderMock = mock( ScmProvider.class );
-        when( scmProviderMock.checkOut( isA( ScmRepository.class ),
-                                        argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ),
-                                        isA( ScmTag.class ),
-                                        isA( CommandParameters.class )))
-                                .thenReturn( new CheckOutScmResult( "...", Collections.<ScmFile>emptyList() ) );
-
-        ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
-        stub.setScmProvider( scmProviderMock );
-
-        releaseDescriptor.setUseReleaseProfile( false );
-
-        // execute
-        releaseManager.perform( releaseDescriptor, new DefaultReleaseEnvironment(), createReactorProjects() );
-
-        // verify
-        verify( mock ).executeGoals( eq( checkoutDirectory ),
-                                     eq( "goal1 goal2" ),
-                                     isA( ReleaseEnvironment.class ),
-                                     eq( true ),
-                                     eq( "-Dmaven.test.skip=true -f pom.xml" ),
-                                     isNull( String.class ),
-                                     isA( ReleaseResult.class ) );
-        verify( scmProviderMock ).checkOut( isA( ScmRepository.class ),
-                                            argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ),
-                                            isA( ScmTag.class ),
-                                            isA( CommandParameters.class ));
-        verifyNoMoreInteractions( mock, scmProviderMock );
-    }
-
-    public void testReleasePerformWithReleasePropertiesCompleted()
-        throws Exception
-    {
-        // prepare
-        DefaultReleaseManager releaseManager = (DefaultReleaseManager) lookup( ReleaseManager.ROLE, "test" );
-
-        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
-        releaseDescriptor.setScmSourceUrl( "scm-url" );
-        releaseDescriptor.setPerformGoals( "goal1 goal2" );
-        File checkoutDirectory = getTestFile( "target/checkout-directory" );
-        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
-
-        MavenExecutor mock = mock( MavenExecutor.class );
-        RunPerformGoalsPhase phase = (RunPerformGoalsPhase) lookup( ReleasePhase.ROLE, "run-perform-goals" );
-        phase.setMavenExecutor( mock );
-
-        ScmProvider scmProviderMock = mock( ScmProvider.class );
-        when( scmProviderMock.checkOut( isA( ScmRepository.class ),
-                                        argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ),
-                                        isA( ScmTag.class ),
-                                        isA( CommandParameters.class )) )
-            .thenReturn( new CheckOutScmResult( "...", Collections.<ScmFile>emptyList() ) );
-
-        ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
-        stub.setScmProvider( scmProviderMock );
-
-        ReleaseDescriptorStoreStub configStore = new ReleaseDescriptorStoreStub();
-        configStore.getReleaseConfiguration().setCompletedPhase( "end-release" );
-        releaseManager.setConfigStore( configStore );
-
-        // execute
-        releaseManager.perform( releaseDescriptor, new DefaultReleaseEnvironment(), createReactorProjects() );
-
-        // verify
-        verify( mock ).executeGoals( eq( checkoutDirectory ),
-                                     eq( "goal1 goal2" ),
-                                     isA( ReleaseEnvironment.class ),
-                                     eq( true ), 
-                                     eq( "-DperformRelease=true -f pom.xml" ), 
-                                     isNull( String.class ),
-                                     isA( ReleaseResult.class ) );
-        verify( scmProviderMock ).checkOut( isA( ScmRepository.class ),
-                                            argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ),
-                                            isA( ScmTag.class ),
-                                            isA( CommandParameters.class ));
-        verifyNoMoreInteractions( mock, scmProviderMock );
-    }
-
     public void testReleaseConfigurationStoreReadFailureOnPerform()
         throws Exception
     {
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractReleaseTestCase.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractReleaseTestCase.java
index 1cd260c..099b3bd 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractReleaseTestCase.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractReleaseTestCase.java
@@ -21,11 +21,9 @@
  */
 
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.fail;
 
 import java.io.File;
 import java.io.IOException;
-import java.io.Reader;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -64,11 +62,7 @@
 import org.codehaus.plexus.context.DefaultContext;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
 import org.codehaus.plexus.util.FileUtils;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.ReaderFactory;
 import org.codehaus.plexus.util.StringUtils;
-import org.w3c.dom.Node;
-import org.xml.sax.SAXException;
 import org.xmlunit.builder.DiffBuilder;
 import org.xmlunit.diff.Comparison;
 import org.xmlunit.diff.ComparisonResult;
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunCompleteGoalsPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunCompleteGoalsPhaseTest.java
index 7d31d4b..83e5a57 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunCompleteGoalsPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunCompleteGoalsPhaseTest.java
@@ -33,7 +33,6 @@
 import java.util.List;
 
 import org.apache.maven.project.MavenProject;
-import org.apache.maven.settings.Settings;
 import org.apache.maven.shared.release.PlexusJUnit4TestCase;
 import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseFailureException;
@@ -43,6 +42,7 @@
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
 import org.apache.maven.shared.release.exec.MavenExecutor;
 import org.apache.maven.shared.release.exec.MavenExecutorException;
+import org.apache.maven.shared.release.stubs.MavenExecutorWrapper;
 import org.junit.Test;
 
 /**
@@ -55,12 +55,21 @@
 {
     private RunCompleteGoalsPhase phase;
 
+    private MavenExecutorWrapper mavenExecutorWrapper;
+    
+    private ReleaseEnvironment releaseEnvironment;
+
     public void setUp()
         throws Exception
     {
         super.setUp();
 
         phase = (RunCompleteGoalsPhase) lookup( ReleasePhase.ROLE, "run-completion-goals" );
+
+        mavenExecutorWrapper = (MavenExecutorWrapper) lookup( "org.apache.maven.shared.release.exec.MavenExecutor", "wrapper" );
+
+        releaseEnvironment = new DefaultReleaseEnvironment();
+        releaseEnvironment.setMavenExecutorId( "wrapper" );
     }
 
     @Test
@@ -76,10 +85,10 @@
 
         MavenExecutor mock = mock( MavenExecutor.class );
 
-        phase.setMavenExecutor( ReleaseEnvironment.DEFAULT_MAVEN_EXECUTOR_ID, mock );
+        mavenExecutorWrapper.setMavenExecutor( mock );
 
         // execute
-        phase.execute( config, (Settings) null, (List<MavenProject>) null );
+        phase.execute( config, releaseEnvironment, (List<MavenProject>) null );
 
         // verify
         verify( mock ).executeGoals( eq( testFile ), eq( "clean integration-test" ), isA( ReleaseEnvironment.class ),
@@ -101,10 +110,10 @@
 
         MavenExecutor mock = mock( MavenExecutor.class );
 
-        phase.setMavenExecutor( ReleaseEnvironment.DEFAULT_MAVEN_EXECUTOR_ID, mock );
+        mavenExecutorWrapper.setMavenExecutor( mock );
 
         // execute
-        phase.simulate( config, new DefaultReleaseEnvironment(), null );
+        phase.simulate( config, releaseEnvironment, null );
 
         // verify
         verify( mock ).executeGoals( eq( testFile ), eq( "clean integration-test" ), isA( ReleaseEnvironment.class ),
@@ -134,12 +143,12 @@
                                                                                             isNull( String.class ),
                                                                                             isA( ReleaseResult.class ) );
 
-        phase.setMavenExecutor( ReleaseEnvironment.DEFAULT_MAVEN_EXECUTOR_ID, mock );
+        mavenExecutorWrapper.setMavenExecutor( mock );
 
         // execute
         try
         {
-            phase.execute( config, (Settings) null, (List<MavenProject>) null );
+            phase.execute( config, releaseEnvironment, (List<MavenProject>) null );
 
             fail( "Should have thrown an exception" );
         }
@@ -176,12 +185,12 @@
                                                                                             isNull( String.class ),
                                                                                             isA( ReleaseResult.class ) );
 
-        phase.setMavenExecutor( ReleaseEnvironment.DEFAULT_MAVEN_EXECUTOR_ID, mock );
+        mavenExecutorWrapper.setMavenExecutor( mock );
 
         // execute
         try
         {
-            phase.simulate( config, new DefaultReleaseEnvironment(), null );
+            phase.simulate( config, releaseEnvironment, null );
 
             fail( "Should have thrown an exception" );
         }
@@ -210,10 +219,10 @@
 
         MavenExecutor mock = mock( MavenExecutor.class );
 
-        phase.setMavenExecutor( ReleaseEnvironment.DEFAULT_MAVEN_EXECUTOR_ID, mock );
+        mavenExecutorWrapper.setMavenExecutor( mock );
 
         // execute
-        phase.execute( config, (Settings) null, (List<MavenProject>) null );
+        phase.execute( config, releaseEnvironment, (List<MavenProject>) null );
 
         // verify
         // never invoke mock
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunPerformGoalsPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunPerformGoalsPhaseTest.java
index ec30507..d8ff801 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunPerformGoalsPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunPerformGoalsPhaseTest.java
@@ -21,6 +21,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
+import static org.mockito.Matchers.argThat;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Matchers.isA;
 import static org.mockito.Matchers.isNull;
@@ -28,19 +29,31 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
 
 import java.io.File;
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.maven.project.MavenProject;
-import org.apache.maven.settings.Settings;
+import org.apache.maven.scm.CommandParameters;
+import org.apache.maven.scm.ScmFile;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmTag;
+import org.apache.maven.scm.command.checkout.CheckOutScmResult;
+import org.apache.maven.scm.manager.ScmManager;
+import org.apache.maven.scm.manager.ScmManagerStub;
+import org.apache.maven.scm.provider.ScmProvider;
+import org.apache.maven.scm.repository.ScmRepository;
 import org.apache.maven.shared.release.PlexusJUnit4TestCase;
 import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseResult;
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
 import org.apache.maven.shared.release.exec.MavenExecutor;
 import org.apache.maven.shared.release.exec.MavenExecutorException;
+import org.apache.maven.shared.release.stubs.MavenExecutorWrapper;
 import org.junit.Test;
 
 /**
@@ -51,6 +64,10 @@
     extends PlexusJUnit4TestCase
 {
     private RunPerformGoalsPhase phase;
+    
+    private MavenExecutorWrapper mavenExecutorWrapper;
+    
+    private ReleaseEnvironment releaseEnvironment;
 
     public void setUp()
         throws Exception
@@ -58,6 +75,11 @@
         super.setUp();
 
         phase = (RunPerformGoalsPhase) lookup( ReleasePhase.ROLE, "run-perform-goals" );
+        
+        mavenExecutorWrapper = (MavenExecutorWrapper) lookup( "org.apache.maven.shared.release.exec.MavenExecutor", "wrapper" );
+        
+        releaseEnvironment = new DefaultReleaseEnvironment();
+        releaseEnvironment.setMavenExecutorId( "wrapper" );
     }
 
     @Test
@@ -72,6 +94,8 @@
         config.setCheckoutDirectory( testFile.getAbsolutePath() );
 
         MavenExecutor mock = mock( MavenExecutor.class );
+        
+        mavenExecutorWrapper.setMavenExecutor( mock );
 
         doThrow( new MavenExecutorException( "...", new Exception() ) ).when( mock ).executeGoals( eq( testFile ),
                                                                                                    eq( "goal1 goal2" ),
@@ -81,12 +105,12 @@
                                                                                                    isNull( String.class ),
                                                                                                    isA( ReleaseResult.class ) );
 
-        phase.setMavenExecutor(ReleaseEnvironment.DEFAULT_MAVEN_EXECUTOR_ID, mock );
+        mavenExecutorWrapper.setMavenExecutor( mock );
 
         // execute
         try
         {
-            phase.execute( config, (Settings) null, (List<MavenProject>) null );
+            phase.execute( config, releaseEnvironment, (List<MavenProject>) null );
 
             fail( "Should have thrown an exception" );
         }
@@ -118,9 +142,9 @@
         
         MavenExecutor mock = mock( MavenExecutor.class );
         
-        phase.setMavenExecutor(ReleaseEnvironment.DEFAULT_MAVEN_EXECUTOR_ID, mock );
+        mavenExecutorWrapper.setMavenExecutor( mock );
         
-        phase.execute( config, (Settings) null, (List<MavenProject>) null );
+        phase.execute( config, releaseEnvironment, (List<MavenProject>) null );
         
         verify( mock ).executeGoals( eq( testFile ),
                                      eq( "goal1 goal2" ),
@@ -132,4 +156,224 @@
         
         verifyNoMoreInteractions( mock );
     }
+    
+    public void testReleasePerformWithArgumentsNoReleaseProfile()
+                    throws Exception
+    {
+        // prepare
+        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        releaseDescriptor.setScmSourceUrl( "scm-url" );
+        releaseDescriptor.setAdditionalArguments( "-Dmaven.test.skip=true" );
+        releaseDescriptor.setPerformGoals( "goal1 goal2" );
+        File checkoutDirectory = getTestFile( "target/checkout-directory" );
+        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+
+        MavenExecutor mock = mock( MavenExecutor.class );
+        mavenExecutorWrapper.setMavenExecutor( mock );
+
+        ScmProvider scmProviderMock = mock( ScmProvider.class );
+        when( scmProviderMock.checkOut( isA( ScmRepository.class ),
+                                        argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ),
+                                        isA( ScmTag.class ),
+                                        isA( CommandParameters.class )))
+                                .thenReturn( new CheckOutScmResult( "...", Collections.<ScmFile>emptyList() ) );
+
+        ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
+        stub.setScmProvider( scmProviderMock );
+
+        releaseDescriptor.setUseReleaseProfile( false );
+
+        // execute
+        phase.execute( releaseDescriptor, releaseEnvironment, createReactorProjects() );
+
+        // verify
+        verify( mock ).executeGoals( eq( checkoutDirectory ),
+                                     eq( "goal1 goal2" ),
+                                     isA( ReleaseEnvironment.class ),
+                                     eq( true ),
+                                     eq( "-Dmaven.test.skip=true -f pom.xml" ),
+                                     isNull( String.class ),
+                                     isA( ReleaseResult.class ) );
+        verify( scmProviderMock ).checkOut( isA( ScmRepository.class ),
+                                            argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ),
+                                            isA( ScmTag.class ),
+                                            isA( CommandParameters.class ));
+        verifyNoMoreInteractions( mock, scmProviderMock );
+    }
+    
+    public void testReleasePerform()
+                    throws Exception
+    {
+        // prepare
+        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        releaseDescriptor.setScmSourceUrl( "scm-url" );
+        releaseDescriptor.setPerformGoals( "goal1 goal2" );
+        File checkoutDirectory = getTestFile( "target/checkout-directory" );
+        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+
+        MavenExecutor mock = mock( MavenExecutor.class );
+        mavenExecutorWrapper.setMavenExecutor( mock );
+
+        ScmProvider scmProviderMock = mock( ScmProvider.class );
+        when( scmProviderMock.checkOut( isA( ScmRepository.class ), 
+                                        argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ),
+                                        isA( ScmTag.class ),
+                                        isA( CommandParameters.class )) )
+            .thenReturn( new CheckOutScmResult( "...", Collections.<ScmFile>emptyList() ) );
+
+        ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
+        stub.setScmProvider( scmProviderMock );
+
+        // execute
+        phase.execute( releaseDescriptor, releaseEnvironment, createReactorProjects() );
+
+        // verify
+        verify( mock ).executeGoals( eq( checkoutDirectory ), 
+                                     eq( "goal1 goal2" ), 
+                                     isA( ReleaseEnvironment.class ), 
+                                     eq( true ), 
+                                     eq( "-DperformRelease=true -f pom.xml" ),
+                                     isNull( String.class ), 
+                                     isA( ReleaseResult.class ) );
+        verify( scmProviderMock ).checkOut( isA( ScmRepository.class ), 
+                                            argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ),
+                                            isA( ScmTag.class ),
+                                            isA( CommandParameters.class ));
+        verifyNoMoreInteractions( mock, scmProviderMock );
+    }
+    
+    public void testReleasePerformNoReleaseProfile()
+                    throws Exception
+    {
+        // prepare
+        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        releaseDescriptor.setScmSourceUrl( "scm-url" );
+        releaseDescriptor.setPerformGoals( "goal1 goal2" );
+        File checkoutDirectory = getTestFile( "target/checkout-directory" );
+        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+
+        MavenExecutor mock = mock( MavenExecutor.class );
+        mavenExecutorWrapper.setMavenExecutor( mock );
+
+        ScmProvider scmProviderMock = mock( ScmProvider.class );
+        when( scmProviderMock.checkOut( isA( ScmRepository.class ), 
+                                        argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ), 
+                                        isA( ScmTag.class ),
+                                        isA( CommandParameters.class )) )
+            .thenReturn( new CheckOutScmResult( "...", Collections.<ScmFile>emptyList() ) );
+
+        ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
+        stub.setScmProvider( scmProviderMock );
+
+        releaseDescriptor.setUseReleaseProfile( false );
+
+        // execute
+        phase.execute( releaseDescriptor, releaseEnvironment, createReactorProjects() );
+
+        // verify
+        verify( mock ).executeGoals( eq( checkoutDirectory ), 
+                                     eq( "goal1 goal2" ), 
+                                     isA( ReleaseEnvironment.class ), 
+                                     eq( true ),
+                                     eq( "-f pom.xml" ),
+                                     isNull( String.class ), 
+                                     isA( ReleaseResult.class ) );
+        verify( scmProviderMock ).checkOut( isA( ScmRepository.class ), 
+                                            argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ), 
+                                            isA( ScmTag.class ),
+                                            isA( CommandParameters.class ));
+        verifyNoMoreInteractions( mock, scmProviderMock );
+    }
+    
+    public void testReleasePerformWithArguments()
+                    throws Exception
+    {
+        // prepare
+        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        releaseDescriptor.setScmSourceUrl( "scm-url" );
+        releaseDescriptor.setAdditionalArguments( "-Dmaven.test.skip=true" );
+        releaseDescriptor.setPerformGoals( "goal1 goal2" );
+        File checkoutDirectory = getTestFile( "target/checkout-directory" );
+        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+
+        MavenExecutor mock = mock( MavenExecutor.class );
+        mavenExecutorWrapper.setMavenExecutor( mock );
+
+        ScmProvider scmProviderMock = mock( ScmProvider.class );
+        when( scmProviderMock.checkOut( isA( ScmRepository.class ),
+                                        argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ),
+                                        isA( ScmTag.class ),
+                                        isA( CommandParameters.class )) )
+            .thenReturn( new CheckOutScmResult( "...", Collections.<ScmFile>emptyList() ) );
+
+        ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
+        stub.setScmProvider( scmProviderMock );
+
+        // execute
+        phase.execute( releaseDescriptor, releaseEnvironment, createReactorProjects() );
+
+        // verify
+        verify( mock ).executeGoals( eq( checkoutDirectory ),
+                                     eq( "goal1 goal2" ),
+                                     isA( ReleaseEnvironment.class),
+                                     eq( true),
+                                     eq( "-Dmaven.test.skip=true -DperformRelease=true -f pom.xml" ),
+                                     isNull( String.class ),
+                                     isA( ReleaseResult.class ) );
+        verify( scmProviderMock ).checkOut( isA( ScmRepository.class ),
+                                            argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ),
+                                            isA( ScmTag.class ),
+                                            isA( CommandParameters.class ));
+        verifyNoMoreInteractions( mock, scmProviderMock );
+    }
+    
+    public void testReleasePerformWithReleasePropertiesCompleted()
+                    throws Exception
+    {
+        // prepare
+        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        releaseDescriptor.setScmSourceUrl( "scm-url" );
+        releaseDescriptor.setPerformGoals( "goal1 goal2" );
+        File checkoutDirectory = getTestFile( "target/checkout-directory" );
+        releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
+
+        MavenExecutor mock = mock( MavenExecutor.class );
+        mavenExecutorWrapper.setMavenExecutor( mock );
+
+        ScmProvider scmProviderMock = mock( ScmProvider.class );
+        when( scmProviderMock.checkOut( isA( ScmRepository.class ),
+                                        argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ),
+                                        isA( ScmTag.class ),
+                                        isA( CommandParameters.class )) )
+            .thenReturn( new CheckOutScmResult( "...", Collections.<ScmFile>emptyList() ) );
+
+        ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
+        stub.setScmProvider( scmProviderMock );
+
+        releaseDescriptor.setCompletedPhase( "end-release" );
+
+        // execute
+        phase.execute( releaseDescriptor, releaseEnvironment, createReactorProjects() );
+
+        // verify
+        verify( mock ).executeGoals( eq( checkoutDirectory ),
+                                     eq( "goal1 goal2" ),
+                                     isA( ReleaseEnvironment.class ),
+                                     eq( true ), 
+                                     eq( "-DperformRelease=true -f pom.xml" ), 
+                                     isNull( String.class ),
+                                     isA( ReleaseResult.class ) );
+        verify( scmProviderMock ).checkOut( isA( ScmRepository.class ),
+                                            argThat( new IsScmFileSetEquals( new ScmFileSet( checkoutDirectory ) ) ),
+                                            isA( ScmTag.class ),
+                                            isA( CommandParameters.class ));
+        verifyNoMoreInteractions( mock, scmProviderMock );
+    }
+    
+    private static List<MavenProject> createReactorProjects()
+    {
+        MavenProject project = new MavenProject();
+        project.setFile( getTestFile( "target/dummy-project/pom.xml" ) );
+        return Collections.singletonList( project );
+    }
 }
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunPrepareGoalsPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunPrepareGoalsPhaseTest.java
index e45e4a6..9b0217d 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunPrepareGoalsPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RunPrepareGoalsPhaseTest.java
@@ -33,7 +33,6 @@
 import java.util.List;
 
 import org.apache.maven.project.MavenProject;
-import org.apache.maven.settings.Settings;
 import org.apache.maven.shared.release.PlexusJUnit4TestCase;
 import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseFailureException;
@@ -43,6 +42,7 @@
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
 import org.apache.maven.shared.release.exec.MavenExecutor;
 import org.apache.maven.shared.release.exec.MavenExecutorException;
+import org.apache.maven.shared.release.stubs.MavenExecutorWrapper;
 import org.junit.Test;
 
 /**
@@ -55,12 +55,21 @@
 {
     private RunPrepareGoalsPhase phase;
 
+    private MavenExecutorWrapper mavenExecutorWrapper;
+    
+    private ReleaseEnvironment releaseEnvironment;
+
     public void setUp()
         throws Exception
     {
         super.setUp();
 
         phase = (RunPrepareGoalsPhase) lookup( ReleasePhase.ROLE, "run-preparation-goals" );
+        
+        mavenExecutorWrapper = (MavenExecutorWrapper) lookup( "org.apache.maven.shared.release.exec.MavenExecutor", "wrapper" );
+        
+        releaseEnvironment = new DefaultReleaseEnvironment();
+        releaseEnvironment.setMavenExecutorId( "wrapper" );
     }
 
     @Test
@@ -76,10 +85,10 @@
 
         MavenExecutor mock = mock( MavenExecutor.class );
 
-        phase.setMavenExecutor( ReleaseEnvironment.DEFAULT_MAVEN_EXECUTOR_ID, mock );
+        mavenExecutorWrapper.setMavenExecutor( mock );
 
         // execute
-        phase.execute( config, (Settings) null, (List<MavenProject>) null );
+        phase.execute( config, releaseEnvironment, (List<MavenProject>) null );
 
         // verify
         verify( mock ).executeGoals( eq( testFile ), eq( "clean integration-test" ), isA( ReleaseEnvironment.class ),
@@ -101,10 +110,10 @@
 
         MavenExecutor mock = mock( MavenExecutor.class );
 
-        phase.setMavenExecutor( ReleaseEnvironment.DEFAULT_MAVEN_EXECUTOR_ID, (MavenExecutor) mock );
+        mavenExecutorWrapper.setMavenExecutor( mock );
 
         // execute
-        phase.simulate( config, new DefaultReleaseEnvironment(), null );
+        phase.simulate( config, releaseEnvironment, null );
 
         // verify
         verify( mock ).executeGoals( eq( testFile ), eq( "clean integration-test" ), isA( ReleaseEnvironment.class ),
@@ -134,12 +143,12 @@
                                                                                             isNull( String.class ),
                                                                                             isA( ReleaseResult.class ) );
 
-        phase.setMavenExecutor( ReleaseEnvironment.DEFAULT_MAVEN_EXECUTOR_ID, mock );
+        mavenExecutorWrapper.setMavenExecutor( mock );
 
         // execute
         try
         {
-            phase.execute( config, (Settings) null, (List<MavenProject>) null );
+            phase.execute( config, releaseEnvironment, (List<MavenProject>) null );
 
             fail( "Should have thrown an exception" );
         }
@@ -176,12 +185,12 @@
                                                                                             isNull( String.class ),
                                                                                             isA( ReleaseResult.class ) );
 
-        phase.setMavenExecutor( ReleaseEnvironment.DEFAULT_MAVEN_EXECUTOR_ID, mock );
+        mavenExecutorWrapper.setMavenExecutor( mock );
 
         // execute
         try
         {
-            phase.simulate( config, new DefaultReleaseEnvironment(), null );
+            phase.simulate( config, releaseEnvironment, null );
 
             fail( "Should have thrown an exception" );
         }
@@ -211,10 +220,10 @@
 
         MavenExecutor mock = mock( MavenExecutor.class );
 
-        phase.setMavenExecutor( ReleaseEnvironment.DEFAULT_MAVEN_EXECUTOR_ID, mock );
+        mavenExecutorWrapper.setMavenExecutor( mock );
 
         // execute
-        phase.execute( config, (Settings) null, (List<MavenProject>) null );
+        phase.execute( config, releaseEnvironment, (List<MavenProject>) null );
 
         // verify
         // no invocations of mock
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/stubs/MavenExecutorWrapper.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/stubs/MavenExecutorWrapper.java
new file mode 100644
index 0000000..ede8f39
--- /dev/null
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/stubs/MavenExecutorWrapper.java
@@ -0,0 +1,71 @@
+package org.apache.maven.shared.release.stubs;
+
+/*
+ * 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.shared.release.ReleaseResult;
+import org.apache.maven.shared.release.env.ReleaseEnvironment;
+import org.apache.maven.shared.release.exec.MavenExecutor;
+import org.apache.maven.shared.release.exec.MavenExecutorException;
+
+public class MavenExecutorWrapper implements MavenExecutor
+{
+    private MavenExecutor executor;
+    
+    public void setMavenExecutor( MavenExecutor executor )
+    {
+        this.executor = executor;
+    }
+
+    @Override
+    public void executeGoals( File workingDirectory, String goals, ReleaseEnvironment releaseEnvironment,
+                              boolean interactive, String additionalArguments, String pomFileName,
+                              ReleaseResult result )
+        throws MavenExecutorException
+    {
+        executor.executeGoals( workingDirectory, goals, releaseEnvironment, interactive, additionalArguments,
+                               pomFileName, result );
+    }
+
+    @Override
+    public void executeGoals( File workingDirectory, String goals, ReleaseEnvironment releaseEnvironment,
+                              boolean interactive, String additionalArguments, ReleaseResult result )
+        throws MavenExecutorException
+    {
+        executor.executeGoals( workingDirectory, goals, releaseEnvironment, interactive, additionalArguments, result );
+    }
+
+    @Override
+    public void executeGoals( File workingDirectory, String goals, boolean interactive, String additionalArguments,
+                              String pomFileName, ReleaseResult result )
+        throws MavenExecutorException
+    {
+        executor.executeGoals( workingDirectory, goals, interactive, additionalArguments, pomFileName, result );
+    }
+
+    @Override
+    public void executeGoals( File workingDirectory, String goals, boolean interactive, String additionalArguments,
+                              ReleaseResult result )
+        throws MavenExecutorException
+    {
+        executor.executeGoals( workingDirectory, goals, interactive, additionalArguments, result );
+    }
+}
diff --git a/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/RunCompleteGoalsPhaseTest.xml b/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/RunCompleteGoalsPhaseTest.xml
index 343cd9b..82a83f7 100644
--- a/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/RunCompleteGoalsPhaseTest.xml
+++ b/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/RunCompleteGoalsPhaseTest.xml
@@ -28,5 +28,10 @@
         <threshold>ERROR</threshold>
       </configuration>
     </component>
+    <component>
+      <role>org.apache.maven.shared.release.exec.MavenExecutor</role>
+      <role-hint>wrapper</role-hint>
+      <implementation>org.apache.maven.shared.release.stubs.MavenExecutorWrapper</implementation>
+    </component>    
   </components>
 </component-set>
diff --git a/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/RunPerformGoalsPhaseTest.xml b/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/RunPerformGoalsPhaseTest.xml
index 343cd9b..9820d21 100644
--- a/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/RunPerformGoalsPhaseTest.xml
+++ b/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/RunPerformGoalsPhaseTest.xml
@@ -28,5 +28,10 @@
         <threshold>ERROR</threshold>
       </configuration>
     </component>
+    <component>
+      <role>org.apache.maven.shared.release.exec.MavenExecutor</role>
+      <role-hint>wrapper</role-hint>
+      <implementation>org.apache.maven.shared.release.stubs.MavenExecutorWrapper</implementation>
+    </component>
   </components>
 </component-set>
diff --git a/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/RunPrepareGoalsPhaseTest.xml b/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/RunPrepareGoalsPhaseTest.xml
index 343cd9b..9820d21 100644
--- a/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/RunPrepareGoalsPhaseTest.xml
+++ b/maven-release-manager/src/test/resources/org/apache/maven/shared/release/phase/RunPrepareGoalsPhaseTest.xml
@@ -28,5 +28,10 @@
         <threshold>ERROR</threshold>
       </configuration>
     </component>
+    <component>
+      <role>org.apache.maven.shared.release.exec.MavenExecutor</role>
+      <role-hint>wrapper</role-hint>
+      <implementation>org.apache.maven.shared.release.stubs.MavenExecutorWrapper</implementation>
+    </component>
   </components>
 </component-set>