You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by cs...@apache.org on 2022/05/06 07:17:32 UTC

[maven-release] branch master updated: [MRELEASE-1087] Upgrade Maven to 3.2.5 (and de-plexus) (#118)

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

cstamas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-release.git


The following commit(s) were added to refs/heads/master by this push:
     new dafdd7f4 [MRELEASE-1087] Upgrade Maven to 3.2.5 (and de-plexus) (#118)
dafdd7f4 is described below

commit dafdd7f49d4f96f4d3c9e9b525d6150c40b4784b
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Fri May 6 09:17:28 2022 +0200

    [MRELEASE-1087] Upgrade Maven to 3.2.5 (and de-plexus) (#118)
    
    Mass changes to plugin:
    * update maven 3.0 -> 3.2.5
    * update resolver from org.sonatype to org.eclipse package
    * off plexus XML, move fully to JSR330
    * off plexus APIs like LogEnabled, Contextualize, etc
    * use slf4j API for logging instead of Plexus Logger
    * tests: off from Junit3 PlexusTestCase w/ XMLs to modern(er) Junit 4
    * tests: off from PlexusTestCase XMLs (one exception remains)
    * reformat
---
 maven-release-api/pom.xml                          |   7 +-
 .../shared/release/phase/AbstractReleasePhase.java |  11 +-
 maven-release-manager/pom.xml                      | 107 ++++---
 .../src/main/components-fragment.xml               | 276 -----------------
 .../shared/release/DefaultReleaseManager.java      |  66 ++--
 .../config/PropertiesReleaseDescriptorStore.java   | 163 ++++------
 .../release/config/ReleaseDescriptorBuilder.java   |  37 ++-
 .../release/config/ReleaseDescriptorStore.java     |   4 +-
 .../config/ReleaseDescriptorStoreException.java    |   4 +-
 .../maven/shared/release/config/ReleaseUtils.java  |  32 +-
 .../release/env/DefaultReleaseEnvironment.java     |   4 +-
 .../shared/release/exec/AbstractMavenExecutor.java | 117 ++------
 .../shared/release/exec/CommandLineFactory.java    |   4 +-
 .../release/exec/DefaultCommandLineFactory.java    |  11 +-
 .../shared/release/exec/ForkedMavenExecutor.java   |  58 ++--
 .../shared/release/exec/InvokerMavenExecutor.java  | 272 +++++++++++------
 .../maven/shared/release/exec/MavenExecutor.java   |   6 +-
 .../release/exec/MavenExecutorException.java       |   6 +-
 .../maven/shared/release/exec/RawStreamPumper.java |  25 +-
 .../maven/shared/release/exec/TeeConsumer.java     |  13 +-
 .../maven/shared/release/exec/TeeOutputStream.java |  13 +-
 .../release/phase/AbstractBackupPomsPhase.java     |   6 +-
 ...eckPomPhase.java => AbstractCheckPomPhase.java} |  32 +-
 ...Phase.java => AbstractInputVariablesPhase.java} |  99 +++---
 ...onsPhase.java => AbstractMapVersionsPhase.java} |  81 ++---
 .../release/phase/AbstractReleasePomsPhase.java    |  19 +-
 .../release/phase/AbstractRewritePomsPhase.java    | 136 +++++----
 .../release/phase/AbstractRunGoalsPhase.java       |  25 +-
 ...java => AbstractScmCommitDevelopmentPhase.java} |  28 +-
 .../release/phase/AbstractScmCommitPhase.java      |  82 ++---
 ...java => AbstractScmCommitPreparationPhase.java} |  30 +-
 .../BranchInputVariablesPhase.java}                |  33 +-
 .../phase/CheckCompletedPreparePhasesPhase.java    |  17 +-
 .../phase/CheckDependencySnapshotsPhase.java       | 150 +++++-----
 .../CheckPomsPhase.java}                           |  27 +-
 .../CheckPomsUpdateversionsPhase.java}             |  27 +-
 .../release/phase/CheckoutProjectFromScm.java      |  42 ++-
 .../release/phase/CreateBackupPomsPhase.java       |  15 +-
 .../shared/release/phase/EndReleasePhase.java      |  17 +-
 .../release/phase/GenerateReleasePomsPhase.java    | 133 ++++----
 .../shared/release/phase/InputVariablesPhase.java  | 269 +----------------
 .../release/phase/MapBranchVersionsPhase.java      |  68 +++++
 .../release/phase/MapDevelopmentVersionsPhase.java |  68 +++++
 .../release/phase/MapReleaseVersionsPhase.java     |  68 +++++
 .../release/phase/RemoveReleasePomsPhase.java      |  31 +-
 .../shared/release/phase/RemoveScmTagPhase.java    |  59 ++--
 .../release/phase/RestoreBackupPomsPhase.java      |  42 ++-
 .../release/phase/RewritePomVersionsPhase.java     |  24 +-
 .../release/phase/RewritePomsForBranchPhase.java   |  38 ++-
 .../phase/RewritePomsForDevelopmentPhase.java      |  29 +-
 .../release/phase/RewritePomsForReleasePhase.java  |  32 +-
 .../release/phase/RunCompleteGoalsPhase.java       |  26 +-
 .../shared/release/phase/RunPerformGoalsPhase.java |  32 +-
 .../shared/release/phase/RunPrepareGoalsPhase.java |  32 +-
 .../maven/shared/release/phase/ScmBranchPhase.java |  42 +--
 .../release/phase/ScmCheckModificationsPhase.java  |  27 +-
 .../ScmCommitBranchPhase.java}                     |  27 +-
 .../release/phase/ScmCommitDevelopmentPhase.java   |  81 +----
 .../ScmCommitReleasePhase.java}                    |  27 +-
 .../ScmCommitRollbackPhase.java}                   |  27 +-
 .../maven/shared/release/phase/ScmTagPhase.java    |  18 +-
 .../release/policies/DefaultNamingPolicy.java      |   9 +-
 .../release/policies/DefaultVersionPolicy.java     |  17 +-
 .../shared/release/scm/ClearCaseScmTranslator.java |   8 +-
 .../maven/shared/release/scm/CvsScmTranslator.java |   8 +-
 .../scm/DefaultScmRepositoryConfigurator.java      |  71 +++--
 .../maven/shared/release/scm/GitScmTranslator.java |   8 +-
 .../maven/shared/release/scm/HgScmTranslator.java  |   8 +-
 .../shared/release/scm/JazzScmTranslator.java      |  10 +-
 .../release/scm/SubversionScmTranslator.java       |   7 +-
 .../shared/release/strategies/DefaultStrategy.java | 120 ++++----
 .../transform/jdom2/JDomModelETLFactory.java       |  10 +-
 .../maven/shared/release/util/MavenCrypto.java     | 171 +++++++++++
 .../maven/shared/release/util/PomFinder.java       |  33 +-
 .../main/resources/META-INF/plexus/components.xml  |  45 ---
 .../shared/release/DefaultReleaseManagerTest.java  |  63 +++-
 .../maven/shared/release/PlexusJUnit4TestCase.java |  43 ++-
 .../PropertiesReleaseDescriptorStoreTest.java      |  33 +-
 .../shared/release/config/ReleaseUtilsTest.java    |  14 +-
 .../release/exec/AbstractMavenExecutorTest.java    |  11 +-
 .../release/exec/CommandLineFactoryTest.java       |  14 +-
 .../release/exec/ForkedMavenExecutorTest.java      |  52 ++--
 .../release/exec/InvokerMavenExecutorTest.java     |  38 +--
 .../maven/shared/release/exec/TeeConsumerTest.java |  19 +-
 .../shared/release/exec/TeeOutputStreamTest.java   |  24 +-
 ...tractEditModeRewritingReleasePhaseTestCase.java |   9 +-
 .../release/phase/AbstractReleaseTestCase.java     |  38 ++-
 .../AbstractRewritingReleasePhaseTestCase.java     |   4 +-
 .../release/phase/AbstractScmCommitPhaseTest.java  |   4 -
 .../phase/BranchInputVariablesPhaseTest.java       |  15 +-
 .../shared/release/phase/CheckPomPhaseTest.java    |  29 +-
 .../release/phase/CheckoutProjectFromScmTest.java  |  10 +-
 .../phase/GenerateReleasePomsPhaseTest.java        |  27 ++
 .../release/phase/InputVariablesPhaseTest.java     |  30 +-
 .../phase/MapDevelopmentVersionPhaseIT.java        |  16 +-
 .../shared/release/phase/MapVersionsPhaseTest.java | 333 +++++++++------------
 .../phase/RewritePomsForBranchPhaseTest.java       |   2 -
 .../phase/RewritePomsForReleasePhaseTest.java      |   4 +
 .../shared/release/phase/ScmBranchPhaseTest.java   |   8 +-
 .../phase/ScmCommitPreparationPhaseTest.java       |   6 +-
 .../shared/release/phase/ScmTagPhaseTest.java      |  20 ++
 .../release/policies/DefaultNamingPolicyTest.java  |   2 +-
 .../release/policies/DefaultVersionPolicyTest.java |   2 +-
 .../release/scm/ClearCaseScmTranslatorTest.java    |  11 +-
 .../shared/release/scm/CvsScmTranslatorTest.java   |  11 +-
 .../scm/DefaultScmRepositoryConfiguratorTest.java  |  30 +-
 .../shared/release/scm/GitScmTranslatorTest.java   |  10 +-
 .../shared/release/scm/HgScmTranslatorTest.java    |  11 +-
 .../shared/release/scm/JazzScmTranslatorTest.java  |  12 +-
 .../release/scm/SubversionScmTranslatorTest.java   |  12 +-
 .../shared/release/stubs/MavenExecutorWrapper.java |   5 +
 .../shared/release/stubs/NamingPolicyStub.java     |   5 +
 .../maven/shared/release/stubs/ScmManagerStub.java |  11 +-
 .../maven/shared/release/util/PomFinderTest.java   |  29 +-
 .../release/versions/DefaultVersionInfoTest.java   |  41 ++-
 .../release/exec/ForkedMavenExecutorTest.xml       |  32 --
 .../phase/BranchInputVariablesPhaseTest.xml        |  41 ---
 .../phase/CheckDependencySnapshotsPhaseTest.xml    |  32 --
 .../release/phase/CheckoutProjectFromScmTest.xml   |  36 ---
 .../shared/release/phase/EndReleasePhaseTest.xml   |  32 --
 .../release/phase/GenerateReleasePomsPhaseTest.xml |  41 ---
 .../shared/release/phase/MapVersionsPhaseTest.xml  |  82 -----
 .../release/phase/RemoveReleasePomsPhaseTest.xml   |  36 ---
 .../shared/release/phase/RemoveScmTagPhaseTest.xml |  36 ---
 .../phase/RewritePomsForBranchPhaseTest.xml        |  32 --
 .../phase/RewritePomsForDevelopmentPhaseTest.xml   |  32 --
 .../phase/RewritePomsForReleasePhaseTest.xml       |  32 --
 .../release/phase/RunCompleteGoalsPhaseTest.xml    |  37 ---
 .../release/phase/RunPerformGoalsPhaseTest.xml     |  37 ---
 .../release/phase/RunPrepareGoalsPhaseTest.xml     |  37 ---
 .../shared/release/phase/ScmBranchPhaseTest.xml    |  36 ---
 .../phase/ScmCheckModificationsPhaseTest.xml       |  36 ---
 .../phase/ScmCommitDevelopmentPhaseTest.xml        |  36 ---
 .../phase/ScmCommitPreparationPhaseTest.xml        |  36 ---
 .../maven/shared/release/phase/ScmTagPhaseTest.xml |  36 ---
 .../basic-pom-entities/expected-release-pom.xml    |   8 +-
 .../basic-pom-namespace/expected-release-pom.xml   |   8 +-
 .../expected-release-pom.xml                       |   8 +-
 .../basic-pom/expected-release-pom-with-schema.xml |   8 +-
 .../basic-pom/expected-release-pom.xml             |   8 +-
 .../cdata-around-values/expected-release-pom.xml   |   8 +-
 .../subproject1/expected-release-pom.xml           |   8 +-
 .../subproject2/expected-release-pom.xml           |   8 +-
 .../expected-release-pom.xml                       |   8 +-
 .../subproject1/expected-release-pom.xml           |   8 +-
 .../expected-release-pom.xml                       |   8 +-
 .../expected-release-pom.xml                       |   8 +-
 .../subproject1/expected-release-pom.xml           |   6 +-
 .../subproject2/expected-release-pom.xml           |   6 +-
 .../expected-release-pom.xml                       |   8 +-
 .../subproject1/expected-release-pom.xml           |   8 +-
 .../subproject2/expected-release-pom.xml           |   6 +-
 .../expected-release-pom.xml                       |   8 +-
 .../subproject1/expected-release-pom.xml           |   8 +-
 .../subproject2/expected-release-pom.xml           |   8 +-
 .../expected-release-pom.xml                       |   8 +-
 .../subproject1/expected-release-pom.xml           |   8 +-
 .../subproject2/expected-release-pom.xml           |   8 +-
 .../expected-release-pom.xml                       |   8 +-
 .../subproject1/expected-release-pom.xml           |   8 +-
 .../subproject2/expected-release-pom.xml           |   6 +-
 .../subproject3/expected-release-pom.xml           |   6 +-
 .../expected-release-pom.xml                       |   8 +-
 .../subproject1/expected-release-pom.xml           |   8 +-
 .../subproject2/expected-release-pom.xml           |   8 +-
 .../subproject3/expected-release-pom.xml           |   8 +-
 .../expected-release-pom.xml                       |   8 +-
 .../subproject1/expected-release-pom.xml           |   8 +-
 .../subproject2/expected-release-pom.xml           |   8 +-
 .../subproject3/expected-release-pom.xml           |   8 +-
 .../subproject4/expected-release-pom.xml           |   8 +-
 .../subsubproject/expected-release-pom.xml         |   8 +-
 .../expected-release-pom.xml                       |   8 +-
 .../subproject1/expected-release-pom.xml           |   8 +-
 .../subproject2/expected-release-pom.xml           |   8 +-
 .../subproject3/expected-release-pom.xml           |   8 +-
 .../expected-release-pom.xml                       |   8 +-
 .../subproject1/expected-release-pom.xml           |   8 +-
 .../subproject2/expected-release-pom.xml           |   8 +-
 .../subproject3/expected-release-pom.xml           |   8 +-
 .../subproject4/expected-release-pom.xml           |   8 +-
 .../expected-release-pom.xml                       |   8 +-
 .../subproject1/expected-release-pom.xml           |   8 +-
 .../subproject2/expected-release-pom.xml           |   8 +-
 .../expected-release-pom.xml                       |   8 +-
 .../subproject1/expected-release-pom.xml           |   8 +-
 .../subproject2/expected-release-pom.xml           |   8 +-
 .../subproject3/expected-release-pom.xml           |   8 +-
 .../subproject4/expected-release-pom.xml           |   8 +-
 .../pom-with-finalname/expected-release-pom.xml    |   8 +-
 .../expected-release-pom.xml                       |   8 +-
 .../expected-release-pom-version-changed.xml       |   8 +-
 .../subproject1/expected-release-pom.xml           |   8 +-
 .../pom-with-namespace/expected-release-pom.xml    |   8 +-
 .../subproject1/expected-release-pom.xml           |   8 +-
 .../subproject2/expected-release-pom.xml           |   8 +-
 .../pom-with-parent/expected-release-pom.xml       |   8 +-
 .../subproject1/expected-release-pom.xml           |   8 +-
 .../expected-release-pom.xml                       |   8 +-
 .../subproject1/expected-release-pom.xml           |   8 +-
 .../expected-release-pom.xml                       |   8 +-
 .../expected-release-pom.xml                       |   8 +-
 .../subproject1/expected-release-pom.xml           |   8 +-
 .../subproject2/expected-release-pom.xml           |   8 +-
 .../src/test/resources/simplelogger.properties     |  17 ++
 maven-release-plugin/pom.xml                       |  12 +-
 .../maven-release-oddeven-policy/pom.xml           |  38 +--
 .../policy/oddeven/OddEvenVersionPolicy.java       |  13 +-
 .../oddeven/OddEvenVersionPolicyTestCase.java      |  16 +-
 .../maven-release-semver-policy/pom.xml            |  32 +-
 .../release/policy/semver/SemVerVersionPolicy.java |  22 +-
 .../policy/semver/SemVerVersionPolicyTest.java     |  18 +-
 pom.xml                                            | 107 ++++++-
 213 files changed, 3053 insertions(+), 3404 deletions(-)

diff --git a/maven-release-api/pom.xml b/maven-release-api/pom.xml
index a801ea9b..9b833650 100644
--- a/maven-release-api/pom.xml
+++ b/maven-release-api/pom.xml
@@ -55,8 +55,11 @@
     <dependency>
       <groupId>org.eclipse.aether</groupId>
       <artifactId>aether-util</artifactId>
-      <version>1.0.0.v20140518</version>
-      <optional>true</optional>
+    </dependency>
+
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
     </dependency>
     
     <dependency>
diff --git a/maven-release-api/src/main/java/org/apache/maven/shared/release/phase/AbstractReleasePhase.java b/maven-release-api/src/main/java/org/apache/maven/shared/release/phase/AbstractReleasePhase.java
index 27184934..898bc0af 100644
--- a/maven-release-api/src/main/java/org/apache/maven/shared/release/phase/AbstractReleasePhase.java
+++ b/maven-release-api/src/main/java/org/apache/maven/shared/release/phase/AbstractReleasePhase.java
@@ -20,7 +20,8 @@ package org.apache.maven.shared.release.phase;
  */
 
 import org.apache.maven.shared.release.ReleaseResult;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Base class for all phases.
@@ -28,9 +29,15 @@ import org.codehaus.plexus.logging.AbstractLogEnabled;
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
 public abstract class AbstractReleasePhase
-    extends AbstractLogEnabled
     implements ReleasePhase
 {
+    private final Logger logger = LoggerFactory.getLogger( getClass() );
+
+    protected Logger getLogger()
+    {
+        return logger;
+    }
+
     /**
      * <p>logInfo.</p>
      *
diff --git a/maven-release-manager/pom.xml b/maven-release-manager/pom.xml
index 81501fb1..717b5b2e 100644
--- a/maven-release-manager/pom.xml
+++ b/maven-release-manager/pom.xml
@@ -37,6 +37,7 @@
       <artifactId>maven-release-api</artifactId>
       <version>3.0.0-M6-SNAPSHOT</version>
     </dependency>
+
     <dependency>
       <groupId>org.codehaus.plexus</groupId>
       <artifactId>plexus-utils</artifactId>
@@ -59,14 +60,14 @@
     </dependency>
 
     <dependency>
-      <groupId>org.sonatype.plexus</groupId>
+      <groupId>org.codehaus.plexus</groupId>
       <artifactId>plexus-sec-dispatcher</artifactId>
-      <version>1.3</version>
+      <version>2.0</version>
     </dependency>
     <dependency>
-      <groupId>org.sonatype.plexus</groupId>
+      <groupId>org.codehaus.plexus</groupId>
       <artifactId>plexus-cipher</artifactId>
-      <version>1.7</version>
+      <version>2.0</version>
     </dependency>
 
     <dependency>
@@ -85,6 +86,23 @@
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-settings</artifactId>
     </dependency>
+
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>javax.inject</groupId>
+      <artifactId>javax.inject</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.sisu</groupId>
+      <artifactId>org.eclipse.sisu.inject</artifactId>
+      <scope>provided</scope>
+    </dependency>
+
     <dependency>
       <groupId>org.apache.maven.shared</groupId>
       <artifactId>maven-invoker</artifactId>
@@ -98,7 +116,7 @@
     <dependency>
       <groupId>commons-cli</groupId>
       <artifactId>commons-cli</artifactId>
-      <version>1.2</version>
+      <version>1.5.0</version>
       <exclusions>
         <exclusion>
           <groupId>commons-lang</groupId>
@@ -106,6 +124,17 @@
         </exclusion>
       </exclusions>
     </dependency>
+
+    <dependency>
+      <groupId>org.eclipse.aether</groupId>
+      <artifactId>aether-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.aether</groupId>
+      <artifactId>aether-util</artifactId>
+    </dependency>
+
+
     <!-- scm dependencies -->
     <dependency>
       <groupId>org.apache.maven.scm</groupId>
@@ -130,6 +159,12 @@
       <groupId>org.apache.maven.shared</groupId>
       <artifactId>maven-artifact-transfer</artifactId>
       <version>0.13.1</version>
+      <exclusions>
+        <exclusion>
+          <groupId>org.sonatype.sisu</groupId>
+          <artifactId>sisu-inject-plexus</artifactId>
+        </exclusion>
+      </exclusions>
     </dependency>
 
     <dependency>
@@ -163,15 +198,35 @@
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.sonatype.aether</groupId>
-      <artifactId>aether-connector-file</artifactId>
-      <version>1.7</version>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
       <scope>test</scope>
     </dependency>
+
     <dependency>
-      <groupId>org.sonatype.aether</groupId>
-      <artifactId>aether-connector-wagon</artifactId>
-      <version>1.7</version>
+      <groupId>org.eclipse.sisu</groupId>
+      <artifactId>org.eclipse.sisu.plexus</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.eclipse.aether</groupId>
+      <artifactId>aether-connector-basic</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.aether</groupId>
+      <artifactId>aether-transport-file</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.aether</groupId>
+      <artifactId>aether-transport-wagon</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.wagon</groupId>
+      <artifactId>wagon-http</artifactId>
       <scope>test</scope>
     </dependency>
   </dependencies>
@@ -208,36 +263,6 @@
           </models>
         </configuration>
       </plugin>
-      <plugin>
-        <groupId>org.codehaus.plexus</groupId>
-        <artifactId>plexus-component-metadata</artifactId>
-        <executions>
-          <execution>
-            <goals>
-              <goal>generate-metadata</goal>
-            </goals>
-            <configuration>
-              <extractors>
-                <extractor>class</extractor>
-              </extractors>
-            </configuration>
-          </execution>
-          <execution>
-            <id>merge</id>
-            <phase>process-classes</phase>
-            <goals>
-              <goal>merge-metadata</goal>
-            </goals>
-            <configuration>
-              <output>${project.build.outputDirectory}/META-INF/plexus/components.xml</output>
-              <descriptors>
-                <descriptor>${project.build.outputDirectory}/META-INF/plexus/components.xml</descriptor>
-                <descriptor>src/main/components-fragment.xml</descriptor>
-              </descriptors>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-failsafe-plugin</artifactId>
diff --git a/maven-release-manager/src/main/components-fragment.xml b/maven-release-manager/src/main/components-fragment.xml
deleted file mode 100644
index 3a366825..00000000
--- a/maven-release-manager/src/main/components-fragment.xml
+++ /dev/null
@@ -1,276 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one
-  ~ or more contributor license agreements.  See the NOTICE file
-  ~ distributed with this work for additional information
-  ~ regarding copyright ownership.  The ASF licenses this file
-  ~ to you under the Apache License, Version 2.0 (the
-  ~ "License"); you may not use this file except in compliance
-  ~ with the License.  You may obtain a copy of the License at
-  ~
-  ~   http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing,
-  ~ software distributed under the License is distributed on an
-  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  ~ KIND, either express or implied.  See the License for the
-  ~ specific language governing permissions and limitations
-  ~ under the License.
-  -->
-
-<component-set>
-  <components>
-<!-- START SNIPPET: default-strategy -->
-    <component>
-      <role>org.apache.maven.shared.release.strategy.Strategy</role>
-      <role-hint>default</role-hint>
-      <implementation>org.apache.maven.shared.release.strategies.DefaultStrategy</implementation>
-      <configuration>
-
-        <preparePhases>
-<!-- START SNIPPET: default-strategy-prepare-phases -->
-          <phase>check-poms</phase>
-          <phase>scm-check-modifications</phase>
-          <phase>check-dependency-snapshots</phase>
-          <phase>create-backup-poms</phase>
-          <phase>map-release-versions</phase>
-          <phase>input-variables</phase>
-          <phase>map-development-versions</phase>
-          <phase>rewrite-poms-for-release</phase>
-          <phase>generate-release-poms</phase>
-          <phase>run-preparation-goals</phase>
-          <phase>scm-commit-release</phase>
-          <phase>scm-tag</phase>
-          <phase>rewrite-poms-for-development</phase>
-          <phase>remove-release-poms</phase>
-          <phase>run-completion-goals</phase>
-          <phase>scm-commit-development</phase>
-          <phase>end-release</phase>
-<!-- END SNIPPET: default-strategy-prepare-phases -->
-        </preparePhases>
-
-        <performPhases>
-<!-- START SNIPPET: default-strategy-perform-phases -->
-          <phase>verify-completed-prepare-phases</phase>
-          <phase>checkout-project-from-scm</phase>
-          <phase>run-perform-goals</phase>
-<!-- END SNIPPET: default-strategy-perform-phases -->
-        </performPhases>
-
-        <rollbackPhases>
-<!-- START SNIPPET: default-strategy-rollback-phases -->
-          <phase>restore-backup-poms</phase>
-          <phase>scm-commit-rollback</phase>
-          <phase>remove-scm-tag</phase>
-<!-- END SNIPPET: default-strategy-rollback-phases -->
-        </rollbackPhases>
-
-        <branchPhases>
-<!-- START SNIPPET: default-strategy-branch-phases -->
-          <phase>check-poms</phase>
-          <phase>scm-check-modifications</phase>
-          <phase>create-backup-poms</phase>
-          <phase>map-branch-versions</phase>
-          <phase>branch-input-variables</phase>
-          <phase>map-development-versions</phase>
-          <phase>rewrite-poms-for-branch</phase>
-          <phase>scm-commit-branch</phase>
-          <phase>scm-branch</phase>
-          <phase>rewrite-poms-for-development</phase>
-          <phase>scm-commit-development</phase>
-          <phase>end-release</phase>
-<!-- END SNIPPET: default-strategy-branch-phases -->
-        </branchPhases>
-
-        <updateVersionsPhases>
-<!-- START SNIPPET: default-strategy-update-versions-phases -->
-          <phase>check-poms-updateversions</phase>
-          <phase>create-backup-poms</phase>
-          <phase>map-development-versions</phase>
-          <phase>rewrite-pom-versions</phase>
-<!-- END SNIPPET: default-strategy-update-versions-phases -->
-        </updateVersionsPhases>
-      </configuration>
-    </component>
-<!-- END SNIPPET: default-strategy -->
-    <component>
-      <role>org.apache.maven.shared.release.phase.ReleasePhase</role>
-      <role-hint>map-release-versions</role-hint>
-      <implementation>org.apache.maven.shared.release.phase.MapVersionsPhase</implementation>
-      <configuration>
-        <convertToSnapshot>false</convertToSnapshot>
-      </configuration>
-      <requirements>
-        <requirement>
-          <role>org.codehaus.plexus.components.interactivity.Prompter</role>
-          <role-hint>default</role-hint>
-        </requirement>
-        <requirement>
-          <role>org.apache.maven.shared.release.policy.version.VersionPolicy</role>
-          <field-name>versionPolicies</field-name>
-        </requirement>
-      </requirements>
-    </component>
-    <component>
-      <role>org.apache.maven.shared.release.phase.ReleasePhase</role>
-      <role-hint>map-development-versions</role-hint>
-      <implementation>org.apache.maven.shared.release.phase.MapVersionsPhase</implementation>
-      <configuration>
-        <convertToSnapshot>true</convertToSnapshot>
-      </configuration>
-      <requirements>
-        <requirement>
-          <role>org.codehaus.plexus.components.interactivity.Prompter</role>
-          <role-hint>default</role-hint>
-        </requirement>
-        <requirement>
-          <role>org.apache.maven.shared.release.policy.version.VersionPolicy</role>
-          <field-name>versionPolicies</field-name>
-        </requirement>
-      </requirements>
-    </component>
-    <component>
-      <role>org.apache.maven.shared.release.phase.ReleasePhase</role>
-      <role-hint>map-branch-versions</role-hint>
-      <implementation>org.apache.maven.shared.release.phase.MapVersionsPhase</implementation>
-      <configuration>
-        <convertToSnapshot>true</convertToSnapshot>
-        <convertToBranch>true</convertToBranch>
-      </configuration>
-      <requirements>
-        <requirement>
-          <role>org.codehaus.plexus.components.interactivity.Prompter</role>
-          <role-hint>default</role-hint>
-        </requirement>
-        <requirement>
-          <role>org.apache.maven.shared.release.policy.version.VersionPolicy</role>
-          <field-name>versionPolicies</field-name>
-        </requirement>
-      </requirements>
-    </component>
-    <component>
-      <role>org.apache.maven.shared.release.phase.ReleasePhase</role>
-      <role-hint>scm-commit-release</role-hint>
-      <implementation>org.apache.maven.shared.release.phase.ScmCommitPreparationPhase</implementation>
-      <requirements>
-        <requirement>
-          <role>org.apache.maven.shared.release.scm.ScmRepositoryConfigurator</role>
-        </requirement>
-      </requirements>
-      <configuration>
-        <descriptorCommentGetter>getScmReleaseCommitComment</descriptorCommentGetter>
-      </configuration>
-    </component>
-    <component>
-      <role>org.apache.maven.shared.release.phase.ReleasePhase</role>
-      <role-hint>scm-commit-development</role-hint>
-      <implementation>org.apache.maven.shared.release.phase.ScmCommitDevelopmentPhase</implementation>
-      <requirements>
-        <requirement>
-          <role>org.apache.maven.shared.release.scm.ScmRepositoryConfigurator</role>
-        </requirement>
-      </requirements>
-      <configuration>
-        <descriptorCommentGetter>getScmDevelopmentCommitComment</descriptorCommentGetter>
-        <rollbackMessageFormat>rollback changes from release preparation of {0}</rollbackMessageFormat>
-      </configuration>
-    </component>
-    <component>
-      <role>org.apache.maven.shared.release.phase.ReleasePhase</role>
-      <role-hint>scm-commit-branch</role-hint>
-      <implementation>org.apache.maven.shared.release.phase.ScmCommitPreparationPhase</implementation>
-      <requirements>
-        <requirement>
-          <role>org.apache.maven.shared.release.scm.ScmRepositoryConfigurator</role>
-        </requirement>
-      </requirements>
-      <configuration>
-        <descriptorCommentGetter>getScmBranchCommitComment</descriptorCommentGetter>
-      </configuration>
-    </component>
-    <component>
-      <role>org.apache.maven.shared.release.phase.ReleasePhase</role>
-      <role-hint>scm-commit-rollback</role-hint>
-      <implementation>org.apache.maven.shared.release.phase.ScmCommitPreparationPhase</implementation>
-      <requirements>
-        <requirement>
-          <role>org.apache.maven.shared.release.scm.ScmRepositoryConfigurator</role>
-        </requirement>
-      </requirements>
-      <configuration>
-        <descriptorCommentGetter>getScmRollbackCommitComment</descriptorCommentGetter>
-      </configuration>
-    </component>
-    <component>
-      <role>org.apache.maven.shared.release.phase.ReleasePhase</role>
-      <role-hint>check-poms</role-hint>
-      <implementation>org.apache.maven.shared.release.phase.CheckPomPhase</implementation>
-      <configuration>
-        <scmRequired>true</scmRequired>
-        <snapshotsRequired>true</snapshotsRequired>
-      </configuration>
-      <requirements>
-        <requirement>
-          <role>org.apache.maven.shared.release.scm.ScmRepositoryConfigurator</role>
-        </requirement>
-      </requirements>
-    </component>
-    <component>
-      <role>org.apache.maven.shared.release.phase.ReleasePhase</role>
-      <role-hint>check-poms-updateversions</role-hint>
-      <implementation>org.apache.maven.shared.release.phase.CheckPomPhase</implementation>
-      <configuration>
-        <scmRequired>false</scmRequired>
-        <snapshotsRequired>false</snapshotsRequired>
-      </configuration>
-      <requirements>
-        <requirement>
-          <role>org.apache.maven.shared.release.scm.ScmRepositoryConfigurator</role>
-        </requirement>
-      </requirements>
-    </component>
-    <component>
-      <role>org.apache.maven.shared.release.phase.ReleasePhase</role>
-      <role-hint>input-variables</role-hint>
-      <implementation>org.apache.maven.shared.release.phase.InputVariablesPhase</implementation>
-      <configuration>
-        <branchOperation>false</branchOperation>
-        <defaultNamingPolicy>default</defaultNamingPolicy>
-      </configuration>
-      <requirements>
-        <requirement>
-          <role>org.codehaus.plexus.components.interactivity.Prompter</role>
-          <role-hint>default</role-hint>
-        </requirement>
-        <requirement>
-          <role>org.apache.maven.shared.release.scm.ScmRepositoryConfigurator</role>
-        </requirement>
-        <requirement>
-          <role>org.apache.maven.shared.release.policy.naming.NamingPolicy</role>
-          <field-name>namingPolicies</field-name>
-        </requirement>
-      </requirements>
-    </component>
-    <component>
-      <role>org.apache.maven.shared.release.phase.ReleasePhase</role>
-      <role-hint>branch-input-variables</role-hint>
-      <implementation>org.apache.maven.shared.release.phase.InputVariablesPhase</implementation>
-      <configuration>
-        <branchOperation>true</branchOperation>
-      </configuration>
-      <requirements>
-        <requirement>
-          <role>org.codehaus.plexus.components.interactivity.Prompter</role>
-          <role-hint>default</role-hint>
-        </requirement>
-        <requirement>
-          <role>org.apache.maven.shared.release.scm.ScmRepositoryConfigurator</role>
-        </requirement>
-        <requirement>
-          <role>org.apache.maven.shared.release.policy.naming.NamingPolicy</role>
-          <field-name>namingPolicies</field-name>
-        </requirement>
-      </requirements>
-    </component>
-  </components>
-</component-set>
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java
index c04dd674..c2732d9f 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java
@@ -19,6 +19,10 @@ package org.apache.maven.shared.release;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -26,6 +30,7 @@ import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
@@ -37,38 +42,56 @@ import org.apache.maven.shared.release.config.ReleaseUtils;
 import org.apache.maven.shared.release.phase.ReleasePhase;
 import org.apache.maven.shared.release.phase.ResourceGenerator;
 import org.apache.maven.shared.release.strategy.Strategy;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.codehaus.plexus.util.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static java.util.Objects.requireNonNull;
 
 /**
  * Implementation of the release manager.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-@Component( role = ReleaseManager.class )
+@Singleton
+@Named
 public class DefaultReleaseManager
-    extends AbstractLogEnabled
     implements ReleaseManager
 {
-    @Requirement
-    private Map<String, Strategy> strategies;
+    private final Logger logger = LoggerFactory.getLogger( getClass() );
+
+    private final Map<String, Strategy> strategies;
 
     /**
      * The available phases.
      */
-    @Requirement
-    private Map<String, ReleasePhase> releasePhases;
+    private final Map<String, ReleasePhase> releasePhases;
 
     /**
      * The configuration storage.
      */
-    @Requirement( hint = "properties" )
-    private ReleaseDescriptorStore configStore;
+    private final AtomicReference<ReleaseDescriptorStore> configStore;
 
     private static final int PHASE_SKIP = 0, PHASE_START = 1, PHASE_END = 2, GOAL_END = 12, ERROR = 99;
 
+    @Inject
+    public DefaultReleaseManager( Map<String, Strategy> strategies,
+                                  Map<String, ReleasePhase> releasePhases,
+                                  @Named( "properties" ) ReleaseDescriptorStore configStore )
+    {
+        this.strategies = requireNonNull( strategies );
+        this.releasePhases = requireNonNull( releasePhases );
+        this.configStore = new AtomicReference<>( requireNonNull( configStore ) );
+    }
+
+    /**
+     * For easier testing only!
+     */
+    public void setConfigStore( ReleaseDescriptorStore configStore )
+    {
+        this.configStore.set( configStore );
+    }
+
     @Override
     public ReleaseResult prepareWithResult( ReleasePrepareRequest prepareRequest )
     {
@@ -218,7 +241,7 @@ public class DefaultReleaseManager
             config.setCompletedPhase( name );
             try
             {
-                configStore.write( config );
+                configStore.get().write( config );
             }
             catch ( ReleaseDescriptorStoreException e )
             {
@@ -311,8 +334,8 @@ public class DefaultReleaseManager
 
         if ( specificProfiles != null && !specificProfiles.isEmpty() )
         {
-            List<String> allProfiles = new ArrayList<>();
-            allProfiles.addAll( ReleaseUtils.buildReleaseDescriptor( builder ).getActivateProfiles() );
+            List<String> allProfiles =
+                    new ArrayList<>( ReleaseUtils.buildReleaseDescriptor( builder ).getActivateProfiles() );
             for ( String specificProfile : specificProfiles )
             {
                 if ( !allProfiles.contains( specificProfile ) )
@@ -538,7 +561,7 @@ public class DefaultReleaseManager
         try
         {
             updateListener( listener, "verify-release-configuration", PHASE_START );
-            ReleaseDescriptorBuilder result = configStore.read( builder );
+            ReleaseDescriptorBuilder result = configStore.get().read( builder );
             updateListener( listener, "verify-release-configuration", PHASE_END );
             return result;
         }
@@ -571,12 +594,12 @@ public class DefaultReleaseManager
     {
         updateListener( cleanRequest.getReleaseManagerListener(), "cleanup", PHASE_START );
 
-        getLogger().info( "Cleaning up after release..." );
+        logger.info( "Cleaning up after release..." );
 
         ReleaseDescriptor releaseDescriptor =
             ReleaseUtils.buildReleaseDescriptor( cleanRequest.getReleaseDescriptorBuilder() );
 
-        configStore.delete( releaseDescriptor );
+        configStore.get().delete( releaseDescriptor );
 
         Strategy releaseStrategy = getStrategy( releaseDescriptor.getReleaseStrategyId() );
 
@@ -597,11 +620,6 @@ public class DefaultReleaseManager
         updateListener( cleanRequest.getReleaseManagerListener(), "cleanup", PHASE_END );
     }
 
-    void setConfigStore( ReleaseDescriptorStore configStore )
-    {
-        this.configStore = configStore;
-    }
-
     void goalStart( ReleaseManagerListener listener, String goal, List<String> phases )
     {
         if ( listener != null )
@@ -693,7 +711,7 @@ public class DefaultReleaseManager
             phases = null;
         }
 
-        return Collections.unmodifiableList( phases );
+        return Collections.unmodifiableList( phases ); // TODO: NPE here in phases=null above!
     }
 
     private void logInfo( ReleaseResult result, String message )
@@ -703,7 +721,7 @@ public class DefaultReleaseManager
             result.appendInfo( message );
         }
 
-        getLogger().info( message );
+        logger.info( message );
     }
 
     private void captureException( ReleaseResult result, ReleaseManagerListener listener, Exception e )
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java
index 3033a45d..fdacb6d2 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java
@@ -19,6 +19,10 @@ package org.apache.maven.shared.release.config;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
@@ -32,39 +36,37 @@ import java.util.Properties;
 import org.apache.maven.model.Scm;
 import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder.BuilderReleaseDescriptor;
 import org.apache.maven.shared.release.scm.IdentifiedScm;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.apache.maven.shared.release.util.MavenCrypto;
+import org.apache.maven.shared.release.util.MavenCrypto.MavenCryptoException;
 import org.codehaus.plexus.util.StringUtils;
-import org.sonatype.plexus.components.cipher.DefaultPlexusCipher;
-import org.sonatype.plexus.components.cipher.PlexusCipherException;
-import org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher;
-import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher;
-import org.sonatype.plexus.components.sec.dispatcher.SecDispatcherException;
-import org.sonatype.plexus.components.sec.dispatcher.SecUtil;
-import org.sonatype.plexus.components.sec.dispatcher.model.SettingsSecurity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static java.util.Objects.requireNonNull;
 
 /**
  * Read and write release configuration and state from a properties file.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-@Component( role = ReleaseDescriptorStore.class, hint = "properties" )
+@Singleton
+@Named( "properties" )
 public class PropertiesReleaseDescriptorStore
-    extends AbstractLogEnabled
-    implements ReleaseDescriptorStore
+        implements ReleaseDescriptorStore
 {
+    private final Logger logger = LoggerFactory.getLogger( getClass() );
 
-    /**
-     * When this plugin requires Maven 3.0 as minimum, this component can be removed and o.a.m.s.c.SettingsDecrypter be
-     * used instead.
-     */
-    @Requirement( role = SecDispatcher.class, hint = "mng-4384" )
-    private DefaultSecDispatcher secDispatcher;
+    private final MavenCrypto mavenCrypto;
+
+    @Inject
+    public PropertiesReleaseDescriptorStore( MavenCrypto mavenCrypto )
+    {
+        this.mavenCrypto = requireNonNull( mavenCrypto );
+    }
 
     @Override
     public ReleaseDescriptorBuilder read( ReleaseDescriptorBuilder mergeDescriptor )
-        throws ReleaseDescriptorStoreException
+            throws ReleaseDescriptorStoreException
     {
         return read( mergeDescriptor, getDefaultReleasePropertiesFile( mergeDescriptor.build() ) );
     }
@@ -77,7 +79,7 @@ public class PropertiesReleaseDescriptorStore
      * @throws org.apache.maven.shared.release.config.ReleaseDescriptorStoreException if any.
      */
     public ReleaseDescriptorBuilder read( File file )
-        throws ReleaseDescriptorStoreException
+            throws ReleaseDescriptorStoreException
     {
         return read( null, file );
     }
@@ -86,12 +88,12 @@ public class PropertiesReleaseDescriptorStore
      * <p>read.</p>
      *
      * @param mergeDescriptor a {@link org.apache.maven.shared.release.config.ReleaseDescriptorBuilder} object
-     * @param file a {@link java.io.File} object
+     * @param file            a {@link java.io.File} object
      * @return a {@link org.apache.maven.shared.release.config.ReleaseDescriptorBuilder} object
      * @throws org.apache.maven.shared.release.config.ReleaseDescriptorStoreException if any.
      */
     public ReleaseDescriptorBuilder read( ReleaseDescriptorBuilder mergeDescriptor, File file )
-        throws ReleaseDescriptorStoreException
+            throws ReleaseDescriptorStoreException
     {
         Properties properties = new Properties();
 
@@ -101,21 +103,21 @@ public class PropertiesReleaseDescriptorStore
         }
         catch ( FileNotFoundException e )
         {
-            getLogger().debug( file.getName() + " not found - using empty properties" );
+            logger.debug( file.getName() + " not found - using empty properties" );
         }
         catch ( IOException e )
         {
             throw new ReleaseDescriptorStoreException(
-                "Error reading properties file '" + file.getName() + "': " + e.getMessage(), e );
+                    "Error reading properties file '" + file.getName() + "': " + e.getMessage(), e );
         }
-        
+
         try
         {
-            decryptProperties( properties );
+            mavenCrypto.decryptProperties( properties );
         }
-        catch ( IllegalStateException | SecDispatcherException | PlexusCipherException e )
+        catch ( MavenCryptoException e )
         {
-            getLogger().debug( e.getMessage() );
+            logger.debug( e.getMessage() );
         }
 
         ReleaseDescriptorBuilder builder;
@@ -125,9 +127,9 @@ public class PropertiesReleaseDescriptorStore
         }
         else
         {
-           builder = new ReleaseDescriptorBuilder(); 
+            builder = new ReleaseDescriptorBuilder();
         }
-        
+
         ReleaseUtils.copyPropertiesToReleaseDescriptor( properties, builder );
 
         return builder;
@@ -135,7 +137,7 @@ public class PropertiesReleaseDescriptorStore
 
     @Override
     public void write( ReleaseDescriptor config )
-        throws ReleaseDescriptorStoreException
+            throws ReleaseDescriptorStoreException
     {
         write( (BuilderReleaseDescriptor) config, getDefaultReleasePropertiesFile( config ) );
     }
@@ -155,11 +157,11 @@ public class PropertiesReleaseDescriptorStore
      *
      * @param config a {@link org.apache.maven.shared.release.config.ReleaseDescriptorBuilder.BuilderReleaseDescriptor}
      *               object
-     * @param file a {@link java.io.File} object
+     * @param file   a {@link java.io.File} object
      * @throws org.apache.maven.shared.release.config.ReleaseDescriptorStoreException if any.
      */
     public void write( BuilderReleaseDescriptor config, File file )
-        throws ReleaseDescriptorStoreException
+            throws ReleaseDescriptorStoreException
     {
         Properties properties = new Properties();
         properties.setProperty( "completedPhase", config.getCompletedPhase() );
@@ -181,11 +183,11 @@ public class PropertiesReleaseDescriptorStore
             String password = config.getScmPassword();
             try
             {
-                password = encryptAndDecorate( password );
+                password = mavenCrypto.encryptAndDecorate( password );
             }
-            catch ( IllegalStateException | SecDispatcherException | PlexusCipherException e )
+            catch ( MavenCryptoException e )
             {
-                getLogger().debug( e.getMessage() );
+                logger.debug( e.getMessage() );
             }
             properties.setProperty( "scm.password", password );
         }
@@ -198,13 +200,13 @@ public class PropertiesReleaseDescriptorStore
             String passPhrase = config.getScmPrivateKeyPassPhrase();
             try
             {
-                passPhrase = encryptAndDecorate( passPhrase );
+                passPhrase = mavenCrypto.encryptAndDecorate( passPhrase );
             }
-            catch ( IllegalStateException | SecDispatcherException | PlexusCipherException e )
+            catch ( MavenCryptoException e )
             {
-                getLogger().debug( e.getMessage() );
+                logger.debug( e.getMessage() );
             }
-            properties.setProperty( "scm.passphrase", passPhrase  );
+            properties.setProperty( "scm.passphrase", passPhrase );
         }
         if ( config.getScmTagBase() != null )
         {
@@ -253,7 +255,7 @@ public class PropertiesReleaseDescriptorStore
         if ( !config.getActivateProfiles().isEmpty() )
         {
             properties.setProperty( "exec.activateProfiles",
-                                    StringUtils.join( config.getActivateProfiles().iterator(), "," ) );
+                    StringUtils.join( config.getActivateProfiles().iterator(), "," ) );
         }
         if ( config.getPreparationGoals() != null )
         {
@@ -277,7 +279,7 @@ public class PropertiesReleaseDescriptorStore
         }
 
         properties.setProperty( "exec.snapshotReleasePluginAllowed",
-                                Boolean.toString( config.isSnapshotReleasePluginAllowed() ) );
+                Boolean.toString( config.isSnapshotReleasePluginAllowed() ) );
 
         properties.setProperty( "remoteTagging", Boolean.toString( config.isRemoteTagging() ) );
 
@@ -298,7 +300,7 @@ public class PropertiesReleaseDescriptorStore
         // others boolean properties are not written to the properties file because the value from the caller is always
         // used
 
-        
+
         for ( Map.Entry<String, ReleaseStageVersions> entry : config.getProjectVersions().entrySet() )
         {
             if ( entry.getValue().getRelease() != null )
@@ -349,7 +351,7 @@ public class PropertiesReleaseDescriptorStore
         }
 
         if ( ( config.getResolvedSnapshotDependencies() != null )
-            && ( config.getResolvedSnapshotDependencies().size() > 0 ) )
+                && ( config.getResolvedSnapshotDependencies().size() > 0 ) )
         {
             processResolvedDependencies( properties, config.getResolvedSnapshotDependencies() );
         }
@@ -361,7 +363,7 @@ public class PropertiesReleaseDescriptorStore
         catch ( IOException e )
         {
             throw new ReleaseDescriptorStoreException(
-                "Error writing properties file '" + file.getName() + "': " + e.getMessage(), e );
+                    "Error writing properties file '" + file.getName() + "': " + e.getMessage(), e );
         }
     }
 
@@ -370,11 +372,11 @@ public class PropertiesReleaseDescriptorStore
         for ( Map.Entry<String, ReleaseStageVersions> currentEntry : resolvedDependencies.entrySet() )
         {
             ReleaseStageVersions versionMap = currentEntry.getValue();
-            
+
             prop.setProperty( "dependency." + currentEntry.getKey() + ".release",
-                              versionMap.getRelease() );
+                    versionMap.getRelease() );
             prop.setProperty( "dependency." + currentEntry.getKey() + ".development",
-                              versionMap.getDevelopment() );
+                    versionMap.getDevelopment() );
         }
     }
 
@@ -382,67 +384,4 @@ public class PropertiesReleaseDescriptorStore
     {
         return new File( mergeDescriptor.getWorkingDirectory(), "release.properties" );
     }
-    
-    private void decryptProperties( Properties properties )
-        throws IllegalStateException, SecDispatcherException, PlexusCipherException
-    {
-        String[] keys = new String[] { "scm.password", "scm.passphrase" };
-
-        for ( String key : keys )
-        {
-            String value = properties.getProperty( key );
-            if ( value != null )
-            {
-                properties.put( key, decrypt( value ) );
-            }
-        }
-    }
-
-    // From org.apache.maven.cli.MavenCli.encryption(CliRequest)
-    private String encryptAndDecorate( String passwd )
-        throws IllegalStateException, SecDispatcherException, PlexusCipherException
-    {
-        final String master = getMaster();
-
-        DefaultPlexusCipher cipher = new DefaultPlexusCipher();
-        String masterPasswd = cipher.decryptDecorated( master, DefaultSecDispatcher.SYSTEM_PROPERTY_SEC_LOCATION );
-        return cipher.encryptAndDecorate( passwd, masterPasswd );
-    }
-    
-    private String decrypt( String value ) throws IllegalStateException, SecDispatcherException, PlexusCipherException
-    {
-        final String master = getMaster();
-
-        DefaultPlexusCipher cipher = new DefaultPlexusCipher();
-        String masterPasswd = cipher.decryptDecorated( master, DefaultSecDispatcher.SYSTEM_PROPERTY_SEC_LOCATION );
-        return cipher.decryptDecorated( value, masterPasswd );
-    }
-    
-    private String getMaster() throws SecDispatcherException 
-    {
-        String configurationFile = secDispatcher.getConfigurationFile();
-
-        if ( configurationFile.startsWith( "~" ) )
-        {
-            configurationFile = System.getProperty( "user.home" ) + configurationFile.substring( 1 );
-        }
-
-        String file = System.getProperty( DefaultSecDispatcher.SYSTEM_PROPERTY_SEC_LOCATION, configurationFile );
-
-        String master = null;
-
-        SettingsSecurity sec = SecUtil.read( file, true );
-        if ( sec != null )
-        {
-            master = sec.getMaster();
-        }
-
-        if ( master == null )
-        {
-            throw new IllegalStateException( "Master password is not set in the setting security file: " + file );
-        }
-        
-        return master;
-    }
-
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorBuilder.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorBuilder.java
index 1cf3f9c3..0d739995 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorBuilder.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorBuilder.java
@@ -34,9 +34,8 @@ public class ReleaseDescriptorBuilder
 {
     /**
      * Hides inner logic of the release descriptor
-     * 
-     * @author Robert Scholte
      *
+     * @author Robert Scholte
      */
     public static final class BuilderReleaseDescriptor extends ModelloReleaseDescriptor implements ReleaseDescriptor
     {
@@ -44,9 +43,9 @@ public class ReleaseDescriptorBuilder
         {
         }
     }
-    
+
     private final BuilderReleaseDescriptor releaseDescriptor;
-    
+
     /**
      * <p>Constructor for ReleaseDescriptorBuilder.</p>
      */
@@ -443,9 +442,9 @@ public class ReleaseDescriptorBuilder
     /**
      * <p>setScmReleaseCommitComment.</p>
      *
-     * @since 3.0.0-M1
      * @param scmReleaseCommitComment a {@link java.lang.String} object
      * @return a {@link org.apache.maven.shared.release.config.ReleaseDescriptorBuilder} object
+     * @since 3.0.0-M1
      */
     public ReleaseDescriptorBuilder setScmReleaseCommitComment( String scmReleaseCommitComment )
     {
@@ -456,9 +455,9 @@ public class ReleaseDescriptorBuilder
     /**
      * <p>setScmDevelopmentCommitComment.</p>
      *
-     * @since 3.0.0-M1
      * @param scmDevelopmentCommitComment a {@link java.lang.String} object
      * @return a {@link org.apache.maven.shared.release.config.ReleaseDescriptorBuilder} object
+     * @since 3.0.0-M1
      */
     public ReleaseDescriptorBuilder setScmDevelopmentCommitComment( String scmDevelopmentCommitComment )
     {
@@ -469,9 +468,9 @@ public class ReleaseDescriptorBuilder
     /**
      * <p>setScmBranchCommitComment.</p>
      *
-     * @since 3.0.0-M1
      * @param scmBranchCommitComment a {@link java.lang.String} object
      * @return a {@link org.apache.maven.shared.release.config.ReleaseDescriptorBuilder} object
+     * @since 3.0.0-M1
      */
     public ReleaseDescriptorBuilder setScmBranchCommitComment( String scmBranchCommitComment )
     {
@@ -482,9 +481,9 @@ public class ReleaseDescriptorBuilder
     /**
      * <p>setScmRollbackCommitComment.</p>
      *
-     * @since 3.0.0-M1
      * @param scmRollbackCommitComment a {@link java.lang.String} object
      * @return a {@link org.apache.maven.shared.release.config.ReleaseDescriptorBuilder} object
+     * @since 3.0.0-M1
      */
     public ReleaseDescriptorBuilder setScmRollbackCommitComment( String scmRollbackCommitComment )
     {
@@ -759,7 +758,7 @@ public class ReleaseDescriptorBuilder
     /**
      * <p>addReleaseVersion.</p>
      *
-     * @param key a {@link java.lang.String} object
+     * @param key   a {@link java.lang.String} object
      * @param value a {@link java.lang.String} object
      * @return a {@link org.apache.maven.shared.release.config.ReleaseDescriptorBuilder} object
      */
@@ -772,7 +771,7 @@ public class ReleaseDescriptorBuilder
     /**
      * <p>addDevelopmentVersion.</p>
      *
-     * @param key a {@link java.lang.String} object
+     * @param key   a {@link java.lang.String} object
      * @param value a {@link java.lang.String} object
      * @return a {@link org.apache.maven.shared.release.config.ReleaseDescriptorBuilder} object
      */
@@ -785,7 +784,7 @@ public class ReleaseDescriptorBuilder
     /**
      * <p>addOriginalScmInfo.</p>
      *
-     * @param key a {@link java.lang.String} object
+     * @param key   a {@link java.lang.String} object
      * @param value a {@link org.apache.maven.model.Scm} object
      * @return a {@link org.apache.maven.shared.release.config.ReleaseDescriptorBuilder} object
      */
@@ -799,32 +798,32 @@ public class ReleaseDescriptorBuilder
      * <p>putOriginalVersion.</p>
      *
      * @param projectKey a {@link java.lang.String} object
-     * @param version a {@link java.lang.String} object
+     * @param version    a {@link java.lang.String} object
      */
     public void putOriginalVersion( String projectKey, String version )
     {
         releaseDescriptor.addOriginalVersion( projectKey, version );
     }
-    
+
     /**
      * <p>addDependencyOriginalVersion.</p>
      *
      * @param dependencyKey a {@link java.lang.String} object
-     * @param version a {@link java.lang.String} object
+     * @param version       a {@link java.lang.String} object
      * @return a {@link org.apache.maven.shared.release.config.ReleaseDescriptorBuilder} object
      */
     public ReleaseDescriptorBuilder addDependencyOriginalVersion( String dependencyKey, String version )
     {
         releaseDescriptor.addDependencyOriginalVersion( dependencyKey, version );
         return this;
-        
+
     }
-    
+
     /**
      * <p>addDependencyReleaseVersion.</p>
      *
      * @param dependencyKey a {@link java.lang.String} object
-     * @param version a {@link java.lang.String} object
+     * @param version       a {@link java.lang.String} object
      * @return a {@link org.apache.maven.shared.release.config.ReleaseDescriptorBuilder} object
      */
     public ReleaseDescriptorBuilder addDependencyReleaseVersion( String dependencyKey, String version )
@@ -832,12 +831,12 @@ public class ReleaseDescriptorBuilder
         releaseDescriptor.addDependencyReleaseVersion( dependencyKey, version );
         return this;
     }
-    
+
     /**
      * <p>addDependencyDevelopmentVersion.</p>
      *
      * @param dependencyKey a {@link java.lang.String} object
-     * @param version a {@link java.lang.String} object
+     * @param version       a {@link java.lang.String} object
      * @return a {@link org.apache.maven.shared.release.config.ReleaseDescriptorBuilder} object
      */
     public ReleaseDescriptorBuilder addDependencyDevelopmentVersion( String dependencyKey, String version )
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStore.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStore.java
index 4327be10..86b1f5a8 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStore.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStore.java
@@ -35,7 +35,7 @@ public interface ReleaseDescriptorStore
      * @throws org.apache.maven.shared.release.config.ReleaseDescriptorStoreException if any.
      */
     ReleaseDescriptorBuilder read( ReleaseDescriptorBuilder mergeDescriptor )
-        throws ReleaseDescriptorStoreException;
+            throws ReleaseDescriptorStoreException;
 
     /**
      * Save a configuration.
@@ -44,7 +44,7 @@ public interface ReleaseDescriptorStore
      * @throws org.apache.maven.shared.release.config.ReleaseDescriptorStoreException if any.
      */
     void write( ReleaseDescriptor config )
-        throws ReleaseDescriptorStoreException;
+            throws ReleaseDescriptorStoreException;
 
     /**
      * Remove a configuration.
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStoreException.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStoreException.java
index e6f3d708..75eccb44 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStoreException.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStoreException.java
@@ -25,13 +25,13 @@ package org.apache.maven.shared.release.config;
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
 public class ReleaseDescriptorStoreException
-    extends Exception
+        extends Exception
 {
     /**
      * <p>Constructor for ReleaseDescriptorStoreException.</p>
      *
      * @param message a {@link java.lang.String} object
-     * @param t a {@link java.lang.Throwable} object
+     * @param t       a {@link java.lang.Throwable} object
      */
     public ReleaseDescriptorStoreException( String message, Throwable t )
     {
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java
index 8ede3e5e..3847b52d 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java
@@ -59,7 +59,7 @@ public class ReleaseUtils
      * <p>copyPropertiesToReleaseDescriptor.</p>
      *
      * @param properties a {@link java.util.Properties} object
-     * @param builder a {@link org.apache.maven.shared.release.config.ReleaseDescriptorBuilder} object
+     * @param builder    a {@link org.apache.maven.shared.release.config.ReleaseDescriptorBuilder} object
      */
     public static void copyPropertiesToReleaseDescriptor( Properties properties, ReleaseDescriptorBuilder builder )
     {
@@ -141,8 +141,8 @@ public class ReleaseUtils
         }
         if ( properties.containsKey( "exec.activateProfiles" ) )
         {
-            builder.setActivateProfiles( 
-                         Arrays.asList( properties.getProperty( "exec.activateProfiles" ).split( "," ) ) );
+            builder.setActivateProfiles(
+                    Arrays.asList( properties.getProperty( "exec.activateProfiles" ).split( "," ) ) );
         }
         if ( properties.containsKey( "preparationGoals" ) )
         {
@@ -167,22 +167,22 @@ public class ReleaseUtils
         if ( properties.containsKey( "exec.snapshotReleasePluginAllowed" ) )
         {
             String snapshotReleasePluginAllowedStr = properties.getProperty( "exec.snapshotReleasePluginAllowed" );
-            builder.setSnapshotReleasePluginAllowed( Boolean.valueOf( snapshotReleasePluginAllowedStr ) );
+            builder.setSnapshotReleasePluginAllowed( Boolean.parseBoolean( snapshotReleasePluginAllowedStr ) );
         }
         if ( properties.containsKey( "remoteTagging" ) )
         {
             String remoteTaggingStr = properties.getProperty( "remoteTagging" );
-            builder.setRemoteTagging( Boolean.valueOf( remoteTaggingStr ) );
+            builder.setRemoteTagging( Boolean.parseBoolean( remoteTaggingStr ) );
         }
         if ( properties.containsKey( "pinExternals" ) )
         {
             String pinExternals = properties.getProperty( "pinExternals" );
-            builder.setPinExternals( Boolean.valueOf( pinExternals ) );
+            builder.setPinExternals( Boolean.parseBoolean( pinExternals ) );
         }
         if ( properties.containsKey( "pushChanges" ) )
         {
             String pushChanges = properties.getProperty( "pushChanges" );
-            builder.setPushChanges( Boolean.valueOf( pushChanges ) );
+            builder.setPushChanges( Boolean.parseBoolean( pushChanges ) );
         }
         if ( properties.containsKey( "workItem" ) )
         {
@@ -198,28 +198,28 @@ public class ReleaseUtils
 
         // boolean properties are not written to the properties file because the value from the caller is always used
 
-        for ( Iterator<?> i = properties.keySet().iterator(); i.hasNext(); )
+        for ( Object o : properties.keySet() )
         {
-            String property = (String) i.next();
+            String property = (String) o;
             if ( property.startsWith( "project.rel." ) )
             {
                 builder.addReleaseVersion( property.substring( "project.rel.".length() ),
-                                                     properties.getProperty( property ) );
+                        properties.getProperty( property ) );
             }
             else if ( property.startsWith( "project.dev." ) )
             {
                 builder.addDevelopmentVersion( property.substring( "project.dev.".length() ),
-                                                         properties.getProperty( property ) );
+                        properties.getProperty( property ) );
             }
             else if ( property.startsWith( "dependency.rel." ) )
             {
                 builder.addDependencyReleaseVersion( property.substring( "dependency.rel.".length() ),
-                                                     properties.getProperty( property ) );
+                        properties.getProperty( property ) );
             }
             else if ( property.startsWith( "dependency.dev." ) )
             {
                 builder.addDependencyDevelopmentVersion( property.substring( "dependency.dev.".length() ),
-                                                         properties.getProperty( property ) );
+                        properties.getProperty( property ) );
             }
             else if ( property.startsWith( "project.scm." ) )
             {
@@ -239,7 +239,7 @@ public class ReleaseUtils
                             IdentifiedScm scm = new IdentifiedScm();
                             scm.setConnection( properties.getProperty( "project.scm." + key + ".connection" ) );
                             scm.setDeveloperConnection(
-                                properties.getProperty( "project.scm." + key + ".developerConnection" ) );
+                                    properties.getProperty( "project.scm." + key + ".developerConnection" ) );
                             scm.setUrl( properties.getProperty( "project.scm." + key + ".url" ) );
                             scm.setTag( properties.getProperty( "project.scm." + key + ".tag" ) );
                             scm.setId( properties.getProperty( "project.scm." + key + ".id" ) );
@@ -271,12 +271,12 @@ public class ReleaseUtils
                 int endIndex;
                 String versionType;
 
-                if ( propertyName.indexOf( ".development" ) != -1 )
+                if ( propertyName.contains( ".development" ) )
                 {
                     endIndex = propertyName.lastIndexOf( ".development" );
                     versionType = DEVELOPMENT_KEY;
                 }
-                else if ( propertyName.indexOf( ".release" ) != -1 )
+                else if ( propertyName.contains( ".release" ) )
                 {
                     endIndex = propertyName.lastIndexOf( ".release" );
                     versionType = RELEASE_KEY;
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/env/DefaultReleaseEnvironment.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/env/DefaultReleaseEnvironment.java
index 1562c2e0..e2668445 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/env/DefaultReleaseEnvironment.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/env/DefaultReleaseEnvironment.java
@@ -26,12 +26,10 @@ import org.apache.maven.settings.Settings;
 
 /**
  * <p>DefaultReleaseEnvironment class.</p>
- *
  */
 public class DefaultReleaseEnvironment
-    implements ReleaseEnvironment
+        implements ReleaseEnvironment
 {
-
     private File mavenHome;
 
     private File javaHome;
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/AbstractMavenExecutor.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/AbstractMavenExecutor.java
index 0041351f..f63d2bf6 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/AbstractMavenExecutor.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/AbstractMavenExecutor.java
@@ -21,6 +21,7 @@ package org.apache.maven.shared.release.exec;
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.maven.settings.Proxy;
@@ -30,54 +31,34 @@ import org.apache.maven.settings.SettingsUtils;
 import org.apache.maven.settings.io.xpp3.SettingsXpp3Writer;
 import org.apache.maven.shared.release.ReleaseResult;
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
-import org.codehaus.plexus.component.annotations.Requirement;
-import org.codehaus.plexus.logging.LogEnabled;
-import org.codehaus.plexus.logging.Logger;
+import org.apache.maven.shared.release.util.MavenCrypto;
+import org.apache.maven.shared.release.util.MavenCrypto.MavenCryptoException;
 import org.codehaus.plexus.util.StringUtils;
-import org.sonatype.plexus.components.cipher.DefaultPlexusCipher;
-import org.sonatype.plexus.components.cipher.PlexusCipher;
-import org.sonatype.plexus.components.cipher.PlexusCipherException;
-import org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher;
-import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher;
-import org.sonatype.plexus.components.sec.dispatcher.SecDispatcherException;
-import org.sonatype.plexus.components.sec.dispatcher.SecUtil;
-import org.sonatype.plexus.components.sec.dispatcher.model.SettingsSecurity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static java.util.Objects.requireNonNull;
 
 /**
  * <p>Abstract AbstractMavenExecutor class.</p>
- *
  */
 public abstract class AbstractMavenExecutor
-    implements MavenExecutor, LogEnabled
+        implements MavenExecutor
 {
+    private final Logger logger = LoggerFactory.getLogger( getClass() );
 
-    private Logger logger;
-
-    /**
-     * When this plugin requires Maven 3.0 as minimum, this component can be removed and o.a.m.s.c.SettingsDecrypter be
-     * used instead.
-     */
-    @Requirement( role = SecDispatcher.class, hint = "mng-4384" )
-    private DefaultSecDispatcher secDispatcher;
-
-    /**
-     *
-     */
-    @Requirement
-    private PlexusCipher cipher;
+    private final MavenCrypto mavenCrypto;
 
-    /**
-     * <p>Constructor for AbstractMavenExecutor.</p>
-     */
-    protected AbstractMavenExecutor()
+    protected AbstractMavenExecutor( MavenCrypto mavenCrypto )
     {
+        this.mavenCrypto = requireNonNull( mavenCrypto );
     }
 
     @Override
     public void executeGoals( File workingDirectory, String goals, ReleaseEnvironment releaseEnvironment,
                               boolean interactive, String additionalArguments, String pomFileName,
                               ReleaseResult result )
-        throws MavenExecutorException
+            throws MavenExecutorException
     {
         List<String> goalsList = new ArrayList<>();
         if ( goals != null )
@@ -85,37 +66,27 @@ public abstract class AbstractMavenExecutor
             // accept both space and comma, so the old way still work
             // also accept line separators, so that goal lists can be spread
             // across multiple lines in the POM.
-            for ( String token : StringUtils.split( goals, ", \n\r\t" ) )
-            {
-                goalsList.add( token );
-            }
+            Collections.addAll( goalsList, StringUtils.split( goals, ", \n\r\t" ) );
         }
         executeGoals( workingDirectory, goalsList, releaseEnvironment, interactive, additionalArguments, pomFileName,
-                      result );
+                result );
     }
 
     protected abstract void executeGoals( File workingDirectory, List<String> goals,
                                           ReleaseEnvironment releaseEnvironment, boolean interactive,
                                           String additionalArguments, String pomFileName, ReleaseResult result )
-        throws MavenExecutorException;
+            throws MavenExecutorException;
 
     /**
      * <p>Getter for the field <code>logger</code>.</p>
      *
-     * @return a {@link org.codehaus.plexus.logging.Logger} object
+     * @return a {@link Logger} object
      */
     protected final Logger getLogger()
     {
         return logger;
     }
 
-    @Override
-    public void enableLogging( Logger logger )
-    {
-        this.logger = logger;
-    }
-
-
     /**
      * <p>encryptSettings.</p>
      *
@@ -129,26 +100,26 @@ public abstract class AbstractMavenExecutor
         for ( Server server : encryptedSettings.getServers() )
         {
             String password = server.getPassword();
-            if ( password != null && !isEncryptedString( password ) )
+            if ( password != null && !mavenCrypto.isEncryptedString( password ) )
             {
                 try
                 {
-                    server.setPassword( encryptAndDecorate( password ) );
+                    server.setPassword( mavenCrypto.encryptAndDecorate( password ) );
                 }
-                catch ( IllegalStateException | SecDispatcherException | PlexusCipherException e )
+                catch ( MavenCryptoException e )
                 {
                     // ignore
                 }
             }
 
             String passphrase = server.getPassphrase();
-            if ( passphrase != null && !isEncryptedString( passphrase ) )
+            if ( passphrase != null && !mavenCrypto.isEncryptedString( passphrase ) )
             {
                 try
                 {
-                    server.setPassphrase( encryptAndDecorate( passphrase ) );
+                    server.setPassphrase( mavenCrypto.encryptAndDecorate( passphrase ) );
                 }
-                catch ( IllegalStateException | SecDispatcherException | PlexusCipherException e )
+                catch ( MavenCryptoException e )
                 {
                     // ignore
                 }
@@ -158,13 +129,13 @@ public abstract class AbstractMavenExecutor
         for ( Proxy proxy : encryptedSettings.getProxies() )
         {
             String password = proxy.getPassword();
-            if ( password != null && !isEncryptedString( password ) )
+            if ( password != null && !mavenCrypto.isEncryptedString( password ) )
             {
                 try
                 {
-                    proxy.setPassword( encryptAndDecorate( password ) );
+                    proxy.setPassword( mavenCrypto.encryptAndDecorate( password ) );
                 }
-                catch ( IllegalStateException | SecDispatcherException | PlexusCipherException e )
+                catch ( MavenCryptoException e )
                 {
                     // ignore
                 }
@@ -174,42 +145,6 @@ public abstract class AbstractMavenExecutor
         return encryptedSettings;
     }
 
-    // From org.apache.maven.cli.MavenCli.encryption(CliRequest)
-    private String encryptAndDecorate( String passwd )
-        throws IllegalStateException, SecDispatcherException, PlexusCipherException
-    {
-        String configurationFile = secDispatcher.getConfigurationFile();
-
-        if ( configurationFile.startsWith( "~" ) )
-        {
-            configurationFile = System.getProperty( "user.home" ) + configurationFile.substring( 1 );
-        }
-
-        String file = System.getProperty( DefaultSecDispatcher.SYSTEM_PROPERTY_SEC_LOCATION, configurationFile );
-
-        String master = null;
-
-        SettingsSecurity sec = SecUtil.read( file, true );
-        if ( sec != null )
-        {
-            master = sec.getMaster();
-        }
-
-        if ( master == null )
-        {
-            throw new IllegalStateException( "Master password is not set in the setting security file: " + file );
-        }
-
-        DefaultPlexusCipher cipher = new DefaultPlexusCipher();
-        String masterPasswd = cipher.decryptDecorated( master, DefaultSecDispatcher.SYSTEM_PROPERTY_SEC_LOCATION );
-        return cipher.encryptAndDecorate( passwd, masterPasswd );
-    }
-
-    private boolean isEncryptedString( String str )
-    {
-        return cipher.isEncryptedString( str );
-    }
-
     /**
      * <p>getSettingsWriter.</p>
      *
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/CommandLineFactory.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/CommandLineFactory.java
index c90d69c1..50e7a12e 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/CommandLineFactory.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/CommandLineFactory.java
@@ -34,8 +34,8 @@ public interface CommandLineFactory
      * @param executable the executable
      * @return the command line
      * @throws org.apache.maven.shared.release.exec.MavenExecutorException if there was a problem creating
-     *         the command line
+     *                                                                     the command line
      */
     Commandline createCommandLine( String executable )
-        throws MavenExecutorException;
+            throws MavenExecutorException;
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/DefaultCommandLineFactory.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/DefaultCommandLineFactory.java
index e89b42bd..cdf8a191 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/DefaultCommandLineFactory.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/DefaultCommandLineFactory.java
@@ -19,7 +19,9 @@ package org.apache.maven.shared.release.exec;
  * under the License.
  */
 
-import org.codehaus.plexus.component.annotations.Component;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.codehaus.plexus.util.cli.Commandline;
 
 /**
@@ -27,13 +29,14 @@ import org.codehaus.plexus.util.cli.Commandline;
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-@Component( role = CommandLineFactory.class )
+@Singleton
+@Named
 public class DefaultCommandLineFactory
-    implements CommandLineFactory
+        implements CommandLineFactory
 {
     @Override
     public Commandline createCommandLine( String executable )
-        throws MavenExecutorException
+            throws MavenExecutorException
     {
         Commandline commandline = new Commandline();
         commandline.setExecutable( executable );
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/ForkedMavenExecutor.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/ForkedMavenExecutor.java
index 2c8907d0..240c62a1 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/ForkedMavenExecutor.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/ForkedMavenExecutor.java
@@ -19,6 +19,10 @@ package org.apache.maven.shared.release.exec;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
@@ -29,26 +33,35 @@ import java.util.List;
 import org.apache.maven.settings.io.xpp3.SettingsXpp3Writer;
 import org.apache.maven.shared.release.ReleaseResult;
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
+import org.apache.maven.shared.release.util.MavenCrypto;
 import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.cli.CommandLineException;
 import org.codehaus.plexus.util.cli.Commandline;
 
+import static java.util.Objects.requireNonNull;
+
 /**
- * Fork Maven to executed a series of goals.
+ * Fork Maven to execute a series of goals.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-@Component( role = MavenExecutor.class, hint = "forked-path" )
+@Singleton
+@Named( "forked-path" )
 public class ForkedMavenExecutor
-    extends AbstractMavenExecutor
+        extends AbstractMavenExecutor
 {
     /**
      * Command line factory.
      */
-    @Requirement
-    private CommandLineFactory commandLineFactory;
+    private final CommandLineFactory commandLineFactory;
+
+    @Inject
+    public ForkedMavenExecutor( MavenCrypto mavenCrypto,
+                                CommandLineFactory commandLineFactory )
+    {
+        super( mavenCrypto );
+        this.commandLineFactory = requireNonNull( commandLineFactory );
+    }
 
     /*
      * @noinspection UseOfSystemOutOrSystemErr
@@ -57,9 +70,9 @@ public class ForkedMavenExecutor
     public void executeGoals( File workingDirectory, List<String> goals, ReleaseEnvironment releaseEnvironment,
                               boolean interactive, String additionalArguments, String pomFileName,
                               ReleaseResult relResult )
-        throws MavenExecutorException
+            throws MavenExecutorException
     {
-        String mavenPath = null;
+        String mavenPath;
         // if null we use the current one
         if ( releaseEnvironment.getMavenHome() != null )
         {
@@ -78,7 +91,7 @@ public class ForkedMavenExecutor
             {
                 settingsFile = File.createTempFile( "release-settings", ".xml" );
                 SettingsXpp3Writer writer = getSettingsWriter();
-                
+
                 try ( FileWriter fileWriter = new FileWriter( settingsFile ) )
                 {
                     writer.write( fileWriter, encryptSettings( releaseEnvironment.getSettings() ) );
@@ -93,7 +106,7 @@ public class ForkedMavenExecutor
         {
 
             Commandline cl =
-                commandLineFactory.createCommandLine( mavenPath + File.separator + "bin" + File.separator + "mvn" );
+                    commandLineFactory.createCommandLine( mavenPath + File.separator + "bin" + File.separator + "mvn" );
 
             cl.setWorkingDirectory( workingDirectory.getAbsolutePath() );
 
@@ -134,14 +147,14 @@ public class ForkedMavenExecutor
 
             try
             {
-                relResult.appendInfo( "Executing: " + cl.toString() );
-                getLogger().info( "Executing: " + cl.toString() );
+                relResult.appendInfo( "Executing: " + cl );
+                getLogger().info( "Executing: " + cl );
 
                 int result = executeCommandLine( cl, System.in, stdOut, stdErr );
 
                 if ( result != 0 )
                 {
-                    throw new MavenExecutorException( "Maven execution failed, exit code: \'" + result + "\'", result );
+                    throw new MavenExecutorException( "Maven execution failed, exit code: '" + result + "'", result );
                 }
             }
             catch ( CommandLineException e )
@@ -162,22 +175,11 @@ public class ForkedMavenExecutor
         }
     }
 
-    /**
-     * <p>Setter for the field <code>commandLineFactory</code>.</p>
-     *
-     * @param commandLineFactory a {@link org.apache.maven.shared.release.exec.CommandLineFactory} object
-     */
-    public void setCommandLineFactory( CommandLineFactory commandLineFactory )
-    {
-        this.commandLineFactory = commandLineFactory;
-    }
-
-
     /**
      * <p>executeCommandLine.</p>
      *
-     * @param cl a {@link org.codehaus.plexus.util.cli.Commandline} object
-     * @param systemIn a {@link java.io.InputStream} object
+     * @param cl        a {@link org.codehaus.plexus.util.cli.Commandline} object
+     * @param systemIn  a {@link java.io.InputStream} object
      * @param systemOut a {@link java.io.OutputStream} object
      * @param systemErr a {@link java.io.OutputStream} object
      * @return a int
@@ -185,7 +187,7 @@ public class ForkedMavenExecutor
      */
     public static int executeCommandLine( Commandline cl, InputStream systemIn, OutputStream systemOut,
                                           OutputStream systemErr )
-        throws CommandLineException
+            throws CommandLineException
     {
         if ( cl == null )
         {
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/InvokerMavenExecutor.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/InvokerMavenExecutor.java
index 2a6e061b..bed98cbd 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/InvokerMavenExecutor.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/InvokerMavenExecutor.java
@@ -19,6 +19,10 @@ package org.apache.maven.shared.release.exec;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
@@ -27,9 +31,9 @@ import java.util.List;
 import java.util.Properties;
 
 import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.OptionBuilder;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
-import org.apache.commons.cli.PosixParser;
 import org.apache.maven.settings.io.xpp3.SettingsXpp3Writer;
 import org.apache.maven.shared.invoker.DefaultInvocationRequest;
 import org.apache.maven.shared.invoker.DefaultInvoker;
@@ -41,44 +45,44 @@ import org.apache.maven.shared.invoker.InvokerLogger;
 import org.apache.maven.shared.invoker.MavenInvocationException;
 import org.apache.maven.shared.release.ReleaseResult;
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.logging.Logger;
+import org.apache.maven.shared.release.util.MavenCrypto;
 import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.slf4j.Logger;
 
 /**
  * Fork Maven using the maven-invoker shared library.
  */
-@Component( role = MavenExecutor.class, hint = "invoker" )
-@SuppressWarnings( "static-access" )
+@Singleton
+@Named( "invoker" )
 public class InvokerMavenExecutor
-    extends AbstractMavenExecutor
+        extends AbstractMavenExecutor
 {
 
     private static final Options OPTIONS = new Options();
 
-    private static final char SET_SYSTEM_PROPERTY = 'D';
+    private static final String SET_SYSTEM_PROPERTY = "D";
 
-    private static final char OFFLINE = 'o';
+    private static final String OFFLINE = "o";
 
-    private static final char REACTOR = 'r';
+    private static final String REACTOR = "r";
 
-    private static final char QUIET = 'q';
+    private static final String QUIET = "q";
 
-    private static final char DEBUG = 'X';
+    private static final String DEBUG = "X";
 
-    private static final char ERRORS = 'e';
+    private static final String ERRORS = "e";
 
-    private static final char NON_RECURSIVE = 'N';
+    private static final String NON_RECURSIVE = "N";
 
-    private static final char UPDATE_SNAPSHOTS = 'U';
+    private static final String UPDATE_SNAPSHOTS = "U";
 
-    private static final char ACTIVATE_PROFILES = 'P';
+    private static final String ACTIVATE_PROFILES = "P";
 
-    private static final char CHECKSUM_FAILURE_POLICY = 'C';
+    private static final String CHECKSUM_FAILURE_POLICY = "C";
 
-    private static final char CHECKSUM_WARNING_POLICY = 'c';
+    private static final String CHECKSUM_WARNING_POLICY = "c";
 
-    private static final char ALTERNATE_USER_SETTINGS = 's';
+    private static final String ALTERNATE_USER_SETTINGS = "s";
 
     private static final String ALTERNATE_GLOBAL_SETTINGS = "gs";
 
@@ -87,108 +91,178 @@ public class InvokerMavenExecutor
     private static final String FAIL_AT_END = "fae";
 
     private static final String FAIL_NEVER = "fn";
-    
+
     private static final String ALTERNATE_POM_FILE = "f";
-    
+
     private static final String THREADS = "T";
 
     private static final String BATCH_MODE = "B";
-    
-    /** Constant <code>ALTERNATE_USER_TOOLCHAINS='t'</code> */
-    public static final char ALTERNATE_USER_TOOLCHAINS = 't';
-    
+
+    public static final String ALTERNATE_USER_TOOLCHAINS = "t";
+
     static
     {
         OPTIONS.addOption(
-            OptionBuilder.withLongOpt( "define" ).hasArg().withDescription( "Define a system property" ).create(
-                SET_SYSTEM_PROPERTY ) );
+                Option.builder( SET_SYSTEM_PROPERTY )
+                        .longOpt( "define" )
+                        .numberOfArgs( 2 )
+                        .valueSeparator( '=' )
+                        .desc( "Define a system property" )
+                        .build() );
+
+        OPTIONS.addOption(
+                Option.builder( OFFLINE )
+                        .longOpt( "offline" )
+                        .desc( "Work offline" )
+                        .build() );
+
+        OPTIONS.addOption(
+                Option.builder( QUIET )
+                        .longOpt( "quiet" )
+                        .desc( "Quiet output - only show errors" )
+                        .build() );
+
+        OPTIONS.addOption(
+                Option.builder( DEBUG )
+                        .longOpt( "debug" )
+                        .desc( "Produce execution debug output" )
+                        .build() );
+
+        OPTIONS.addOption(
+                Option.builder( ERRORS )
+                        .longOpt( "errors" )
+                        .desc( "Produce execution error messages" )
+                        .build() );
+
+        OPTIONS.addOption(
+                Option.builder( REACTOR )
+                        .longOpt( "reactor" )
+                        .desc( "Execute goals for project found in the reactor" )
+                        .build() );
+
+        OPTIONS.addOption(
+                Option.builder( NON_RECURSIVE )
+                        .longOpt( "non-recursive" )
+                        .desc( "Do not recurse into sub-projects" )
+                        .build() );
+
+        OPTIONS.addOption(
+                Option.builder( UPDATE_SNAPSHOTS )
+                        .longOpt( "update-snapshots" )
+                        .desc( "Forces a check for updated releases and snapshots on remote repositories" )
+                        .build() );
+
+        OPTIONS.addOption(
+                Option.builder( ACTIVATE_PROFILES )
+                        .longOpt( "activate-profiles" )
+                        .desc( "Comma-delimited list of profiles to activate" )
+                        .hasArg()
+                        .build() );
 
-        OPTIONS.addOption( OptionBuilder.withLongOpt( "offline" ).withDescription( "Work offline" ).create( OFFLINE ) );
+        OPTIONS.addOption(
+                Option.builder( CHECKSUM_FAILURE_POLICY )
+                        .longOpt( "strict-checksums" )
+                        .desc( "Fail the build if checksums don't match" )
+                        .build() );
 
         OPTIONS.addOption(
-            OptionBuilder.withLongOpt( "quiet" ).withDescription( "Quiet output - only show errors" ).create( QUIET ) );
+                Option.builder( CHECKSUM_WARNING_POLICY )
+                        .longOpt( "lax-checksums" )
+                        .desc( "Warn if checksums don't match" )
+                        .build() );
 
         OPTIONS.addOption(
-            OptionBuilder.withLongOpt( "debug" ).withDescription( "Produce execution debug output" ).create( DEBUG ) );
+                Option.builder( ALTERNATE_USER_SETTINGS )
+                        .longOpt( "settings" )
+                        .desc( "Alternate path for the user settings file" )
+                        .hasArg()
+                        .build() );
 
         OPTIONS.addOption(
-            OptionBuilder.withLongOpt( "errors" ).withDescription( "Produce execution error messages" ).create(
-                ERRORS ) );
+                Option.builder( ALTERNATE_GLOBAL_SETTINGS )
+                        .longOpt( "global-settings" )
+                        .desc( "Alternate path for the global settings file" )
+                        .hasArg()
+                        .build() );
 
-        OPTIONS.addOption( OptionBuilder.withLongOpt( "reactor" ).withDescription(
-            "Execute goals for project found in the reactor" ).create( REACTOR ) );
+        OPTIONS.addOption(
+                Option.builder( FAIL_FAST )
+                        .longOpt( "fail-fast" )
+                        .desc( "Stop at first failure in reactorized builds" )
+                        .build() );
 
         OPTIONS.addOption(
-            OptionBuilder.withLongOpt( "non-recursive" ).withDescription( "Do not recurse into sub-projects" ).create(
-                NON_RECURSIVE ) );
+                Option.builder( FAIL_AT_END )
+                        .longOpt( "fail-at-end" )
+                        .desc( "Only fail the build afterwards; allow all non-impacted builds to continue" )
+                        .build() );
 
-        OPTIONS.addOption( OptionBuilder.withLongOpt( "update-snapshots" ).withDescription(
-            "Forces a check for updated releases and snapshots on remote repositories" ).create( UPDATE_SNAPSHOTS ) );
+        OPTIONS.addOption(
+                Option.builder( FAIL_NEVER )
+                        .longOpt( "fail-never" )
+                        .desc( "NEVER fail the build, regardless of project result" )
+                        .build() );
 
-        OPTIONS.addOption( OptionBuilder.withLongOpt( "activate-profiles" ).withDescription(
-            "Comma-delimited list of profiles to activate" ).hasArg().create( ACTIVATE_PROFILES ) );
+        OPTIONS.addOption(
+                Option.builder( ALTERNATE_POM_FILE )
+                        .longOpt( "file" )
+                        .desc( "Force the use of an alternate POM file." )
+                        .hasArg()
+                        .build() );
 
-        OPTIONS.addOption( OptionBuilder.withLongOpt( "strict-checksums" ).withDescription(
-            "Fail the build if checksums don't match" ).create( CHECKSUM_FAILURE_POLICY ) );
+        OPTIONS.addOption(
+                Option.builder( THREADS )
+                        .longOpt( "threads" )
+                        .desc( "Thread count, for instance 2.0C where C is core multiplied" )
+                        .hasArg()
+                        .build() );
 
         OPTIONS.addOption(
-            OptionBuilder.withLongOpt( "lax-checksums" ).withDescription( "Warn if checksums don't match" ).create(
-                CHECKSUM_WARNING_POLICY ) );
-
-        OPTIONS.addOption( OptionBuilder.withLongOpt( "settings" ).withDescription(
-            "Alternate path for the user settings file" ).hasArg().create( ALTERNATE_USER_SETTINGS ) );
-
-        OPTIONS.addOption( OptionBuilder.withLongOpt( "global-settings" ).withDescription(
-            " Alternate path for the global settings file" ).hasArg().create( ALTERNATE_GLOBAL_SETTINGS ) );
-
-        OPTIONS.addOption( OptionBuilder.withLongOpt( "fail-fast" ).withDescription(
-            "Stop at first failure in reactorized builds" ).create( FAIL_FAST ) );
-
-        OPTIONS.addOption( OptionBuilder.withLongOpt( "fail-at-end" ).withDescription(
-            "Only fail the build afterwards; allow all non-impacted builds to continue" ).create( FAIL_AT_END ) );
-
-        OPTIONS.addOption( OptionBuilder.withLongOpt( "fail-never" ).withDescription(
-            "NEVER fail the build, regardless of project result" ).create( FAIL_NEVER ) );
-        
-        OPTIONS.addOption( OptionBuilder.withLongOpt( "file" ).withDescription( 
-            "Force the use of an alternate POM file." ).hasArg().create( ALTERNATE_POM_FILE ) );
-        
-        OPTIONS.addOption( OptionBuilder.withLongOpt( "threads" ).withDescription( 
-            "Thread count, for instance 2.0C where C is core multiplied" ).hasArg().create( THREADS ) );
-        
-        OPTIONS.addOption( OptionBuilder.withLongOpt( "batch-mode" ).withDescription( 
-            "Run in non-interactive (batch) mode" ).create( BATCH_MODE ) );
-        
-        OPTIONS.addOption( OptionBuilder.withLongOpt( "toolchains" ).withDescription( 
-            "Alternate path for the user toolchains file" ).hasArg().create( ALTERNATE_USER_TOOLCHAINS ) );
+                Option.builder( BATCH_MODE )
+                        .longOpt( "batch-mode" )
+                        .desc( "Run in non-interactive (batch) mode" )
+                        .build() );
+
+        OPTIONS.addOption(
+                Option.builder( ALTERNATE_USER_TOOLCHAINS )
+                        .longOpt( "toolchains" )
+                        .desc( "Alternate path for the user toolchains file" )
+                        .hasArg()
+                        .build() );
+    }
+
+    @Inject
+    public InvokerMavenExecutor( MavenCrypto mavenCrypto )
+    {
+        super( mavenCrypto );
     }
 
     // TODO: Configuring an invocation request from a command line could as well be part of the Invoker API
+
     /**
      * <p>setupRequest.</p>
      *
-     * @param req a {@link org.apache.maven.shared.invoker.InvocationRequest} object
-     * @param bridge a {@link org.apache.maven.shared.invoker.InvokerLogger} object
+     * @param req                 a {@link org.apache.maven.shared.invoker.InvocationRequest} object
+     * @param bridge              a {@link org.apache.maven.shared.invoker.InvokerLogger} object
      * @param additionalArguments a {@link java.lang.String} object
      * @throws org.apache.maven.shared.release.exec.MavenExecutorException if any.
      */
     protected void setupRequest( InvocationRequest req,
                                  InvokerLogger bridge,
-                               String additionalArguments )
-        throws MavenExecutorException
+                                 String additionalArguments )
+            throws MavenExecutorException
     {
         try
         {
             String[] args = CommandLineUtils.translateCommandline( additionalArguments );
-            CommandLine cli = new PosixParser().parse( OPTIONS, args );
+            CommandLine cli = new DefaultParser().parse( OPTIONS, args );
 
             if ( cli.hasOption( SET_SYSTEM_PROPERTY ) )
             {
                 String[] properties = cli.getOptionValues( SET_SYSTEM_PROPERTY );
                 Properties props = new Properties();
-                for ( int i = 0; i < properties.length; i++ )
+                for ( String property : properties )
                 {
-                    String property = properties[i];
                     String name, value;
                     int sep = property.indexOf( "=" );
                     if ( sep <= 0 )
@@ -242,7 +316,7 @@ public class InvokerMavenExecutor
             if ( cli.hasOption( ACTIVATE_PROFILES ) )
             {
                 String[] profiles = cli.getOptionValues( ACTIVATE_PROFILES );
-                
+
                 if ( profiles != null )
                 {
                     req.setProfiles( Arrays.asList( profiles ) );
@@ -262,7 +336,7 @@ public class InvokerMavenExecutor
             {
                 req.setUserSettingsFile( new File( cli.getOptionValue( ALTERNATE_USER_SETTINGS ) ) );
             }
-            
+
             if ( cli.hasOption( ALTERNATE_GLOBAL_SETTINGS ) )
             {
                 req.setGlobalSettingsFile( new File( cli.getOptionValue( ALTERNATE_GLOBAL_SETTINGS ) ) );
@@ -291,22 +365,22 @@ public class InvokerMavenExecutor
                     req.setPomFileName( cli.getOptionValue( ALTERNATE_POM_FILE ) );
                 }
             }
-            
+
             if ( cli.hasOption( THREADS ) )
             {
                 req.setThreads( cli.getOptionValue( THREADS ) );
             }
-            
+
             if ( cli.hasOption( BATCH_MODE ) )
             {
                 req.setBatchMode( true );
             }
-            
+
             if ( cli.hasOption( ALTERNATE_USER_TOOLCHAINS ) )
             {
                 req.setToolchainsFile( new File( cli.getOptionValue( ALTERNATE_USER_TOOLCHAINS ) ) );
             }
-            
+
         }
         catch ( Exception e )
         {
@@ -318,12 +392,12 @@ public class InvokerMavenExecutor
     public void executeGoals( File workingDirectory, List<String> goals, ReleaseEnvironment releaseEnvironment,
                               boolean interactive, String additionalArguments, String pomFileName,
                               ReleaseResult result )
-        throws MavenExecutorException
+            throws MavenExecutorException
     {
         InvocationOutputHandler handler = getOutputHandler();
         InvokerLogger bridge = getInvokerLogger();
 
-        File mavenPath = null;
+        File mavenPath;
         // if null we use the current one
         if ( releaseEnvironment.getMavenHome() != null )
         {
@@ -367,7 +441,7 @@ public class InvokerMavenExecutor
             {
                 settingsFile = File.createTempFile( "release-settings", ".xml" );
                 SettingsXpp3Writer writer = getSettingsWriter();
-                
+
                 try ( FileWriter fileWriter = new FileWriter( settingsFile ) )
                 {
                     writer.write( fileWriter, encryptSettings( releaseEnvironment.getSettings() ) );
@@ -398,13 +472,13 @@ public class InvokerMavenExecutor
                 if ( invocationResult.getExecutionException() != null )
                 {
                     throw new MavenExecutorException( "Error executing Maven.",
-                                                      invocationResult.getExecutionException() );
+                            invocationResult.getExecutionException() );
                 }
                 if ( invocationResult.getExitCode() != 0 )
                 {
                     throw new MavenExecutorException(
-                        "Maven execution failed, exit code: \'" + invocationResult.getExitCode() + "\'",
-                        invocationResult.getExitCode() );
+                            "Maven execution failed, exit code: '" + invocationResult.getExitCode() + "'",
+                            invocationResult.getExitCode() );
                 }
             }
             catch ( MavenInvocationException e )
@@ -442,9 +516,9 @@ public class InvokerMavenExecutor
     }
 
     private static final class Handler
-        implements InvocationOutputHandler
+            implements InvocationOutputHandler
     {
-        private Logger logger;
+        private final Logger logger;
 
         Handler( Logger logger )
         {
@@ -458,10 +532,10 @@ public class InvokerMavenExecutor
     }
 
     private static final class LoggerBridge
-        implements InvokerLogger
+            implements InvokerLogger
     {
 
-        private Logger logger;
+        private final Logger logger;
 
         LoggerBridge( Logger logger )
         {
@@ -495,19 +569,19 @@ public class InvokerMavenExecutor
         @Override
         public void fatalError( String message, Throwable error )
         {
-            logger.fatalError( message, error );
+            logger.error( message, error );
         }
 
         @Override
         public void fatalError( String message )
         {
-            logger.fatalError( message );
+            logger.error( message );
         }
 
         @Override
         public int getThreshold()
         {
-            return logger.getThreshold();
+            return InvokerLogger.DEBUG;
         }
 
         @Override
@@ -537,7 +611,7 @@ public class InvokerMavenExecutor
         @Override
         public boolean isFatalErrorEnabled()
         {
-            return logger.isFatalErrorEnabled();
+            return logger.isErrorEnabled();
         }
 
         @Override
@@ -556,7 +630,7 @@ public class InvokerMavenExecutor
         public void setThreshold( int level )
         {
             // NOTE:
-            // logger.setThreadhold( level )
+            // logger.setThreshold( level )
             // is not supported in plexus-container-default:1.0-alpha-9 as used in Maven 2.x
         }
 
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/MavenExecutor.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/MavenExecutor.java
index e3fd6f13..53475a7e 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/MavenExecutor.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/MavenExecutor.java
@@ -19,11 +19,11 @@ package org.apache.maven.shared.release.exec;
  * under the License.
  */
 
+import java.io.File;
+
 import org.apache.maven.shared.release.ReleaseResult;
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
 
-import java.io.File;
-
 /**
  * Execute Maven. May be implemented as a forked instance, or embedded.
  *
@@ -45,5 +45,5 @@ public interface MavenExecutor
      */
     void executeGoals( File workingDirectory, String goals, ReleaseEnvironment releaseEnvironment,
                        boolean interactive, String additionalArguments, String pomFileName, ReleaseResult result )
-        throws MavenExecutorException;
+            throws MavenExecutorException;
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/MavenExecutorException.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/MavenExecutorException.java
index 9d8c8154..7a689493 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/MavenExecutorException.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/MavenExecutorException.java
@@ -25,14 +25,14 @@ package org.apache.maven.shared.release.exec;
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
 public class MavenExecutorException
-    extends Exception
+        extends Exception
 {
     private int exitCode;
 
     /**
      * <p>Constructor for MavenExecutorException.</p>
      *
-     * @param message a {@link java.lang.String} object
+     * @param message  a {@link java.lang.String} object
      * @param exitCode a int
      */
     public MavenExecutorException( String message, int exitCode )
@@ -46,7 +46,7 @@ public class MavenExecutorException
      * <p>Constructor for MavenExecutorException.</p>
      *
      * @param message a {@link java.lang.String} object
-     * @param cause a {@link java.lang.Throwable} object
+     * @param cause   a {@link java.lang.Throwable} object
      */
     public MavenExecutorException( String message, Throwable cause )
     {
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/RawStreamPumper.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/RawStreamPumper.java
index de38e44b..34da6970 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/RawStreamPumper.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/RawStreamPumper.java
@@ -25,29 +25,28 @@ import java.io.OutputStream;
 
 /**
  * <p>RawStreamPumper class.</p>
- *
  */
 public class RawStreamPumper
-    extends Thread
+        extends Thread
 {
-    private InputStream in;
+    private final InputStream in;
 
-    private OutputStream out;
+    private final OutputStream out;
 
     boolean done;
 
     boolean poll;
 
-    byte buffer[] = new byte[256];
+    byte[] buffer = new byte[256];
 
     /**
      * <p>Constructor for RawStreamPumper.</p>
      *
-     * @param in a {@link java.io.InputStream} object
-     * @param out a {@link java.io.OutputStream} object
+     * @param in   a {@link java.io.InputStream} object
+     * @param out  a {@link java.io.OutputStream} object
      * @param poll a boolean
      */
-    public RawStreamPumper( InputStream in , OutputStream out, boolean poll )
+    public RawStreamPumper( InputStream in, OutputStream out, boolean poll )
     {
         this.in = in;
         this.out = out;
@@ -57,10 +56,10 @@ public class RawStreamPumper
     /**
      * <p>Constructor for RawStreamPumper.</p>
      *
-     * @param in a {@link java.io.InputStream} object
+     * @param in  a {@link java.io.InputStream} object
      * @param out a {@link java.io.OutputStream} object
      */
-    public RawStreamPumper( InputStream in , OutputStream out )
+    public RawStreamPumper( InputStream in, OutputStream out )
     {
         this.in = in;
         this.out = out;
@@ -81,7 +80,7 @@ public class RawStreamPumper
      * @throws java.io.IOException if any.
      */
     public void closeInput()
-        throws IOException
+            throws IOException
     {
         in.close();
     }
@@ -92,7 +91,7 @@ public class RawStreamPumper
      * @throws java.io.IOException if any.
      */
     public void closeOutput()
-        throws IOException
+            throws IOException
     {
         out.close();
     }
@@ -145,7 +144,7 @@ public class RawStreamPumper
         }
         catch ( Throwable e )
         {
-            // Catched everything
+            // Caught everything
         }
         finally
         {
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/TeeConsumer.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/TeeConsumer.java
index c10788e0..c30d588a 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/TeeConsumer.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/TeeConsumer.java
@@ -19,28 +19,28 @@ package org.apache.maven.shared.release.exec;
  * under the License.
  */
 
-import org.codehaus.plexus.util.cli.StreamConsumer;
-
 import java.io.PrintStream;
 
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
 /**
  * Consumer that both funnels to System.out/err, and stores in an internal buffer.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
 public class TeeConsumer
-    implements StreamConsumer
+        implements StreamConsumer
 {
-    private PrintStream stream;
+    private final PrintStream stream;
 
     /**
      * @noinspection StringBufferField
      */
-    private StringBuffer content = new StringBuffer();
+    private final StringBuffer content = new StringBuffer();
 
     private static final String LS = System.getProperty( "line.separator" );
 
-    private String indent;
+    private final String indent;
 
     /**
      * <p>Constructor for TeeConsumer.</p>
@@ -61,7 +61,6 @@ public class TeeConsumer
     public TeeConsumer( PrintStream stream, String indent )
     {
         this.stream = stream;
-
         this.indent = indent;
     }
 
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/TeeOutputStream.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/TeeOutputStream.java
index bfa6143d..363e76ad 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/TeeOutputStream.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/exec/TeeOutputStream.java
@@ -26,13 +26,12 @@ import java.io.OutputStream;
 
 /**
  * <p>TeeOutputStream class.</p>
- *
  */
 public class TeeOutputStream
-    extends FilterOutputStream
+        extends FilterOutputStream
 {
-    private ByteArrayOutputStream bout = new ByteArrayOutputStream( 1024 * 8 );
-    private byte indent[];
+    private final ByteArrayOutputStream bout = new ByteArrayOutputStream( 1024 * 8 );
+    private final byte[] indent;
     private int last = '\n';
 
     /**
@@ -49,7 +48,7 @@ public class TeeOutputStream
      * <p>Constructor for TeeOutputStream.</p>
      *
      * @param out a {@link java.io.OutputStream} object
-     * @param i a {@link java.lang.String} object
+     * @param i   a {@link java.lang.String} object
      */
     public TeeOutputStream( OutputStream out, String i )
     {
@@ -59,7 +58,7 @@ public class TeeOutputStream
 
     @Override
     public void write( byte[] b, int off, int len )
-        throws IOException
+            throws IOException
     {
         for ( int x = 0; x < len; x++ )
         {
@@ -81,7 +80,7 @@ public class TeeOutputStream
 
     @Override
     public void write( int b )
-        throws IOException
+            throws IOException
     {
         if ( last == '\n' || ( last == '\r' && b != '\n' ) )
         {
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractBackupPomsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractBackupPomsPhase.java
index 81963de5..25770ecb 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractBackupPomsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractBackupPomsPhase.java
@@ -19,18 +19,18 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import java.io.File;
+
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.release.util.ReleaseUtil;
 
-import java.io.File;
-
 /**
  * <p>Abstract AbstractBackupPomsPhase class.</p>
  *
  * @author Edwin Punzalan
  */
 public abstract class AbstractBackupPomsPhase
-    extends AbstractReleasePhase
+        extends AbstractReleasePhase
 {
     private final String backupSuffix = ".releaseBackup";
 
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckPomPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractCheckPomPhase.java
similarity index 78%
rename from maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckPomPhase.java
rename to maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractCheckPomPhase.java
index 128721fd..37c5e4c6 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckPomPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractCheckPomPhase.java
@@ -19,6 +19,8 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import java.util.List;
+
 import org.apache.maven.artifact.ArtifactUtils;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.scm.manager.NoSuchScmProviderException;
@@ -32,33 +34,41 @@ import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 import org.codehaus.plexus.util.StringUtils;
 
-import java.util.List;
+import static java.util.Objects.requireNonNull;
 
 /**
  * Phase that checks the validity of the POM before release.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-public class CheckPomPhase
-    extends AbstractReleasePhase
+public abstract class AbstractCheckPomPhase
+        extends AbstractReleasePhase
 {
 
+    private final ScmRepositoryConfigurator scmRepositoryConfigurator;
+
     /**
      * @since 2.4
      */
-    private boolean scmRequired = true;
+    private final boolean scmRequired;
 
     /**
      * @since 2.5.2
      */
-    private boolean snapshotsRequired = true;
+    private final boolean snapshotsRequired;
 
-    private ScmRepositoryConfigurator scmRepositoryConfigurator;
+    public AbstractCheckPomPhase( ScmRepositoryConfigurator scmRepositoryConfigurator, boolean scmRequired,
+                                  boolean snapshotsRequired )
+    {
+        this.scmRepositoryConfigurator = requireNonNull( scmRepositoryConfigurator );
+        this.scmRequired = scmRequired;
+        this.snapshotsRequired = snapshotsRequired;
+    }
 
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                   List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult result = new ReleaseResult();
 
@@ -68,13 +78,13 @@ public class CheckPomPhase
             if ( StringUtils.isEmpty( releaseDescriptor.getScmSourceUrl() ) )
             {
                 throw new ReleaseFailureException(
-                    "Missing required setting: scm connection or developerConnection must be specified." );
+                        "Missing required setting: scm connection or developerConnection must be specified." );
             }
 
             try
             {
                 scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor,
-                                                                   releaseEnvironment.getSettings() );
+                        releaseEnvironment.getSettings() );
             }
             catch ( ScmRepositoryException e )
             {
@@ -83,7 +93,7 @@ public class CheckPomPhase
             catch ( NoSuchScmProviderException e )
             {
                 throw new ReleaseFailureException(
-                    "The provider given in the SCM URL could not be found: " + e.getMessage() );
+                        "The provider given in the SCM URL could not be found: " + e.getMessage() );
             }
         }
 
@@ -112,7 +122,7 @@ public class CheckPomPhase
     @Override
     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                    List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         // It makes no modifications, so simulate is the same as execute
         return execute( releaseDescriptor, releaseEnvironment, reactorProjects );
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/InputVariablesPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractInputVariablesPhase.java
similarity index 74%
copy from maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/InputVariablesPhase.java
copy to maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractInputVariablesPhase.java
index bdf292fb..bae1798b 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/InputVariablesPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractInputVariablesPhase.java
@@ -19,9 +19,11 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.maven.artifact.ArtifactUtils;
 import org.apache.maven.project.MavenProject;
@@ -39,7 +41,6 @@ import org.apache.maven.shared.release.policy.naming.NamingPolicyRequest;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 import org.apache.maven.shared.release.util.ReleaseUtil;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.components.interactivity.Prompter;
 import org.codehaus.plexus.components.interactivity.PrompterException;
 import org.codehaus.plexus.interpolation.InterpolationException;
@@ -50,45 +51,58 @@ import org.codehaus.plexus.interpolation.RecursionInterceptor;
 import org.codehaus.plexus.interpolation.StringSearchInterpolator;
 import org.codehaus.plexus.util.StringUtils;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * Input any variables that were not yet configured.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-public class InputVariablesPhase
-    extends AbstractReleasePhase
+public abstract class AbstractInputVariablesPhase
+        extends AbstractReleasePhase
 {
     /**
      * Component used to prompt for input.
      */
-    @Requirement
-    private Prompter prompter;
+    private final AtomicReference<Prompter> prompter;
 
     /**
-     * Whether this is a branch or a tag operation.
+     * Tool that gets a configured SCM repository from release configuration.
      */
-    private boolean branchOperation;
+    private final ScmRepositoryConfigurator scmRepositoryConfigurator;
 
     /**
-     * Tool that gets a configured SCM repository from release configuration.
+     * Component used for custom or default naming policy
      */
-    @Requirement
-    private ScmRepositoryConfigurator scmRepositoryConfigurator;
+    private final Map<String, NamingPolicy> namingPolicies;
 
     /**
-     * Component used for custom or default naming policy
+     * Whether this is a branch or a tag operation.
      */
-    @Requirement
-    private Map<String, NamingPolicy> namingPolicies;
+    private final boolean branchOperation;
 
     /**
      * The default naming policy to apply, if any
      */
-    private String defaultNamingPolicy;
+    private final String defaultNamingPolicy;
+
+    protected AbstractInputVariablesPhase( Prompter prompter, ScmRepositoryConfigurator scmRepositoryConfigurator,
+                                        Map<String, NamingPolicy> namingPolicies, boolean branchOperation,
+                                        String defaultNamingPolicy )
+    {
+        this.prompter = new AtomicReference<>( requireNonNull( prompter ) );
+        this.scmRepositoryConfigurator = requireNonNull( scmRepositoryConfigurator );
+        this.namingPolicies = requireNonNull( namingPolicies );
+        this.branchOperation = branchOperation;
+        this.defaultNamingPolicy = defaultNamingPolicy;
+    }
 
-    void setPrompter( Prompter prompter )
+    /**
+     * For easier testing only!
+     */
+    public void setPrompter( Prompter prompter )
     {
-        this.prompter = prompter;
+        this.prompter.set( prompter );
     }
 
     boolean isBranchOperation()
@@ -99,27 +113,27 @@ public class InputVariablesPhase
     /**
      * <p>getScmProvider.</p>
      *
-     * @param releaseDescriptor a {@link org.apache.maven.shared.release.config.ReleaseDescriptor} object
-     * @param releaseEnvironment a {@link org.apache.maven.shared.release.env.ReleaseEnvironment} object
-     * @return a {@link org.apache.maven.scm.provider.ScmProvider} object
-     * @throws org.apache.maven.shared.release.scm.ReleaseScmRepositoryException if any.
-     * @throws org.apache.maven.shared.release.ReleaseExecutionException if any.
+     * @param releaseDescriptor  a {@link ReleaseDescriptor} object
+     * @param releaseEnvironment a {@link ReleaseEnvironment} object
+     * @return a {@link ScmProvider} object
+     * @throws ReleaseScmRepositoryException if any.
+     * @throws ReleaseExecutionException     if any.
      */
     protected ScmProvider getScmProvider( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment )
-        throws ReleaseScmRepositoryException, ReleaseExecutionException
+            throws ReleaseScmRepositoryException, ReleaseExecutionException
     {
         try
         {
             ScmRepository repository =
-                scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor,
-                                                                   releaseEnvironment.getSettings() );
+                    scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor,
+                            releaseEnvironment.getSettings() );
 
             return scmRepositoryConfigurator.getRepositoryProvider( repository );
         }
         catch ( ScmRepositoryException e )
         {
             throw new ReleaseScmRepositoryException(
-                e.getMessage() + " for URL: " + releaseDescriptor.getScmSourceUrl(), e.getValidationMessages() );
+                    e.getMessage() + " for URL: " + releaseDescriptor.getScmSourceUrl(), e.getValidationMessages() );
         }
         catch ( NoSuchScmProviderException e )
         {
@@ -130,7 +144,7 @@ public class InputVariablesPhase
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                   List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException
+            throws ReleaseExecutionException
     {
         ReleaseResult result = new ReleaseResult();
 
@@ -156,7 +170,8 @@ public class InputVariablesPhase
                 try
                 {
                     suggestedName =
-                        resolveSuggestedName( releaseDescriptor.getProjectNamingPolicyId(), releaseVersion, project );
+                            resolveSuggestedName( releaseDescriptor.getProjectNamingPolicyId(), releaseVersion,
+                                    project );
                 }
                 catch ( PolicyException e )
                 {
@@ -166,7 +181,7 @@ public class InputVariablesPhase
             else if ( scmTagNameFormat != null )
             {
                 Interpolator interpolator = new StringSearchInterpolator( "@{", "}" );
-                List<String> possiblePrefixes = java.util.Arrays.asList( "project", "pom" );
+                List<String> possiblePrefixes = Arrays.asList( "project", "pom" );
                 Properties values = new Properties();
                 values.setProperty( "artifactId", project.getArtifactId() );
                 values.setProperty( "groupId", project.getGroupId() );
@@ -180,7 +195,7 @@ public class InputVariablesPhase
                 catch ( InterpolationException e )
                 {
                     throw new ReleaseExecutionException(
-                        "Could not interpolate specified tag name format: " + scmTagNameFormat, e );
+                            "Could not interpolate specified tag name format: " + scmTagNameFormat, e );
                 }
             }
             else
@@ -195,7 +210,7 @@ public class InputVariablesPhase
                 }
             }
 
-            ScmProvider provider = null;
+            ScmProvider provider;
             try
             {
                 provider = getScmProvider( releaseDescriptor, releaseEnvironment );
@@ -203,7 +218,7 @@ public class InputVariablesPhase
             catch ( ReleaseScmRepositoryException e )
             {
                 throw new ReleaseExecutionException(
-                    "No scm provider can be found for url: " + releaseDescriptor.getScmSourceUrl(), e );
+                        "No scm provider can be found for url: " + releaseDescriptor.getScmSourceUrl(), e );
             }
 
             suggestedName = provider.sanitizeTagName( suggestedName );
@@ -214,8 +229,8 @@ public class InputVariablesPhase
                 {
                     if ( branchOperation )
                     {
-                        tag = prompter.prompt( "What is the branch name for \"" + project.getName() + "\"? ("
-                            + project.getGroupId() + ":" + project.getArtifactId() + ")" );
+                        tag = prompter.get().prompt( "What is the branch name for \"" + project.getName() + "\"? ("
+                                + project.getGroupId() + ":" + project.getArtifactId() + ")" );
                         if ( StringUtils.isEmpty( tag ) )
                         {
                             throw new ReleaseExecutionException( "No branch name was given." );
@@ -223,14 +238,14 @@ public class InputVariablesPhase
                     }
                     else
                     {
-                        tag = prompter.prompt( "What is the SCM release tag or label for \"" + project.getName()
-                            + "\"? (" + project.getGroupId() + ":" + project.getArtifactId() + ")", suggestedName );
+                        tag = prompter.get().prompt( "What is the SCM release tag or label for \"" + project.getName()
+                                + "\"? (" + project.getGroupId() + ":" + project.getArtifactId() + ")", suggestedName );
                     }
                 }
                 catch ( PrompterException e )
                 {
                     throw new ReleaseExecutionException( "Error reading version from input handler: " + e.getMessage(),
-                                                         e );
+                            e );
                 }
             }
             else if ( suggestedName == null )
@@ -259,7 +274,7 @@ public class InputVariablesPhase
     @Override
     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                    List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException
+            throws ReleaseExecutionException
     {
         ReleaseResult result = new ReleaseResult();
 
@@ -272,7 +287,7 @@ public class InputVariablesPhase
     }
 
     private String resolveSuggestedName( String policyId, String version, MavenProject project )
-        throws PolicyException
+            throws PolicyException
     {
         if ( policyId == null )
         {
@@ -283,13 +298,13 @@ public class InputVariablesPhase
         if ( policy == null )
         {
             throw new PolicyException( "Policy '" + policyId + "' is unknown, available: "
-                + namingPolicies.keySet() );
+                    + namingPolicies.keySet() );
         }
 
         NamingPolicyRequest request = new NamingPolicyRequest()
-                        .setGroupId( project.getGroupId() )
-                        .setArtifactId( project.getArtifactId() )
-                        .setVersion( version );
+                .setGroupId( project.getGroupId() )
+                .setArtifactId( project.getArtifactId() )
+                .setVersion( version );
         return policy.getName( request ).getName();
     }
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/MapVersionsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractMapVersionsPhase.java
similarity index 85%
rename from maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/MapVersionsPhase.java
rename to maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractMapVersionsPhase.java
index a04f027d..b75a4b1d 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/MapVersionsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractMapVersionsPhase.java
@@ -40,9 +40,11 @@ import org.codehaus.plexus.components.interactivity.Prompter;
 import org.codehaus.plexus.components.interactivity.PrompterException;
 import org.codehaus.plexus.util.StringUtils;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * Map projects to their new versions after release / into the next development cycle.
- *
+ * <p>
  * The map-phases per goal are:
  * <dl>
  *  <dt>release:prepare</dt><dd>map-release-versions + map-development-versions; RD.isBranchCreation() = false</dd>
@@ -67,49 +69,47 @@ import org.codehaus.plexus.util.StringUtils;
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  * @author Robert Scholte
  */
-public class MapVersionsPhase
-    extends AbstractReleasePhase
+public abstract class AbstractMapVersionsPhase
+        extends AbstractReleasePhase
 {
-    private ResourceBundle resourceBundle;
-
     /**
-     * Whether to convert to a snapshot or a release.
+     * Component used to prompt for input.
      */
-    private boolean convertToSnapshot;
+    private final Prompter prompter;
 
     /**
-     * Whether to convert to a snapshot or a release.
+     * Component used for custom or default version policy
      */
-    private boolean convertToBranch;
+    private final Map<String, VersionPolicy> versionPolicies;
 
     /**
-     * Component used to prompt for input.
+     * Whether to convert to a snapshot or a release.
      */
-    private Prompter prompter;
-
+    private final boolean convertToSnapshot;
 
     /**
-     * Component used for custom or default version policy
+     * Whether to convert to a snapshot or a release.
      */
-    private Map<String, VersionPolicy> versionPolicies;
+    private final boolean convertToBranch;
 
-    void setConvertToSnapshot( boolean convertToSnapshot )
+    public AbstractMapVersionsPhase( Prompter prompter, Map<String, VersionPolicy> versionPolicies,
+                                     boolean convertToSnapshot, boolean convertToBranch )
     {
+        this.prompter = requireNonNull( prompter );
+        this.versionPolicies = requireNonNull( versionPolicies );
         this.convertToSnapshot = convertToSnapshot;
-    }
-    void setPrompter( Prompter prompter )
-    {
-        this.prompter = prompter;
+        this.convertToBranch = convertToBranch;
+
     }
 
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                   List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException
+            throws ReleaseExecutionException
     {
         ReleaseResult result = new ReleaseResult();
 
-        resourceBundle = getResourceBundle( releaseEnvironment.getLocale() );
+        ResourceBundle resourceBundle = getResourceBundle( releaseEnvironment.getLocale() );
 
         MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
 
@@ -120,7 +120,7 @@ public class MapVersionsPhase
 
             String projectId = ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() );
 
-            String nextVersion = resolveNextVersion( project, projectId, releaseDescriptor );
+            String nextVersion = resolveNextVersion( project, projectId, releaseDescriptor, resourceBundle );
 
             if ( !convertToSnapshot )
             {
@@ -138,7 +138,7 @@ public class MapVersionsPhase
             for ( MavenProject subProject : reactorProjects )
             {
                 String subProjectId =
-                    ArtifactUtils.versionlessKey( subProject.getGroupId(), subProject.getArtifactId() );
+                        ArtifactUtils.versionlessKey( subProject.getGroupId(), subProject.getArtifactId() );
 
                 if ( convertToSnapshot )
                 {
@@ -186,7 +186,7 @@ public class MapVersionsPhase
             {
                 String projectId = ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() );
 
-                String nextVersion = resolveNextVersion( project, projectId, releaseDescriptor );
+                String nextVersion = resolveNextVersion( project, projectId, releaseDescriptor, resourceBundle );
 
                 if ( !convertToSnapshot )
                 {
@@ -209,17 +209,18 @@ public class MapVersionsPhase
     }
 
     private String resolveNextVersion( MavenProject project,
-                                   String projectId,
-                                   ReleaseDescriptor releaseDescriptor )
-        throws ReleaseExecutionException
+                                       String projectId,
+                                       ReleaseDescriptor releaseDescriptor,
+                                       ResourceBundle resourceBundle )
+            throws ReleaseExecutionException
     {
         String defaultVersion;
         if ( convertToBranch )
         {
             // no branch modification
             if ( !( releaseDescriptor.isUpdateBranchVersions()
-                            && ( ArtifactUtils.isSnapshot( project.getVersion() )
-                                            || releaseDescriptor.isUpdateVersionsToSnapshot() ) ) )
+                    && ( ArtifactUtils.isSnapshot( project.getVersion() )
+                    || releaseDescriptor.isUpdateVersionsToSnapshot() ) ) )
             {
                 return project.getVersion();
             }
@@ -234,7 +235,7 @@ public class MapVersionsPhase
         {
             // no working copy modification
             if ( !( ArtifactUtils.isSnapshot( project.getVersion() )
-                          && releaseDescriptor.isUpdateWorkingCopyVersions() ) )
+                    && releaseDescriptor.isUpdateWorkingCopyVersions() ) )
             {
                 return project.getVersion();
             }
@@ -278,19 +279,20 @@ public class MapVersionsPhase
                         try
                         {
                             suggestedVersion =
-                                resolveSuggestedVersion( baseVersion, releaseDescriptor.getProjectVersionPolicyId() );
+                                    resolveSuggestedVersion( baseVersion,
+                                            releaseDescriptor.getProjectVersionPolicyId() );
                         }
                         catch ( VersionParseException e )
                         {
                             if ( releaseDescriptor.isInteractive() )
                             {
                                 suggestedVersion =
-                                    resolveSuggestedVersion( "1.0", releaseDescriptor.getProjectVersionPolicyId() );
+                                        resolveSuggestedVersion( "1.0", releaseDescriptor.getProjectVersionPolicyId() );
                             }
                             else
                             {
                                 throw new ReleaseExecutionException( "Error parsing version, cannot determine next "
-                                    + "version: " + e.getMessage(), e );
+                                        + "version: " + e.getMessage(), e );
                             }
                         }
                     }
@@ -307,10 +309,11 @@ public class MapVersionsPhase
                         messageKey = getMapversionPromptKey( releaseDescriptor );
                     }
                     String message =
-                        MessageFormat.format( resourceBundle.getString( messageKey ), project.getName(), projectId );
+                            MessageFormat.format( resourceBundle.getString( messageKey ), project.getName(),
+                                    projectId );
                     nextVersion = prompter.prompt( message, suggestedVersion );
 
-                  //@todo validate next version, maybe with DefaultArtifactVersion
+                    //@todo validate next version, maybe with DefaultArtifactVersion
                 }
                 else if ( defaultVersion == null )
                 {
@@ -334,7 +337,7 @@ public class MapVersionsPhase
     }
 
     private String resolveSuggestedVersion( String baseVersion, String policyId )
-        throws PolicyException, VersionParseException
+            throws PolicyException, VersionParseException
     {
         VersionPolicy policy = versionPolicies.get( policyId );
         if ( policy == null )
@@ -344,7 +347,7 @@ public class MapVersionsPhase
 
         VersionPolicyRequest request = new VersionPolicyRequest().setVersion( baseVersion );
         return convertToSnapshot ? policy.getDevelopmentVersion( request ).getVersion()
-                        : policy.getReleaseVersion( request ).getVersion();
+                : policy.getReleaseVersion( request ).getVersion();
     }
 
     private String getDevelopmentVersion( String projectId, ReleaseDescriptor releaseDescriptor )
@@ -407,7 +410,7 @@ public class MapVersionsPhase
     @Override
     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                    List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException
+            throws ReleaseExecutionException
     {
         ReleaseResult result = new ReleaseResult();
 
@@ -421,6 +424,6 @@ public class MapVersionsPhase
 
     private ResourceBundle getResourceBundle( Locale locale )
     {
-        return ResourceBundle.getBundle( "release-messages", locale, MapVersionsPhase.class.getClassLoader() );
+        return ResourceBundle.getBundle( "release-messages", locale, AbstractMapVersionsPhase.class.getClassLoader() );
     }
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractReleasePomsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractReleasePomsPhase.java
index 0555c08c..5794501b 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractReleasePomsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractReleasePomsPhase.java
@@ -29,7 +29,6 @@ import org.apache.maven.shared.release.config.ReleaseDescriptor;
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
-import org.codehaus.plexus.component.annotations.Requirement;
 
 /**
  * Abstract release POM phase.
@@ -41,17 +40,21 @@ public abstract class AbstractReleasePomsPhase extends AbstractReleasePhase
     /**
      * Tool that gets a configured SCM repository from release configuration.
      */
-    @Requirement
-    private ScmRepositoryConfigurator scmRepositoryConfigurator;
+    private final ScmRepositoryConfigurator scmRepositoryConfigurator;
+
+    protected AbstractReleasePomsPhase( ScmRepositoryConfigurator scmRepositoryConfigurator )
+    {
+        this.scmRepositoryConfigurator = scmRepositoryConfigurator;
+    }
 
     protected ScmRepository getScmRepository( ReleaseDescriptor releaseDescriptor,
                                               ReleaseEnvironment releaseEnvironment )
-        throws ReleaseFailureException, ReleaseExecutionException
+            throws ReleaseFailureException, ReleaseExecutionException
     {
         try
         {
             return scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor,
-                                                                      releaseEnvironment.getSettings() );
+                    releaseEnvironment.getSettings() );
         }
         catch ( ScmRepositoryException exception )
         {
@@ -60,12 +63,12 @@ public abstract class AbstractReleasePomsPhase extends AbstractReleasePhase
         catch ( NoSuchScmProviderException exception )
         {
             throw new ReleaseExecutionException( "Unable to configure SCM repository: " + exception.getMessage(),
-                                                 exception );
+                    exception );
         }
     }
 
     protected ScmProvider getScmProvider( ScmRepository scmRepository )
-        throws ReleaseExecutionException
+            throws ReleaseExecutionException
     {
         try
         {
@@ -74,7 +77,7 @@ public abstract class AbstractReleasePomsPhase extends AbstractReleasePhase
         catch ( NoSuchScmProviderException exception )
         {
             throw new ReleaseExecutionException( "Unable to configure SCM repository: " + exception.getMessage(),
-                                                 exception );
+                    exception );
         }
     }
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java
index 3e5525d6..47525a46 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java
@@ -55,42 +55,51 @@ import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 import org.apache.maven.shared.release.scm.ScmTranslator;
-import org.apache.maven.shared.release.transform.ModelETLRequest;
 import org.apache.maven.shared.release.transform.MavenCoordinate;
 import org.apache.maven.shared.release.transform.ModelETL;
 import org.apache.maven.shared.release.transform.ModelETLFactory;
+import org.apache.maven.shared.release.transform.ModelETLRequest;
 import org.apache.maven.shared.release.transform.jdom2.JDomModelETLFactory;
 import org.apache.maven.shared.release.util.ReleaseUtil;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.util.StringUtils;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * Base class for rewriting phases.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
 public abstract class AbstractRewritePomsPhase
-    extends AbstractReleasePhase implements ResourceGenerator
+        extends AbstractReleasePhase implements ResourceGenerator
 {
     /**
      * Tool that gets a configured SCM repository from release configuration.
      */
-    @Requirement
-    private ScmRepositoryConfigurator scmRepositoryConfigurator;
+    private final ScmRepositoryConfigurator scmRepositoryConfigurator;
 
-    @Requirement( role = ModelETLFactory.class )
-    private Map<String, ModelETLFactory> modelETLFactories;
+    private final Map<String, ModelETLFactory> modelETLFactories;
 
     /**
-     * Use jdom2-sax as default
+     * SCM URL translators mapped by provider name.
      */
-    private String modelETL = JDomModelETLFactory.ROLE_HINT;
+    private Map<String, ScmTranslator> scmTranslators;
 
     /**
-     * SCM URL translators mapped by provider name.
+     * Use jdom2-sax as default
      */
-    @Requirement( role = ScmTranslator.class )
-    private Map<String, ScmTranslator> scmTranslators;
+    private String modelETL = JDomModelETLFactory.NAME;
+
+    private long startTime = -1 * 1000;
+
+    protected AbstractRewritePomsPhase( ScmRepositoryConfigurator scmRepositoryConfigurator,
+                                        Map<String, ModelETLFactory> modelETLFactories,
+                                        Map<String, ScmTranslator> scmTranslators )
+    {
+        this.scmRepositoryConfigurator = requireNonNull( scmRepositoryConfigurator );
+        this.modelETLFactories = requireNonNull( modelETLFactories );
+        this.scmTranslators = requireNonNull( scmTranslators );
+    }
 
     /**
      * <p>Getter for the field <code>scmTranslators</code>.</p>
@@ -112,8 +121,6 @@ public abstract class AbstractRewritePomsPhase
         this.modelETL = modelETL;
     }
 
-    private long startTime = -1 * 1000;
-
     /**
      * <p>Setter for the field <code>startTime</code>.</p>
      *
@@ -134,7 +141,7 @@ public abstract class AbstractRewritePomsPhase
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                   List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult result = new ReleaseResult();
 
@@ -148,7 +155,7 @@ public abstract class AbstractRewritePomsPhase
     @Override
     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                    List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult result = new ReleaseResult();
 
@@ -188,7 +195,7 @@ public abstract class AbstractRewritePomsPhase
 
     private void transform( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                             List<MavenProject> reactorProjects, boolean simulate, ReleaseResult result )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         result.setStartTime( ( startTime >= 0 ) ? startTime : System.currentTimeMillis() );
 
@@ -203,7 +210,7 @@ public abstract class AbstractRewritePomsPhase
     private void transformProject( MavenProject project, ReleaseDescriptor releaseDescriptor,
                                    ReleaseEnvironment releaseEnvironment, boolean simulate,
                                    ReleaseResult result )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         File pomFile = ReleaseUtil.getStandardPom( project );
 
@@ -223,7 +230,7 @@ public abstract class AbstractRewritePomsPhase
             try
             {
                 scmRepository = scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor,
-                                                                                   releaseEnvironment.getSettings() );
+                        releaseEnvironment.getSettings() );
 
                 provider = scmRepositoryConfigurator.getRepositoryProvider( scmRepository );
             }
@@ -238,7 +245,7 @@ public abstract class AbstractRewritePomsPhase
         }
 
         transformDocument( project, etl.getModel(), releaseDescriptor, scmRepository, result,
-                           simulate );
+                simulate );
 
         File outputFile;
         if ( simulate )
@@ -257,7 +264,7 @@ public abstract class AbstractRewritePomsPhase
     private void transformDocument( MavenProject project, Model modelTarget, ReleaseDescriptor releaseDescriptor,
                                     ScmRepository scmRepository, ReleaseResult result,
                                     boolean simulate )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         Model model = project.getModel();
 
@@ -273,28 +280,28 @@ public abstract class AbstractRewritePomsPhase
         if ( buildTarget != null )
         {
             // profile.build.extensions doesn't exist, so only rewrite project.build.extensions
-            rewriteArtifactVersions( toMavenCoordinates( buildTarget.getExtensions() ), 
-                                     model, properties, result, releaseDescriptor, simulate );
+            rewriteArtifactVersions( toMavenCoordinates( buildTarget.getExtensions() ),
+                    model, properties, result, releaseDescriptor, simulate );
 
-            rewriteArtifactVersions( toMavenCoordinates( buildTarget.getPlugins() ), 
-                                     model, properties, result, releaseDescriptor, simulate );
+            rewriteArtifactVersions( toMavenCoordinates( buildTarget.getPlugins() ),
+                    model, properties, result, releaseDescriptor, simulate );
 
             for ( Plugin plugin : buildTarget.getPlugins() )
             {
                 rewriteArtifactVersions( toMavenCoordinates( plugin.getDependencies() ),
-                                         model, properties,
-                                         result, releaseDescriptor, simulate );
+                        model, properties,
+                        result, releaseDescriptor, simulate );
             }
 
             if ( buildTarget.getPluginManagement() != null )
             {
                 rewriteArtifactVersions( toMavenCoordinates( buildTarget.getPluginManagement().getPlugins() ), model,
-                                         properties, result, releaseDescriptor, simulate );
+                        properties, result, releaseDescriptor, simulate );
 
                 for ( Plugin plugin : buildTarget.getPluginManagement().getPlugins() )
                 {
                     rewriteArtifactVersions( toMavenCoordinates( plugin.getDependencies() ), model, properties, result,
-                                             releaseDescriptor, simulate );
+                            releaseDescriptor, simulate );
                 }
             }
         }
@@ -305,23 +312,23 @@ public abstract class AbstractRewritePomsPhase
             if ( profileBuild != null )
             {
                 rewriteArtifactVersions( toMavenCoordinates( profileBuild.getPlugins() ), model, properties, result,
-                                         releaseDescriptor, simulate );
+                        releaseDescriptor, simulate );
 
                 for ( Plugin plugin : profileBuild.getPlugins() )
                 {
                     rewriteArtifactVersions( toMavenCoordinates( plugin.getDependencies() ), model, properties, result,
-                                             releaseDescriptor, simulate );
+                            releaseDescriptor, simulate );
                 }
 
                 if ( profileBuild.getPluginManagement() != null )
                 {
                     rewriteArtifactVersions( toMavenCoordinates( profileBuild.getPluginManagement().getPlugins() ),
-                                             model, properties, result, releaseDescriptor, simulate );
+                            model, properties, result, releaseDescriptor, simulate );
 
                     for ( Plugin plugin : profileBuild.getPluginManagement().getPlugins() )
                     {
                         rewriteArtifactVersions( toMavenCoordinates( plugin.getDependencies() ), model, properties,
-                                                 result, releaseDescriptor, simulate );
+                                result, releaseDescriptor, simulate );
                     }
                 }
             }
@@ -334,18 +341,18 @@ public abstract class AbstractRewritePomsPhase
         for ( ModelBase modelBase : modelBases )
         {
             rewriteArtifactVersions( toMavenCoordinates( modelBase.getDependencies() ), model, properties, result,
-                                     releaseDescriptor, simulate );
+                    releaseDescriptor, simulate );
 
             if ( modelBase.getDependencyManagement() != null )
             {
                 rewriteArtifactVersions( toMavenCoordinates( modelBase.getDependencyManagement().getDependencies() ),
-                                         model, properties, result, releaseDescriptor, simulate );
+                        model, properties, result, releaseDescriptor, simulate );
             }
 
             if ( modelBase.getReporting() != null )
             {
                 rewriteArtifactVersions( toMavenCoordinates( modelBase.getReporting().getPlugins() ), model, properties,
-                                         result, releaseDescriptor, simulate );
+                        result, releaseDescriptor, simulate );
             }
         }
 
@@ -388,7 +395,7 @@ public abstract class AbstractRewritePomsPhase
 
     private void rewriteVersion( Model modelTarget, ReleaseDescriptor releaseDescriptor, String projectId,
                                  MavenProject project )
-        throws ReleaseFailureException
+            throws ReleaseFailureException
     {
         String version = getNextVersion( releaseDescriptor, projectId );
         if ( version == null )
@@ -399,9 +406,9 @@ public abstract class AbstractRewritePomsPhase
         modelTarget.setVersion( version );
     }
 
-    private String rewriteParent( MavenProject project, Model targetModel, 
+    private String rewriteParent( MavenProject project, Model targetModel,
                                   ReleaseDescriptor releaseDescriptor, boolean simulate )
-        throws ReleaseFailureException
+            throws ReleaseFailureException
     {
         String parentVersion = null;
         if ( project.hasParent() )
@@ -433,7 +440,7 @@ public abstract class AbstractRewritePomsPhase
     private void rewriteArtifactVersions( Collection<MavenCoordinate> elements, Model projectModel,
                                           Properties properties, ReleaseResult result,
                                           ReleaseDescriptor releaseDescriptor, boolean simulate )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         if ( elements == null )
         {
@@ -483,7 +490,7 @@ public abstract class AbstractRewritePomsPhase
 
             // MRELEASE-220
             if ( mappedVersion != null && mappedVersion.endsWith( Artifact.SNAPSHOT_VERSION )
-                && !rawVersion.endsWith( Artifact.SNAPSHOT_VERSION ) && !releaseDescriptor.isUpdateDependencies() )
+                    && !rawVersion.endsWith( Artifact.SNAPSHOT_VERSION ) && !releaseDescriptor.isUpdateDependencies() )
             {
                 continue;
             }
@@ -500,7 +507,7 @@ public abstract class AbstractRewritePomsPhase
                     String expression = rawVersion.substring( 2, rawVersion.length() - 1 );
 
                     if ( expression.startsWith( "project." ) || expression.startsWith( "pom." )
-                        || "version".equals( expression ) )
+                            || "version".equals( expression ) )
                     {
                         if ( !mappedVersion.equals( getNextVersion( releaseDescriptor, projectId ) ) )
                         {
@@ -530,25 +537,28 @@ public abstract class AbstractRewritePomsPhase
                             {
                                 // this property may have been updated during processing a sibling.
                                 logInfo( result, "  Ignoring artifact version update for expression " + rawVersion
-                                    + " because it is already updated" );
+                                        + " because it is already updated" );
                             }
                             else if ( !mappedVersion.equals( rawVersion ) )
                             {
+                                // WARNING: ${pom.*} prefix support and ${version} is about to be dropped in mvn4!
+                                // https://issues.apache.org/jira/browse/MNG-7404
+                                // https://issues.apache.org/jira/browse/MNG-7244
                                 if ( mappedVersion.matches( "\\$\\{project.+\\}" )
-                                    || mappedVersion.matches( "\\$\\{pom.+\\}" )
-                                    || "${version}".equals( mappedVersion ) )
+                                        || mappedVersion.matches( "\\$\\{pom.+\\}" )
+                                        || "${version}".equals( mappedVersion ) )
                                 {
                                     logInfo( result, "  Ignoring artifact version update for expression "
-                                        + mappedVersion );
+                                            + mappedVersion );
                                     // ignore... we cannot update this expression
                                 }
                                 else
                                 {
                                     // the value of the expression conflicts with what the user wanted to release
                                     throw new ReleaseFailureException( "The artifact (" + key + ") requires a "
-                                        + "different version (" + mappedVersion + ") than what is found ("
-                                        + propertyValue + ") for the expression (" + expression + ") in the "
-                                        + "project (" + projectId + ")." );
+                                            + "different version (" + mappedVersion + ") than what is found ("
+                                            + propertyValue + ") for the expression (" + expression + ") in the "
+                                            + "project (" + projectId + ")." );
                                 }
                             }
                         }
@@ -579,15 +589,15 @@ public abstract class AbstractRewritePomsPhase
     }
 
     private void prepareScm( File pomFile, ReleaseDescriptor releaseDescriptor, ScmRepository repository,
-                           ScmProvider provider )
-        throws ReleaseExecutionException, ReleaseScmCommandException
+                             ScmProvider provider )
+            throws ReleaseExecutionException, ReleaseScmCommandException
     {
         try
         {
             if ( isUpdateScm() && ( releaseDescriptor.isScmUseEditMode() || provider.requiresEditMode() ) )
             {
                 EditScmResult result = provider.edit( repository, new ScmFileSet(
-                    new File( releaseDescriptor.getWorkingDirectory() ), pomFile ) );
+                        new File( releaseDescriptor.getWorkingDirectory() ), pomFile ) );
 
                 if ( !result.isSuccess() )
                 {
@@ -606,7 +616,7 @@ public abstract class AbstractRewritePomsPhase
      * <p>getResolvedSnapshotVersion.</p>
      *
      * @param artifactVersionlessKey a {@link java.lang.String} object
-     * @param releaseDscriptor a {@link org.apache.maven.shared.release.config.ReleaseDescriptor} object
+     * @param releaseDscriptor       a {@link org.apache.maven.shared.release.config.ReleaseDescriptor} object
      * @return a {@link java.lang.String} object
      */
     protected abstract String getResolvedSnapshotVersion( String artifactVersionlessKey,
@@ -616,8 +626,8 @@ public abstract class AbstractRewritePomsPhase
      * <p>getOriginalVersion.</p>
      *
      * @param releaseDescriptor a {@link org.apache.maven.shared.release.config.ReleaseDescriptor} object
-     * @param projectKey a {@link java.lang.String} object
-     * @param simulate a boolean
+     * @param projectKey        a {@link java.lang.String} object
+     * @param simulate          a boolean
      * @return a {@link java.lang.String} object
      */
     protected abstract String getOriginalVersion( ReleaseDescriptor releaseDescriptor, String projectKey,
@@ -627,7 +637,7 @@ public abstract class AbstractRewritePomsPhase
      * <p>getNextVersion.</p>
      *
      * @param releaseDescriptor a {@link org.apache.maven.shared.release.config.ReleaseDescriptor} object
-     * @param key a {@link java.lang.String} object
+     * @param key               a {@link java.lang.String} object
      * @return a {@link java.lang.String} object
      */
     protected abstract String getNextVersion( ReleaseDescriptor releaseDescriptor, String key );
@@ -635,18 +645,18 @@ public abstract class AbstractRewritePomsPhase
     /**
      * <p>transformScm.</p>
      *
-     * @param project a {@link org.apache.maven.project.MavenProject} object
-     * @param modelTarget a {@link org.apache.maven.model.Model} object
+     * @param project           a {@link org.apache.maven.project.MavenProject} object
+     * @param modelTarget       a {@link org.apache.maven.model.Model} object
      * @param releaseDescriptor a {@link org.apache.maven.shared.release.config.ReleaseDescriptor} object
-     * @param projectId a {@link java.lang.String} object
-     * @param scmRepository a {@link org.apache.maven.scm.repository.ScmRepository} object
-     * @param result a {@link org.apache.maven.shared.release.ReleaseResult} object
+     * @param projectId         a {@link java.lang.String} object
+     * @param scmRepository     a {@link org.apache.maven.scm.repository.ScmRepository} object
+     * @param result            a {@link org.apache.maven.shared.release.ReleaseResult} object
      * @throws org.apache.maven.shared.release.ReleaseExecutionException if any.
      */
     protected abstract void transformScm( MavenProject project, Model modelTarget, ReleaseDescriptor releaseDescriptor,
                                           String projectId, ScmRepository scmRepository,
                                           ReleaseResult result )
-        throws ReleaseExecutionException;
+            throws ReleaseExecutionException;
 
     /**
      * <p>isUpdateScm.</p>
@@ -663,7 +673,7 @@ public abstract class AbstractRewritePomsPhase
      * <p>getOriginalResolvedSnapshotVersion.</p>
      *
      * @param artifactVersionlessKey a {@link java.lang.String} object
-     * @param releaseDescriptor a {@link org.apache.maven.shared.release.config.ReleaseDescriptor} object
+     * @param releaseDescriptor      a {@link org.apache.maven.shared.release.config.ReleaseDescriptor} object
      * @return a {@link java.lang.String} object
      */
     protected String getOriginalResolvedSnapshotVersion( String artifactVersionlessKey,
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 23d4cce7..12ba401d 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
@@ -28,26 +28,31 @@ import org.apache.maven.shared.release.config.ReleaseDescriptor;
 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.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.util.StringUtils;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * Run the integration tests for the project to verify that it builds before committing.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
 public abstract class AbstractRunGoalsPhase
-    extends AbstractReleasePhase
+        extends AbstractReleasePhase
 {
     /**
      * Component to assist in executing Maven.
      */
-    @Requirement( role = MavenExecutor.class )
-    private Map<String, MavenExecutor> mavenExecutors;
+    private final Map<String, MavenExecutor> mavenExecutors;
+
+    protected AbstractRunGoalsPhase( Map<String, MavenExecutor> mavenExecutors )
+    {
+        this.mavenExecutors = requireNonNull( mavenExecutors );
+    }
 
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                   File workingDirectory, String additionalArguments )
-        throws ReleaseExecutionException
+            throws ReleaseExecutionException
     {
         ReleaseResult result = new ReleaseResult();
 
@@ -63,7 +68,7 @@ public abstract class AbstractRunGoalsPhase
                 if ( mavenExecutor == null )
                 {
                     throw new ReleaseExecutionException(
-                        "Cannot find Maven executor with id: " + releaseEnvironment.getMavenExecutorId() );
+                            "Cannot find Maven executor with id: " + releaseEnvironment.getMavenExecutorId() );
                 }
 
                 File executionRoot;
@@ -79,10 +84,10 @@ public abstract class AbstractRunGoalsPhase
                     executionRoot = workingDirectory;
                     pomFileName = null;
                 }
-                
+
                 mavenExecutor.executeGoals( executionRoot, goals, releaseEnvironment,
-                                            releaseDescriptor.isInteractive(), additionalArguments,
-                                            pomFileName, result );
+                        releaseDescriptor.isInteractive(), additionalArguments,
+                        pomFileName, result );
             }
         }
         catch ( MavenExecutorException e )
@@ -109,7 +114,7 @@ public abstract class AbstractRunGoalsPhase
         if ( !releaseDescriptor.getActivateProfiles().isEmpty() )
         {
             builder.append( " -P " )
-                   .append( StringUtils.join( releaseDescriptor.getActivateProfiles().iterator(), "," ) );
+                    .append( StringUtils.join( releaseDescriptor.getActivateProfiles().iterator(), "," ) );
         }
 
         return builder.length() > 0 ? builder.toString().trim() : null;
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractScmCommitDevelopmentPhase.java
similarity index 76%
copy from maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhase.java
copy to maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractScmCommitDevelopmentPhase.java
index bf8a8a80..15ea9391 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractScmCommitDevelopmentPhase.java
@@ -31,32 +31,40 @@ import org.apache.maven.shared.release.config.ReleaseDescriptor;
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
 import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
+import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 
 /**
  * Commit the changes that were done to prepare the branch or tag to the SCM.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-public class ScmCommitDevelopmentPhase
-    extends AbstractScmCommitPhase
+public abstract class AbstractScmCommitDevelopmentPhase
+        extends AbstractScmCommitPhase
 {
-
     /**
      * The format for the
      */
-    private String rollbackMessageFormat;
+    private final String rollbackMessageFormat;
+
+    protected AbstractScmCommitDevelopmentPhase(
+            ScmRepositoryConfigurator scmRepositoryConfigurator,
+            String descriptorCommentGetter, String rollbackMessageFormat )
+    {
+        super( scmRepositoryConfigurator, descriptorCommentGetter );
+        this.rollbackMessageFormat = rollbackMessageFormat;
+    }
 
     @Override
     protected void runLogic( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                              List<MavenProject> reactorProjects, ReleaseResult result, boolean simulating )
-        throws ReleaseScmCommandException, ReleaseExecutionException, ReleaseScmRepositoryException
+            throws ReleaseScmCommandException, ReleaseExecutionException, ReleaseScmRepositoryException
     {
         // no rollback required
         if (
             // was there no commit that has to be rolled back by a new one
-            releaseDescriptor.isSuppressCommitBeforeTagOrBranch()
-                // and working copy should not be touched
-                && !releaseDescriptor.isUpdateWorkingCopyVersions() )
+                releaseDescriptor.isSuppressCommitBeforeTagOrBranch()
+                        // and working copy should not be touched
+                        && !releaseDescriptor.isUpdateWorkingCopyVersions() )
         {
             if ( simulating )
             {
@@ -85,7 +93,7 @@ public class ScmCommitDevelopmentPhase
             {
                 Collection<File> pomFiles = createPomFiles( releaseDescriptor, reactorProjects );
                 logInfo( result,
-                         "Full run would commit " + pomFiles.size() + " files with message: '" + message + "'" );
+                        "Full run would commit " + pomFiles.size() + " files with message: '" + message + "'" );
             }
             else
             {
@@ -97,7 +105,7 @@ public class ScmCommitDevelopmentPhase
     private String createRollbackMessage( ReleaseDescriptor releaseDescriptor )
     {
         return MessageFormat.format( releaseDescriptor.getScmCommentPrefix() + rollbackMessageFormat,
-                                     new Object[]{releaseDescriptor.getScmReleaseLabel()} );
+                releaseDescriptor.getScmReleaseLabel() );
     }
 
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractScmCommitPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractScmCommitPhase.java
index b9b1a5a1..a5a61eac 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractScmCommitPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractScmCommitPhase.java
@@ -19,6 +19,11 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
@@ -38,10 +43,7 @@ import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 import org.apache.maven.shared.release.util.ReleaseUtil;
 
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
+import static java.util.Objects.requireNonNull;
 
 /**
  * Holds the basic concept of committing changes to the current working copy.
@@ -50,26 +52,29 @@ import java.util.List;
  * @author <a href="mailto:me@lcorneliussen.de">Lars Corneliussen</a>
  */
 public abstract class AbstractScmCommitPhase
-    extends AbstractReleasePhase
+        extends AbstractReleasePhase
 {
-    protected boolean beforeBranchOrTag = false;
-
-    protected boolean afterBranchOrTag = false;
-
     /**
      * Tool that gets a configured SCM repository from release configuration.
      */
-    protected ScmRepositoryConfigurator scmRepositoryConfigurator;
+    protected final ScmRepositoryConfigurator scmRepositoryConfigurator;
 
     /**
      * The getter in the descriptor for the comment.
      */
-    protected String descriptorCommentGetter;
+    protected final String descriptorCommentGetter;
+
+    protected AbstractScmCommitPhase( ScmRepositoryConfigurator scmRepositoryConfigurator,
+                                      String descriptorCommentGetter )
+    {
+        this.scmRepositoryConfigurator = requireNonNull( scmRepositoryConfigurator );
+        this.descriptorCommentGetter = requireNonNull( descriptorCommentGetter );
+    }
 
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                   List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult relResult = new ReleaseResult();
 
@@ -85,7 +90,7 @@ public abstract class AbstractScmCommitPhase
     @Override
     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                    List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult result = new ReleaseResult();
 
@@ -100,33 +105,33 @@ public abstract class AbstractScmCommitPhase
     /**
      * <p>runLogic.</p>
      *
-     * @param releaseDescriptor a {@link org.apache.maven.shared.release.config.ReleaseDescriptor} object
+     * @param releaseDescriptor  a {@link org.apache.maven.shared.release.config.ReleaseDescriptor} object
      * @param releaseEnvironment a {@link org.apache.maven.shared.release.env.ReleaseEnvironment} object
-     * @param reactorProjects a {@link java.util.List} object
-     * @param result a {@link org.apache.maven.shared.release.ReleaseResult} object
-     * @param simulating a boolean
-     * @throws org.apache.maven.shared.release.scm.ReleaseScmCommandException if any.
-     * @throws org.apache.maven.shared.release.ReleaseExecutionException if any.
+     * @param reactorProjects    a {@link java.util.List} object
+     * @param result             a {@link org.apache.maven.shared.release.ReleaseResult} object
+     * @param simulating         a boolean
+     * @throws org.apache.maven.shared.release.scm.ReleaseScmCommandException    if any.
+     * @throws org.apache.maven.shared.release.ReleaseExecutionException         if any.
      * @throws org.apache.maven.shared.release.scm.ReleaseScmRepositoryException if any.
      */
     protected abstract void runLogic( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                       List<MavenProject> reactorProjects, ReleaseResult result, boolean simulating )
-        throws ReleaseScmCommandException, ReleaseExecutionException, ReleaseScmRepositoryException;
+            throws ReleaseScmCommandException, ReleaseExecutionException, ReleaseScmRepositoryException;
 
     /**
      * <p>performCheckins.</p>
      *
-     * @param releaseDescriptor a {@link org.apache.maven.shared.release.config.ReleaseDescriptor} object
+     * @param releaseDescriptor  a {@link org.apache.maven.shared.release.config.ReleaseDescriptor} object
      * @param releaseEnvironment a {@link org.apache.maven.shared.release.env.ReleaseEnvironment} object
-     * @param reactorProjects a {@link java.util.List} object
-     * @param message a {@link java.lang.String} object
+     * @param reactorProjects    a {@link java.util.List} object
+     * @param message            a {@link java.lang.String} object
      * @throws org.apache.maven.shared.release.scm.ReleaseScmRepositoryException if any.
-     * @throws org.apache.maven.shared.release.ReleaseExecutionException if any.
-     * @throws org.apache.maven.shared.release.scm.ReleaseScmCommandException if any.
+     * @throws org.apache.maven.shared.release.ReleaseExecutionException         if any.
+     * @throws org.apache.maven.shared.release.scm.ReleaseScmCommandException    if any.
      */
     protected void performCheckins( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                     List<MavenProject> reactorProjects, String message )
-        throws ReleaseScmRepositoryException, ReleaseExecutionException, ReleaseScmCommandException
+            throws ReleaseScmRepositoryException, ReleaseExecutionException, ReleaseScmCommandException
     {
 
         getLogger().info( "Checking in modified POMs..." );
@@ -136,7 +141,7 @@ public abstract class AbstractScmCommitPhase
         try
         {
             repository = scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor,
-                                                                            releaseEnvironment.getSettings() );
+                    releaseEnvironment.getSettings() );
 
             repository.getProviderRepository().setPushChanges( releaseDescriptor.isPushChanges() );
 
@@ -174,7 +179,7 @@ public abstract class AbstractScmCommitPhase
 
     private void checkin( ScmProvider provider, ScmRepository repository, ScmFileSet fileSet,
                           ReleaseDescriptor releaseDescriptor, String message )
-        throws ReleaseExecutionException, ReleaseScmCommandException
+            throws ReleaseExecutionException, ReleaseScmCommandException
     {
         CheckInScmResult result;
         try
@@ -200,9 +205,9 @@ public abstract class AbstractScmCommitPhase
      * <p>simulateCheckins.</p>
      *
      * @param releaseDescriptor a {@link org.apache.maven.shared.release.config.ReleaseDescriptor} object
-     * @param reactorProjects a {@link java.util.List} object
-     * @param result a {@link org.apache.maven.shared.release.ReleaseResult} object
-     * @param message a {@link java.lang.String} object
+     * @param reactorProjects   a {@link java.util.List} object
+     * @param result            a {@link org.apache.maven.shared.release.ReleaseResult} object
+     * @param message           a {@link java.lang.String} object
      */
     protected void simulateCheckins( ReleaseDescriptor releaseDescriptor, List<MavenProject> reactorProjects,
                                      ReleaseResult result, String message )
@@ -218,7 +223,7 @@ public abstract class AbstractScmCommitPhase
      * @throws org.apache.maven.shared.release.ReleaseFailureException if any.
      */
     protected void validateConfiguration( ReleaseDescriptor releaseDescriptor )
-        throws ReleaseFailureException
+            throws ReleaseFailureException
     {
         if ( releaseDescriptor.getScmReleaseLabel() == null )
         {
@@ -229,14 +234,14 @@ public abstract class AbstractScmCommitPhase
     /**
      * <p>createMessage.</p>
      *
-     * @param reactorProjects a {@link java.util.List} object
+     * @param reactorProjects   a {@link java.util.List} object
      * @param releaseDescriptor a {@link org.apache.maven.shared.release.config.ReleaseDescriptor} object
      * @return a {@link java.lang.String} object
      * @throws org.apache.maven.shared.release.ReleaseExecutionException if any.
      */
     protected String createMessage( List<MavenProject> reactorProjects,
                                     ReleaseDescriptor releaseDescriptor )
-                                    throws ReleaseExecutionException
+            throws ReleaseExecutionException
     {
         String comment;
         boolean branch = false;
@@ -259,9 +264,10 @@ public abstract class AbstractScmCommitPhase
         }
         else
         {
-            throw new ReleaseExecutionException( "Invalid configuration in components-fragment.xml" );
+            throw new ReleaseExecutionException(
+                    "Invalid configuration of descriptorCommentGetter='" + descriptorCommentGetter + "'" );
         }
-        
+
         MavenProject project = ReleaseUtil.getRootProject( reactorProjects );
         comment = comment.replace( "@{prefix}", releaseDescriptor.getScmCommentPrefix().trim() );
         comment = comment.replace( "@{groupId}", project.getGroupId() );
@@ -281,7 +287,7 @@ public abstract class AbstractScmCommitPhase
      * <p>createPomFiles.</p>
      *
      * @param releaseDescriptor a {@link org.apache.maven.shared.release.config.ReleaseDescriptor} object
-     * @param project a {@link org.apache.maven.project.MavenProject} object
+     * @param project           a {@link org.apache.maven.project.MavenProject} object
      * @return a {@link java.util.List} object
      */
     protected static List<File> createPomFiles( ReleaseDescriptor releaseDescriptor, MavenProject project )
@@ -302,7 +308,7 @@ public abstract class AbstractScmCommitPhase
      * <p>createPomFiles.</p>
      *
      * @param releaseDescriptor a {@link org.apache.maven.shared.release.config.ReleaseDescriptor} object
-     * @param reactorProjects a {@link java.util.List} object
+     * @param reactorProjects   a {@link java.util.List} object
      * @return a {@link java.util.List} object
      */
     protected static List<File> createPomFiles( ReleaseDescriptor releaseDescriptor,
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractScmCommitPreparationPhase.java
similarity index 75%
rename from maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhase.java
rename to maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractScmCommitPreparationPhase.java
index b4a5bbfe..5c36a2f5 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractScmCommitPreparationPhase.java
@@ -19,6 +19,8 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import java.util.List;
+
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseFailureException;
@@ -27,31 +29,37 @@ import org.apache.maven.shared.release.config.ReleaseDescriptor;
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
 import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
-
-import java.util.List;
+import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 
 /**
  * Commit the changes that were done to prepare the branch or tag to the SCM.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-public class ScmCommitPreparationPhase
-    extends AbstractScmCommitPhase
+public abstract class AbstractScmCommitPreparationPhase
+        extends AbstractScmCommitPhase
 {
+    protected AbstractScmCommitPreparationPhase(
+            ScmRepositoryConfigurator scmRepositoryConfigurator,
+            String descriptorCommentGetter )
+    {
+        super( scmRepositoryConfigurator, descriptorCommentGetter );
+    }
 
+    @Override
     protected void runLogic( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                              List<MavenProject> reactorProjects, ReleaseResult result, boolean simulating )
-        throws ReleaseScmCommandException, ReleaseExecutionException, ReleaseScmRepositoryException
+            throws ReleaseScmCommandException, ReleaseExecutionException, ReleaseScmRepositoryException
     {
         // no prepare-commit required
         if ( releaseDescriptor.isSuppressCommitBeforeTagOrBranch() )
         {
             String parameterName;
-            if ( releaseDescriptor.isBranchCreation() ) 
+            if ( releaseDescriptor.isBranchCreation() )
             {
                 parameterName = "suppressCommitBeforeBranch";
             }
-            else 
+            else
             {
                 parameterName = "suppressCommitBeforeTag";
             }
@@ -59,12 +67,12 @@ public class ScmCommitPreparationPhase
             if ( simulating )
             {
                 logInfo( result,
-                         "Full run would not commit changes, " + "because " + parameterName + " is set to true." );
+                        "Full run would not commit changes, " + "because " + parameterName + " is set to true." );
             }
             else
             {
                 logInfo( result,
-                         "Modified POMs are not committed because " + parameterName + " is set to true." );
+                        "Modified POMs are not committed because " + parameterName + " is set to true." );
             }
         }
         // commit development versions required
@@ -83,14 +91,14 @@ public class ScmCommitPreparationPhase
     }
 
     protected void validateConfiguration( ReleaseDescriptor releaseDescriptor )
-        throws ReleaseFailureException
+            throws ReleaseFailureException
     {
         super.validateConfiguration( releaseDescriptor );
 
         if ( releaseDescriptor.isSuppressCommitBeforeTagOrBranch() && releaseDescriptor.isRemoteTagging() )
         {
             throw new ReleaseFailureException(
-                "Cannot perform a remote tag or branch without committing the working copy first." );
+                    "Cannot perform a remote tag or branch without committing the working copy first." );
         }
     }
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/policies/DefaultNamingPolicy.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhase.java
similarity index 52%
copy from maven-release-manager/src/main/java/org/apache/maven/shared/release/policies/DefaultNamingPolicy.java
copy to maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhase.java
index 37a0b960..c0ca7f54 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/policies/DefaultNamingPolicy.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhase.java
@@ -1,4 +1,4 @@
-package org.apache.maven.shared.release.policies;
+package org.apache.maven.shared.release.phase;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,25 +19,30 @@ package org.apache.maven.shared.release.policies;
  * under the License.
  */
 
-import org.apache.maven.shared.release.policy.PolicyException;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import java.util.Map;
+
 import org.apache.maven.shared.release.policy.naming.NamingPolicy;
-import org.apache.maven.shared.release.policy.naming.NamingPolicyRequest;
-import org.apache.maven.shared.release.policy.naming.NamingPolicyResult;
-import org.codehaus.plexus.component.annotations.Component;
+import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
+import org.codehaus.plexus.components.interactivity.Prompter;
 
 /**
- * <p>DefaultNamingPolicy class.</p>
+ * Input any variables that were not yet configured.
  *
- * @author Robert Scholte
- * @since 3.0.0-M5
+ * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-@Component( role = NamingPolicy.class, hint = "default" )
-public class DefaultNamingPolicy implements NamingPolicy
+@Singleton
+@Named( "branch-input-variables" )
+public class BranchInputVariablesPhase
+        extends AbstractInputVariablesPhase
 {
-    @Override
-    public NamingPolicyResult getName( NamingPolicyRequest request )
-        throws PolicyException
+    @Inject
+    public BranchInputVariablesPhase( Prompter prompter, ScmRepositoryConfigurator scmRepositoryConfigurator,
+                                      Map<String, NamingPolicy> namingPolicies )
     {
-        return new NamingPolicyResult().setName( request.getArtifactId() + "-" + request.getVersion() );
+        super( prompter, scmRepositoryConfigurator, namingPolicies, true, null );
     }
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckCompletedPreparePhasesPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckCompletedPreparePhasesPhase.java
index 3424c1e3..15bc7a0f 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckCompletedPreparePhasesPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckCompletedPreparePhasesPhase.java
@@ -19,6 +19,9 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.util.List;
 
 import org.apache.maven.project.MavenProject;
@@ -27,29 +30,29 @@ import org.apache.maven.shared.release.ReleaseFailureException;
 import org.apache.maven.shared.release.ReleaseResult;
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
-import org.codehaus.plexus.component.annotations.Component;
 
 /**
  * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
  */
-@Component( role = ReleasePhase.class, hint = "verify-completed-prepare-phases" )
+@Singleton
+@Named( "verify-completed-prepare-phases" )
 public class CheckCompletedPreparePhasesPhase
-    extends AbstractReleasePhase
+        extends AbstractReleasePhase
 {
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor,
                                   ReleaseEnvironment releaseEnvironment,
                                   List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult result = new ReleaseResult();
 
         // if we stopped mid-way through preparation - don't perform
         if ( releaseDescriptor.getCompletedPhase() != null
-             && !"end-release".equals( releaseDescriptor.getCompletedPhase() ) )
+                && !"end-release".equals( releaseDescriptor.getCompletedPhase() ) )
         {
             String message = "Cannot perform release - the preparation step was stopped mid-way. Please re-run "
-                             + "release:prepare to continue, or perform the release from an SCM tag.";
+                    + "release:prepare to continue, or perform the release from an SCM tag.";
 
             result.setResultCode( ReleaseResult.ERROR );
 
@@ -78,7 +81,7 @@ public class CheckCompletedPreparePhasesPhase
     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor,
                                    ReleaseEnvironment releaseEnvironment,
                                    List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         return execute( releaseDescriptor, releaseEnvironment, reactorProjects );
     }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhase.java
index 8c3614fa..bc278ca7 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhase.java
@@ -19,6 +19,10 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -28,6 +32,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.ArtifactUtils;
@@ -40,21 +45,22 @@ import org.apache.maven.shared.release.env.ReleaseEnvironment;
 import org.apache.maven.shared.release.versions.DefaultVersionInfo;
 import org.apache.maven.shared.release.versions.VersionInfo;
 import org.apache.maven.shared.release.versions.VersionParseException;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.components.interactivity.Prompter;
 import org.codehaus.plexus.components.interactivity.PrompterException;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * Check the dependencies of all projects being released to see if there are any unreleased snapshots.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
- // TODO plugins with no version will be resolved to RELEASE which is not a snapshot, but remains unresolved to this point. This is a potential hole in the check, and should be revisited after the release pom writing is done and resolving versions to verify whether it is.
- // TODO plugins injected by the lifecycle are not tested here. They will be injected with a RELEASE version so are covered under the above point.
-@Component( role = ReleasePhase.class, hint = "check-dependency-snapshots" )
+// TODO plugins with no version will be resolved to RELEASE which is not a snapshot, but remains unresolved to this point. This is a potential hole in the check, and should be revisited after the release pom writing is done and resolving versions to verify whether it is.
+// TODO plugins injected by the lifecycle are not tested here. They will be injected with a RELEASE version so are covered under the above point.
+@Singleton
+@Named( "check-dependency-snapshots" )
 public class CheckDependencySnapshotsPhase
-    extends AbstractReleasePhase
+        extends AbstractReleasePhase
 {
     public static final String RESOLVE_SNAPSHOT_MESSAGE = "There are still some remaining snapshot dependencies.\n";
 
@@ -63,30 +69,43 @@ public class CheckDependencySnapshotsPhase
     public static final String RESOLVE_SNAPSHOT_TYPE_MESSAGE = "Dependency type to resolve,";
 
     public static final String RESOLVE_SNAPSHOT_TYPE_PROMPT =
-        "specify the selection number ( 0:All 1:Project Dependencies 2:Plugins 3:Reports 4:Extensions ):";
+            "specify the selection number ( 0:All 1:Project Dependencies 2:Plugins 3:Reports 4:Extensions ):";
 
     /**
      * Component used to prompt for input.
      */
-    @Requirement
-    private Prompter prompter;
-    
+    private final AtomicReference<Prompter> prompter;
+
     // Be aware of the difference between usedSnapshots and specifiedSnapshots:
     // UsedSnapshots end up on the classpath.
     // SpecifiedSnapshots are defined anywhere in the pom.
     // We'll probably need to introduce specifiedSnapshots as well.
     // @TODO MRELEASE-378: verify custom dependencies in plugins. Be aware of deprecated/removed Components in M3, such as PluginCollector
     // @TODO MRELEASE-763: verify all dependencies in inactive profiles
-    
+
     // Don't prompt for every project in reactor, remember state of questions
     private String resolveSnapshot;
 
     private String resolveSnapshotType;
-    
+
+    @Inject
+    public CheckDependencySnapshotsPhase( Prompter prompter )
+    {
+        this.prompter = new AtomicReference<>( requireNonNull( prompter ) );
+    }
+
+    /**
+     * For easier testing only!
+     */
+    public void setPrompter( Prompter prompter )
+    {
+        this.prompter.set( prompter );
+    }
+
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                   List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult result = new ReleaseResult();
 
@@ -109,10 +128,10 @@ public class CheckDependencySnapshotsPhase
     }
 
     private void checkProject( MavenProject project, ReleaseDescriptor releaseDescriptor )
-        throws ReleaseFailureException, ReleaseExecutionException
+            throws ReleaseFailureException, ReleaseExecutionException
     {
         Map<String, Artifact> artifactMap = ArtifactUtils.artifactMapByVersionlessId( project.getArtifacts() );
-        
+
         Set<Artifact> usedSnapshotDependencies = new HashSet<>();
 
         if ( project.getParentArtifact() != null )
@@ -142,16 +161,16 @@ public class CheckDependencySnapshotsPhase
         //@todo check profiles
 
         if ( !usedSnapshotDependencies.isEmpty() || !usedSnapshotReports.isEmpty()
-                        || !usedSnapshotExtensions.isEmpty() || !usedSnapshotPlugins.isEmpty() )
+                || !usedSnapshotExtensions.isEmpty() || !usedSnapshotPlugins.isEmpty() )
         {
             if ( releaseDescriptor.isInteractive() || null != releaseDescriptor.getAutoResolveSnapshots() )
             {
                 resolveSnapshots( usedSnapshotDependencies, usedSnapshotReports, usedSnapshotExtensions,
-                                  usedSnapshotPlugins, releaseDescriptor );
+                        usedSnapshotPlugins, releaseDescriptor );
             }
 
             if ( !usedSnapshotDependencies.isEmpty() || !usedSnapshotReports.isEmpty()
-                            || !usedSnapshotExtensions.isEmpty() || !usedSnapshotPlugins.isEmpty() )
+                    || !usedSnapshotExtensions.isEmpty() || !usedSnapshotPlugins.isEmpty() )
             {
                 StringBuilder message = new StringBuilder();
 
@@ -162,14 +181,14 @@ public class CheckDependencySnapshotsPhase
                 message.append( "in project '" + project.getName() + "' (" + project.getId() + ")" );
 
                 throw new ReleaseFailureException(
-                    "Can't release project due to non released dependencies :\n" + message );
+                        "Can't release project due to non released dependencies :\n" + message );
             }
         }
     }
 
     private Set<Artifact> checkPlugins( ReleaseDescriptor releaseDescriptor,
-                               Map<String, Artifact> artifactMap, Set<Artifact> pluginArtifacts )
-        throws ReleaseExecutionException
+                                        Map<String, Artifact> artifactMap, Set<Artifact> pluginArtifacts )
+            throws ReleaseExecutionException
     {
         Set<Artifact> usedSnapshotPlugins = new HashSet<>();
         for ( Artifact artifact : pluginArtifacts )
@@ -179,7 +198,7 @@ public class CheckDependencySnapshotsPhase
                 boolean addToFailures;
 
                 if ( "org.apache.maven.plugins".equals( artifact.getGroupId() ) && "maven-release-plugin".equals(
-                    artifact.getArtifactId() ) )
+                        artifact.getArtifactId() ) )
                 {
                     // It's a snapshot of the release plugin. Maybe just testing - ask
                     // By default, we fail as for any other plugin
@@ -194,24 +213,17 @@ public class CheckDependencySnapshotsPhase
                             String result;
                             if ( !releaseDescriptor.isSnapshotReleasePluginAllowed() )
                             {
-                                prompter.showMessage( "This project relies on a SNAPSHOT of the release plugin. "
-                                                          + "This may be necessary during testing.\n" );
-                                result = prompter.prompt( "Do you want to continue with the release?",
-                                                          Arrays.asList( "yes", "no" ), "no" );
+                                prompter.get().showMessage( "This project relies on a SNAPSHOT of the release plugin. "
+                                        + "This may be necessary during testing.\n" );
+                                result = prompter.get().prompt( "Do you want to continue with the release?",
+                                        Arrays.asList( "yes", "no" ), "no" );
                             }
                             else
                             {
                                 result = "yes";
                             }
 
-                            if ( result.toLowerCase( Locale.ENGLISH ).startsWith( "y" ) )
-                            {
-                                addToFailures = false;
-                            }
-                            else
-                            {
-                                addToFailures = true;
-                            }
+                            addToFailures = !result.toLowerCase( Locale.ENGLISH ).startsWith( "y" );
                         }
                         catch ( PrompterException e )
                         {
@@ -238,8 +250,8 @@ public class CheckDependencySnapshotsPhase
     }
 
     private Set<Artifact> checkDependencies( ReleaseDescriptor releaseDescriptor,
-                                    Map<String, Artifact> artifactMap, 
-                                    Set<Artifact> dependencyArtifacts )
+                                             Map<String, Artifact> artifactMap,
+                                             Set<Artifact> dependencyArtifacts )
     {
         Set<Artifact> usedSnapshotDependencies = new HashSet<>();
         for ( Artifact artifact : dependencyArtifacts )
@@ -253,7 +265,7 @@ public class CheckDependencySnapshotsPhase
     }
 
     private Set<Artifact> checkReports( ReleaseDescriptor releaseDescriptor,
-                               Map<String, Artifact> artifactMap, Set<Artifact> reportArtifacts )
+                                        Map<String, Artifact> artifactMap, Set<Artifact> reportArtifacts )
     {
         Set<Artifact> usedSnapshotReports = new HashSet<>();
         for ( Artifact artifact : reportArtifacts )
@@ -268,7 +280,7 @@ public class CheckDependencySnapshotsPhase
     }
 
     private Set<Artifact> checkExtensions( ReleaseDescriptor releaseDescriptor,
-                                  Map<String, Artifact> artifactMap, Set<Artifact> extensionArtifacts )
+                                           Map<String, Artifact> artifactMap, Set<Artifact> extensionArtifacts )
     {
         Set<Artifact> usedSnapshotExtensions = new HashSet<>();
         for ( Artifact artifact : extensionArtifacts )
@@ -308,19 +320,19 @@ public class CheckDependencySnapshotsPhase
         String releaseDescriptorResolvedVersion = releaseDescriptor.getDependencyReleaseVersion( versionlessKey );
 
         boolean releaseDescriptorResolvedVersionIsSnapshot = releaseDescriptorResolvedVersion == null
-                        || releaseDescriptorResolvedVersion.contains( Artifact.SNAPSHOT_VERSION );
-        
+                || releaseDescriptorResolvedVersion.contains( Artifact.SNAPSHOT_VERSION );
+
         // We are only looking at dependencies external to the project - ignore anything found in the reactor as
         // it's version will be updated
         boolean bannedVersion = artifact.isSnapshot()
                 && !artifact.getBaseVersion().equals( releaseDescriptor.getProjectOriginalVersion( versionlessKey ) )
-                        && releaseDescriptorResolvedVersionIsSnapshot;
+                && releaseDescriptorResolvedVersionIsSnapshot;
 
         // If we have a snapshot but allowTimestampedSnapshots is true, accept the artifact if the version
         // indicates that it is a timestamped snapshot.
         if ( bannedVersion && releaseDescriptor.isAllowTimestampedSnapshots() )
         {
-            bannedVersion = artifact.getVersion().indexOf( Artifact.SNAPSHOT_VERSION ) >= 0;
+            bannedVersion = artifact.getVersion().contains( Artifact.SNAPSHOT_VERSION );
         }
 
         return bannedVersion;
@@ -329,18 +341,13 @@ public class CheckDependencySnapshotsPhase
     @Override
     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                    List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         // It makes no modifications, so simulate is the same as execute
         return execute( releaseDescriptor, releaseEnvironment, reactorProjects );
     }
 
-    public void setPrompter( Prompter prompter )
-    {
-        this.prompter = prompter;
-    }
-
-    private StringBuilder printSnapshotDependencies( Set<Artifact> snapshotsSet, StringBuilder message )
+    private void printSnapshotDependencies( Set<Artifact> snapshotsSet, StringBuilder message )
     {
         List<Artifact> snapshotsList = new ArrayList<>( snapshotsSet );
 
@@ -354,29 +361,28 @@ public class CheckDependencySnapshotsPhase
 
             message.append( "\n" );
         }
-
-        return message;
     }
 
     private void resolveSnapshots( Set<Artifact> projectDependencies, Set<Artifact> reportDependencies,
                                    Set<Artifact> extensionDependencies, Set<Artifact> pluginDependencies,
                                    ReleaseDescriptor releaseDescriptor )
-        throws ReleaseExecutionException
+            throws ReleaseExecutionException
     {
         try
         {
             String autoResolveSnapshots = releaseDescriptor.getAutoResolveSnapshots();
             if ( resolveSnapshot == null )
             {
-                prompter.showMessage( RESOLVE_SNAPSHOT_MESSAGE );
+                prompter.get().showMessage( RESOLVE_SNAPSHOT_MESSAGE );
                 if ( autoResolveSnapshots != null )
                 {
                     resolveSnapshot = "yes";
-                    prompter.showMessage( RESOLVE_SNAPSHOT_PROMPT + " " + resolveSnapshot );
+                    prompter.get().showMessage( RESOLVE_SNAPSHOT_PROMPT + " " + resolveSnapshot );
                 }
                 else
                 {
-                    resolveSnapshot = prompter.prompt( RESOLVE_SNAPSHOT_PROMPT, Arrays.asList( "yes", "no" ), "no" );
+                    resolveSnapshot =
+                            prompter.get().prompt( RESOLVE_SNAPSHOT_PROMPT, Arrays.asList( "yes", "no" ), "no" );
                 }
             }
 
@@ -384,7 +390,7 @@ public class CheckDependencySnapshotsPhase
             {
                 if ( resolveSnapshotType == null )
                 {
-                    prompter.showMessage( RESOLVE_SNAPSHOT_TYPE_MESSAGE );
+                    prompter.get().showMessage( RESOLVE_SNAPSHOT_TYPE_MESSAGE );
                     int defaultAnswer = -1;
                     if ( autoResolveSnapshots != null )
                     {
@@ -422,13 +428,15 @@ public class CheckDependencySnapshotsPhase
                     }
                     if ( defaultAnswer >= 0 && defaultAnswer <= 4 )
                     {
-                        prompter.showMessage( RESOLVE_SNAPSHOT_TYPE_PROMPT + " " + autoResolveSnapshots );
+                        prompter.get().showMessage( RESOLVE_SNAPSHOT_TYPE_PROMPT + " " + autoResolveSnapshots );
                         resolveSnapshotType = Integer.toString( defaultAnswer );
                     }
                     else
                     {
                         resolveSnapshotType =
-                            prompter.prompt( RESOLVE_SNAPSHOT_TYPE_PROMPT, Arrays.asList( "0", "1", "2", "3" ), "1" );
+                                prompter.get()
+                                        .prompt( RESOLVE_SNAPSHOT_TYPE_PROMPT, Arrays.asList( "0", "1", "2", "3" ),
+                                                "1" );
                     }
                 }
 
@@ -442,22 +450,22 @@ public class CheckDependencySnapshotsPhase
                         processSnapshot( extensionDependencies, releaseDescriptor, autoResolveSnapshots );
                         break;
 
-                        // project dependencies
+                    // project dependencies
                     case 1:
                         processSnapshot( projectDependencies, releaseDescriptor, autoResolveSnapshots );
                         break;
 
-                        // plugins
+                    // plugins
                     case 2:
                         processSnapshot( pluginDependencies, releaseDescriptor, autoResolveSnapshots );
                         break;
 
-                        // reports
+                    // reports
                     case 3:
                         processSnapshot( reportDependencies, releaseDescriptor, autoResolveSnapshots );
                         break;
 
-                        // extensions
+                    // extensions
                     case 4:
                         processSnapshot( extensionDependencies, releaseDescriptor, autoResolveSnapshots );
                         break;
@@ -474,7 +482,7 @@ public class CheckDependencySnapshotsPhase
 
     private void processSnapshot( Set<Artifact> snapshotSet, ReleaseDescriptor releaseDescriptor,
                                   String autoResolveSnapshots )
-        throws PrompterException, VersionParseException
+            throws PrompterException, VersionParseException
     {
         Iterator<Artifact> iterator = snapshotSet.iterator();
 
@@ -486,20 +494,20 @@ public class CheckDependencySnapshotsPhase
             VersionInfo versionInfo = new DefaultVersionInfo( currentArtifact.getBaseVersion() );
             releaseDescriptor.addDependencyOriginalVersion( versionlessKey, versionInfo.toString() );
 
-            prompter.showMessage(
-                "Dependency '" + versionlessKey + "' is a snapshot (" + currentArtifact.getVersion() + ")\n" );
+            prompter.get().showMessage(
+                    "Dependency '" + versionlessKey + "' is a snapshot (" + currentArtifact.getVersion() + ")\n" );
             String message = "Which release version should it be set to?";
             String result;
             if ( null != autoResolveSnapshots )
             {
                 result = versionInfo.getReleaseVersionString();
-                prompter.showMessage( message + " " + result );
+                prompter.get().showMessage( message + " " + result );
             }
             else
             {
-                result = prompter.prompt( message, versionInfo.getReleaseVersionString() );
+                result = prompter.get().prompt( message, versionInfo.getReleaseVersionString() );
             }
-            
+
             releaseDescriptor.addDependencyReleaseVersion( versionlessKey, result );
 
             iterator.remove();
@@ -522,13 +530,13 @@ public class CheckDependencySnapshotsPhase
             if ( null != autoResolveSnapshots )
             {
                 result = nextVersion;
-                prompter.showMessage( message + " " + result );
+                prompter.get().showMessage( message + " " + result );
             }
             else
             {
-                result = prompter.prompt( message, nextVersion );
+                result = prompter.get().prompt( message, nextVersion );
             }
-            
+
             releaseDescriptor.addDependencyDevelopmentVersion( versionlessKey, result );
         }
     }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStoreException.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckPomsPhase.java
similarity index 63%
copy from maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStoreException.java
copy to maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckPomsPhase.java
index e6f3d708..f1f15c6b 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStoreException.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckPomsPhase.java
@@ -1,4 +1,4 @@
-package org.apache.maven.shared.release.config;
+package org.apache.maven.shared.release.phase;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,22 +19,25 @@ package org.apache.maven.shared.release.config;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
+
 /**
- * Exception occurring within the configuration store.
+ * Phase that checks the validity of the POM before release.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-public class ReleaseDescriptorStoreException
-    extends Exception
+@Singleton
+@Named( "check-poms" )
+public class CheckPomsPhase
+        extends AbstractCheckPomPhase
 {
-    /**
-     * <p>Constructor for ReleaseDescriptorStoreException.</p>
-     *
-     * @param message a {@link java.lang.String} object
-     * @param t a {@link java.lang.Throwable} object
-     */
-    public ReleaseDescriptorStoreException( String message, Throwable t )
+    @Inject
+    public CheckPomsPhase( ScmRepositoryConfigurator scmRepositoryConfigurator )
     {
-        super( message, t );
+        super( scmRepositoryConfigurator, true, true );
     }
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStoreException.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckPomsUpdateversionsPhase.java
similarity index 61%
copy from maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStoreException.java
copy to maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckPomsUpdateversionsPhase.java
index e6f3d708..108e5ba0 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStoreException.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckPomsUpdateversionsPhase.java
@@ -1,4 +1,4 @@
-package org.apache.maven.shared.release.config;
+package org.apache.maven.shared.release.phase;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,22 +19,25 @@ package org.apache.maven.shared.release.config;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
+
 /**
- * Exception occurring within the configuration store.
+ * Phase that checks the validity of the POM before release.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-public class ReleaseDescriptorStoreException
-    extends Exception
+@Singleton
+@Named( "check-poms-updateversions" )
+public class CheckPomsUpdateversionsPhase
+        extends AbstractCheckPomPhase
 {
-    /**
-     * <p>Constructor for ReleaseDescriptorStoreException.</p>
-     *
-     * @param message a {@link java.lang.String} object
-     * @param t a {@link java.lang.Throwable} object
-     */
-    public ReleaseDescriptorStoreException( String message, Throwable t )
+    @Inject
+    public CheckPomsUpdateversionsPhase( ScmRepositoryConfigurator scmRepositoryConfigurator )
     {
-        super( message, t );
+        super( scmRepositoryConfigurator, false, false );
     }
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckoutProjectFromScm.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckoutProjectFromScm.java
index 76e55343..29e4308f 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckoutProjectFromScm.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckoutProjectFromScm.java
@@ -19,6 +19,10 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.LinkOption;
@@ -46,30 +50,36 @@ import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 import org.apache.maven.shared.release.util.ReleaseUtil;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.StringUtils;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
  */
-@Component( role = ReleasePhase.class, hint = "checkout-project-from-scm" )
+@Singleton
+@Named( "checkout-project-from-scm" )
 public class CheckoutProjectFromScm
-    extends AbstractReleasePhase
+        extends AbstractReleasePhase
 {
     /**
      * Tool that gets a configured SCM repository from release configuration.
      */
-    @Requirement
-    private ScmRepositoryConfigurator scmRepositoryConfigurator;
+    private final ScmRepositoryConfigurator scmRepositoryConfigurator;
+
+    @Inject
+    public CheckoutProjectFromScm( ScmRepositoryConfigurator scmRepositoryConfigurator )
+    {
+        this.scmRepositoryConfigurator = requireNonNull( scmRepositoryConfigurator );
+    }
 
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                   List<MavenProject> reactorProjects )
             throws ReleaseExecutionException, ReleaseFailureException
     {
-        ReleaseResult releaseResult = null;
+        ReleaseResult releaseResult;
 
         if ( releaseDescriptor.isLocalCheckout() )
         {
@@ -133,7 +143,7 @@ public class CheckoutProjectFromScm
             // when there is no localCheckout, then we just do a standard SCM checkout.
             try
             {
-                releaseResult =  performCheckout( releaseDescriptor, releaseEnvironment, reactorProjects );
+                releaseResult = performCheckout( releaseDescriptor, releaseEnvironment, reactorProjects );
             }
             catch ( ScmException e )
             {
@@ -142,7 +152,7 @@ public class CheckoutProjectFromScm
                 logError( releaseResult, e.getMessage() );
 
                 throw new ReleaseExecutionException( "An error is occurred in the checkout process: "
-                                                     + e.getMessage(), e );
+                        + e.getMessage(), e );
             }
 
         }
@@ -152,8 +162,8 @@ public class CheckoutProjectFromScm
 
 
     private ReleaseResult performCheckout( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
-                                  List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException, ScmException
+                                           List<MavenProject> reactorProjects )
+            throws ReleaseExecutionException, ReleaseFailureException, ScmException
     {
         ReleaseResult result = new ReleaseResult();
 
@@ -165,7 +175,7 @@ public class CheckoutProjectFromScm
         try
         {
             repository = scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor,
-                                                                            releaseEnvironment.getSettings() );
+                    releaseEnvironment.getSettings() );
 
             provider = scmRepositoryConfigurator.getRepositoryProvider( repository );
         }
@@ -188,7 +198,7 @@ public class CheckoutProjectFromScm
 
         // TODO: sanity check that it is not . or .. or lower
         File checkoutDirectory =
-            FileUtils.resolveFile( rootProject.getBasedir(), releaseDescriptor.getCheckoutDirectory() );
+                FileUtils.resolveFile( rootProject.getBasedir(), releaseDescriptor.getCheckoutDirectory() );
 
         if ( checkoutDirectory.exists() )
         {
@@ -211,7 +221,7 @@ public class CheckoutProjectFromScm
         commandParameters.setString( CommandParameter.SHALLOW, Boolean.TRUE.toString() );
 
         CheckOutScmResult scmResult = provider.checkOut( repository, new ScmFileSet( checkoutDirectory ),
-                           new ScmTag( releaseDescriptor.getScmReleaseLabel() ), commandParameters );
+                new ScmTag( releaseDescriptor.getScmReleaseLabel() ), commandParameters );
 
         if ( releaseDescriptor.isLocalCheckout() && !scmResult.isSuccess() )
         {
@@ -234,7 +244,7 @@ public class CheckoutProjectFromScm
             {
                 throw new ReleaseExecutionException( e.getMessage(), e );
             }
-            
+
             scmRelativePathProjectDirectory = workingDirectory.relativize( rootProjectBasedir ).toString();
         }
         releaseDescriptor.setScmRelativePathProjectDirectory( scmRelativePathProjectDirectory );
@@ -255,7 +265,7 @@ public class CheckoutProjectFromScm
     @Override
     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                    List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult result = new ReleaseResult();
 
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CreateBackupPomsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CreateBackupPomsPhase.java
index bf07fd62..866c9a20 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CreateBackupPomsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CreateBackupPomsPhase.java
@@ -19,6 +19,9 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.io.IOException;
 import java.util.List;
 
@@ -29,20 +32,20 @@ import org.apache.maven.shared.release.ReleaseResult;
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
 import org.apache.maven.shared.release.util.ReleaseUtil;
-import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.util.FileUtils;
 
 /**
  * @author Edwin Punzalan
  */
-@Component( role = ReleasePhase.class, hint = "create-backup-poms" )
+@Singleton
+@Named( "create-backup-poms" )
 public class CreateBackupPomsPhase
-    extends AbstractBackupPomsPhase implements ResourceGenerator
+        extends AbstractBackupPomsPhase implements ResourceGenerator
 {
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                   List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult result = new ReleaseResult();
 
@@ -77,13 +80,13 @@ public class CreateBackupPomsPhase
     @Override
     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                    List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         return execute( releaseDescriptor, releaseEnvironment, reactorProjects );
     }
 
     private void createPomBackup( MavenProject project )
-        throws ReleaseExecutionException
+            throws ReleaseExecutionException
     {
         // delete any existing backup first
         deletePomBackup( project );
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/EndReleasePhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/EndReleasePhase.java
index 123c0a35..b55cf2f9 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/EndReleasePhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/EndReleasePhase.java
@@ -19,29 +19,32 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import java.util.List;
+
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseFailureException;
 import org.apache.maven.shared.release.ReleaseResult;
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
-import org.codehaus.plexus.component.annotations.Component;
-
-import java.util.List;
 
 /**
  * Finalise release preparation so it can be flagged complete..
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-@Component( role = ReleasePhase.class, hint = "end-release" )
+@Singleton
+@Named( "end-release" )
 public class EndReleasePhase
-    extends AbstractReleasePhase
+        extends AbstractReleasePhase
 {
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                   List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult result = new ReleaseResult();
 
@@ -55,7 +58,7 @@ public class EndReleasePhase
     @Override
     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                    List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult result = new ReleaseResult();
 
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/GenerateReleasePomsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/GenerateReleasePomsPhase.java
index fc638148..9a2ec0f9 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/GenerateReleasePomsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/GenerateReleasePomsPhase.java
@@ -19,6 +19,10 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.io.File;
 import java.io.IOException;
 import java.io.Writer;
@@ -38,7 +42,6 @@ import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Extension;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.Plugin;
-import org.apache.maven.model.Profile;
 import org.apache.maven.model.ReportPlugin;
 import org.apache.maven.model.Reporting;
 import org.apache.maven.model.Resource;
@@ -60,35 +63,46 @@ import org.apache.maven.shared.release.ReleaseResult;
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
 import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
+import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 import org.apache.maven.shared.release.scm.ScmTranslator;
 import org.apache.maven.shared.release.util.ReleaseUtil;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.util.WriterFactory;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * Generate release POMs.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  */
-@Component( role = ReleasePhase.class, hint = "generate-release-poms" )
+@Singleton
+@Named( "generate-release-poms" )
 public class GenerateReleasePomsPhase
-    extends AbstractReleasePomsPhase implements ResourceGenerator
+        extends AbstractReleasePomsPhase implements ResourceGenerator
 {
     private static final String FINALNAME_EXPRESSION = "${project.artifactId}-${project.version}";
 
-    @Requirement
-    private SuperPomProvider superPomProvider;
+    private final SuperPomProvider superPomProvider;
 
-    @Requirement
-    private ModelInterpolator modelInterpolator;
+    private final ModelInterpolator modelInterpolator;
 
     /**
      * SCM URL translators mapped by provider name.
      */
-    @Requirement( role = ScmTranslator.class )
-    private Map<String, ScmTranslator> scmTranslators;
+    private final Map<String, ScmTranslator> scmTranslators;
+
+    @Inject
+    public GenerateReleasePomsPhase(
+            ScmRepositoryConfigurator scmRepositoryConfigurator,
+            SuperPomProvider superPomProvider, ModelInterpolator modelInterpolator,
+            Map<String, ScmTranslator> scmTranslators )
+    {
+        super( scmRepositoryConfigurator );
+        this.superPomProvider = requireNonNull( superPomProvider );
+        this.modelInterpolator = requireNonNull( modelInterpolator );
+        this.scmTranslators = requireNonNull( scmTranslators );
+    }
 
     /*
      * @see org.apache.maven.shared.release.phase.ReleasePhase#execute(org.apache.maven.shared.release.config.ReleaseDescriptor,
@@ -97,14 +111,14 @@ public class GenerateReleasePomsPhase
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                   List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         return execute( releaseDescriptor, releaseEnvironment, reactorProjects, false );
     }
 
     private ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                    List<MavenProject> reactorProjects, boolean simulate )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult result = new ReleaseResult();
 
@@ -126,7 +140,7 @@ public class GenerateReleasePomsPhase
 
     private void generateReleasePoms( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                       List<MavenProject> reactorProjects, boolean simulate, ReleaseResult result )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         List<File> releasePoms = new ArrayList<>();
 
@@ -143,7 +157,7 @@ public class GenerateReleasePomsPhase
     private File generateReleasePom( MavenProject project, ReleaseDescriptor releaseDescriptor,
                                      ReleaseEnvironment releaseEnvironment,
                                      ReleaseResult result )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         // create release pom
 
@@ -161,9 +175,8 @@ public class GenerateReleasePomsPhase
             throw new ReleaseExecutionException( "Cannot generate release POM : pom file is null" );
         }
 
-        
 
-        try ( Writer fileWriter = WriterFactory.newXmlWriter( releasePomFile ) ) 
+        try ( Writer fileWriter = WriterFactory.newXmlWriter( releasePomFile ) )
         {
             pomWriter.write( fileWriter, releasePom );
         }
@@ -178,7 +191,7 @@ public class GenerateReleasePomsPhase
     private void addReleasePomsToScm( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                       List<MavenProject> reactorProjects, boolean simulate, ReleaseResult result,
                                       List<File> releasePoms )
-        throws ReleaseFailureException, ReleaseExecutionException
+            throws ReleaseFailureException, ReleaseExecutionException
     {
         if ( simulate )
         {
@@ -204,7 +217,7 @@ public class GenerateReleasePomsPhase
             catch ( ScmException exception )
             {
                 throw new ReleaseExecutionException( "Cannot add release POM to SCM: " + exception.getMessage(),
-                                                     exception );
+                        exception );
             }
         }
     }
@@ -212,7 +225,7 @@ public class GenerateReleasePomsPhase
     private Model createReleaseModel( MavenProject project, ReleaseDescriptor releaseDescriptor,
                                       ReleaseEnvironment releaseEnvironment,
                                       ReleaseResult result )
-        throws ReleaseFailureException, ReleaseExecutionException
+            throws ReleaseFailureException, ReleaseExecutionException
     {
         MavenProject releaseProject = project.clone();
         Model releaseModel = releaseProject.getModel();
@@ -220,14 +233,14 @@ public class GenerateReleasePomsPhase
         // the release POM should reflect bits of these which were injected at build time...
         // we don't need these polluting the POM.
         releaseModel.setParent( null );
-        releaseModel.setProfiles( Collections.<Profile>emptyList() );
+        releaseModel.setProfiles( Collections.emptyList() );
         releaseModel.setDependencyManagement( null );
         releaseProject.getBuild().setPluginManagement( null );
 
         // update project version
         String projectVersion = releaseModel.getVersion();
         String releaseVersion =
-            getNextVersion( releaseDescriptor, project.getGroupId(), project.getArtifactId() );
+                getNextVersion( releaseDescriptor, project.getGroupId(), project.getArtifactId() );
         releaseModel.setVersion( releaseVersion );
 
         String originalFinalName = releaseModel.getBuild().getFinalName();
@@ -247,10 +260,10 @@ public class GenerateReleasePomsPhase
         String finalName = ReleaseUtil.interpolate( originalFinalName, releaseModel );
 
         // still required?
-        if ( finalName.indexOf( Artifact.SNAPSHOT_VERSION ) != -1 )
+        if ( finalName.contains( Artifact.SNAPSHOT_VERSION ) )
         {
             throw new ReleaseFailureException( "Cannot reliably adjust the finalName of project: "
-                            + releaseProject.getId() );
+                    + releaseProject.getId() );
         }
         releaseModel.getBuild().setFinalName( finalName );
 
@@ -284,12 +297,12 @@ public class GenerateReleasePomsPhase
         releaseModel.getBuild().setPlugins( createReleasePlugins( releaseDescriptor, releaseProject ) );
 
         // rewrite reports
-        releaseModel.getReporting().setPlugins( createReleaseReportPlugins( releaseDescriptor, 
-                                                                            releaseProject ) );
+        releaseModel.getReporting().setPlugins( createReleaseReportPlugins( releaseDescriptor,
+                releaseProject ) );
 
         // rewrite extensions
-        releaseModel.getBuild().setExtensions( createReleaseExtensions( releaseDescriptor, 
-                                                                        releaseProject ) );
+        releaseModel.getBuild().setExtensions( createReleaseExtensions( releaseDescriptor,
+                releaseProject ) );
 
         unalignFromBaseDirectory( releaseModel, project.getBasedir() );
 
@@ -311,63 +324,62 @@ public class GenerateReleasePomsPhase
         buildingRequest.setUserProperties( properties );
 
         Model interpolatedSuperModel =
-            modelInterpolator.interpolateModel( rawSuperModel.clone(), basedir, buildingRequest, null );
+                modelInterpolator.interpolateModel( rawSuperModel.clone(), basedir, buildingRequest, null );
 
         Build currentBuild = releaseModel.getBuild();
         Build interpolatedSuperBuild = interpolatedSuperModel.getBuild();
         Build rawSuperBuild = rawSuperModel.getBuild();
 
         currentBuild.setSourceDirectory( resolvePath( basedir.toPath(), currentBuild.getSourceDirectory(),
-                                                  interpolatedSuperBuild.getSourceDirectory(),
-                                                  rawSuperBuild.getSourceDirectory() ) );
+                interpolatedSuperBuild.getSourceDirectory(),
+                rawSuperBuild.getSourceDirectory() ) );
         currentBuild.setScriptSourceDirectory( resolvePath( basedir.toPath(), currentBuild.getScriptSourceDirectory(),
-                                                  interpolatedSuperBuild.getScriptSourceDirectory(),
-                                                  rawSuperBuild.getScriptSourceDirectory() ) );
+                interpolatedSuperBuild.getScriptSourceDirectory(),
+                rawSuperBuild.getScriptSourceDirectory() ) );
         currentBuild.setTestSourceDirectory( resolvePath( basedir.toPath(), currentBuild.getTestSourceDirectory(),
-                                                  interpolatedSuperBuild.getTestSourceDirectory(),
-                                                  rawSuperBuild.getTestSourceDirectory() ) );
+                interpolatedSuperBuild.getTestSourceDirectory(),
+                rawSuperBuild.getTestSourceDirectory() ) );
         currentBuild.setOutputDirectory( resolvePath( basedir.toPath(), currentBuild.getOutputDirectory(),
-                                                        interpolatedSuperBuild.getOutputDirectory(),
-                                                        rawSuperBuild.getOutputDirectory() ) );
+                interpolatedSuperBuild.getOutputDirectory(),
+                rawSuperBuild.getOutputDirectory() ) );
         currentBuild.setTestOutputDirectory( resolvePath( basedir.toPath(), currentBuild.getTestOutputDirectory(),
-                                                      interpolatedSuperBuild.getTestOutputDirectory(),
-                                                      rawSuperBuild.getTestOutputDirectory() ) );
+                interpolatedSuperBuild.getTestOutputDirectory(),
+                rawSuperBuild.getTestOutputDirectory() ) );
         currentBuild.setDirectory( resolvePath( basedir.toPath(), currentBuild.getDirectory(),
-                                            interpolatedSuperBuild.getDirectory(),
-                                            rawSuperBuild.getDirectory() ) );
+                interpolatedSuperBuild.getDirectory(),
+                rawSuperBuild.getDirectory() ) );
 
         for ( Resource currentResource : currentBuild.getResources() )
         {
             Map<String, String> superResourceDirectories =
-                new LinkedHashMap<>( interpolatedSuperBuild.getResources().size() );
+                    new LinkedHashMap<>( interpolatedSuperBuild.getResources().size() );
             for ( int i = 0; i < interpolatedSuperBuild.getResources().size(); i++ )
             {
                 superResourceDirectories.put( interpolatedSuperBuild.getResources().get( i ).getDirectory(),
-                                              rawSuperBuild.getResources().get( i ).getDirectory() );
+                        rawSuperBuild.getResources().get( i ).getDirectory() );
             }
             currentResource.setDirectory( resolvePath( basedir.toPath(), currentResource.getDirectory(),
-                                                       superResourceDirectories ) );
+                    superResourceDirectories ) );
         }
 
         for ( Resource currentResource : currentBuild.getTestResources() )
         {
             Map<String, String> superResourceDirectories =
-                new LinkedHashMap<>( interpolatedSuperBuild.getTestResources().size() );
+                    new LinkedHashMap<>( interpolatedSuperBuild.getTestResources().size() );
             for ( int i = 0; i < interpolatedSuperBuild.getTestResources().size(); i++ )
             {
                 superResourceDirectories.put( interpolatedSuperBuild.getTestResources().get( i ).getDirectory(),
-                                              rawSuperBuild.getTestResources().get( i ).getDirectory() );
+                        rawSuperBuild.getTestResources().get( i ).getDirectory() );
             }
             currentResource.setDirectory( resolvePath( basedir.toPath(), currentResource.getDirectory(),
-                                                       superResourceDirectories ) );
+                    superResourceDirectories ) );
         }
 
 
-
         releaseModel.getReporting().setOutputDirectory( resolvePath( basedir.toPath(),
-                                                         releaseModel.getReporting().getOutputDirectory(),
-                                                         interpolatedSuperModel.getReporting().getOutputDirectory(),
-                                                         rawSuperModel.getReporting().getOutputDirectory() ) );
+                releaseModel.getReporting().getOutputDirectory(),
+                interpolatedSuperModel.getReporting().getOutputDirectory(),
+                rawSuperModel.getReporting().getOutputDirectory() ) );
     }
 
     private String resolvePath( Path basedir, String current, String superInterpolated, String superRaw )
@@ -392,7 +404,7 @@ public class GenerateReleasePomsPhase
     private String findOriginalFinalName( MavenProject project )
     {
         if ( project.getOriginalModel().getBuild() != null
-            && project.getOriginalModel().getBuild().getFinalName() != null )
+                && project.getOriginalModel().getBuild().getFinalName() != null )
         {
             return project.getOriginalModel().getBuild().getFinalName();
         }
@@ -409,13 +421,13 @@ public class GenerateReleasePomsPhase
     @Override
     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                    List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         return execute( releaseDescriptor, releaseEnvironment, reactorProjects, true );
     }
 
     private String getNextVersion( ReleaseDescriptor releaseDescriptor, String groupId, String artifactId )
-        throws ReleaseFailureException
+            throws ReleaseFailureException
     {
         // TODO: share with RewritePomsForReleasePhase.rewriteVersion
 
@@ -474,7 +486,7 @@ public class GenerateReleasePomsPhase
 
     private List<Dependency> createReleaseDependencies( ReleaseDescriptor releaseDescriptor,
                                                         MavenProject project )
-        throws ReleaseFailureException
+            throws ReleaseFailureException
     {
         Set<Artifact> artifacts = project.getArtifacts();
 
@@ -483,8 +495,7 @@ public class GenerateReleasePomsPhase
         if ( artifacts != null )
         {
             // make dependency order deterministic for tests (related to MNG-1412)
-            List<Artifact> orderedArtifacts = new ArrayList<>();
-            orderedArtifacts.addAll( artifacts );
+            List<Artifact> orderedArtifacts = new ArrayList<>( artifacts );
             Collections.sort( orderedArtifacts );
 
             releaseDependencies = new ArrayList<>();
@@ -512,7 +523,7 @@ public class GenerateReleasePomsPhase
 
     private String getReleaseVersion( ReleaseDescriptor releaseDescriptor,
                                       Artifact artifact )
-        throws ReleaseFailureException
+            throws ReleaseFailureException
     {
         String key = ArtifactUtils.versionlessKey( artifact );
 
@@ -545,7 +556,7 @@ public class GenerateReleasePomsPhase
 
     private List<Plugin> createReleasePlugins( ReleaseDescriptor releaseDescriptor,
                                                MavenProject project )
-        throws ReleaseFailureException
+            throws ReleaseFailureException
     {
         List<Plugin> releasePlugins = null;
 
@@ -592,7 +603,7 @@ public class GenerateReleasePomsPhase
 
     private List<ReportPlugin> createReleaseReportPlugins( ReleaseDescriptor releaseDescriptor,
                                                            MavenProject project )
-        throws ReleaseFailureException
+            throws ReleaseFailureException
     {
         List<ReportPlugin> releaseReportPlugins = null;
 
@@ -632,7 +643,7 @@ public class GenerateReleasePomsPhase
 
     private List<Extension> createReleaseExtensions( ReleaseDescriptor releaseDescriptor,
                                                      MavenProject project )
-        throws ReleaseFailureException
+            throws ReleaseFailureException
     {
         List<Extension> releaseExtensions = null;
 
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/InputVariablesPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/InputVariablesPhase.java
index bdf292fb..4460b7b9 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/InputVariablesPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/InputVariablesPhase.java
@@ -19,277 +19,30 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
-import java.util.List;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.util.Map;
-import java.util.Properties;
 
-import org.apache.maven.artifact.ArtifactUtils;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.scm.manager.NoSuchScmProviderException;
-import org.apache.maven.scm.provider.ScmProvider;
-import org.apache.maven.scm.repository.ScmRepository;
-import org.apache.maven.scm.repository.ScmRepositoryException;
-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.ReleaseEnvironment;
-import org.apache.maven.shared.release.policy.PolicyException;
 import org.apache.maven.shared.release.policy.naming.NamingPolicy;
-import org.apache.maven.shared.release.policy.naming.NamingPolicyRequest;
-import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
-import org.apache.maven.shared.release.util.ReleaseUtil;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.components.interactivity.Prompter;
-import org.codehaus.plexus.components.interactivity.PrompterException;
-import org.codehaus.plexus.interpolation.InterpolationException;
-import org.codehaus.plexus.interpolation.Interpolator;
-import org.codehaus.plexus.interpolation.PrefixAwareRecursionInterceptor;
-import org.codehaus.plexus.interpolation.PrefixedPropertiesValueSource;
-import org.codehaus.plexus.interpolation.RecursionInterceptor;
-import org.codehaus.plexus.interpolation.StringSearchInterpolator;
-import org.codehaus.plexus.util.StringUtils;
 
 /**
  * Input any variables that were not yet configured.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
+@Singleton
+@Named( "input-variables" )
 public class InputVariablesPhase
-    extends AbstractReleasePhase
+        extends AbstractInputVariablesPhase
 {
-    /**
-     * Component used to prompt for input.
-     */
-    @Requirement
-    private Prompter prompter;
-
-    /**
-     * Whether this is a branch or a tag operation.
-     */
-    private boolean branchOperation;
-
-    /**
-     * Tool that gets a configured SCM repository from release configuration.
-     */
-    @Requirement
-    private ScmRepositoryConfigurator scmRepositoryConfigurator;
-
-    /**
-     * Component used for custom or default naming policy
-     */
-    @Requirement
-    private Map<String, NamingPolicy> namingPolicies;
-
-    /**
-     * The default naming policy to apply, if any
-     */
-    private String defaultNamingPolicy;
-
-    void setPrompter( Prompter prompter )
-    {
-        this.prompter = prompter;
-    }
-
-    boolean isBranchOperation()
-    {
-        return branchOperation;
-    }
-
-    /**
-     * <p>getScmProvider.</p>
-     *
-     * @param releaseDescriptor a {@link org.apache.maven.shared.release.config.ReleaseDescriptor} object
-     * @param releaseEnvironment a {@link org.apache.maven.shared.release.env.ReleaseEnvironment} object
-     * @return a {@link org.apache.maven.scm.provider.ScmProvider} object
-     * @throws org.apache.maven.shared.release.scm.ReleaseScmRepositoryException if any.
-     * @throws org.apache.maven.shared.release.ReleaseExecutionException if any.
-     */
-    protected ScmProvider getScmProvider( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment )
-        throws ReleaseScmRepositoryException, ReleaseExecutionException
-    {
-        try
-        {
-            ScmRepository repository =
-                scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor,
-                                                                   releaseEnvironment.getSettings() );
-
-            return scmRepositoryConfigurator.getRepositoryProvider( repository );
-        }
-        catch ( ScmRepositoryException e )
-        {
-            throw new ReleaseScmRepositoryException(
-                e.getMessage() + " for URL: " + releaseDescriptor.getScmSourceUrl(), e.getValidationMessages() );
-        }
-        catch ( NoSuchScmProviderException e )
-        {
-            throw new ReleaseExecutionException( "Unable to configure SCM repository: " + e.getMessage(), e );
-        }
-    }
-
-    @Override
-    public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
-                                  List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException
-    {
-        ReleaseResult result = new ReleaseResult();
-
-        // get the root project
-        MavenProject project = ReleaseUtil.getRootProject( reactorProjects );
-
-        String tag = releaseDescriptor.getScmReleaseLabel();
-
-        if ( tag == null )
-        {
-            // Must get default version from mapped versions, as the project will be the incorrect snapshot
-            String key = ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() );
-            String releaseVersion = releaseDescriptor.getProjectReleaseVersion( key );
-            if ( releaseVersion == null )
-            {
-                throw new ReleaseExecutionException( "Project tag cannot be selected if version is not yet mapped" );
-            }
-
-            String suggestedName;
-            String scmTagNameFormat = releaseDescriptor.getScmTagNameFormat();
-            if ( releaseDescriptor.getProjectNamingPolicyId() != null )
-            {
-                try
-                {
-                    suggestedName =
-                        resolveSuggestedName( releaseDescriptor.getProjectNamingPolicyId(), releaseVersion, project );
-                }
-                catch ( PolicyException e )
-                {
-                    throw new ReleaseExecutionException( e.getMessage(), e );
-                }
-            }
-            else if ( scmTagNameFormat != null )
-            {
-                Interpolator interpolator = new StringSearchInterpolator( "@{", "}" );
-                List<String> possiblePrefixes = java.util.Arrays.asList( "project", "pom" );
-                Properties values = new Properties();
-                values.setProperty( "artifactId", project.getArtifactId() );
-                values.setProperty( "groupId", project.getGroupId() );
-                values.setProperty( "version", releaseVersion );
-                interpolator.addValueSource( new PrefixedPropertiesValueSource( possiblePrefixes, values, true ) );
-                RecursionInterceptor recursionInterceptor = new PrefixAwareRecursionInterceptor( possiblePrefixes );
-                try
-                {
-                    suggestedName = interpolator.interpolate( scmTagNameFormat, recursionInterceptor );
-                }
-                catch ( InterpolationException e )
-                {
-                    throw new ReleaseExecutionException(
-                        "Could not interpolate specified tag name format: " + scmTagNameFormat, e );
-                }
-            }
-            else
-            {
-                try
-                {
-                    suggestedName = resolveSuggestedName( defaultNamingPolicy, releaseVersion, project );
-                }
-                catch ( PolicyException e )
-                {
-                    throw new ReleaseExecutionException( e.getMessage(), e );
-                }
-            }
-
-            ScmProvider provider = null;
-            try
-            {
-                provider = getScmProvider( releaseDescriptor, releaseEnvironment );
-            }
-            catch ( ReleaseScmRepositoryException e )
-            {
-                throw new ReleaseExecutionException(
-                    "No scm provider can be found for url: " + releaseDescriptor.getScmSourceUrl(), e );
-            }
-
-            suggestedName = provider.sanitizeTagName( suggestedName );
-
-            if ( releaseDescriptor.isInteractive() )
-            {
-                try
-                {
-                    if ( branchOperation )
-                    {
-                        tag = prompter.prompt( "What is the branch name for \"" + project.getName() + "\"? ("
-                            + project.getGroupId() + ":" + project.getArtifactId() + ")" );
-                        if ( StringUtils.isEmpty( tag ) )
-                        {
-                            throw new ReleaseExecutionException( "No branch name was given." );
-                        }
-                    }
-                    else
-                    {
-                        tag = prompter.prompt( "What is the SCM release tag or label for \"" + project.getName()
-                            + "\"? (" + project.getGroupId() + ":" + project.getArtifactId() + ")", suggestedName );
-                    }
-                }
-                catch ( PrompterException e )
-                {
-                    throw new ReleaseExecutionException( "Error reading version from input handler: " + e.getMessage(),
-                                                         e );
-                }
-            }
-            else if ( suggestedName == null )
-            {
-                if ( isBranchOperation() )
-                {
-                    throw new ReleaseExecutionException( "No branch name was given." );
-                }
-                else
-                {
-                    throw new ReleaseExecutionException( "No tag name was given." );
-                }
-            }
-            else
-            {
-                tag = suggestedName;
-            }
-            releaseDescriptor.setScmReleaseLabel( tag );
-        }
-
-        result.setResultCode( ReleaseResult.SUCCESS );
-
-        return result;
-    }
-
-    @Override
-    public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
-                                   List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException
+    @Inject
+    public InputVariablesPhase( Prompter prompter, ScmRepositoryConfigurator scmRepositoryConfigurator,
+                                Map<String, NamingPolicy> namingPolicies )
     {
-        ReleaseResult result = new ReleaseResult();
-
-        // It makes no modifications, so simulate is the same as execute
-        execute( releaseDescriptor, releaseEnvironment, reactorProjects );
-
-        result.setResultCode( ReleaseResult.SUCCESS );
-
-        return result;
-    }
-
-    private String resolveSuggestedName( String policyId, String version, MavenProject project )
-        throws PolicyException
-    {
-        if ( policyId == null )
-        {
-            return null;
-        }
-
-        NamingPolicy policy = namingPolicies.get( policyId );
-        if ( policy == null )
-        {
-            throw new PolicyException( "Policy '" + policyId + "' is unknown, available: "
-                + namingPolicies.keySet() );
-        }
-
-        NamingPolicyRequest request = new NamingPolicyRequest()
-                        .setGroupId( project.getGroupId() )
-                        .setArtifactId( project.getArtifactId() )
-                        .setVersion( version );
-        return policy.getName( request ).getName();
+        super( prompter, scmRepositoryConfigurator, namingPolicies, false, "default" );
     }
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/MapBranchVersionsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/MapBranchVersionsPhase.java
new file mode 100644
index 00000000..ae81496f
--- /dev/null
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/MapBranchVersionsPhase.java
@@ -0,0 +1,68 @@
+package org.apache.maven.shared.release.phase;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import java.util.Map;
+
+import org.apache.maven.shared.release.policy.version.VersionPolicy;
+import org.codehaus.plexus.components.interactivity.Prompter;
+
+/**
+ * Map projects to their new versions after release / into the next development cycle.
+ * <p>
+ * The map-phases per goal are:
+ * <dl>
+ *  <dt>release:prepare</dt><dd>map-release-versions + map-development-versions; RD.isBranchCreation() = false</dd>
+ *  <dt>release:branch</dt><dd>map-branch-versions + map-development-versions; RD.isBranchCreation() = true</dd>
+ *  <dt>release:update-versions</dt><dd>map-development-versions; RD.isBranchCreation() = false</dd>
+ * </dl>
+ *
+ * <table>
+ *   <caption>MapVersionsPhase</caption>
+ *   <tr>
+ *     <th>MapVersionsPhase field</th><th>map-release-versions</th><th>map-branch-versions</th>
+ *     <th>map-development-versions</th>
+ *   </tr>
+ *   <tr>
+ *     <td>convertToSnapshot</td>     <td>false</td>               <td>true</td>               <td>true</td>
+ *   </tr>
+ *   <tr>
+ *     <td>convertToBranch</td>       <td>false</td>               <td>true</td>               <td>false</td>
+ *   </tr>
+ * </table>
+ *
+ * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ * @author Robert Scholte
+ */
+@Singleton
+@Named( "map-branch-versions" )
+public class MapBranchVersionsPhase
+        extends AbstractMapVersionsPhase
+{
+    @Inject
+    public MapBranchVersionsPhase( Prompter prompter, Map<String, VersionPolicy> versionPolicies )
+    {
+        super( prompter, versionPolicies, true, true );
+    }
+}
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/MapDevelopmentVersionsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/MapDevelopmentVersionsPhase.java
new file mode 100644
index 00000000..d0ab04af
--- /dev/null
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/MapDevelopmentVersionsPhase.java
@@ -0,0 +1,68 @@
+package org.apache.maven.shared.release.phase;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import java.util.Map;
+
+import org.apache.maven.shared.release.policy.version.VersionPolicy;
+import org.codehaus.plexus.components.interactivity.Prompter;
+
+/**
+ * Map projects to their new versions after release / into the next development cycle.
+ * <p>
+ * The map-phases per goal are:
+ * <dl>
+ *  <dt>release:prepare</dt><dd>map-release-versions + map-development-versions; RD.isBranchCreation() = false</dd>
+ *  <dt>release:branch</dt><dd>map-branch-versions + map-development-versions; RD.isBranchCreation() = true</dd>
+ *  <dt>release:update-versions</dt><dd>map-development-versions; RD.isBranchCreation() = false</dd>
+ * </dl>
+ *
+ * <table>
+ *   <caption>MapVersionsPhase</caption>
+ *   <tr>
+ *     <th>MapVersionsPhase field</th><th>map-release-versions</th><th>map-branch-versions</th>
+ *     <th>map-development-versions</th>
+ *   </tr>
+ *   <tr>
+ *     <td>convertToSnapshot</td>     <td>false</td>               <td>true</td>               <td>true</td>
+ *   </tr>
+ *   <tr>
+ *     <td>convertToBranch</td>       <td>false</td>               <td>true</td>               <td>false</td>
+ *   </tr>
+ * </table>
+ *
+ * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ * @author Robert Scholte
+ */
+@Singleton
+@Named( "map-development-versions" )
+public class MapDevelopmentVersionsPhase
+        extends AbstractMapVersionsPhase
+{
+    @Inject
+    public MapDevelopmentVersionsPhase( Prompter prompter, Map<String, VersionPolicy> versionPolicies )
+    {
+        super( prompter, versionPolicies, true, false );
+    }
+}
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/MapReleaseVersionsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/MapReleaseVersionsPhase.java
new file mode 100644
index 00000000..c785f8ab
--- /dev/null
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/MapReleaseVersionsPhase.java
@@ -0,0 +1,68 @@
+package org.apache.maven.shared.release.phase;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import java.util.Map;
+
+import org.apache.maven.shared.release.policy.version.VersionPolicy;
+import org.codehaus.plexus.components.interactivity.Prompter;
+
+/**
+ * Map projects to their new versions after release / into the next development cycle.
+ * <p>
+ * The map-phases per goal are:
+ * <dl>
+ *  <dt>release:prepare</dt><dd>map-release-versions + map-development-versions; RD.isBranchCreation() = false</dd>
+ *  <dt>release:branch</dt><dd>map-branch-versions + map-development-versions; RD.isBranchCreation() = true</dd>
+ *  <dt>release:update-versions</dt><dd>map-development-versions; RD.isBranchCreation() = false</dd>
+ * </dl>
+ *
+ * <table>
+ *   <caption>MapVersionsPhase</caption>
+ *   <tr>
+ *     <th>MapVersionsPhase field</th><th>map-release-versions</th><th>map-branch-versions</th>
+ *     <th>map-development-versions</th>
+ *   </tr>
+ *   <tr>
+ *     <td>convertToSnapshot</td>     <td>false</td>               <td>true</td>               <td>true</td>
+ *   </tr>
+ *   <tr>
+ *     <td>convertToBranch</td>       <td>false</td>               <td>true</td>               <td>false</td>
+ *   </tr>
+ * </table>
+ *
+ * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ * @author Robert Scholte
+ */
+@Singleton
+@Named( "map-release-versions" )
+public class MapReleaseVersionsPhase
+        extends AbstractMapVersionsPhase
+{
+    @Inject
+    public MapReleaseVersionsPhase( Prompter prompter, Map<String, VersionPolicy> versionPolicies )
+    {
+        super( prompter, versionPolicies, false, false );
+    }
+}
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RemoveReleasePomsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RemoveReleasePomsPhase.java
index 032271ff..839889ed 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RemoveReleasePomsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RemoveReleasePomsPhase.java
@@ -19,6 +19,10 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
@@ -35,8 +39,8 @@ import org.apache.maven.shared.release.ReleaseResult;
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
 import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
+import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 import org.apache.maven.shared.release.util.ReleaseUtil;
-import org.codehaus.plexus.component.annotations.Component;
 
 /**
  * Remove release POMs.
@@ -44,14 +48,21 @@ import org.codehaus.plexus.component.annotations.Component;
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
  */
-@Component( role = ReleasePhase.class, hint = "remove-release-poms" )
+@Singleton
+@Named( "remove-release-poms" )
 public class RemoveReleasePomsPhase
-    extends AbstractReleasePomsPhase
+        extends AbstractReleasePomsPhase
 {
+    @Inject
+    public RemoveReleasePomsPhase( ScmRepositoryConfigurator scmRepositoryConfigurator )
+    {
+        super( scmRepositoryConfigurator );
+    }
+
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                   List<MavenProject> reactorProjects )
-        throws ReleaseFailureException, ReleaseExecutionException
+            throws ReleaseFailureException, ReleaseExecutionException
     {
         return execute( releaseDescriptor, releaseEnvironment, reactorProjects, false );
     }
@@ -59,14 +70,14 @@ public class RemoveReleasePomsPhase
     @Override
     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                    List<MavenProject> reactorProjects )
-        throws ReleaseFailureException, ReleaseExecutionException
+            throws ReleaseFailureException, ReleaseExecutionException
     {
         return execute( releaseDescriptor, releaseEnvironment, reactorProjects, true );
     }
 
     private ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                    List<MavenProject> reactorProjects, boolean simulate )
-        throws ReleaseFailureException, ReleaseExecutionException
+            throws ReleaseFailureException, ReleaseExecutionException
     {
         ReleaseResult result = new ReleaseResult();
 
@@ -86,7 +97,7 @@ public class RemoveReleasePomsPhase
 
     private void removeReleasePoms( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                     boolean simulate, ReleaseResult result, List<MavenProject> projects )
-        throws ReleaseFailureException, ReleaseExecutionException
+            throws ReleaseFailureException, ReleaseExecutionException
     {
         List<File> releasePoms = new ArrayList<>();
 
@@ -124,7 +135,7 @@ public class RemoveReleasePomsPhase
 
     private void removeReleasePomsFromScm( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                            boolean simulate, ReleaseResult result, List<File> releasePoms )
-        throws ReleaseFailureException, ReleaseExecutionException
+            throws ReleaseFailureException, ReleaseExecutionException
     {
         if ( simulate )
         {
@@ -140,7 +151,7 @@ public class RemoveReleasePomsPhase
             try
             {
                 RemoveScmResult scmResult =
-                    scmProvider.remove( scmRepository, scmFileSet, "Removing for next development iteration." );
+                        scmProvider.remove( scmRepository, scmFileSet, "Removing for next development iteration." );
 
                 if ( !scmResult.isSuccess() )
                 {
@@ -150,7 +161,7 @@ public class RemoveReleasePomsPhase
             catch ( ScmException exception )
             {
                 throw new ReleaseExecutionException( "Cannot remove release POMs from SCM: " + exception.getMessage(),
-                                                     exception );
+                        exception );
             }
         }
     }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RemoveScmTagPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RemoveScmTagPhase.java
index 25e03149..1d4299fb 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RemoveScmTagPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RemoveScmTagPhase.java
@@ -19,16 +19,14 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
-import java.io.File;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.shared.release.ReleaseExecutionException;
-import org.apache.maven.shared.release.ReleaseFailureException;
-import org.apache.maven.shared.release.ReleaseResult;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
-import org.apache.maven.shared.release.env.ReleaseEnvironment;
-import org.codehaus.plexus.component.annotations.Component;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
 
+import java.io.File;
 import java.util.List;
+
+import org.apache.maven.project.MavenProject;
 import org.apache.maven.scm.CommandParameter;
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
@@ -38,28 +36,40 @@ import org.apache.maven.scm.manager.NoSuchScmProviderException;
 import org.apache.maven.scm.provider.ScmProvider;
 import org.apache.maven.scm.repository.ScmRepository;
 import org.apache.maven.scm.repository.ScmRepositoryException;
+import org.apache.maven.shared.release.ReleaseExecutionException;
+import org.apache.maven.shared.release.ReleaseFailureException;
+import org.apache.maven.shared.release.ReleaseResult;
+import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.env.ReleaseEnvironment;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 import org.apache.maven.shared.release.util.ReleaseUtil;
-import org.codehaus.plexus.component.annotations.Requirement;
+
+import static java.util.Objects.requireNonNull;
 
 /**
  * Remove tag from SCM repository during rollback
  */
-@Component( role = ReleasePhase.class, hint = "remove-scm-tag" )
+@Singleton
+@Named( "remove-scm-tag" )
 public class RemoveScmTagPhase
-    extends AbstractReleasePhase
+        extends AbstractReleasePhase
 {
     /**
      * Tool that gets a configured SCM repository from release configuration.
      */
-    @Requirement
-    private ScmRepositoryConfigurator scmRepositoryConfigurator;
+    private final ScmRepositoryConfigurator scmRepositoryConfigurator;
+
+    @Inject
+    public RemoveScmTagPhase( ScmRepositoryConfigurator scmRepositoryConfigurator )
+    {
+        this.scmRepositoryConfigurator = requireNonNull( scmRepositoryConfigurator );
+    }
 
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                   List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult releaseResult = new ReleaseResult();
 
@@ -68,16 +78,17 @@ public class RemoveScmTagPhase
         logInfo( releaseResult, "Removing tag with the label " + releaseDescriptor.getScmReleaseLabel() + " ..." );
 
         ReleaseDescriptor basedirAlignedReleaseDescriptor =
-            ReleaseUtil.createBasedirAlignedReleaseDescriptor( releaseDescriptor, reactorProjects );
+                ReleaseUtil.createBasedirAlignedReleaseDescriptor( releaseDescriptor, reactorProjects );
 
         ScmRepository repository;
         ScmProvider provider;
         try
         {
             repository =
-                scmRepositoryConfigurator.getConfiguredRepository( basedirAlignedReleaseDescriptor.getScmSourceUrl(),
-                                                                   releaseDescriptor,
-                                                                   releaseEnvironment.getSettings() );
+                    scmRepositoryConfigurator.getConfiguredRepository(
+                            basedirAlignedReleaseDescriptor.getScmSourceUrl(),
+                            releaseDescriptor,
+                            releaseEnvironment.getSettings() );
 
             repository.getProviderRepository().setPushChanges( releaseDescriptor.isPushChanges() );
 
@@ -106,18 +117,18 @@ public class RemoveScmTagPhase
             if ( getLogger().isDebugEnabled() )
             {
                 getLogger().debug(
-                    "RemoveScmTagPhase :: scmUntagParameters tagName " + tagName );
+                        "RemoveScmTagPhase :: scmUntagParameters tagName " + tagName );
                 getLogger().debug(
-                    "RemoveScmTagPhase :: scmUntagParameters message " + message );
+                        "RemoveScmTagPhase :: scmUntagParameters message " + message );
                 getLogger().debug(
-                    "RemoveScmTagPhase :: fileSet  " + fileSet );
+                        "RemoveScmTagPhase :: fileSet  " + fileSet );
             }
             untagScmResult = provider.untag( repository, fileSet, commandParameters );
         }
         catch ( ScmException e )
         {
             throw new ReleaseExecutionException( "An error has occurred in the remove tag process: "
-                + e.getMessage(), e );
+                    + e.getMessage(), e );
         }
 
         if ( !untagScmResult.isSuccess() )
@@ -134,7 +145,7 @@ public class RemoveScmTagPhase
     @Override
     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                    List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult releaseResult = new ReleaseResult();
 
@@ -149,7 +160,7 @@ public class RemoveScmTagPhase
     }
 
     private void validateConfiguration( ReleaseDescriptor releaseDescriptor )
-        throws ReleaseFailureException
+            throws ReleaseFailureException
     {
         if ( releaseDescriptor.getScmReleaseLabel() == null )
         {
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RestoreBackupPomsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RestoreBackupPomsPhase.java
index f746eedd..fcf11fe8 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RestoreBackupPomsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RestoreBackupPomsPhase.java
@@ -19,6 +19,14 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
@@ -36,31 +44,33 @@ import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 import org.apache.maven.shared.release.util.ReleaseUtil;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.util.FileUtils;
 
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
+import static java.util.Objects.requireNonNull;
 
 /**
  * @author Edwin Punzalan
  */
-@Component( role = ReleasePhase.class, hint = "restore-backup-poms" )
+@Singleton
+@Named( "restore-backup-poms" )
 public class RestoreBackupPomsPhase
-    extends AbstractBackupPomsPhase
+        extends AbstractBackupPomsPhase
 {
     /**
      * Tool that gets a configured SCM repository from release configuration.
      */
-    @Requirement
-    private ScmRepositoryConfigurator scmRepositoryConfigurator;
+    private final ScmRepositoryConfigurator scmRepositoryConfigurator;
+
+    @Inject
+    public RestoreBackupPomsPhase( ScmRepositoryConfigurator scmRepositoryConfigurator )
+    {
+        this.scmRepositoryConfigurator = requireNonNull( scmRepositoryConfigurator );
+    }
 
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                   List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult result = new ReleaseResult();
 
@@ -77,21 +87,21 @@ public class RestoreBackupPomsPhase
     @Override
     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                    List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         return execute( releaseDescriptor, releaseEnvironment, reactorProjects );
     }
 
     protected void restorePomBackup( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                      MavenProject project )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         File pomBackup = getPomBackup( project );
 
         if ( !pomBackup.exists() )
         {
             throw new ReleaseExecutionException(
-                "Cannot restore from a missing backup POM: " + pomBackup.getAbsolutePath() );
+                    "Cannot restore from a missing backup POM: " + pomBackup.getAbsolutePath() );
         }
 
         try
@@ -101,8 +111,8 @@ public class RestoreBackupPomsPhase
             try
             {
                 scmRepository =
-                    scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor,
-                                                                       releaseEnvironment.getSettings() );
+                        scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor,
+                                releaseEnvironment.getSettings() );
 
                 provider = scmRepositoryConfigurator.getRepositoryProvider( scmRepository );
             }
@@ -118,7 +128,7 @@ public class RestoreBackupPomsPhase
             if ( releaseDescriptor.isScmUseEditMode() || provider.requiresEditMode() )
             {
                 EditScmResult result = provider.edit( scmRepository, new ScmFileSet(
-                    new File( releaseDescriptor.getWorkingDirectory() ), project.getFile() ) );
+                        new File( releaseDescriptor.getWorkingDirectory() ), project.getFile() ) );
 
                 if ( !result.isSuccess() )
                 {
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomVersionsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomVersionsPhase.java
index 3d556140..d95ee1ad 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomVersionsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomVersionsPhase.java
@@ -19,23 +19,38 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import java.util.Map;
+
 import org.apache.maven.model.Model;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.scm.repository.ScmRepository;
-import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseResult;
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
-import org.codehaus.plexus.component.annotations.Component;
+import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
+import org.apache.maven.shared.release.scm.ScmTranslator;
+import org.apache.maven.shared.release.transform.ModelETLFactory;
 
 /**
  * Rewrite POMs for future development
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-@Component( role = ReleasePhase.class, hint = "rewrite-pom-versions" )
+@Singleton
+@Named( "rewrite-pom-versions" )
 public class RewritePomVersionsPhase
-    extends AbstractRewritePomsPhase
+        extends AbstractRewritePomsPhase
 {
+    @Inject
+    public RewritePomVersionsPhase( ScmRepositoryConfigurator scmRepositoryConfigurator,
+                                    Map<String, ModelETLFactory> modelETLFactories,
+                                    Map<String, ScmTranslator> scmTranslators )
+    {
+        super( scmRepositoryConfigurator, modelETLFactories, scmTranslators );
+    }
 
     @Override
     protected final String getPomSuffix()
@@ -46,7 +61,6 @@ public class RewritePomVersionsPhase
     @Override
     protected void transformScm( MavenProject project, Model modelTarget, ReleaseDescriptor releaseDescriptor,
                                  String projectId, ScmRepository scmRepository, ReleaseResult result )
-        throws ReleaseExecutionException
     {
         // We are only updating versions no mods to scm needed
     }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhase.java
index 6f60c06d..20893f72 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhase.java
@@ -19,10 +19,15 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.io.IOException;
 import java.nio.file.LinkOption;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.Map;
 
 import org.apache.maven.artifact.ArtifactUtils;
 import org.apache.maven.model.Model;
@@ -32,19 +37,30 @@ import org.apache.maven.scm.repository.ScmRepository;
 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.scm.ScmRepositoryConfigurator;
 import org.apache.maven.shared.release.scm.ScmTranslator;
+import org.apache.maven.shared.release.transform.ModelETLFactory;
 import org.apache.maven.shared.release.util.ReleaseUtil;
-import org.codehaus.plexus.component.annotations.Component;
 
 /**
  * Rewrite POMs for branch.
  *
  * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
  */
-@Component( role = ReleasePhase.class, hint = "rewrite-poms-for-branch" )
+@Singleton
+@Named( "rewrite-poms-for-branch" )
 public class RewritePomsForBranchPhase
-    extends AbstractRewritePomsPhase
+        extends AbstractRewritePomsPhase
 {
+    @Inject
+    public RewritePomsForBranchPhase(
+            ScmRepositoryConfigurator scmRepositoryConfigurator,
+            Map<String, ModelETLFactory> modelETLFactories,
+            Map<String, ScmTranslator> scmTranslators )
+    {
+        super( scmRepositoryConfigurator, modelETLFactories, scmTranslators );
+    }
+
     @Override
     protected final String getPomSuffix()
     {
@@ -54,7 +70,7 @@ public class RewritePomsForBranchPhase
     @Override
     protected void transformScm( MavenProject project, Model modelTarget, ReleaseDescriptor releaseDescriptor,
                                  String projectId, ScmRepository scmRepository, ReleaseResult result )
-    throws ReleaseExecutionException
+            throws ReleaseExecutionException
     {
         // If SCM is null in original model, it is inherited, no mods needed
         if ( project.getScm() != null )
@@ -106,7 +122,7 @@ public class RewritePomsForBranchPhase
 
     private boolean translateScm( MavenProject project, ReleaseDescriptor releaseDescriptor, Scm scmTarget,
                                   ScmRepository scmRepository, ReleaseResult relResult )
-    throws IOException
+            throws IOException
     {
         ScmTranslator translator = getScmTranslators().get( scmRepository.getProvider() );
         boolean result = false;
@@ -131,7 +147,7 @@ public class RewritePomsForBranchPhase
             Path workingDirectory = Paths.get( releaseDescriptor.getWorkingDirectory() );
 
             int count = ReleaseUtil.getBaseWorkingDirectoryParentCount( workingDirectory, projectBasedir );
-            
+
             if ( scm.getConnection() != null )
             {
                 String rootUrl = ReleaseUtil.realignScmUrl( count, scm.getConnection() );
@@ -154,8 +170,8 @@ public class RewritePomsForBranchPhase
                 }
 
                 String value =
-                    translator.translateBranchUrl( scm.getConnection(), branchName + subDirectoryBranch,
-                                                   scmConnectionBranch );
+                        translator.translateBranchUrl( scm.getConnection(), branchName + subDirectoryBranch,
+                                scmConnectionBranch );
                 if ( !value.equals( scm.getConnection() ) )
                 {
                     scmTarget.setConnection( value );
@@ -174,8 +190,8 @@ public class RewritePomsForBranchPhase
                 }
 
                 String value =
-                    translator.translateBranchUrl( scm.getDeveloperConnection(), branchName + subDirectoryBranch,
-                                                   branchBase );
+                        translator.translateBranchUrl( scm.getDeveloperConnection(), branchName + subDirectoryBranch,
+                                branchBase );
                 if ( !value.equals( scm.getDeveloperConnection() ) )
                 {
                     scmTarget.setDeveloperConnection( value );
@@ -206,7 +222,7 @@ public class RewritePomsForBranchPhase
 
                 // use original branch base without protocol
                 String value = translator.translateBranchUrl( scm.getUrl(), branchName + subDirectoryBranch,
-                                                              tagScmUrl );
+                        tagScmUrl );
                 if ( !value.equals( scm.getUrl() ) )
                 {
                     scmTarget.setUrl( value );
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForDevelopmentPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForDevelopmentPhase.java
index 834ca0eb..b9914c72 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForDevelopmentPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForDevelopmentPhase.java
@@ -19,25 +19,41 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import java.util.Map;
+
 import org.apache.maven.model.Model;
 import org.apache.maven.model.Scm;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.scm.repository.ScmRepository;
-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.scm.ScmRepositoryConfigurator;
 import org.apache.maven.shared.release.scm.ScmTranslator;
-import org.codehaus.plexus.component.annotations.Component;
+import org.apache.maven.shared.release.transform.ModelETLFactory;
 
 /**
  * Rewrite POMs for future development
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-@Component( role = ReleasePhase.class , hint = "rewrite-poms-for-development" )
+@Singleton
+@Named( "rewrite-poms-for-development" )
 public class RewritePomsForDevelopmentPhase
-    extends AbstractRewritePomsPhase
+        extends AbstractRewritePomsPhase
 {
+    @Inject
+    public RewritePomsForDevelopmentPhase(
+            ScmRepositoryConfigurator scmRepositoryConfigurator,
+            Map<String, ModelETLFactory> modelETLFactories,
+            Map<String, ScmTranslator> scmTranslators )
+    {
+        super( scmRepositoryConfigurator, modelETLFactories, scmTranslators );
+    }
+
     @Override
     protected final String getPomSuffix()
     {
@@ -47,7 +63,6 @@ public class RewritePomsForDevelopmentPhase
     @Override
     protected void transformScm( MavenProject project, Model modelTarget, ReleaseDescriptor releaseDescriptor,
                                  String projectId, ScmRepository scmRepository, ReleaseResult result )
-        throws ReleaseExecutionException
     {
         // If SCM is null in original model, it is inherited, no mods needed
         if ( project.getScm() != null )
@@ -87,8 +102,8 @@ public class RewritePomsForDevelopmentPhase
     protected String getOriginalVersion( ReleaseDescriptor releaseDescriptor, String projectKey, boolean simulate )
     {
         return simulate
-                        ? releaseDescriptor.getProjectOriginalVersion( projectKey )
-                        : releaseDescriptor.getProjectReleaseVersion( projectKey );
+                ? releaseDescriptor.getProjectOriginalVersion( projectKey )
+                : releaseDescriptor.getProjectReleaseVersion( projectKey );
     }
 
     @Override
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhase.java
index cc36600a..fa7df321 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhase.java
@@ -19,10 +19,15 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.io.IOException;
 import java.nio.file.LinkOption;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.Map;
 
 import org.apache.maven.artifact.ArtifactUtils;
 import org.apache.maven.model.Model;
@@ -32,19 +37,30 @@ import org.apache.maven.scm.repository.ScmRepository;
 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.scm.ScmRepositoryConfigurator;
 import org.apache.maven.shared.release.scm.ScmTranslator;
+import org.apache.maven.shared.release.transform.ModelETLFactory;
 import org.apache.maven.shared.release.util.ReleaseUtil;
-import org.codehaus.plexus.component.annotations.Component;
 
 /**
  * Rewrite POMs for release.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-@Component( role = ReleasePhase.class, hint = "rewrite-poms-for-release" )
+@Singleton
+@Named( "rewrite-poms-for-release" )
 public class RewritePomsForReleasePhase
-    extends AbstractRewritePomsPhase
+        extends AbstractRewritePomsPhase
 {
+    @Inject
+    public RewritePomsForReleasePhase(
+            ScmRepositoryConfigurator scmRepositoryConfigurator,
+            Map<String, ModelETLFactory> modelETLFactories,
+            Map<String, ScmTranslator> scmTranslators )
+    {
+        super( scmRepositoryConfigurator, modelETLFactories, scmTranslators );
+    }
+
     @Override
     protected final String getPomSuffix()
     {
@@ -54,7 +70,7 @@ public class RewritePomsForReleasePhase
     @Override
     protected void transformScm( MavenProject project, Model modelTarget, ReleaseDescriptor releaseDescriptor,
                                  String projectId, ScmRepository scmRepository, ReleaseResult result )
-    throws ReleaseExecutionException
+            throws ReleaseExecutionException
     {
         // If SCM is null in original model, it is inherited, no mods needed
         if ( project.getScm() != null )
@@ -105,7 +121,7 @@ public class RewritePomsForReleasePhase
 
     private boolean translateScm( MavenProject project, ReleaseDescriptor releaseDescriptor, Scm scmTarget,
                                   ScmRepository scmRepository, ReleaseResult relResult )
-        throws IOException
+            throws IOException
     {
         ScmTranslator translator = getScmTranslators().get( scmRepository.getProvider() );
         boolean result = false;
@@ -130,7 +146,7 @@ public class RewritePomsForReleasePhase
             Path workingDirectory = Paths.get( releaseDescriptor.getWorkingDirectory() );
 
             int count = ReleaseUtil.getBaseWorkingDirectoryParentCount( workingDirectory, projectBasedir );
-            
+
             if ( scm.getConnection() != null )
             {
                 String rootUrl = ReleaseUtil.realignScmUrl( count, scm.getConnection() );
@@ -152,7 +168,7 @@ public class RewritePomsForReleasePhase
                     scmConnectionTag = translateUrlPath( trunkUrl, tagBase, scm.getConnection() );
                 }
                 String value =
-                    translator.translateTagUrl( scm.getConnection(), tag + subDirectoryTag, scmConnectionTag );
+                        translator.translateTagUrl( scm.getConnection(), tag + subDirectoryTag, scmConnectionTag );
 
                 if ( !value.equals( scm.getConnection() ) )
                 {
@@ -172,7 +188,7 @@ public class RewritePomsForReleasePhase
                 }
 
                 String value =
-                    translator.translateTagUrl( scm.getDeveloperConnection(), tag + subDirectoryTag, tagBase );
+                        translator.translateTagUrl( scm.getDeveloperConnection(), tag + subDirectoryTag, tagBase );
 
                 if ( !value.equals( scm.getDeveloperConnection() ) )
                 {
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunCompleteGoalsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunCompleteGoalsPhase.java
index aab47500..6d9051dd 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunCompleteGoalsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunCompleteGoalsPhase.java
@@ -19,15 +19,20 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.io.File;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.maven.project.MavenProject;
 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.ReleaseEnvironment;
-import org.codehaus.plexus.component.annotations.Component;
+import org.apache.maven.shared.release.exec.MavenExecutor;
 
 /**
  * Run the completion goals for the project to before committing the continuing development stream.
@@ -35,28 +40,35 @@ import org.codehaus.plexus.component.annotations.Component;
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  * @author <a href="mailto:stephenc@apache.org">Stephen Connolly</a>
  */
-@Component( role = ReleasePhase.class, hint = "run-completion-goals" )
+@Singleton
+@Named( "run-completion-goals" )
 public class RunCompleteGoalsPhase
-    extends AbstractRunGoalsPhase
+        extends AbstractRunGoalsPhase
 {
+    @Inject
+    public RunCompleteGoalsPhase( Map<String, MavenExecutor> mavenExecutors )
+    {
+        super( mavenExecutors );
+    }
+
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                   List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException
+            throws ReleaseExecutionException
     {
         return execute( releaseDescriptor, releaseEnvironment, new File( releaseDescriptor.getWorkingDirectory() ),
-                        getAdditionalArguments( releaseDescriptor ) );
+                getAdditionalArguments( releaseDescriptor ) );
     }
 
     @Override
     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                    List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException
+            throws ReleaseExecutionException
     {
         ReleaseResult result = new ReleaseResult();
 
         logInfo( result, "Executing completion goals - since this is simulation mode it is running against the "
-            + "original project, not the rewritten ones" );
+                + "original project, not the rewritten ones" );
 
         execute( releaseDescriptor, releaseEnvironment, reactorProjects );
 
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunPerformGoalsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunPerformGoalsPhase.java
index 2e3a8437..0be778a6 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunPerformGoalsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunPerformGoalsPhase.java
@@ -19,38 +19,50 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.maven.project.MavenProject;
 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.ReleaseEnvironment;
+import org.apache.maven.shared.release.exec.MavenExecutor;
 import org.apache.maven.shared.release.util.PomFinder;
-import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.util.StringUtils;
 
-import java.io.File;
-import java.util.List;
-
 /**
  * Run the integration tests for the project to verify that it builds before committing.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-@Component( role = ReleasePhase.class, hint = "run-perform-goals" )
+@Singleton
+@Named( "run-perform-goals" )
 public class RunPerformGoalsPhase
-    extends AbstractRunGoalsPhase
+        extends AbstractRunGoalsPhase
 {
+    @Inject
+    public RunPerformGoalsPhase( Map<String, MavenExecutor> mavenExecutors )
+    {
+        super( mavenExecutors );
+    }
+
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                   List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException
+            throws ReleaseExecutionException
     {
         return runLogic( releaseDescriptor, releaseEnvironment, false );
     }
 
     private ReleaseResult runLogic( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
-                                  boolean simulate )
-        throws ReleaseExecutionException
+                                    boolean simulate )
+            throws ReleaseExecutionException
     {
         String additionalArguments = getAdditionalArguments( releaseDescriptor );
 
@@ -132,7 +144,7 @@ public class RunPerformGoalsPhase
     @Override
     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                    List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException
+            throws ReleaseExecutionException
     {
         return runLogic( releaseDescriptor, releaseEnvironment, true );
     }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunPrepareGoalsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunPrepareGoalsPhase.java
index 23db790b..4313ec61 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunPrepareGoalsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunPrepareGoalsPhase.java
@@ -19,43 +19,55 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.maven.project.MavenProject;
 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.ReleaseEnvironment;
-import org.codehaus.plexus.component.annotations.Component;
-
-import java.io.File;
-import java.util.List;
+import org.apache.maven.shared.release.exec.MavenExecutor;
 
 /**
  * Run the integration tests for the project to verify that it builds before committing.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-@Component( role = ReleasePhase.class, hint = "run-preparation-goals" )
+@Singleton
+@Named( "run-preparation-goals" )
 public class RunPrepareGoalsPhase
-    extends AbstractRunGoalsPhase
+        extends AbstractRunGoalsPhase
 {
+    @Inject
+    public RunPrepareGoalsPhase( Map<String, MavenExecutor> mavenExecutors )
+    {
+        super( mavenExecutors );
+    }
+
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                   List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException
+            throws ReleaseExecutionException
     {
         return execute( releaseDescriptor, releaseEnvironment, new File( releaseDescriptor.getWorkingDirectory() ),
-                        getAdditionalArguments( releaseDescriptor ) );
+                getAdditionalArguments( releaseDescriptor ) );
     }
 
     @Override
     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                    List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException
+            throws ReleaseExecutionException
     {
         ReleaseResult result = new ReleaseResult();
 
         logInfo( result, "Executing preparation goals - since this is simulation mode it is running against the "
-            + "original project, not the rewritten ones" );
+                + "original project, not the rewritten ones" );
 
         execute( releaseDescriptor, releaseEnvironment, reactorProjects );
 
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmBranchPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmBranchPhase.java
index 41c26166..cb3d1fb9 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmBranchPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmBranchPhase.java
@@ -19,6 +19,13 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import java.io.File;
+import java.util.List;
+
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.scm.ScmBranchParameters;
 import org.apache.maven.scm.ScmException;
@@ -37,32 +44,32 @@ import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 import org.apache.maven.shared.release.util.ReleaseUtil;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
-
-import java.io.File;
-import java.util.List;
 
 /**
  * Branch the SCM repository.
  *
  * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
  */
-@Component( role = ReleasePhase.class, hint = "scm-branch" )
+@Singleton
+@Named( "scm-branch" )
 public class ScmBranchPhase
-    extends AbstractReleasePhase
+        extends AbstractReleasePhase
 {
     /**
      * Tool that gets a configured SCM repository from release configuration.
      */
-    @Requirement
-    private ScmRepositoryConfigurator scmRepositoryConfigurator;
+    private final ScmRepositoryConfigurator scmRepositoryConfigurator;
 
+    @Inject
+    public ScmBranchPhase( ScmRepositoryConfigurator scmRepositoryConfigurator )
+    {
+        this.scmRepositoryConfigurator = scmRepositoryConfigurator;
+    }
 
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                   List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult relResult = new ReleaseResult();
 
@@ -71,16 +78,17 @@ public class ScmBranchPhase
         logInfo( relResult, "Branching release with the label " + releaseDescriptor.getScmReleaseLabel() + "..." );
 
         ReleaseDescriptor basedirAlignedReleaseDescriptor =
-            ReleaseUtil.createBasedirAlignedReleaseDescriptor( releaseDescriptor, reactorProjects );
+                ReleaseUtil.createBasedirAlignedReleaseDescriptor( releaseDescriptor, reactorProjects );
 
         ScmRepository repository;
         ScmProvider provider;
         try
         {
             repository =
-                scmRepositoryConfigurator.getConfiguredRepository( basedirAlignedReleaseDescriptor.getScmSourceUrl(),
-                                                                   releaseDescriptor,
-                                                                   releaseEnvironment.getSettings() );
+                    scmRepositoryConfigurator.getConfiguredRepository(
+                            basedirAlignedReleaseDescriptor.getScmSourceUrl(),
+                            releaseDescriptor,
+                            releaseEnvironment.getSettings() );
 
             repository.getProviderRepository().setPushChanges( releaseDescriptor.isPushChanges() );
 
@@ -130,13 +138,13 @@ public class ScmBranchPhase
     @Override
     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                    List<MavenProject> reactorProjects )
-        throws ReleaseExecutionException, ReleaseFailureException
+            throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult result = new ReleaseResult();
 
         validateConfiguration( releaseDescriptor );
         ReleaseDescriptor basedirAlignedReleaseDescriptor =
-            ReleaseUtil.createBasedirAlignedReleaseDescriptor( releaseDescriptor, reactorProjects );
+                ReleaseUtil.createBasedirAlignedReleaseDescriptor( releaseDescriptor, reactorProjects );
 
         logInfo( result, "Full run would branch " + basedirAlignedReleaseDescriptor.getWorkingDirectory() );
         if ( releaseDescriptor.getScmBranchBase() != null )
@@ -155,7 +163,7 @@ public class ScmBranchPhase
     }
 
     private static void validateConfiguration( ReleaseDescriptor releaseDescriptor )
-        throws ReleaseFailureException
+            throws ReleaseFailureException
     {
         if ( releaseDescriptor.getScmReleaseLabel() == null )
         {
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhase.java
index 6562089c..4c9a8f2b 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhase.java
@@ -19,6 +19,10 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFile;
@@ -37,8 +41,6 @@ import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 import org.apache.maven.shared.release.scm.ScmTranslator;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.util.SelectorUtils;
 import org.codehaus.plexus.util.StringUtils;
 
@@ -50,37 +52,46 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * See if there are any local modifications to the files before proceeding with SCM operations and the release.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-@Component( role = ReleasePhase.class, hint = "scm-check-modifications" )
+@Singleton
+@Named( "scm-check-modifications" )
 public class ScmCheckModificationsPhase
     extends AbstractReleasePhase
 {
     /**
      * Tool that gets a configured SCM repository from release configuration.
      */
-    @Requirement
-    private ScmRepositoryConfigurator scmRepositoryConfigurator;
+    private final ScmRepositoryConfigurator scmRepositoryConfigurator;
 
     /**
      * SCM URL translators mapped by provider name.
      */
-    @Requirement( role = ScmTranslator.class )
-    private Map<String, ScmTranslator> scmTranslators;
+    private final Map<String, ScmTranslator> scmTranslators;
 
     /**
      * The filepatterns to exclude from the status check.
      *
      * @todo proper construction of filenames, especially release properties
      */
-    private Set<String> exclusionPatterns = new HashSet<>( Arrays.asList(
+    private final Set<String> exclusionPatterns = new HashSet<>( Arrays.asList(
         "**" + File.separator + "pom.xml.backup", "**" + File.separator + "pom.xml.tag",
         "**" + File.separator + "pom.xml.next", "**" + File.separator + "pom.xml.branch",
         "**" + File.separator + "release.properties", "**" + File.separator + "pom.xml.releaseBackup" ) );
 
+    @Inject
+    public ScmCheckModificationsPhase( ScmRepositoryConfigurator scmRepositoryConfigurator,
+                                       Map<String, ScmTranslator> scmTranslators )
+    {
+        this.scmRepositoryConfigurator = requireNonNull( scmRepositoryConfigurator );
+        this.scmTranslators = requireNonNull( scmTranslators );
+    }
+
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
                                   List<MavenProject> reactorProjects )
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStoreException.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitBranchPhase.java
similarity index 60%
copy from maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStoreException.java
copy to maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitBranchPhase.java
index e6f3d708..7e5e7bce 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStoreException.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitBranchPhase.java
@@ -1,4 +1,4 @@
-package org.apache.maven.shared.release.config;
+package org.apache.maven.shared.release.phase;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,22 +19,25 @@ package org.apache.maven.shared.release.config;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
+
 /**
- * Exception occurring within the configuration store.
+ * Commit the changes that were done to prepare the branch or tag to the SCM.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-public class ReleaseDescriptorStoreException
-    extends Exception
+@Singleton
+@Named( "scm-commit-branch" )
+public class ScmCommitBranchPhase
+        extends AbstractScmCommitPreparationPhase
 {
-    /**
-     * <p>Constructor for ReleaseDescriptorStoreException.</p>
-     *
-     * @param message a {@link java.lang.String} object
-     * @param t a {@link java.lang.Throwable} object
-     */
-    public ReleaseDescriptorStoreException( String message, Throwable t )
+    @Inject
+    public ScmCommitBranchPhase( ScmRepositoryConfigurator scmRepositoryConfigurator )
     {
-        super( message, t );
+        super( scmRepositoryConfigurator, "getScmBranchCommitComment" );
     }
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhase.java
index bf8a8a80..76643331 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitDevelopmentPhase.java
@@ -19,85 +19,26 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
-import java.io.File;
-import java.text.MessageFormat;
-import java.util.Collection;
-import java.util.List;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
 
-import org.apache.maven.project.MavenProject;
-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.ReleaseEnvironment;
-import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
-import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
+import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 
 /**
  * Commit the changes that were done to prepare the branch or tag to the SCM.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
+@Singleton
+@Named( "scm-commit-development" )
 public class ScmCommitDevelopmentPhase
-    extends AbstractScmCommitPhase
+        extends AbstractScmCommitDevelopmentPhase
 {
-
-    /**
-     * The format for the
-     */
-    private String rollbackMessageFormat;
-
-    @Override
-    protected void runLogic( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
-                             List<MavenProject> reactorProjects, ReleaseResult result, boolean simulating )
-        throws ReleaseScmCommandException, ReleaseExecutionException, ReleaseScmRepositoryException
-    {
-        // no rollback required
-        if (
-            // was there no commit that has to be rolled back by a new one
-            releaseDescriptor.isSuppressCommitBeforeTagOrBranch()
-                // and working copy should not be touched
-                && !releaseDescriptor.isUpdateWorkingCopyVersions() )
-        {
-            if ( simulating )
-            {
-                logInfo( result, "Full run would not commit changes, because updateWorkingCopyVersions is false." );
-            }
-            else
-            {
-                logInfo( result, "Modified POMs are not committed because updateWorkingCopyVersions is set to false." );
-            }
-        }
-        // rollback or commit development versions required
-        else
-        {
-            String message;
-            if ( !releaseDescriptor.isUpdateWorkingCopyVersions() )
-            {
-                // the commit is a rollback
-                message = createRollbackMessage( releaseDescriptor );
-            }
-            else
-            {
-                // a normal commit
-                message = createMessage( reactorProjects, releaseDescriptor );
-            }
-            if ( simulating )
-            {
-                Collection<File> pomFiles = createPomFiles( releaseDescriptor, reactorProjects );
-                logInfo( result,
-                         "Full run would commit " + pomFiles.size() + " files with message: '" + message + "'" );
-            }
-            else
-            {
-                performCheckins( releaseDescriptor, releaseEnvironment, reactorProjects, message );
-            }
-        }
-    }
-
-    private String createRollbackMessage( ReleaseDescriptor releaseDescriptor )
+    @Inject
+    public ScmCommitDevelopmentPhase( ScmRepositoryConfigurator scmRepositoryConfigurator )
     {
-        return MessageFormat.format( releaseDescriptor.getScmCommentPrefix() + rollbackMessageFormat,
-                                     new Object[]{releaseDescriptor.getScmReleaseLabel()} );
+        super( scmRepositoryConfigurator, "getScmDevelopmentCommitComment",
+                "rollback changes from release preparation of {0}" );
     }
-
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStoreException.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitReleasePhase.java
similarity index 60%
copy from maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStoreException.java
copy to maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitReleasePhase.java
index e6f3d708..bb27a842 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStoreException.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitReleasePhase.java
@@ -1,4 +1,4 @@
-package org.apache.maven.shared.release.config;
+package org.apache.maven.shared.release.phase;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,22 +19,25 @@ package org.apache.maven.shared.release.config;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
+
 /**
- * Exception occurring within the configuration store.
+ * Commit the changes that were done to prepare the branch or tag to the SCM.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-public class ReleaseDescriptorStoreException
-    extends Exception
+@Singleton
+@Named( "scm-commit-release" )
+public class ScmCommitReleasePhase
+        extends AbstractScmCommitPreparationPhase
 {
-    /**
-     * <p>Constructor for ReleaseDescriptorStoreException.</p>
-     *
-     * @param message a {@link java.lang.String} object
-     * @param t a {@link java.lang.Throwable} object
-     */
-    public ReleaseDescriptorStoreException( String message, Throwable t )
+    @Inject
+    public ScmCommitReleasePhase( ScmRepositoryConfigurator scmRepositoryConfigurator )
     {
-        super( message, t );
+        super( scmRepositoryConfigurator, "getScmReleaseCommitComment" );
     }
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStoreException.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitRollbackPhase.java
similarity index 60%
copy from maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStoreException.java
copy to maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitRollbackPhase.java
index e6f3d708..1acf1ab5 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorStoreException.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitRollbackPhase.java
@@ -1,4 +1,4 @@
-package org.apache.maven.shared.release.config;
+package org.apache.maven.shared.release.phase;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,22 +19,25 @@ package org.apache.maven.shared.release.config;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
+
 /**
- * Exception occurring within the configuration store.
+ * Commit the changes that were done to prepare the branch or tag to the SCM.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-public class ReleaseDescriptorStoreException
-    extends Exception
+@Singleton
+@Named( "scm-commit-rollback" )
+public class ScmCommitRollbackPhase
+        extends AbstractScmCommitPreparationPhase
 {
-    /**
-     * <p>Constructor for ReleaseDescriptorStoreException.</p>
-     *
-     * @param message a {@link java.lang.String} object
-     * @param t a {@link java.lang.Throwable} object
-     */
-    public ReleaseDescriptorStoreException( String message, Throwable t )
+    @Inject
+    public ScmCommitRollbackPhase( ScmRepositoryConfigurator scmRepositoryConfigurator )
     {
-        super( message, t );
+        super( scmRepositoryConfigurator, "getScmRollbackCommitComment" );
     }
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmTagPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmTagPhase.java
index 7f961406..362f6145 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmTagPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmTagPhase.java
@@ -19,6 +19,10 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.io.File;
 import java.util.List;
 
@@ -40,23 +44,27 @@ import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 import org.apache.maven.shared.release.util.ReleaseUtil;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
 
 /**
  * Tag the SCM repository after committing the release.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-@Component( role = ReleasePhase.class, hint = "scm-tag" )
+@Singleton
+@Named( "scm-tag" )
 public class ScmTagPhase
     extends AbstractReleasePhase
 {
     /**
      * Tool that gets a configured SCM repository from release configuration.
      */
-    @Requirement
-    private ScmRepositoryConfigurator scmRepositoryConfigurator;
+    private final ScmRepositoryConfigurator scmRepositoryConfigurator;
+
+    @Inject
+    public ScmTagPhase( ScmRepositoryConfigurator scmRepositoryConfigurator )
+    {
+        this.scmRepositoryConfigurator = scmRepositoryConfigurator;
+    }
 
     @Override
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/policies/DefaultNamingPolicy.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/policies/DefaultNamingPolicy.java
index 37a0b960..c76fc6bc 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/policies/DefaultNamingPolicy.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/policies/DefaultNamingPolicy.java
@@ -19,11 +19,13 @@ package org.apache.maven.shared.release.policies;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.shared.release.policy.PolicyException;
 import org.apache.maven.shared.release.policy.naming.NamingPolicy;
 import org.apache.maven.shared.release.policy.naming.NamingPolicyRequest;
 import org.apache.maven.shared.release.policy.naming.NamingPolicyResult;
-import org.codehaus.plexus.component.annotations.Component;
 
 /**
  * <p>DefaultNamingPolicy class.</p>
@@ -31,12 +33,13 @@ import org.codehaus.plexus.component.annotations.Component;
  * @author Robert Scholte
  * @since 3.0.0-M5
  */
-@Component( role = NamingPolicy.class, hint = "default" )
+@Singleton
+@Named
 public class DefaultNamingPolicy implements NamingPolicy
 {
     @Override
     public NamingPolicyResult getName( NamingPolicyRequest request )
-        throws PolicyException
+            throws PolicyException
     {
         return new NamingPolicyResult().setName( request.getArtifactId() + "-" + request.getVersion() );
     }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/policies/DefaultVersionPolicy.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/policies/DefaultVersionPolicy.java
index f4c8cf01..cf29d386 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/policies/DefaultVersionPolicy.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/policies/DefaultVersionPolicy.java
@@ -19,27 +19,28 @@ package org.apache.maven.shared.release.policies;
  * under the License.
  */
 
-import org.apache.maven.shared.release.policy.PolicyException;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.shared.release.policy.version.VersionPolicy;
 import org.apache.maven.shared.release.policy.version.VersionPolicyRequest;
 import org.apache.maven.shared.release.policy.version.VersionPolicyResult;
 import org.apache.maven.shared.release.versions.DefaultVersionInfo;
 import org.apache.maven.shared.release.versions.VersionParseException;
-import org.codehaus.plexus.component.annotations.Component;
 
 /**
  * <p>DefaultVersionPolicy class.</p>
  *
  * @author Robert Scholte
  */
-@Component( role = VersionPolicy.class, hint = "default" )
+@Singleton
+@Named
 public class DefaultVersionPolicy
-    implements VersionPolicy
+        implements VersionPolicy
 {
-
     @Override
     public VersionPolicyResult getReleaseVersion( VersionPolicyRequest request )
-        throws PolicyException, VersionParseException
+            throws VersionParseException
     {
         String releaseVersion = new DefaultVersionInfo( request.getVersion() ).getReleaseVersionString();
         return new VersionPolicyResult().setVersion( releaseVersion );
@@ -47,10 +48,10 @@ public class DefaultVersionPolicy
 
     @Override
     public VersionPolicyResult getDevelopmentVersion( VersionPolicyRequest request )
-        throws PolicyException, VersionParseException
+            throws VersionParseException
     {
         String developmentVersion =
-            new DefaultVersionInfo( request.getVersion() ).getNextVersion().getSnapshotVersionString();
+                new DefaultVersionInfo( request.getVersion() ).getNextVersion().getSnapshotVersionString();
         return new VersionPolicyResult().setVersion( developmentVersion );
     }
 
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/ClearCaseScmTranslator.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/ClearCaseScmTranslator.java
index e67b08f1..642c5c7b 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/ClearCaseScmTranslator.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/ClearCaseScmTranslator.java
@@ -19,16 +19,18 @@ package org.apache.maven.shared.release.scm;
  * under the License.
  */
 
-import org.codehaus.plexus.component.annotations.Component;
+import javax.inject.Named;
+import javax.inject.Singleton;
 
 /**
  * ClearCase tag translator.
  *
  * @author <a href="mailto:arne@degenring.com">Arne Degenring</a>
  */
-@Component( role = ScmTranslator.class, hint = "clearcase" )
+@Singleton
+@Named( "clearcase" )
 public class ClearCaseScmTranslator
-    implements ScmTranslator
+        implements ScmTranslator
 {
     @Override
     public String translateBranchUrl( String url, String branchName, String branchBase )
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/CvsScmTranslator.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/CvsScmTranslator.java
index 3180a3db..e6c1aa07 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/CvsScmTranslator.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/CvsScmTranslator.java
@@ -19,16 +19,18 @@ package org.apache.maven.shared.release.scm;
  * under the License.
  */
 
-import org.codehaus.plexus.component.annotations.Component;
+import javax.inject.Named;
+import javax.inject.Singleton;
 
 /**
  * CVS tag translator.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-@Component( role = ScmTranslator.class, hint = "cvs" )
+@Singleton
+@Named( "cvs" )
 public class CvsScmTranslator
-    implements ScmTranslator
+        implements ScmTranslator
 {
     @Override
     public String translateBranchUrl( String url, String branchName, String branchBase )
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/DefaultScmRepositoryConfigurator.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/DefaultScmRepositoryConfigurator.java
index 0dd2280a..e6be9249 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/DefaultScmRepositoryConfigurator.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/DefaultScmRepositoryConfigurator.java
@@ -19,6 +19,12 @@ package org.apache.maven.shared.release.scm;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import java.util.concurrent.atomic.AtomicReference;
+
 import org.apache.maven.scm.manager.NoSuchScmProviderException;
 import org.apache.maven.scm.manager.ScmManager;
 import org.apache.maven.scm.provider.ScmProvider;
@@ -30,35 +36,44 @@ import org.apache.maven.scm.repository.ScmRepositoryException;
 import org.apache.maven.settings.Server;
 import org.apache.maven.settings.Settings;
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.apache.maven.shared.release.util.MavenCrypto;
+import org.apache.maven.shared.release.util.MavenCrypto.MavenCryptoException;
 import org.codehaus.plexus.util.StringUtils;
-import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher;
-import org.sonatype.plexus.components.sec.dispatcher.SecDispatcherException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static java.util.Objects.requireNonNull;
 
 /**
  * Tool that gets a configured SCM repository from release configuration.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-@Component( role = ScmRepositoryConfigurator.class, instantiationStrategy = "singleton" )
+@Singleton
+@Named
 public class DefaultScmRepositoryConfigurator
-    extends AbstractLogEnabled
     implements ScmRepositoryConfigurator
 {
-    /**
-     * The SCM manager.
-     */
-    @Requirement
-    private ScmManager scmManager;
+    private final Logger logger = LoggerFactory.getLogger( getClass() );
+
+    private final AtomicReference<ScmManager> scmManager;
+
+    private final MavenCrypto mavenCrypto;
+
+    @Inject
+    public DefaultScmRepositoryConfigurator( ScmManager scmManager, MavenCrypto mavenCrypto )
+    {
+        this.scmManager = new AtomicReference<>( requireNonNull( scmManager ) );
+        this.mavenCrypto = requireNonNull( mavenCrypto );
+    }
 
     /**
-     * When this plugin requires Maven 3.0 as minimum, this component can be removed and o.a.m.s.c.SettingsDecrypter be
-     * used instead.
+     * For testing purposes only!
      */
-    @Requirement( hint = "mng-4384" )
-    private SecDispatcher secDispatcher;
+    public void setScmManager( ScmManager scmManager )
+    {
+        this.scmManager.set( scmManager );
+    }
 
     @Override
     public ScmRepository getConfiguredRepository( ReleaseDescriptor releaseDescriptor, Settings settings )
@@ -77,7 +92,7 @@ public class DefaultScmRepositoryConfigurator
         String privateKey = releaseDescriptor.getScmPrivateKey();
         String passphrase = releaseDescriptor.getScmPrivateKeyPassPhrase();
 
-        ScmRepository repository = scmManager.makeScmRepository( url );
+        ScmRepository repository = scmManager.get().makeScmRepository( url );
 
         ScmProviderRepository scmRepo = repository.getProviderRepository();
 
@@ -181,20 +196,20 @@ public class DefaultScmRepositoryConfigurator
     {
         try
         {
-            return secDispatcher.decrypt( str );
+            return mavenCrypto.decrypt( str );
         }
-        catch ( SecDispatcherException e )
+        catch ( MavenCryptoException e )
         {
             String msg =
                 "Failed to decrypt password/passphrase for server " + server + ", using auth token as is: "
                     + e.getMessage();
-            if ( getLogger().isDebugEnabled() )
+            if ( logger.isDebugEnabled() )
             {
-                getLogger().warn( msg, e );
+                logger.warn( msg, e );
             }
             else
             {
-                getLogger().warn( msg );
+                logger.warn( msg );
             }
             return str;
         }
@@ -204,16 +219,6 @@ public class DefaultScmRepositoryConfigurator
     public ScmProvider getRepositoryProvider( ScmRepository repository )
         throws NoSuchScmProviderException
     {
-        return scmManager.getProviderByRepository( repository );
-    }
-
-    /**
-     * <p>Setter for the field <code>scmManager</code>.</p>
-     *
-     * @param scmManager a {@link org.apache.maven.scm.manager.ScmManager} object
-     */
-    public void setScmManager( ScmManager scmManager )
-    {
-        this.scmManager = scmManager;
+        return scmManager.get().getProviderByRepository( repository );
     }
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/GitScmTranslator.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/GitScmTranslator.java
index 2739576c..4399479f 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/GitScmTranslator.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/GitScmTranslator.java
@@ -19,14 +19,16 @@ package org.apache.maven.shared.release.scm;
  * under the License.
  */
 
-import org.codehaus.plexus.component.annotations.Component;
+import javax.inject.Named;
+import javax.inject.Singleton;
 
 /**
  * <p>GitScmTranslator class.</p>
  */
-@Component( role = ScmTranslator.class, hint = "git" )
+@Singleton
+@Named( "git" )
 public class GitScmTranslator
-    implements ScmTranslator
+        implements ScmTranslator
 {
 
     @Override
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/HgScmTranslator.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/HgScmTranslator.java
index 1968fb35..73a038ac 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/HgScmTranslator.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/HgScmTranslator.java
@@ -19,14 +19,16 @@ package org.apache.maven.shared.release.scm;
  * under the License.
  */
 
-import org.codehaus.plexus.component.annotations.Component;
+import javax.inject.Named;
+import javax.inject.Singleton;
 
 /**
  * <p>HgScmTranslator class.</p>
  */
-@Component( role = ScmTranslator.class, hint = "hg" )
+@Singleton
+@Named( "hg" )
 public class HgScmTranslator
-    implements ScmTranslator
+        implements ScmTranslator
 {
 
     @Override
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/JazzScmTranslator.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/JazzScmTranslator.java
index a770d4e5..8da9b534 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/JazzScmTranslator.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/JazzScmTranslator.java
@@ -19,18 +19,20 @@ package org.apache.maven.shared.release.scm;
  * under the License.
  */
 
-import java.io.File;
+import javax.inject.Named;
+import javax.inject.Singleton;
 
-import org.codehaus.plexus.component.annotations.Component;
+import java.io.File;
 
 /**
  * Jazz tag translator.
  *
  * @author <a href="mailto:ChrisGWarp@gmail.com">Chris Graham</a>
  */
-@Component( role = ScmTranslator.class, hint = "jazz" )
+@Singleton
+@Named( "jazz" )
 public class JazzScmTranslator
-    implements ScmTranslator
+        implements ScmTranslator
 {
     @Override
     public String translateBranchUrl( String url, String branchName, String branchBase )
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/SubversionScmTranslator.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/SubversionScmTranslator.java
index abf68e11..0f8db4b7 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/SubversionScmTranslator.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/SubversionScmTranslator.java
@@ -19,17 +19,20 @@ package org.apache.maven.shared.release.scm;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.scm.ScmBranch;
 import org.apache.maven.scm.ScmTag;
 import org.apache.maven.scm.provider.svn.SvnTagBranchUtils;
-import org.codehaus.plexus.component.annotations.Component;
 
 /**
  * Subversion tag translator.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
-@Component( role = ScmTranslator.class, hint = "svn" )
+@Singleton
+@Named( "svn" )
 public class SubversionScmTranslator
     implements ScmTranslator
 {
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/strategies/DefaultStrategy.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/strategies/DefaultStrategy.java
index d3e892b5..0dd3874b 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/strategies/DefaultStrategy.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/strategies/DefaultStrategy.java
@@ -19,6 +19,11 @@ package org.apache.maven.shared.release.strategies;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.maven.shared.release.strategy.Strategy;
@@ -29,47 +34,92 @@ import org.apache.maven.shared.release.strategy.Strategy;
  * @author Robert Scholte
  * @since 3.0.0-M5
  */
+@Singleton
+@Named
 public class DefaultStrategy implements Strategy
 {
     /**
      * The phases of release to run, and in what order.
      */
-    private List<String> preparePhases;
+    private final List<String> preparePhases;
 
     /**
      * The phases of release to run to perform.
      */
-    private List<String> performPhases;
+    private final List<String> performPhases;
 
     /**
      * The phases of release to run to rollback changes
      */
-    private List<String> rollbackPhases;
+    private final List<String> rollbackPhases;
 
     /**
      * The phases to create a branch.
      */
-    private List<String> branchPhases;
+    private final List<String> branchPhases;
 
     /**
      * The phases to create update versions.
      */
-    private List<String> updateVersionsPhases;
+    private final List<String> updateVersionsPhases;
 
-    @Override
-    public List<String> getPreparePhases()
+    public DefaultStrategy()
     {
-        return preparePhases;
+        this.preparePhases = Collections.unmodifiableList( Arrays.asList(
+                "check-poms",
+                "scm-check-modifications",
+                "check-dependency-snapshots",
+                "create-backup-poms",
+                "map-release-versions",
+                "input-variables",
+                "map-development-versions",
+                "rewrite-poms-for-release",
+                "generate-release-poms",
+                "run-preparation-goals",
+                "scm-commit-release",
+                "scm-tag",
+                "rewrite-poms-for-development",
+                "remove-release-poms",
+                "run-completion-goals",
+                "scm-commit-development",
+                "end-release"
+        ) );
+        this.performPhases = Collections.unmodifiableList( Arrays.asList(
+                "verify-completed-prepare-phases",
+                "checkout-project-from-scm",
+                "run-perform-goals"
+        ) );
+        this.rollbackPhases = Collections.unmodifiableList( Arrays.asList(
+                "restore-backup-poms",
+                "scm-commit-rollback",
+                "remove-scm-tag"
+        ) );
+        this.branchPhases = Collections.unmodifiableList( Arrays.asList(
+                "check-poms",
+                "scm-check-modifications",
+                "create-backup-poms",
+                "map-branch-versions",
+                "branch-input-variables",
+                "map-development-versions",
+                "rewrite-poms-for-branch",
+                "scm-commit-branch",
+                "scm-branch",
+                "rewrite-poms-for-development",
+                "scm-commit-development",
+                "end-release"
+        ) );
+        this.updateVersionsPhases = Collections.unmodifiableList( Arrays.asList(
+                "check-poms-updateversions",
+                "create-backup-poms",
+                "map-development-versions",
+                "rewrite-pom-versions"
+        ) );
     }
 
-    /**
-     * <p>Setter for the field <code>preparePhases</code>.</p>
-     *
-     * @param preparePhases a {@link java.util.List} object
-     */
-    public void setPreparePhases( List<String> preparePhases )
+    @Override
+    public final List<String> getPreparePhases()
     {
-        this.preparePhases = preparePhases;
+        return preparePhases;
     }
 
     @Override
@@ -78,61 +128,21 @@ public class DefaultStrategy implements Strategy
         return performPhases;
     }
 
-    /**
-     * <p>Setter for the field <code>performPhases</code>.</p>
-     *
-     * @param performPhases a {@link java.util.List} object
-     */
-    public void setPerformPhases( List<String> performPhases )
-    {
-        this.performPhases = performPhases;
-    }
-
     @Override
     public List<String> getRollbackPhases()
     {
         return rollbackPhases;
     }
 
-    /**
-     * <p>Setter for the field <code>rollbackPhases</code>.</p>
-     *
-     * @param rollbackPhases a {@link java.util.List} object
-     */
-    public void setRollbackPhases( List<String> rollbackPhases )
-    {
-        this.rollbackPhases = rollbackPhases;
-    }
-
     @Override
     public List<String> getBranchPhases()
     {
         return branchPhases;
     }
 
-    /**
-     * <p>Setter for the field <code>branchPhases</code>.</p>
-     *
-     * @param branchPhases a {@link java.util.List} object
-     */
-    public void setBranchPhases( List<String> branchPhases )
-    {
-        this.branchPhases = branchPhases;
-    }
-
     @Override
     public List<String> getUpdateVersionsPhases()
     {
         return updateVersionsPhases;
     }
-
-    /**
-     * <p>Setter for the field <code>updateVersionsPhases</code>.</p>
-     *
-     * @param updateVersionsPhases a {@link java.util.List} object
-     */
-    public void setUpdateVersionsPhases( List<String> updateVersionsPhases )
-    {
-        this.updateVersionsPhases = updateVersionsPhases;
-    }
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomModelETLFactory.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomModelETLFactory.java
index 4d7ba695..4d4414d7 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomModelETLFactory.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/jdom2/JDomModelETLFactory.java
@@ -19,9 +19,11 @@ package org.apache.maven.shared.release.transform.jdom2;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.shared.release.transform.ModelETLRequest;
 import org.apache.maven.shared.release.transform.ModelETLFactory;
-import org.codehaus.plexus.component.annotations.Component;
 
 /**
  * <p>JDomModelETLFactory class.</p>
@@ -29,11 +31,11 @@ import org.codehaus.plexus.component.annotations.Component;
  * @author Robert Scholte
  * @since 3.0
  */
-@Component( role = ModelETLFactory.class, hint = JDomModelETLFactory.ROLE_HINT )
+@Singleton
+@Named( JDomModelETLFactory.NAME )
 public class JDomModelETLFactory implements ModelETLFactory
 {
-    /** Constant <code>ROLE_HINT="jdom2-sax"</code> */
-    public static final String ROLE_HINT = "jdom2-sax";
+    public static final String NAME = "jdom2-sax";
 
     @Override
     public JDomModelETL newInstance( ModelETLRequest request )
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/util/MavenCrypto.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/util/MavenCrypto.java
new file mode 100644
index 00000000..3d82414b
--- /dev/null
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/util/MavenCrypto.java
@@ -0,0 +1,171 @@
+package org.apache.maven.shared.release.util;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import java.util.Properties;
+
+import org.sonatype.plexus.components.cipher.DefaultPlexusCipher;
+import org.sonatype.plexus.components.cipher.PlexusCipher;
+import org.sonatype.plexus.components.cipher.PlexusCipherException;
+import org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher;
+import org.sonatype.plexus.components.sec.dispatcher.SecDispatcherException;
+import org.sonatype.plexus.components.sec.dispatcher.SecUtil;
+import org.sonatype.plexus.components.sec.dispatcher.model.SettingsSecurity;
+
+
+/**
+ * A shared utility to access {@link DefaultSecDispatcher} service.
+ *
+ * @since TBD
+ */
+@Singleton
+@Named
+public class MavenCrypto
+{
+    /**
+     * Exception thrown when "something" of crypto operation did not succeed. All the code all over the place
+     * was catching sec dispatcher and plexus cipher exceptions just to neglect it (maybe log in DEBUG), so
+     * this is one single exception here.
+     */
+    public static class MavenCryptoException extends Exception
+    {
+        private MavenCryptoException( String message )
+        {
+            super( message );
+        }
+
+        private MavenCryptoException( String message, Throwable cause )
+        {
+            super( message, cause );
+        }
+    }
+
+    private final DefaultSecDispatcher secDispatcher;
+
+    private final PlexusCipher plexusCipher;
+
+    @Inject
+    public MavenCrypto( DefaultSecDispatcher secDispatcher, PlexusCipher plexusCipher )
+    {
+        this.secDispatcher = secDispatcher;
+        this.plexusCipher = plexusCipher;
+    }
+
+    public String decrypt( String value ) throws MavenCryptoException
+    {
+        try
+        {
+            return secDispatcher.decrypt( value );
+        }
+        catch ( SecDispatcherException e )
+        {
+            throw new MavenCryptoException( "decrypt failed", e );
+        }
+    }
+
+    public void decryptProperties( Properties properties ) throws MavenCryptoException
+    {
+        String[] keys = new String[] {"scm.password", "scm.passphrase"};
+
+        for ( String key : keys )
+        {
+            String value = properties.getProperty( key );
+            if ( value != null )
+            {
+                properties.put( key, decryptDecorated( value ) );
+            }
+        }
+    }
+
+    public String encryptAndDecorate( String passwd ) throws MavenCryptoException
+    {
+        try
+        {
+            final String master = getMaster();
+
+            DefaultPlexusCipher cipher = new DefaultPlexusCipher();
+            String masterPasswd = cipher.decryptDecorated( master, DefaultSecDispatcher.SYSTEM_PROPERTY_SEC_LOCATION );
+            return cipher.encryptAndDecorate( passwd, masterPasswd );
+        }
+        catch ( PlexusCipherException e )
+        {
+            throw new MavenCryptoException( "encrypt failed", e );
+        }
+    }
+
+    public boolean isEncryptedString( String str )
+    {
+        return plexusCipher.isEncryptedString( str );
+    }
+
+    private String decryptDecorated( String value ) throws MavenCryptoException
+    {
+        try
+        {
+            final String master = getMaster();
+
+            DefaultPlexusCipher cipher = new DefaultPlexusCipher();
+            String masterPasswd = cipher.decryptDecorated( master, DefaultSecDispatcher.SYSTEM_PROPERTY_SEC_LOCATION );
+            return cipher.decryptDecorated( value, masterPasswd );
+        }
+        catch ( PlexusCipherException e )
+        {
+            throw new MavenCryptoException( "decrypt failed", e );
+        }
+    }
+
+    private String getMaster() throws MavenCryptoException
+    {
+        String configurationFile = secDispatcher.getConfigurationFile();
+
+        if ( configurationFile.startsWith( "~" ) )
+        {
+            configurationFile = System.getProperty( "user.home" ) + configurationFile.substring( 1 );
+        }
+
+        String file = System.getProperty( DefaultSecDispatcher.SYSTEM_PROPERTY_SEC_LOCATION, configurationFile );
+
+        String master = null;
+
+        try
+        {
+            SettingsSecurity sec = SecUtil.read( file, true );
+            if ( sec != null )
+            {
+                master = sec.getMaster();
+            }
+        }
+        catch ( SecDispatcherException e )
+        {
+            throw new MavenCryptoException( "config file read failed", e );
+        }
+
+        if ( master == null )
+        {
+            throw new MavenCryptoException( "Master password is not set in the setting security file: " + file );
+        }
+
+        return master;
+    }
+}
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/util/PomFinder.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/util/PomFinder.java
index 5f93e590..28586aea 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/util/PomFinder.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/util/PomFinder.java
@@ -25,10 +25,12 @@ import java.io.IOException;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.Parent;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
-import org.codehaus.plexus.logging.Logger;
 import org.codehaus.plexus.util.ReaderFactory;
 import org.codehaus.plexus.util.xml.XmlStreamReader;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+import org.slf4j.Logger;
+
+import static java.util.Objects.requireNonNull;
 
 /**
  * <p>This utility class helps with finding a maven pom file
@@ -62,12 +64,12 @@ import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 public class PomFinder
 {
 
-    private Logger log;
+    private final Logger log;
     private PomInfo foundPomInfo;
 
     public PomFinder( Logger log )
     {
-        this.log = log;
+        this.log = requireNonNull( log );
     }
 
     /**
@@ -151,19 +153,20 @@ public class PomFinder
         if ( matchingPom == null )
         {
             String[] childFiles = startDirectory.list();
-            for ( int i = 0; i < childFiles.length; i++ )
+            if ( childFiles != null )
             {
-                String childFile = childFiles[ i ];
-
-                File subDir = new File( startDirectory, childFile );
-                if ( subDir.isDirectory() && !subDir.isHidden() )
-                {
-                    matchingPom = findMatchingPom( subDir );
-                }
-
-                if ( matchingPom != null )
+                for ( String childFile : childFiles )
                 {
-                    break;
+                    File subDir = new File( startDirectory, childFile );
+                    if ( subDir.isDirectory() && !subDir.isHidden() )
+                    {
+                        matchingPom = findMatchingPom( subDir );
+                    }
+
+                    if ( matchingPom != null )
+                    {
+                        break;
+                    }
                 }
             }
         }
@@ -189,7 +192,7 @@ public class PomFinder
 
         MavenXpp3Reader reader = new MavenXpp3Reader();
         
-        Model model = null;
+        Model model;
         try ( XmlStreamReader xmlReader = ReaderFactory.newXmlReader( pomFile ) )
         {
             model = reader.read( xmlReader );
diff --git a/maven-release-manager/src/main/resources/META-INF/plexus/components.xml b/maven-release-manager/src/main/resources/META-INF/plexus/components.xml
deleted file mode 100644
index 6c997dbc..00000000
--- a/maven-release-manager/src/main/resources/META-INF/plexus/components.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<component-set>
-  <components>
-    <component>
-      <role>org.sonatype.plexus.components.sec.dispatcher.SecDispatcher</role>
-      <role-hint>mng-4384</role-hint>
-      <implementation>org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher</implementation>
-      <requirements>
-        <requirement>
-          <role>org.sonatype.plexus.components.cipher.PlexusCipher</role>
-          <role-hint>mng-4384</role-hint>
-          <field-name>_cipher</field-name>
-        </requirement>
-      </requirements>
-      <configuration>
-        <_configuration-file>~/.m2/settings-security.xml</_configuration-file>
-      </configuration>
-    </component>
-    <component>
-      <role>org.sonatype.plexus.components.cipher.PlexusCipher</role>
-      <role-hint>mng-4384</role-hint>
-      <implementation>org.sonatype.plexus.components.cipher.DefaultPlexusCipher</implementation>
-    </component>
-  </components>
-</component-set>
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 a9e5da52..376b8a02 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
@@ -19,6 +19,11 @@ package org.apache.maven.shared.release;
  * under the License.
  */
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.doThrow;
@@ -35,6 +40,8 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Properties;
 
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
@@ -42,7 +49,6 @@ 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.provider.ScmProviderStub;
 import org.apache.maven.scm.repository.ScmRepository;
@@ -55,8 +61,10 @@ import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.phase.ReleasePhase;
 import org.apache.maven.shared.release.phase.ReleasePhaseStub;
 import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
-import org.codehaus.plexus.PlexusTestCase;
+import org.apache.maven.shared.release.stubs.ScmManagerStub;
 import org.codehaus.plexus.util.FileUtils;
+import org.junit.Ignore;
+import org.junit.Test;
 
 /**
  * Test the default release manager.
@@ -64,13 +72,13 @@ import org.codehaus.plexus.util.FileUtils;
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
 public class DefaultReleaseManagerTest
-    extends PlexusTestCase
+    extends PlexusJUnit4TestCase
 {
     private ReleaseDescriptorStoreStub configStore;
 
 
     @Override
-    protected void setUp()
+    public void setUp()
         throws Exception
     {
         super.setUp();
@@ -78,6 +86,23 @@ public class DefaultReleaseManagerTest
         configStore = (ReleaseDescriptorStoreStub) lookup( ReleaseDescriptorStore.class, "stub" );
     }
 
+    @Override
+    protected Module[] getCustomModules()
+    {
+        return new Module[] {
+                new AbstractModule()
+                {
+                    @Override
+                    protected void configure()
+                    {
+                        bind( ScmManager.class ).toInstance( new ScmManagerStub() );
+                        bind( ReleaseDescriptorStore.class ).toInstance( new ReleaseDescriptorStoreStub() );
+                    }
+                }
+        };
+    }
+
+    @Test
     public void testPrepareNoCompletedPhase()
         throws Exception
     {
@@ -104,6 +129,7 @@ public class DefaultReleaseManagerTest
         assertFalse( "step3 not simulated", phase.isSimulated() );
     }
 
+    @Test
     public void testPrepareCompletedPhase()
         throws Exception
     {
@@ -130,6 +156,7 @@ public class DefaultReleaseManagerTest
         assertFalse( "step3 not simulated", phase.isSimulated() );
     }
 
+    @Test
     public void testPrepareCompletedPhaseNoResume()
         throws Exception
     {
@@ -158,6 +185,7 @@ public class DefaultReleaseManagerTest
         assertFalse( "step3 not simulated", phase.isSimulated() );
     }
 
+    @Test
     public void testPrepareCompletedAllPhases()
         throws Exception
     {
@@ -184,6 +212,7 @@ public class DefaultReleaseManagerTest
         assertFalse( "step3 not simulated", phase.isSimulated() );
     }
 
+    @Test
     public void testPrepareInvalidCompletedPhase()
         throws Exception
     {
@@ -210,6 +239,7 @@ public class DefaultReleaseManagerTest
         assertFalse( "step3 not simulated", phase.isSimulated() );
     }
 
+    @Test
     public void testPrepareSimulateNoCompletedPhase()
         throws Exception
     {
@@ -238,6 +268,7 @@ public class DefaultReleaseManagerTest
         assertFalse( "step3 not executed", phase.isExecuted() );
     }
 
+    @Test
     public void testPrepareSimulateCompletedPhase()
         throws Exception
     {
@@ -266,6 +297,7 @@ public class DefaultReleaseManagerTest
         assertFalse( "step3 not executed", phase.isExecuted() );
     }
 
+    @Test
     public void testPrepareSimulateCompletedAllPhases()
         throws Exception
     {
@@ -294,6 +326,7 @@ public class DefaultReleaseManagerTest
         assertFalse( "step3 not executed", phase.isExecuted() );
     }
 
+    @Test
     public void testPrepareSimulateInvalidCompletedPhase()
         throws Exception
     {
@@ -322,6 +355,8 @@ public class DefaultReleaseManagerTest
         assertFalse( "step3 not executed", phase.isExecuted() );
     }
 
+    @Ignore( "This is testing messed up XML?" )
+    @Test
     public void testPrepareUnknownPhaseConfigured()
         throws Exception
     {
@@ -345,6 +380,7 @@ public class DefaultReleaseManagerTest
         }
     }
 
+    @Test
     public void testReleaseConfigurationStoreReadFailure()
         throws Exception
     {
@@ -382,6 +418,7 @@ public class DefaultReleaseManagerTest
         verifyNoMoreInteractions( configStoreMock );
     }
 
+    @Test
     public void testReleaseConfigurationStoreWriteFailure()
         throws Exception
     {
@@ -422,6 +459,7 @@ public class DefaultReleaseManagerTest
         verifyNoMoreInteractions( configStoreMock );
     }
 
+    @Test
     public void testReleaseConfigurationStoreClean()
         throws Exception
     {
@@ -473,6 +511,7 @@ public class DefaultReleaseManagerTest
         return Collections.singletonList( project );
     }
 
+    @Test
     public void testReleasePerformWithResult()
         throws Exception
     {
@@ -494,6 +533,7 @@ public class DefaultReleaseManagerTest
         assertTrue( result.getOutput().length() > 0 );
     }
 
+    @Test
     public void testReleaseConfigurationStoreReadFailureOnPerform()
         throws Exception
     {
@@ -532,6 +572,7 @@ public class DefaultReleaseManagerTest
         verifyNoMoreInteractions( configStoreMock );
     }
 
+    @Test
     public void testReleasePerformWithIncompletePrepare()
         throws Exception
     {
@@ -564,6 +605,7 @@ public class DefaultReleaseManagerTest
     }
 
     // MRELEASE-758: release:perform no longer removes release.properties
+    @Test
     public void testPerformWithDefaultClean()
         throws Exception
     {
@@ -599,6 +641,7 @@ public class DefaultReleaseManagerTest
         verifyNoMoreInteractions( managerListener );
     }
 
+    @Test
     public void testNoScmUrlPerform()
         throws Exception
     {
@@ -625,6 +668,7 @@ public class DefaultReleaseManagerTest
         }
     }
 
+    @Test
     public void testScmExceptionThrown()
         throws Exception
     {
@@ -669,6 +713,7 @@ public class DefaultReleaseManagerTest
         verifyNoMoreInteractions( scmProviderMock );
     }
 
+    @Test
     public void testScmResultFailure()
         throws Exception
     {
@@ -704,6 +749,7 @@ public class DefaultReleaseManagerTest
     }
 
     // MRELEASE-1042
+    @Test
     public void testKeepProfilesOnPerform()
             throws Exception
     {
@@ -735,10 +781,15 @@ public class DefaultReleaseManagerTest
         assertTrue( result.getOutput().contains( "-P aProfile,bProfile,anotherOne" ) );
     }
 
+    @Test
     public void testDetermineWorkingDirectory()
         throws Exception
     {
-        DefaultReleaseManager defaultReleaseManager = new DefaultReleaseManager();
+        DefaultReleaseManager defaultReleaseManager = new DefaultReleaseManager(
+                Collections.emptyMap(),
+                Collections.emptyMap(),
+                mock( ReleaseDescriptorStore.class )
+        );
 
         File checkoutDir = getTestFile( "target/checkout" );
         FileUtils.forceDelete( checkoutDir );
@@ -761,6 +812,7 @@ public class DefaultReleaseManagerTest
     }
 
     // MRELEASE-761
+    @Test
     public void testRollbackCall()
         throws Exception
     {
@@ -778,6 +830,7 @@ public class DefaultReleaseManagerTest
 
 
     // MRELEASE-765
+    @Test
     public void testUpdateVersionsCall()
         throws Exception
     {
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/PlexusJUnit4TestCase.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/PlexusJUnit4TestCase.java
index 9b491cc2..59b0ab69 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/PlexusJUnit4TestCase.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/PlexusJUnit4TestCase.java
@@ -19,14 +19,24 @@ package org.apache.maven.shared.release;
  * under the License.
  */
 
+import javax.inject.Singleton;
+
 import static org.junit.Assert.fail;
 
 import java.io.File;
 import java.io.InputStream;
-
+import java.util.Map;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
+import org.apache.maven.scm.manager.ScmManager;
+import org.apache.maven.shared.release.config.ReleaseDescriptorStore;
+import org.apache.maven.shared.release.config.ReleaseDescriptorStoreStub;
+import org.apache.maven.shared.release.stubs.ScmManagerStub;
 import org.codehaus.plexus.ContainerConfiguration;
 import org.codehaus.plexus.DefaultContainerConfiguration;
 import org.codehaus.plexus.DefaultPlexusContainer;
+import org.codehaus.plexus.PlexusConstants;
 import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.PlexusContainerException;
 import org.codehaus.plexus.configuration.PlexusConfiguration;
@@ -86,7 +96,11 @@ public abstract class PlexusJUnit4TestCase
         final String config = getCustomConfigurationName();
 
         final ContainerConfiguration containerConfiguration =
-            new DefaultContainerConfiguration().setName( "test" ).setContext( context.getContextData() ).setClassPathCaching( true );
+            new DefaultContainerConfiguration()
+                    .setName( "test" )
+                    .setContext( context.getContextData() )
+                    .setAutoWiring( true )
+                    .setClassPathScanning( PlexusConstants.SCANNING_CACHE );
 
         if ( config != null )
         {
@@ -103,7 +117,7 @@ public abstract class PlexusJUnit4TestCase
 
         try
         {
-            container = new DefaultPlexusContainer( containerConfiguration );
+            container = new DefaultPlexusContainer( containerConfiguration, getCustomModules() );
         }
         catch ( final PlexusContainerException e )
         {
@@ -112,6 +126,23 @@ public abstract class PlexusJUnit4TestCase
         }
     }
 
+    /**
+     * Allows test to define custom modules.
+     */
+    protected Module[] getCustomModules()
+    {
+        return new Module[] {
+                new AbstractModule()
+                {
+                    @Override
+                    protected void configure()
+                    {
+                        bind( ScmManager.class ).to( ScmManagerStub.class ).in( Singleton.class );
+                    }
+                }
+        };
+    }
+
     /**
      * Allow custom test case implementations do augment the default container configuration before executing tests.
      *
@@ -221,6 +252,12 @@ public abstract class PlexusJUnit4TestCase
         return getContainer().lookup( componentClass, roleHint );
     }
 
+    protected <T> Map<String, T> lookupMap( final Class<T> componentClass )
+            throws Exception
+    {
+        return getContainer().lookupMap( componentClass );
+    }
+
     protected void release( final Object component )
         throws Exception
     {
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStoreTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStoreTest.java
index e563fab0..27e03d98 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStoreTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStoreTest.java
@@ -1,6 +1,11 @@
 package org.apache.maven.shared.release.config;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -8,6 +13,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.util.Properties;
 
+import org.apache.maven.shared.release.PlexusJUnit4TestCase;
 import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder.BuilderReleaseDescriptor;
 
 /*
@@ -31,7 +37,7 @@ import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder.BuilderRe
 
 import org.apache.maven.shared.release.phase.AbstractReleaseTestCase;
 import org.apache.maven.shared.release.scm.IdentifiedScm;
-import org.codehaus.plexus.PlexusTestCase;
+import org.junit.Test;
 import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher;
 
 /**
@@ -40,21 +46,22 @@ import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher;
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
 public class PropertiesReleaseDescriptorStoreTest
-    extends PlexusTestCase
+        extends PlexusJUnit4TestCase
 {
     private PropertiesReleaseDescriptorStore store;
 
     private SecDispatcher secDispatcher;
 
     @Override
-    protected void setUp()
+    public void setUp()
         throws Exception
     {
         super.setUp();
         store = (PropertiesReleaseDescriptorStore) lookup( ReleaseDescriptorStore.class, "properties" );
-        secDispatcher = lookup( SecDispatcher.class, "mng-4384" );
+        secDispatcher = lookup( SecDispatcher.class );
     }
 
+    @Test
     public void testReadFromFile()
         throws ReleaseDescriptorStoreException
     {
@@ -67,6 +74,7 @@ public class PropertiesReleaseDescriptorStoreTest
         assertEquals( "check matches", expected, config );
     }
 
+    @Test
     public void testReadFromFileUsingWorkingDirectory()
         throws Exception
     {
@@ -80,6 +88,7 @@ public class PropertiesReleaseDescriptorStoreTest
         assertEquals( "check matches", expected.build(), config );
     }
 
+    @Test
     public void testReadFromEmptyFile()
         throws ReleaseDescriptorStoreException
     {
@@ -90,6 +99,7 @@ public class PropertiesReleaseDescriptorStoreTest
         assertDefaultReleaseConfiguration( config );
     }
 
+    @Test
     public void testReadMissingFile()
         throws ReleaseDescriptorStoreException
     {
@@ -100,6 +110,7 @@ public class PropertiesReleaseDescriptorStoreTest
         assertDefaultReleaseConfiguration( config );
     }
 
+    @Test
     public void testMergeFromEmptyFile()
         throws ReleaseDescriptorStoreException, IOException
     {
@@ -111,6 +122,7 @@ public class PropertiesReleaseDescriptorStoreTest
         assertEquals( "Check configurations merged", mergeDescriptor.build(), config );
     }
 
+    @Test
     public void testMergeFromMissingFile()
         throws ReleaseDescriptorStoreException, IOException
     {
@@ -122,6 +134,7 @@ public class PropertiesReleaseDescriptorStoreTest
         assertEquals( "Check configurations merged", mergeDescriptor.build(), config );
     }
 
+    @Test
     public void testWriteToNewFile()
         throws Exception
     {
@@ -141,6 +154,7 @@ public class PropertiesReleaseDescriptorStoreTest
         assertEquals( "compare configuration", config.build(), rereadDescriptor );
     }
 
+    @Test
     public void testWriteToWorkingDirectory()
         throws Exception
     {
@@ -163,6 +177,7 @@ public class PropertiesReleaseDescriptorStoreTest
         assertEquals( "compare configuration", config.build(), rereadDescriptorBuilder.build() );
     }
 
+    @Test
     public void testWriteToNewFileRequiredOnly()
         throws ReleaseDescriptorStoreException
     {
@@ -181,6 +196,7 @@ public class PropertiesReleaseDescriptorStoreTest
         assertEquals( "compare configuration", config.build(), rereadDescriptor );
     }
 
+    @Test
     public void testWriteToNewFileDottedIds()
         throws ReleaseDescriptorStoreException
     {
@@ -210,6 +226,7 @@ public class PropertiesReleaseDescriptorStoreTest
         assertEquals( "compare configuration", config.build(), rereadDescriptor );
     }
 
+    @Test
     public void testWriteToNewFileNullMappedScm()
         throws ReleaseDescriptorStoreException
     {
@@ -236,6 +253,7 @@ public class PropertiesReleaseDescriptorStoreTest
         assertEquals( "compare configuration", builder.build(), rereadDescriptor );
     }
 
+    @Test
     public void testOverwriteFile()
         throws Exception
     {
@@ -253,7 +271,8 @@ public class PropertiesReleaseDescriptorStoreTest
 
         assertEquals( "compare configuration", config.build(), rereadDescriptor );
     }
-    
+
+    @Test
     public void testDeleteFile()
         throws ReleaseDescriptorStoreException, IOException
     {
@@ -270,6 +289,7 @@ public class PropertiesReleaseDescriptorStoreTest
         assertFalse( "Check file already exists", file.exists() );
     }
 
+    @Test
     public void testMissingDeleteFile()
         throws ReleaseDescriptorStoreException, IOException
     {
@@ -285,7 +305,8 @@ public class PropertiesReleaseDescriptorStoreTest
 
         assertFalse( "Check file already exists", file.exists() );
     }
-    
+
+    @Test
     public void testWriteEncryptedProperties()
         throws Exception
     {
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/ReleaseUtilsTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/ReleaseUtilsTest.java
index 22faa976..84121003 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/ReleaseUtilsTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/ReleaseUtilsTest.java
@@ -19,26 +19,29 @@ package org.apache.maven.shared.release.config;
  * under the License.
  */
 
-import junit.framework.TestCase;
-
 import org.apache.maven.artifact.ArtifactUtils;
 import org.apache.maven.model.Scm;
 import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder.BuilderReleaseDescriptor;
 import org.apache.maven.shared.release.phase.AbstractReleaseTestCase;
+import org.junit.Test;
 
 import java.io.File;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Properties;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
 /**
  * ReleaseDescriptor Tester.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
 public class ReleaseUtilsTest
-    extends TestCase
 {
+    @Test
     public void testEquals()
         throws IOException
     {
@@ -202,6 +205,7 @@ public class ReleaseUtilsTest
         assertFalse( "Check original comparison", configBuilder.build().equals( origConfig ) );
     }
 
+    @Test
     public void testHashCode()
         throws IOException
     {
@@ -211,6 +215,7 @@ public class ReleaseUtilsTest
                       createReleaseDescriptor( releaseDescriptor.getWorkingDirectory() ).build().hashCode() );
     }
 
+    @Test
     public void testLoadResolvedDependencies()
     {
         Properties properties = new Properties();
@@ -227,6 +232,7 @@ public class ReleaseUtilsTest
     }
 
     // MRELEASE-750
+    @Test
     public void testArtifactIdEndswithDependency()
     {
         Properties properties = new Properties();
@@ -244,6 +250,7 @@ public class ReleaseUtilsTest
     }
 
     // MRELEASE-834
+    @Test
     public void testSystemPropertyStartingWithDependency()
     {
         Properties properties = new Properties();
@@ -252,6 +259,7 @@ public class ReleaseUtilsTest
     }
     
     // MRELEASE-1038
+    @Test
     public void testActiveProfilesProperty()
     {
         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/AbstractMavenExecutorTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/AbstractMavenExecutorTest.java
index 79bef7a0..385a232a 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/AbstractMavenExecutorTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/AbstractMavenExecutorTest.java
@@ -22,6 +22,7 @@ package org.apache.maven.shared.release.exec;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.isA;
 import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
@@ -36,15 +37,17 @@ import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
 
 import junit.framework.TestCase;
+import org.apache.maven.shared.release.util.MavenCrypto;
+import org.junit.Test;
 
 public class AbstractMavenExecutorTest
-    extends TestCase
 {
 
+    @Test
     public void testGoalSeparation()
         throws MavenExecutorException
     {
-        AbstractMavenExecutor executor = spy( new AbstractMavenExecutorSpy() );
+        AbstractMavenExecutor executor = spy( new AbstractMavenExecutorSpy( mock( MavenCrypto.class ) ) );
 
         executor.executeGoals( null, (String) null, new DefaultReleaseEnvironment(), true, null, null, null );
         verify( executor ).executeGoals( isNull(), eq( new ArrayList<String>() ),
@@ -98,6 +101,10 @@ public class AbstractMavenExecutorTest
     protected class AbstractMavenExecutorSpy
         extends AbstractMavenExecutor
     {
+        public AbstractMavenExecutorSpy( MavenCrypto mavenCrypto )
+        {
+            super( mavenCrypto );
+        }
 
         @Override
         protected void executeGoals( File workingDirectory, List<String> goals, ReleaseEnvironment releaseEnvironment,
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/CommandLineFactoryTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/CommandLineFactoryTest.java
index 19e15c74..813b3844 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/CommandLineFactoryTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/CommandLineFactoryTest.java
@@ -19,8 +19,13 @@ package org.apache.maven.shared.release.exec;
  * under the License.
  */
 
-import org.codehaus.plexus.PlexusTestCase;
+import org.apache.maven.shared.release.PlexusJUnit4TestCase;
 import org.codehaus.plexus.util.cli.Commandline;
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 /**
  * Test the command line factory.
@@ -28,19 +33,20 @@ import org.codehaus.plexus.util.cli.Commandline;
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
 public class CommandLineFactoryTest
-    extends PlexusTestCase
+        extends PlexusJUnit4TestCase
 {
     private CommandLineFactory factory;
 
     @Override
-    protected void setUp()
+    public void setUp()
         throws Exception
     {
         super.setUp();
 
-        factory = (CommandLineFactory) lookup( CommandLineFactory.class );
+        factory = lookup( CommandLineFactory.class );
     }
 
+    @Test
     public void testCreation()
         throws Exception
     {
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/ForkedMavenExecutorTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/ForkedMavenExecutorTest.java
index a159df22..122bd17e 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/ForkedMavenExecutorTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/ForkedMavenExecutorTest.java
@@ -19,10 +19,14 @@ package org.apache.maven.shared.release.exec;
  * under the License.
  */
 
-import static org.mockito.Matchers.endsWith;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Matchers.isA;
-import static org.mockito.Matchers.isNull;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.endsWith;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isA;
+import static org.mockito.ArgumentMatchers.isNull;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
@@ -39,12 +43,14 @@ import org.apache.maven.settings.Proxy;
 import org.apache.maven.settings.Server;
 import org.apache.maven.settings.Settings;
 import org.apache.maven.settings.io.xpp3.SettingsXpp3Writer;
+import org.apache.maven.shared.release.PlexusJUnit4TestCase;
 import org.apache.maven.shared.release.ReleaseResult;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
-import org.codehaus.plexus.PlexusTestCase;
+import org.apache.maven.shared.release.util.MavenCrypto;
 import org.codehaus.plexus.util.cli.Arg;
 import org.codehaus.plexus.util.cli.CommandLineException;
 import org.codehaus.plexus.util.cli.Commandline;
+import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher;
 
@@ -54,23 +60,22 @@ import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher;
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
 public class ForkedMavenExecutorTest
-    extends PlexusTestCase
+        extends PlexusJUnit4TestCase
 {
-    private ForkedMavenExecutor executor;
-
+    private MavenCrypto mavenCrypto;
     private SecDispatcher secDispatcher;
 
     @Override
-    protected void setUp()
+    public void setUp()
         throws Exception
     {
         super.setUp();
 
-        executor = (ForkedMavenExecutor) lookup( MavenExecutor.class, "forked-path" );
-
-        secDispatcher = (SecDispatcher) lookup( SecDispatcher.class, "mng-4384" );
+        mavenCrypto = lookup( MavenCrypto.class );
+        secDispatcher = lookup( SecDispatcher.class );
     }
 
+    @Test
     public void testExecution()
         throws Exception
     {
@@ -91,7 +96,7 @@ public class ForkedMavenExecutorTest
         CommandLineFactory commandLineFactoryMock = mock( CommandLineFactory.class );
         when( commandLineFactoryMock.createCommandLine( isA( String.class ) /*"mvn"*/ ) ).thenReturn( commandLineMock );
 
-        executor.setCommandLineFactory( commandLineFactoryMock );
+        ForkedMavenExecutor executor = new ForkedMavenExecutor( mavenCrypto, commandLineFactoryMock );
 
         // execute
         executor.executeGoals( workingDirectory, "clean integration-test", new DefaultReleaseEnvironment(), false, null,
@@ -115,6 +120,7 @@ public class ForkedMavenExecutorTest
         verifyNoMoreInteractions( mockProcess, commandLineFactoryMock, commandLineMock, valueArgument );
     }
 
+    @Test
     public void testExecutionWithCustomPomFile()
         throws Exception
     {
@@ -134,7 +140,7 @@ public class ForkedMavenExecutorTest
         CommandLineFactory commandLineFactoryMock = mock( CommandLineFactory.class );
         when( commandLineFactoryMock.createCommandLine( isA( String.class ) /* "mvn" */ ) ).thenReturn( commandLineMock );
 
-        executor.setCommandLineFactory( commandLineFactoryMock );
+        ForkedMavenExecutor executor = new ForkedMavenExecutor( mavenCrypto, commandLineFactoryMock );
 
         // execute
         executor.executeGoals( workingDirectory, "clean integration-test", new DefaultReleaseEnvironment(), false, null, "my-pom.xml",
@@ -159,6 +165,7 @@ public class ForkedMavenExecutorTest
         verifyNoMoreInteractions( mockProcess, commandLineMock, argMock, commandLineFactoryMock );
     }
 
+    @Test
     public void testExecutionWithArguments()
         throws Exception
     {
@@ -178,7 +185,7 @@ public class ForkedMavenExecutorTest
         CommandLineFactory commandLineFactoryMock = mock( CommandLineFactory.class );
         when( commandLineFactoryMock.createCommandLine( endsWith( "mvn" ) ) ).thenReturn( commandLineMock );
 
-        executor.setCommandLineFactory( commandLineFactoryMock );
+        ForkedMavenExecutor executor = new ForkedMavenExecutor( mavenCrypto, commandLineFactoryMock );
 
         // execute
         String arguments = "-DperformRelease=true -Dmaven.test.skip=true";
@@ -203,6 +210,7 @@ public class ForkedMavenExecutorTest
         verifyNoMoreInteractions( mockProcess, commandLineMock, argMock, commandLineFactoryMock );
     }
 
+    @Test
     public void testExecutionWithNonZeroExitCode()
         throws Exception
     {
@@ -224,7 +232,7 @@ public class ForkedMavenExecutorTest
         CommandLineFactory commandLineFactoryMock = mock( CommandLineFactory.class );
         when( commandLineFactoryMock.createCommandLine( endsWith( "mvn" ) ) ).thenReturn( commandLineMock );
 
-        executor.setCommandLineFactory( commandLineFactoryMock );
+        ForkedMavenExecutor executor = new ForkedMavenExecutor( mavenCrypto, commandLineFactoryMock );
 
         // execute
         try
@@ -257,6 +265,7 @@ public class ForkedMavenExecutorTest
         verifyNoMoreInteractions( mockProcess, commandLineMock, argMock, commandLineFactoryMock );
     }
 
+    @Test
     public void testExecutionWithCommandLineException()
         throws Exception
     {
@@ -272,7 +281,7 @@ public class ForkedMavenExecutorTest
         CommandLineFactory commandLineFactoryMock = mock( CommandLineFactory.class );
         when( commandLineFactoryMock.createCommandLine( endsWith( "mvn" ) ) ).thenReturn( commandLineMock );
 
-        executor.setCommandLineFactory( commandLineFactoryMock );
+        ForkedMavenExecutor executor = new ForkedMavenExecutor( mavenCrypto, commandLineFactoryMock );
 
         // execute
         try
@@ -300,6 +309,7 @@ public class ForkedMavenExecutorTest
         verifyNoMoreInteractions( commandLineMock, argMock, commandLineFactoryMock );
     }
 
+    @Test
     public void testEncryptSettings()
         throws Exception
     {
@@ -320,7 +330,7 @@ public class ForkedMavenExecutorTest
         CommandLineFactory commandLineFactoryMock = mock( CommandLineFactory.class );
         when( commandLineFactoryMock.createCommandLine( isA( String.class ) /* "mvn" */) ).thenReturn( commandLineMock );
 
-        executor.setCommandLineFactory( commandLineFactoryMock );
+        ForkedMavenExecutor executor = new ForkedMavenExecutor( mavenCrypto, commandLineFactoryMock );
 
         Settings settings = new Settings();
         Server server = new Server();
@@ -357,9 +367,9 @@ public class ForkedMavenExecutorTest
         File settingsSecurity = new File( System.getProperty( "user.home" ), ".m2/settings-security.xml" );
         if ( settingsSecurity.exists() )
         {
-            assertFalse( "server_passphrase".equals( encryptedServer.getPassphrase() ) );
-            assertFalse( "server_password".equals( encryptedServer.getPassword() ) );
-            assertFalse( "proxy_password".equals( encryptedProxy.getPassword() ) );
+            assertNotEquals( "server_passphrase", encryptedServer.getPassphrase() );
+            assertNotEquals( "server_password", encryptedServer.getPassword() );
+            assertNotEquals( "proxy_password", encryptedProxy.getPassword() );
         }
     }
 }
\ No newline at end of file
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/InvokerMavenExecutorTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/InvokerMavenExecutorTest.java
index cdb2ceda..b8afc8b1 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/InvokerMavenExecutorTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/InvokerMavenExecutorTest.java
@@ -19,6 +19,11 @@ package org.apache.maven.shared.release.exec;
  * under the License.
  */
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.isA;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
@@ -34,8 +39,10 @@ import org.apache.maven.settings.Settings;
 import org.apache.maven.settings.io.xpp3.SettingsXpp3Writer;
 import org.apache.maven.shared.invoker.DefaultInvocationRequest;
 import org.apache.maven.shared.invoker.InvocationRequest;
+import org.apache.maven.shared.release.PlexusJUnit4TestCase;
 import org.apache.maven.shared.release.ReleaseResult;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
+import org.apache.maven.shared.release.util.MavenCrypto;
 import org.codehaus.plexus.PlexusTestCase;
 import org.codehaus.plexus.logging.Logger;
 import org.junit.Test;
@@ -43,30 +50,28 @@ import org.mockito.ArgumentCaptor;
 import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher;
 
 public class InvokerMavenExecutorTest
-    extends PlexusTestCase
+        extends PlexusJUnit4TestCase
 {
 
-    private InvokerMavenExecutor executor;
+    private MavenCrypto mavenCrypto;
 
     private SecDispatcher secDispatcher;
 
     @Override
-    protected void setUp()
+    public void setUp()
         throws Exception
     {
         super.setUp();
 
-        executor = (InvokerMavenExecutor) lookup( MavenExecutor.class, "invoker" );
-
-        secDispatcher = (SecDispatcher) lookup( SecDispatcher.class, "mng-4384" );
+        mavenCrypto = lookup( MavenCrypto.class );
+        secDispatcher = lookup( SecDispatcher.class );
     }
 
     @Test
     public void testThreads()
         throws Exception
     {
-        Logger logger = mock( Logger.class );
-        executor.enableLogging( logger );
+        InvokerMavenExecutor executor = new InvokerMavenExecutor( mavenCrypto );
 
         InvocationRequest req = new DefaultInvocationRequest();
         executor.setupRequest( req, null, "-T 3" );
@@ -85,8 +90,7 @@ public class InvokerMavenExecutorTest
     public void testBatch()
                   throws Exception
     {
-        Logger logger = mock( Logger.class );
-        executor.enableLogging( logger );
+        InvokerMavenExecutor executor = new InvokerMavenExecutor( mavenCrypto );
 
         InvocationRequest req = new DefaultInvocationRequest();
 
@@ -104,8 +108,7 @@ public class InvokerMavenExecutorTest
     public void testUserToolchains()
         throws Exception
     {
-        Logger logger = mock( Logger.class );
-        executor.enableLogging( logger );
+        InvokerMavenExecutor executor = new InvokerMavenExecutor( mavenCrypto );
 
         InvocationRequest req = new DefaultInvocationRequest();
         executor.setupRequest( req, null, "-t mytoolchains.xml" );
@@ -124,8 +127,7 @@ public class InvokerMavenExecutorTest
     public void testGlobalSettings()
         throws Exception
     {
-        Logger logger = mock( Logger.class );
-        executor.enableLogging( logger );
+        InvokerMavenExecutor executor = new InvokerMavenExecutor( mavenCrypto );
 
         InvocationRequest req = new DefaultInvocationRequest();
         executor.setupRequest( req, null, "-gs custom-settings.xml" );
@@ -139,6 +141,8 @@ public class InvokerMavenExecutorTest
     public void testEncryptSettings()
         throws Exception
     {
+        InvokerMavenExecutor executor = new InvokerMavenExecutor( mavenCrypto );
+
         // prepare
         File workingDirectory = getTestFile( "target/working-directory" );
         workingDirectory.mkdirs();
@@ -188,9 +192,9 @@ public class InvokerMavenExecutorTest
         File settingsSecurity = new File( System.getProperty( "user.home" ), ".m2/settings-security.xml" );
         if ( settingsSecurity.exists() )
         {
-            assertFalse( "server_passphrase".equals( encryptedServer.getPassphrase() ) );
-            assertFalse( "server_password".equals( encryptedServer.getPassword() ) );
-            assertFalse( "proxy_password".equals( encryptedProxy.getPassword() ) );
+            assertNotEquals( "server_passphrase", encryptedServer.getPassphrase() );
+            assertNotEquals( "server_password", encryptedServer.getPassword() );
+            assertNotEquals( "proxy_password", encryptedProxy.getPassword() );
         }
     }
 }
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/TeeConsumerTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/TeeConsumerTest.java
index d7d2e04e..f7af78bf 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/TeeConsumerTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/TeeConsumerTest.java
@@ -20,34 +20,27 @@ package org.apache.maven.shared.release.exec;
  */
 
 import junit.framework.TestCase;
+import org.junit.Test;
 
 import java.io.ByteArrayOutputStream;
 import java.io.PrintStream;
 
+import static org.junit.Assert.assertEquals;
+
 /**
  * Test the consumer that tees output both to a stream and into an internal buffer for later.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
 public class TeeConsumerTest
-    extends TestCase
 {
-    private TeeConsumer consumer;
+    private final ByteArrayOutputStream out = new ByteArrayOutputStream();
 
-    private ByteArrayOutputStream out;
+    private final TeeConsumer consumer = new TeeConsumer( new PrintStream( out ), "xxx " );
 
     private static final String LS = System.getProperty( "line.separator" );
 
-    @Override
-    protected void setUp()
-        throws Exception
-    {
-        super.setUp();
-
-        out = new ByteArrayOutputStream();
-        consumer = new TeeConsumer( new PrintStream( out ), "xxx " );
-    }
-
+    @Test
     public void testConsumeLine()
     {
         consumer.consumeLine( "line" );
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/TeeOutputStreamTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/TeeOutputStreamTest.java
index 0855a417..50cd6c7f 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/TeeOutputStreamTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/exec/TeeOutputStreamTest.java
@@ -19,37 +19,29 @@ package org.apache.maven.shared.release.exec;
  * under the License.
  */
 
-import junit.framework.TestCase;
-
 import java.io.ByteArrayOutputStream;
 import java.io.PrintStream;
 
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
 /**
  * Test the output stream that tees output both to a stream and into an internal buffer for later.
  *
  * @author Benjamin Bentmann
  */
 public class TeeOutputStreamTest
-    extends TestCase
 {
-    private TeeOutputStream stream;
+    private final ByteArrayOutputStream out = new ByteArrayOutputStream();
 
-    private ByteArrayOutputStream out;
+    private final TeeOutputStream stream = new TeeOutputStream( new PrintStream( out ), "xxx " );
 
     private static final String LS = System.getProperty( "line.separator" );
 
-    @Override
-    protected void setUp()
-        throws Exception
-    {
-        super.setUp();
-
-        out = new ByteArrayOutputStream();
-        stream = new TeeOutputStream( new PrintStream( out ), "xxx " );
-    }
-
+    @Test
     public void testConsumeLine()
-        throws Exception
+            throws Exception
     {
         stream.write( ( "the first line" + LS + "line2" + LS + "3" + LS ).getBytes() );
 
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractEditModeRewritingReleasePhaseTestCase.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractEditModeRewritingReleasePhaseTestCase.java
index 4e137287..5541e6f0 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractEditModeRewritingReleasePhaseTestCase.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractEditModeRewritingReleasePhaseTestCase.java
@@ -23,7 +23,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
-import static org.mockito.Matchers.isA;
+import static org.mockito.ArgumentMatchers.isA;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -31,6 +31,7 @@ import static org.mockito.Mockito.when;
 
 import java.util.List;
 
+import com.google.inject.Module;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
@@ -62,6 +63,12 @@ public abstract class AbstractEditModeRewritingReleasePhaseTestCase
         super( modelETL );
     }
 
+    @Override
+    protected Module[] getCustomModules()
+    {
+        return new Module[0]; // real SCM needed
+    }
+
     @Test
     public void testRewriteBasicPomWithEditMode()
         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 989fad22..be529f41 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
@@ -32,7 +32,6 @@ import java.nio.file.SimpleFileVisitor;
 import java.nio.file.StandardCopyOption;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -58,12 +57,13 @@ import org.apache.maven.project.ProjectBuildingRequest.RepositoryMerging;
 import org.apache.maven.project.artifact.InvalidDependencyVersionException;
 import org.apache.maven.project.ProjectBuildingResult;
 import org.apache.maven.project.ProjectSorter;
-import org.apache.maven.repository.internal.MavenRepositorySystemSession;
 import org.apache.maven.shared.release.PlexusJUnit4TestCase;
 import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
-import org.sonatype.aether.impl.internal.SimpleLocalRepositoryManager;
-import org.sonatype.aether.repository.WorkspaceReader;
-import org.sonatype.aether.repository.WorkspaceRepository;
+import org.eclipse.aether.DefaultRepositorySystemSession;
+import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
+import org.eclipse.aether.repository.LocalRepository;
+import org.eclipse.aether.repository.WorkspaceReader;
+import org.eclipse.aether.repository.WorkspaceRepository;
 import org.xmlunit.builder.DiffBuilder;
 import org.xmlunit.diff.Comparison;
 import org.xmlunit.diff.ComparisonResult;
@@ -170,7 +170,7 @@ public abstract class AbstractReleaseTestCase
         }
 
         List<ArtifactRepository> repos =
-            Collections.<ArtifactRepository>singletonList( new DefaultArtifactRepository( "central",
+            Collections.singletonList( new DefaultArtifactRepository( "central",
                                                                                           getRemoteRepositoryURL(),
                                                                                           new DefaultRepositoryLayout() ) );
 
@@ -187,11 +187,11 @@ public abstract class AbstractReleaseTestCase
         buildingRequest.setRemoteRepositories( repos );
         buildingRequest.setPluginArtifactRepositories( repos );
         buildingRequest.setRepositoryMerging( RepositoryMerging.REQUEST_DOMINANT );
-        MavenRepositorySystemSession repositorySession = new MavenRepositorySystemSession();
-        repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManager( localRepository.getBasedir() ) );
+        DefaultRepositorySystemSession repositorySession = new DefaultRepositorySystemSession();
+        repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManagerFactory().newInstance( repositorySession, new LocalRepository( localRepository.getBasedir() ) ) );
         buildingRequest.setRepositorySession( repositorySession );
         buildingRequest.addProfile( profile );
-        buildingRequest.setActiveProfileIds( Arrays.asList( profile.getId() ) );
+        buildingRequest.setActiveProfileIds( Collections.singletonList( profile.getId() ) );
         buildingRequest.setResolveDependencies( true );
 
         List<ProjectBuildingResult> buildingResults =
@@ -213,9 +213,9 @@ public abstract class AbstractReleaseTestCase
         for ( MavenProject project  : reactorProjects )
         {
             MavenProject resolvedProject = projectBuilder.build( project.getFile(), buildingRequest ).getProject();
-            
+
             // from LifecycleDependencyResolver
-            if ( project.getDependencyArtifacts() == null )
+            if ( resolvedProject.getDependencyArtifacts() == null )
             {
                 try
                 {
@@ -226,7 +226,15 @@ public abstract class AbstractReleaseTestCase
                     throw new LifecycleExecutionException( e );
                 }
             }
-            
+
+            // TODO .... understand why this is working ... :-)
+            // why projectBuilder doesn't resolve and set in proper way DependencyArtifacts and Artifacts
+            if ( resolvedProject.getDependencyArtifacts().size() >= resolvedProject.getArtifacts().size()
+                && resolvedProject.getDependencyArtifacts().stream().noneMatch( a -> a.getVersion() == null ) )
+            {
+                resolvedProject.setArtifacts( resolvedProject.getDependencyArtifacts() );
+            }
+
             resolvedProjects.add( resolvedProject );
         }
         return resolvedProjects;
@@ -387,7 +395,7 @@ public abstract class AbstractReleaseTestCase
         }
 
         @Override
-        public List<String> findVersions( org.sonatype.aether.artifact.Artifact artifact )
+        public List<String> findVersions( org.eclipse.aether.artifact.Artifact artifact )
         {
             for ( MavenProject mavenProject : reactorProjects )
             {
@@ -400,7 +408,7 @@ public abstract class AbstractReleaseTestCase
         }
 
         @Override
-        public File findArtifact( org.sonatype.aether.artifact.Artifact artifact )
+        public File findArtifact( org.eclipse.aether.artifact.Artifact artifact )
         {
             for ( MavenProject mavenProject : reactorProjects )
             {
@@ -419,4 +427,4 @@ public abstract class AbstractReleaseTestCase
             return null;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractRewritingReleasePhaseTestCase.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractRewritingReleasePhaseTestCase.java
index 08a60426..40e4eb7c 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractRewritingReleasePhaseTestCase.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractRewritingReleasePhaseTestCase.java
@@ -64,12 +64,12 @@ import org.junit.runners.Parameterized.Parameters;
 public abstract class AbstractRewritingReleasePhaseTestCase
     extends AbstractReleaseTestCase
 {
-    private String modelETL;
+    private final String modelETL;
 
     @Parameters
     public static Collection<Object[]> data()
     {
-        return Arrays.asList( new Object[][] { { JDomModelETLFactory.ROLE_HINT } } );
+        return Arrays.asList( new Object[][] { { JDomModelETLFactory.NAME } } );
     }
 
     public AbstractRewritingReleasePhaseTestCase( String modelETL )
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractScmCommitPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractScmCommitPhaseTest.java
index 3a6bbae2..594a446e 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractScmCommitPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractScmCommitPhaseTest.java
@@ -35,7 +35,6 @@ public class AbstractScmCommitPhaseTest
 {
     @Test
     public void testDefaultCreatePomFiles()
-        throws Exception
     {
         List<File> files =
             AbstractScmCommitPhase.createPomFiles( ReleaseUtils.buildReleaseDescriptor( new ReleaseDescriptorBuilder() ),
@@ -48,7 +47,6 @@ public class AbstractScmCommitPhaseTest
 
     @Test
     public void testCreatePomFilesSuppressCommitBeforeTag()
-        throws Exception
     {
         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         builder.setSuppressCommitBeforeTagOrBranch( true );
@@ -61,7 +59,6 @@ public class AbstractScmCommitPhaseTest
 
     @Test
     public void testCreatePomFilesWithReleasePom()
-        throws Exception
     {
         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         builder.setGenerateReleasePoms( true );
@@ -75,7 +72,6 @@ public class AbstractScmCommitPhaseTest
 
     @Test
     public void testCreatePomFilesWithReleasePomAndSuppressCommitBeforeTag()
-        throws Exception
     {
         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         builder.setGenerateReleasePoms( true );
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhaseTest.java
index 1ff575f7..67e51b73 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhaseTest.java
@@ -22,7 +22,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
-import static org.mockito.Matchers.isA;
+import static org.mockito.ArgumentMatchers.isA;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -32,13 +32,17 @@ import static org.mockito.Mockito.when;
 import java.util.Collections;
 import java.util.List;
 
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
 import org.apache.maven.model.Model;
 import org.apache.maven.project.MavenProject;
+import org.apache.maven.scm.manager.ScmManager;
 import org.apache.maven.shared.release.PlexusJUnit4TestCase;
 import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.config.ReleaseUtils;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
+import org.apache.maven.shared.release.stubs.ScmManagerStub;
 import org.codehaus.plexus.components.interactivity.Prompter;
 import org.codehaus.plexus.components.interactivity.PrompterException;
 import org.junit.Test;
@@ -51,14 +55,14 @@ import org.junit.Test;
 public class BranchInputVariablesPhaseTest
     extends PlexusJUnit4TestCase
 {
-    private InputVariablesPhase phase;
+    private BranchInputVariablesPhase phase;
 
     @Override
     public void setUp()
         throws Exception
     {
         super.setUp();
-        phase = (InputVariablesPhase) lookup( ReleasePhase.class, "branch-input-variables" );
+        phase = (BranchInputVariablesPhase) lookup( ReleasePhase.class, "branch-input-variables" );
     }
 
     @Test
@@ -68,6 +72,8 @@ public class BranchInputVariablesPhaseTest
         // prepare
         Prompter mockPrompter = mock( Prompter.class );
         when( mockPrompter.prompt( isA( String.class ) ) ).thenReturn( "tag-value", "simulated-tag-value" );
+
+
         phase.setPrompter( mockPrompter );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
@@ -99,7 +105,6 @@ public class BranchInputVariablesPhaseTest
 
     @Test
     public void testUnmappedVersion()
-        throws Exception
     {
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
@@ -250,14 +255,12 @@ public class BranchInputVariablesPhaseTest
 
     @Test
     public void testBranchOperation()
-        throws Exception
     {
         assertTrue( phase.isBranchOperation() );
     }
 
     @Test
     public void testEmptyBranchName()
-        throws Exception
     {
         // prepare
         Prompter mockPrompter = mock( Prompter.class );
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckPomPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckPomPhaseTest.java
index 46ee81c7..c93ed59c 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckPomPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckPomPhaseTest.java
@@ -19,37 +19,50 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import com.google.inject.Module;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.Scm;
 import org.apache.maven.project.MavenProject;
+import org.apache.maven.shared.release.PlexusJUnit4TestCase;
 import org.apache.maven.shared.release.ReleaseFailureException;
 import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.config.ReleaseUtils;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
-import org.codehaus.plexus.PlexusTestCase;
+import org.junit.Test;
 
 import java.util.Collections;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
 /**
  * Test the POM verification check phase.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
 public class CheckPomPhaseTest
-    extends PlexusTestCase
+        extends PlexusJUnit4TestCase
 {
     private ReleasePhase phase;
 
     @Override
-    protected void setUp()
+    public void setUp()
         throws Exception
     {
         super.setUp();
 
-        phase = (ReleasePhase) lookup( ReleasePhase.class, "check-poms" );
+        phase = lookup( ReleasePhase.class, "check-poms" );
+    }
+
+    @Override
+    protected Module[] getCustomModules()
+    {
+        return new Module[0]; // real SCM needed
     }
 
+    @Test
     public void testCorrectlyConfigured()
         throws Exception
     {
@@ -64,6 +77,7 @@ public class CheckPomPhaseTest
         assertTrue( true );
     }
 
+    @Test
     public void testGetUrlFromProjectConnection()
         throws Exception
     {
@@ -77,6 +91,7 @@ public class CheckPomPhaseTest
         assertEquals( "Check URL", "scm:svn:file://localhost/tmp/repo", ReleaseUtils.buildReleaseDescriptor( builder ).getScmSourceUrl() );
     }
 
+    @Test
     public void testGetUrlFromProjectConnectionSimulate()
         throws Exception
     {
@@ -90,6 +105,7 @@ public class CheckPomPhaseTest
         assertEquals( "Check URL", "scm:svn:file://localhost/tmp/repo", ReleaseUtils.buildReleaseDescriptor( builder ).getScmSourceUrl() );
     }
 
+    @Test
     public void testGetUrlFromProjectDevConnection()
         throws Exception
     {
@@ -103,6 +119,7 @@ public class CheckPomPhaseTest
         assertEquals( "Check URL", "scm:svn:https://localhost/tmp/repo", ReleaseUtils.buildReleaseDescriptor( builder ).getScmSourceUrl() );
     }
 
+    @Test
     public void testGetUrlFromProjectDevConnectionSimulate()
         throws Exception
     {
@@ -116,6 +133,7 @@ public class CheckPomPhaseTest
         assertEquals( "Check URL", "scm:svn:https://localhost/tmp/repo", ReleaseUtils.buildReleaseDescriptor( builder ).getScmSourceUrl() );
     }
 
+    @Test
     public void testGetInvalidUrl()
         throws Exception
     {
@@ -136,6 +154,7 @@ public class CheckPomPhaseTest
         }
     }
 
+    @Test
     public void testGetInvalidProvider()
         throws Exception
     {
@@ -157,6 +176,7 @@ public class CheckPomPhaseTest
         }
     }
 
+    @Test
     public void testMissingUrl()
         throws Exception
     {
@@ -185,6 +205,7 @@ public class CheckPomPhaseTest
         }
     }
 
+    @Test
     public void testReleasingNonSnapshot()
         throws Exception
     {
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckoutProjectFromScmTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckoutProjectFromScmTest.java
index 3ac4eb57..c94acf39 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckoutProjectFromScmTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckoutProjectFromScmTest.java
@@ -22,9 +22,9 @@ package org.apache.maven.shared.release.phase;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.fail;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.argThat;
-import static org.mockito.Matchers.eq;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -58,15 +58,13 @@ import org.junit.Test;
 public class CheckoutProjectFromScmTest
     extends AbstractReleaseTestCase
 {
-    private CheckoutProjectFromScm phase;
-
     @Override
     public void setUp()
         throws Exception
     {
         super.setUp();
 
-        phase = (CheckoutProjectFromScm) lookup( ReleasePhase.class, "checkout-project-from-scm" );
+        phase = lookup( ReleasePhase.class, "checkout-project-from-scm" );
     }
 
     @Test
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/GenerateReleasePomsPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/GenerateReleasePomsPhaseTest.java
index ad381eea..d269eae4 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/GenerateReleasePomsPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/GenerateReleasePomsPhaseTest.java
@@ -19,6 +19,8 @@ package org.apache.maven.shared.release.phase;
  * under the License.
  */
 
+import javax.inject.Singleton;
+
 import static org.junit.Assert.assertTrue;
 
 import static org.mockito.Matchers.argThat;
@@ -35,6 +37,9 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
+import com.google.inject.name.Names;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.scm.ScmFile;
 import org.apache.maven.scm.ScmFileSet;
@@ -47,6 +52,7 @@ import org.apache.maven.scm.repository.ScmRepository;
 import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.config.ReleaseUtils;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
+import org.apache.maven.shared.release.scm.ScmTranslator;
 import org.apache.maven.shared.release.util.ReleaseUtil;
 import org.junit.Test;
 
@@ -78,6 +84,27 @@ public class GenerateReleasePomsPhaseTest
         scmProviderMock = null;
     }
 
+    @Override
+    protected Module[] getCustomModules()
+    {
+        return new Module[] {
+                new AbstractModule()
+                {
+                    @Override
+                    protected void configure()
+                    {
+                        bind( ScmManager.class )
+                                .to( org.apache.maven.shared.release.stubs.ScmManagerStub.class )
+                                .in( Singleton.class );
+                        bind( ScmTranslator.class )
+                                .annotatedWith( Names.named( "stub-provider" ) )
+                                .to( org.apache.maven.shared.release.scm.SubversionScmTranslator.class )
+                                .in( Singleton.class );
+                    }
+                }
+        };
+    }
+
     @Override
     protected String getRoleHint()
     {
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/InputVariablesPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/InputVariablesPhaseTest.java
index 6c215e0e..e4f09384 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/InputVariablesPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/InputVariablesPhaseTest.java
@@ -32,6 +32,7 @@ import static org.mockito.Mockito.when;
 
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.maven.model.Model;
 import org.apache.maven.project.MavenProject;
@@ -40,6 +41,8 @@ import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.config.ReleaseUtils;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
+import org.apache.maven.shared.release.policy.naming.NamingPolicy;
+import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 import org.codehaus.plexus.components.interactivity.Prompter;
 import org.codehaus.plexus.components.interactivity.PrompterException;
 import org.junit.Test;
@@ -54,12 +57,17 @@ public class InputVariablesPhaseTest
 {
     private InputVariablesPhase phase;
 
+    private ScmRepositoryConfigurator scmRepositoryConfigurator;
+
+    private Map<String, NamingPolicy> namingPolicies;
+
     @Override
     public void setUp()
         throws Exception
     {
         super.setUp();
-        phase = (InputVariablesPhase) lookup( ReleasePhase.class, "input-variables" );
+        scmRepositoryConfigurator = lookup( ScmRepositoryConfigurator.class );
+        namingPolicies = lookupMap( NamingPolicy.class );
     }
 
     @Test
@@ -70,7 +78,7 @@ public class InputVariablesPhaseTest
         Prompter mockPrompter = mock( Prompter.class );
         when( mockPrompter.prompt( isA( String.class ), eq( "artifactId-1.0" ) ) ).thenReturn( "tag-value",
                                                                                                "simulated-tag-value" );
-        phase.setPrompter( mockPrompter );
+        phase = new InputVariablesPhase( mockPrompter, scmRepositoryConfigurator, namingPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
@@ -107,6 +115,9 @@ public class InputVariablesPhaseTest
 
         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
 
+        Prompter mockPrompter = mock( Prompter.class );
+        phase = new InputVariablesPhase( mockPrompter, scmRepositoryConfigurator, namingPolicies );
+
         try
         {
             phase.execute( ReleaseUtils.buildReleaseDescriptor( builder ), new DefaultReleaseEnvironment(), reactorProjects );
@@ -138,7 +149,7 @@ public class InputVariablesPhaseTest
     {
         // prepare
         Prompter mockPrompter = mock( Prompter.class );
-        phase.setPrompter( mockPrompter );
+        phase = new InputVariablesPhase( mockPrompter, scmRepositoryConfigurator, namingPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
@@ -175,7 +186,7 @@ public class InputVariablesPhaseTest
     {
         // prepare
         Prompter mockPrompter = mock( Prompter.class );
-        phase.setPrompter( mockPrompter );
+        phase = new InputVariablesPhase( mockPrompter, scmRepositoryConfigurator, namingPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
@@ -210,7 +221,7 @@ public class InputVariablesPhaseTest
     {
         // prepare
         Prompter mockPrompter = mock( Prompter.class );
-        phase.setPrompter( mockPrompter );
+        phase = new InputVariablesPhase( mockPrompter, scmRepositoryConfigurator, namingPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
@@ -245,7 +256,7 @@ public class InputVariablesPhaseTest
         Prompter mockPrompter = mock( Prompter.class );
         when( mockPrompter.prompt( isA( String.class ),
                                    isA( String.class ) ) ).thenThrow( new PrompterException( "..." ) );
-        phase.setPrompter( mockPrompter );
+        phase = new InputVariablesPhase( mockPrompter, scmRepositoryConfigurator, namingPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
@@ -294,7 +305,7 @@ public class InputVariablesPhaseTest
     {
         // prepare
         Prompter mockPrompter = mock( Prompter.class );
-        phase.setPrompter( mockPrompter );
+        phase = new InputVariablesPhase( mockPrompter, scmRepositoryConfigurator, namingPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
@@ -332,7 +343,7 @@ public class InputVariablesPhaseTest
     {
         // prepare
         Prompter mockPrompter = mock( Prompter.class );
-        phase.setPrompter( mockPrompter );
+        phase = new InputVariablesPhase( mockPrompter, scmRepositoryConfigurator, namingPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
@@ -367,6 +378,9 @@ public class InputVariablesPhaseTest
     public void testBranchOperation()
         throws Exception
     {
+        // prepare
+        Prompter mockPrompter = mock( Prompter.class );
+        phase = new InputVariablesPhase( mockPrompter, scmRepositoryConfigurator, namingPolicies );
         assertFalse( phase.isBranchOperation() );
     }
 
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/MapDevelopmentVersionPhaseIT.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/MapDevelopmentVersionPhaseIT.java
index bbd55208..d8943dc6 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/MapDevelopmentVersionPhaseIT.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/MapDevelopmentVersionPhaseIT.java
@@ -24,22 +24,25 @@ import java.util.List;
 
 import org.apache.maven.model.Model;
 import org.apache.maven.project.MavenProject;
+import org.apache.maven.shared.release.PlexusJUnit4TestCase;
 import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.config.ReleaseUtils;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
-import org.codehaus.plexus.PlexusTestCase;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
 
 public class MapDevelopmentVersionPhaseIT
-    extends PlexusTestCase
+        extends PlexusJUnit4TestCase
 {
-    private MapVersionsPhase mapVersionsPhase;
+    private MapDevelopmentVersionsPhase mapDevelopmentVersionsPhase;
 
     @Override
-    protected void setUp()
+    public void setUp()
         throws Exception
     {
         super.setUp();
-        mapVersionsPhase = (MapVersionsPhase) lookup( ReleasePhase.class, "map-development-versions" );
+        mapDevelopmentVersionsPhase = (MapDevelopmentVersionsPhase) lookup( ReleasePhase.class, "map-development-versions" );
     }
 
     private static MavenProject createProject( String artifactId, String version )
@@ -51,6 +54,7 @@ public class MapDevelopmentVersionPhaseIT
         return new MavenProject( model );
     }
 
+    @Test
     public void testNoUpdateWorkingCopyVersions() throws Exception
     {
         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
@@ -58,7 +62,7 @@ public class MapDevelopmentVersionPhaseIT
         builder.setUpdateWorkingCopyVersions( false );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
-        mapVersionsPhase.execute( ReleaseUtils.buildReleaseDescriptor( builder ), new DefaultReleaseEnvironment(), reactorProjects );
+        mapDevelopmentVersionsPhase.execute( ReleaseUtils.buildReleaseDescriptor( builder ), new DefaultReleaseEnvironment(), reactorProjects );
 
         assertEquals( "1.0", ReleaseUtils.buildReleaseDescriptor( builder ).getProjectDevelopmentVersion( "groupId:artifactId" ) );
     }
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/MapVersionsPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/MapVersionsPhaseTest.java
index 00a19b50..8c8196ec 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/MapVersionsPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/MapVersionsPhaseTest.java
@@ -36,6 +36,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.maven.model.Model;
 import org.apache.maven.project.MavenProject;
@@ -45,6 +46,7 @@ import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 import org.apache.maven.shared.release.config.ReleaseUtils;
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 import org.apache.maven.shared.release.policy.PolicyException;
+import org.apache.maven.shared.release.policy.version.VersionPolicy;
 import org.apache.maven.shared.release.versions.VersionParseException;
 import org.codehaus.plexus.components.interactivity.Prompter;
 import org.codehaus.plexus.components.interactivity.PrompterException;
@@ -61,21 +63,18 @@ import org.mockito.MockitoAnnotations;
 public class MapVersionsPhaseTest
     extends PlexusJUnit4TestCase
 {
-    private static final String TEST_MAP_BRANCH_VERSIONS = "test-map-branch-versions";
-
-    private static final String TEST_MAP_DEVELOPMENT_VERSIONS = "test-map-development-versions";
-
-    private static final String TEST_MAP_RELEASE_VERSIONS = "test-map-release-versions";
-
     @Mock
     private Prompter mockPrompter;
 
+    private Map<String, VersionPolicy> versionPolicies;
+
     @Override
     public void setUp()
         throws Exception
     {
         super.setUp();
         MockitoAnnotations.initMocks( this );
+        versionPolicies = lookupMap( VersionPolicy.class );
     }
 
     @Override
@@ -91,12 +90,10 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_RELEASE_VERSIONS );
         MavenProject project = createProject( "artifactId", "1.0-SNAPSHOT" );
-
... 5348 lines suppressed ...