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/04/29 12:27:27 UTC

[maven-release] branch migrate-plugin-off-plexus created (now ab7a496f)

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

cstamas pushed a change to branch migrate-plugin-off-plexus
in repository https://gitbox.apache.org/repos/asf/maven-release.git


      at ab7a496f Migrate plugin off Plexus

This branch includes the following new commits:

     new ab7a496f Migrate plugin off Plexus

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



[maven-release] 01/01: Migrate plugin off Plexus

Posted by cs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit ab7a496fe9a1ab1b1eff9c77cd579aa279ba80c7
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Fri Apr 29 14:26:43 2022 +0200

    Migrate plugin off Plexus
    
    This plugin was so deeply tied to plexus
    "magic", not only tests, but also runtime!
---
 maven-release-api/pom.xml                          |   7 +-
 .../shared/release/phase/AbstractReleasePhase.java |  11 +-
 maven-release-manager/pom.xml                      | 104 ++++---
 .../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  | 144 +++++----
 .../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} |  96 +++---
 ...onsPhase.java => AbstractMapVersionsPhase.java} |  81 ++---
 .../release/phase/AbstractReleasePomsPhase.java    |  19 +-
 .../release/phase/AbstractRewritePomsPhase.java    | 133 ++++----
 .../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  |  58 +++-
 .../maven/shared/release/PlexusJUnit4TestCase.java |  25 +-
 .../PropertiesReleaseDescriptorStoreTest.java      |  31 +-
 .../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 |   2 +-
 .../release/phase/AbstractReleaseTestCase.java     |  22 +-
 .../AbstractRewritingReleasePhaseTestCase.java     |   4 +-
 .../release/phase/AbstractScmCommitPhaseTest.java  |   4 -
 .../phase/BranchInputVariablesPhaseTest.java       |   6 +-
 .../release/phase/CheckoutProjectFromScmTest.java  |  10 +-
 .../release/phase/InputVariablesPhaseTest.java     |  27 +-
 .../phase/MapDevelopmentVersionPhaseIT.java        |   6 +-
 .../shared/release/phase/MapVersionsPhaseTest.java | 333 +++++++++------------
 .../phase/ScmCommitPreparationPhaseTest.java       |   6 +-
 .../release/policies/DefaultNamingPolicyTest.java  |   2 +-
 .../release/policies/DefaultVersionPolicyTest.java |   2 +-
 .../release/scm/ClearCaseScmTranslatorTest.java    |  11 +-
 .../shared/release/scm/CvsScmTranslatorTest.java   |  11 +-
 .../scm/DefaultScmRepositoryConfiguratorTest.java  |  23 +-
 .../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 |   7 +
 .../maven/shared/release/util/PomFinderTest.java   |  29 +-
 .../release/versions/DefaultVersionInfoTest.java   |  37 ++-
 .../release/exec/ForkedMavenExecutorTest.xml       |  32 --
 .../phase/BranchInputVariablesPhaseTest.xml        |  41 ---
 .../phase/CheckDependencySnapshotsPhaseTest.xml    |  32 --
 .../release/phase/CheckoutProjectFromScmTest.xml   |  36 ---
 .../shared/release/phase/EndReleasePhaseTest.xml   |  32 --
 .../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 ---
 .../maven-release-oddeven-policy/pom.xml           |  32 +-
 .../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                                            |  89 +++++-
 135 files changed, 2492 insertions(+), 3017 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..558e15c8 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>
@@ -80,11 +81,34 @@
     <dependency>
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-core</artifactId>
+      <exclusions>
+        <exclusion>
+          <groupId>org.sonatype.plexus</groupId>
+          <artifactId>plexus-sec-dispatcher</artifactId>
+        </exclusion>
+      </exclusions>
     </dependency>
     <dependency>
       <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 +122,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 +130,7 @@
         </exclusion>
       </exclusions>
     </dependency>
+
     <!-- scm dependencies -->
     <dependency>
       <groupId>org.apache.maven.scm</groupId>
@@ -117,6 +142,12 @@
       <groupId>org.apache.maven.scm</groupId>
       <artifactId>maven-scm-manager-plexus</artifactId>
       <scope>runtime</scope>
+      <exclusions>
+        <exclusion>
+          <groupId>org.codehaus.plexus</groupId>
+          <artifactId>plexus-container-default</artifactId>
+        </exclusion>
+      </exclusions>
     </dependency>
     <dependency>
       <groupId>org.apache.maven.scm</groupId>
@@ -130,6 +161,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>
@@ -162,16 +199,31 @@
       <artifactId>xmlunit-core</artifactId>
       <scope>test</scope>
     </dependency>
+
+    <dependency>
+      <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.sonatype.aether</groupId>
-      <artifactId>aether-connector-file</artifactId>
-      <version>1.7</version>
+      <groupId>org.eclipse.aether</groupId>
+      <artifactId>aether-transport-wagon</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.sonatype.aether</groupId>
-      <artifactId>aether-connector-wagon</artifactId>
-      <version>1.7</version>
+      <groupId>org.apache.maven.wagon</groupId>
+      <artifactId>wagon-http</artifactId>
       <scope>test</scope>
     </dependency>
   </dependencies>
@@ -208,36 +260,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..3b99c2c7 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 static final Logger LOGGER = LoggerFactory.getLogger( DefaultReleaseManager.class );
+
+    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..f1affb0f 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 static final Logger LOGGER = LoggerFactory.getLogger( PropertiesReleaseDescriptorStore.class );
 
-    /**
-     * 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..45364524 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;
@@ -41,17 +45,18 @@ 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" )
+@Singleton
+@Named( "invoker" )
 @SuppressWarnings( "static-access" )
 public class InvokerMavenExecutor
-    extends AbstractMavenExecutor
+        extends AbstractMavenExecutor
 {
 
     private static final Options OPTIONS = new Options();
@@ -87,95 +92,108 @@ 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> */
+
+    /**
+     * Constant <code>ALTERNATE_USER_TOOLCHAINS='t'</code>
+     */
     public static final char ALTERNATE_USER_TOOLCHAINS = 't';
-    
+
     static
     {
         OPTIONS.addOption(
-            OptionBuilder.withLongOpt( "define" ).hasArg().withDescription( "Define a system property" ).create(
-                SET_SYSTEM_PROPERTY ) );
+                OptionBuilder.withLongOpt( "define" ).hasArg().withDescription( "Define a system property" ).create(
+                        SET_SYSTEM_PROPERTY ) );
 
         OPTIONS.addOption( OptionBuilder.withLongOpt( "offline" ).withDescription( "Work offline" ).create( OFFLINE ) );
 
         OPTIONS.addOption(
-            OptionBuilder.withLongOpt( "quiet" ).withDescription( "Quiet output - only show errors" ).create( QUIET ) );
+                OptionBuilder.withLongOpt( "quiet" ).withDescription( "Quiet output - only show errors" )
+                        .create( QUIET ) );
 
         OPTIONS.addOption(
-            OptionBuilder.withLongOpt( "debug" ).withDescription( "Produce execution debug output" ).create( DEBUG ) );
+                OptionBuilder.withLongOpt( "debug" ).withDescription( "Produce execution debug output" )
+                        .create( DEBUG ) );
 
         OPTIONS.addOption(
-            OptionBuilder.withLongOpt( "errors" ).withDescription( "Produce execution error messages" ).create(
-                ERRORS ) );
+                OptionBuilder.withLongOpt( "errors" ).withDescription( "Produce execution error messages" ).create(
+                        ERRORS ) );
 
         OPTIONS.addOption( OptionBuilder.withLongOpt( "reactor" ).withDescription(
-            "Execute goals for project found in the reactor" ).create( REACTOR ) );
+                "Execute goals for project found in the reactor" ).create( REACTOR ) );
 
         OPTIONS.addOption(
-            OptionBuilder.withLongOpt( "non-recursive" ).withDescription( "Do not recurse into sub-projects" ).create(
-                NON_RECURSIVE ) );
+                OptionBuilder.withLongOpt( "non-recursive" ).withDescription( "Do not recurse into sub-projects" )
+                        .create(
+                                NON_RECURSIVE ) );
 
         OPTIONS.addOption( OptionBuilder.withLongOpt( "update-snapshots" ).withDescription(
-            "Forces a check for updated releases and snapshots on remote repositories" ).create( UPDATE_SNAPSHOTS ) );
+                        "Forces a check for updated releases and snapshots on remote repositories" )
+                .create( UPDATE_SNAPSHOTS ) );
 
         OPTIONS.addOption( OptionBuilder.withLongOpt( "activate-profiles" ).withDescription(
-            "Comma-delimited list of profiles to activate" ).hasArg().create( ACTIVATE_PROFILES ) );
+                "Comma-delimited list of profiles to activate" ).hasArg().create( ACTIVATE_PROFILES ) );
 
         OPTIONS.addOption( OptionBuilder.withLongOpt( "strict-checksums" ).withDescription(
-            "Fail the build if checksums don't match" ).create( CHECKSUM_FAILURE_POLICY ) );
+                "Fail the build if checksums don't match" ).create( CHECKSUM_FAILURE_POLICY ) );
 
         OPTIONS.addOption(
-            OptionBuilder.withLongOpt( "lax-checksums" ).withDescription( "Warn if checksums don't match" ).create(
-                CHECKSUM_WARNING_POLICY ) );
+                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 ) );
+                "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 ) );
+                " 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 ) );
+                "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 ) );
+                "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 ) );
+                "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 ) );
+    }
+
+    @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
         {
@@ -242,7 +260,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 +280,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 +309,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 +336,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 +385,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 +416,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,7 +460,7 @@ public class InvokerMavenExecutor
     }
 
     private static final class Handler
-        implements InvocationOutputHandler
+            implements InvocationOutputHandler
     {
         private Logger logger;
 
@@ -458,7 +476,7 @@ public class InvokerMavenExecutor
     }
 
     private static final class LoggerBridge
-        implements InvokerLogger
+            implements InvokerLogger
     {
 
         private Logger logger;
@@ -495,19 +513,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 +555,7 @@ public class InvokerMavenExecutor
         @Override
         public boolean isFatalErrorEnabled()
         {
-            return logger.isFatalErrorEnabled();
+            return logger.isErrorEnabled();
         }
 
         @Override
@@ -556,7 +574,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..7cd73da8 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
@@ -22,6 +22,7 @@ package org.apache.maven.shared.release.phase;
 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 +40,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 +50,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 = requireNonNull( 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 +112,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 +143,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 +169,8 @@ public class InputVariablesPhase
                 try
                 {
                     suggestedName =
-                        resolveSuggestedName( releaseDescriptor.getProjectNamingPolicyId(), releaseVersion, project );
+                            resolveSuggestedName( releaseDescriptor.getProjectNamingPolicyId(), releaseVersion,
+                                    project );
                 }
                 catch ( PolicyException e )
                 {
@@ -180,7 +194,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 +209,7 @@ public class InputVariablesPhase
                 }
             }
 
-            ScmProvider provider = null;
+            ScmProvider provider;
             try
             {
                 provider = getScmProvider( releaseDescriptor, releaseEnvironment );
@@ -203,7 +217,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 +228,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 +237,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 +273,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 +286,7 @@ public class InputVariablesPhase
     }
 
     private String resolveSuggestedName( String policyId, String version, MavenProject project )
-        throws PolicyException
+            throws PolicyException
     {
         if ( policyId == null )
         {
@@ -283,13 +297,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..dedf34d6 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,25 @@ 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 ) )
                             {
                                 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 +586,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 +613,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 +623,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 +634,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 +642,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 +670,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..81d830e9 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, "default" );
     }
 }
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..f2791b1e 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 static final Logger LOGGER = LoggerFactory.getLogger( DefaultScmRepositoryConfigurator.class );
+
+    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..0e0ee142 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;
@@ -55,8 +62,8 @@ 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.codehaus.plexus.util.FileUtils;
+import org.junit.Test;
 
 /**
  * Test the default release manager.
@@ -64,13 +71,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 +85,22 @@ public class DefaultReleaseManagerTest
         configStore = (ReleaseDescriptorStoreStub) lookup( ReleaseDescriptorStore.class, "stub" );
     }
 
+    @Override
+    protected Module[] getCustomModules()
+    {
+        return new Module[] {
+                new AbstractModule()
+                {
+                    @Override
+                    protected void configure()
+                    {
+                        bind( ReleaseDescriptorStore.class ).toInstance( new ReleaseDescriptorStoreStub() );
+                    }
+                }
+        };
+    }
+
+    @Test
     public void testPrepareNoCompletedPhase()
         throws Exception
     {
@@ -104,6 +127,7 @@ public class DefaultReleaseManagerTest
         assertFalse( "step3 not simulated", phase.isSimulated() );
     }
 
+    @Test
     public void testPrepareCompletedPhase()
         throws Exception
     {
@@ -130,6 +154,7 @@ public class DefaultReleaseManagerTest
         assertFalse( "step3 not simulated", phase.isSimulated() );
     }
 
+    @Test
     public void testPrepareCompletedPhaseNoResume()
         throws Exception
     {
@@ -158,6 +183,7 @@ public class DefaultReleaseManagerTest
         assertFalse( "step3 not simulated", phase.isSimulated() );
     }
 
+    @Test
     public void testPrepareCompletedAllPhases()
         throws Exception
     {
@@ -184,6 +210,7 @@ public class DefaultReleaseManagerTest
         assertFalse( "step3 not simulated", phase.isSimulated() );
     }
 
+    @Test
     public void testPrepareInvalidCompletedPhase()
         throws Exception
     {
@@ -210,6 +237,7 @@ public class DefaultReleaseManagerTest
         assertFalse( "step3 not simulated", phase.isSimulated() );
     }
 
+    @Test
     public void testPrepareSimulateNoCompletedPhase()
         throws Exception
     {
@@ -238,6 +266,7 @@ public class DefaultReleaseManagerTest
         assertFalse( "step3 not executed", phase.isExecuted() );
     }
 
+    @Test
     public void testPrepareSimulateCompletedPhase()
         throws Exception
     {
@@ -266,6 +295,7 @@ public class DefaultReleaseManagerTest
         assertFalse( "step3 not executed", phase.isExecuted() );
     }
 
+    @Test
     public void testPrepareSimulateCompletedAllPhases()
         throws Exception
     {
@@ -294,6 +324,7 @@ public class DefaultReleaseManagerTest
         assertFalse( "step3 not executed", phase.isExecuted() );
     }
 
+    @Test
     public void testPrepareSimulateInvalidCompletedPhase()
         throws Exception
     {
@@ -322,6 +353,7 @@ public class DefaultReleaseManagerTest
         assertFalse( "step3 not executed", phase.isExecuted() );
     }
 
+    @Test
     public void testPrepareUnknownPhaseConfigured()
         throws Exception
     {
@@ -345,6 +377,7 @@ public class DefaultReleaseManagerTest
         }
     }
 
+    @Test
     public void testReleaseConfigurationStoreReadFailure()
         throws Exception
     {
@@ -382,6 +415,7 @@ public class DefaultReleaseManagerTest
         verifyNoMoreInteractions( configStoreMock );
     }
 
+    @Test
     public void testReleaseConfigurationStoreWriteFailure()
         throws Exception
     {
@@ -422,6 +456,7 @@ public class DefaultReleaseManagerTest
         verifyNoMoreInteractions( configStoreMock );
     }
 
+    @Test
     public void testReleaseConfigurationStoreClean()
         throws Exception
     {
@@ -473,6 +508,7 @@ public class DefaultReleaseManagerTest
         return Collections.singletonList( project );
     }
 
+    @Test
     public void testReleasePerformWithResult()
         throws Exception
     {
@@ -494,6 +530,7 @@ public class DefaultReleaseManagerTest
         assertTrue( result.getOutput().length() > 0 );
     }
 
+    @Test
     public void testReleaseConfigurationStoreReadFailureOnPerform()
         throws Exception
     {
@@ -532,6 +569,7 @@ public class DefaultReleaseManagerTest
         verifyNoMoreInteractions( configStoreMock );
     }
 
+    @Test
     public void testReleasePerformWithIncompletePrepare()
         throws Exception
     {
@@ -564,6 +602,7 @@ public class DefaultReleaseManagerTest
     }
 
     // MRELEASE-758: release:perform no longer removes release.properties
+    @Test
     public void testPerformWithDefaultClean()
         throws Exception
     {
@@ -599,6 +638,7 @@ public class DefaultReleaseManagerTest
         verifyNoMoreInteractions( managerListener );
     }
 
+    @Test
     public void testNoScmUrlPerform()
         throws Exception
     {
@@ -625,6 +665,7 @@ public class DefaultReleaseManagerTest
         }
     }
 
+    @Test
     public void testScmExceptionThrown()
         throws Exception
     {
@@ -669,6 +710,7 @@ public class DefaultReleaseManagerTest
         verifyNoMoreInteractions( scmProviderMock );
     }
 
+    @Test
     public void testScmResultFailure()
         throws Exception
     {
@@ -704,6 +746,7 @@ public class DefaultReleaseManagerTest
     }
 
     // MRELEASE-1042
+    @Test
     public void testKeepProfilesOnPerform()
             throws Exception
     {
@@ -735,10 +778,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 +809,7 @@ public class DefaultReleaseManagerTest
     }
 
     // MRELEASE-761
+    @Test
     public void testRollbackCall()
         throws Exception
     {
@@ -778,6 +827,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..acdb227c 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
@@ -23,10 +23,13 @@ import static org.junit.Assert.fail;
 
 import java.io.File;
 import java.io.InputStream;
+import java.util.Map;
 
+import com.google.inject.Module;
 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 +89,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 +110,7 @@ public abstract class PlexusJUnit4TestCase
 
         try
         {
-            container = new DefaultPlexusContainer( containerConfiguration );
+            container = new DefaultPlexusContainer( containerConfiguration, getCustomModules() );
         }
         catch ( final PlexusContainerException e )
         {
@@ -112,6 +119,14 @@ public abstract class PlexusJUnit4TestCase
         }
     }
 
+    /**
+     * Allows test to define custom modules.
+     */
+    protected Module[] getCustomModules()
+    {
+        return new Module[0];
+    }
+
     /**
      * Allow custom test case implementations do augment the default container configuration before executing tests.
      *
@@ -221,6 +236,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..47537ede 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,14 +46,14 @@ 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();
@@ -55,6 +61,7 @@ public class PropertiesReleaseDescriptorStoreTest
         secDispatcher = lookup( SecDispatcher.class, "mng-4384" );
     }
 
+    @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..60e89385 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;
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..b478f6ce 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 =
@@ -387,7 +387,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 +400,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 )
             {
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..d6f1d17d 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
@@ -51,14 +51,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 +68,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" ) );
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..11266064 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
@@ -48,8 +48,10 @@ 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.scm.DefaultScmRepositoryConfigurator;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 import org.apache.maven.shared.release.stubs.ScmManagerStub;
+import org.apache.maven.shared.release.util.MavenCrypto;
 import org.junit.Test;
 
 /**
@@ -58,7 +60,9 @@ import org.junit.Test;
 public class CheckoutProjectFromScmTest
     extends AbstractReleaseTestCase
 {
-    private CheckoutProjectFromScm phase;
+    private ScmManager scmManager;
+
+    private MavenCrypto mavenCrypto;
 
     @Override
     public void setUp()
@@ -66,7 +70,9 @@ public class CheckoutProjectFromScmTest
     {
         super.setUp();
 
-        phase = (CheckoutProjectFromScm) lookup( ReleasePhase.class, "checkout-project-from-scm" );
+        mavenCrypto = lookup( MavenCrypto.class );
+        scmManager = new ScmManagerStub();
+        phase = new CheckoutProjectFromScm( new DefaultScmRepositoryConfigurator( scmManager, mavenCrypto ) );
     }
 
     @Test
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..df67e897 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();
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..2f5e00da 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
@@ -32,14 +32,14 @@ import org.codehaus.plexus.PlexusTestCase;
 public class MapDevelopmentVersionPhaseIT
     extends PlexusTestCase
 {
-    private MapVersionsPhase mapVersionsPhase;
+    private MapDevelopmentVersionsPhase mapDevelopmentVersionsPhase;
 
     @Override
     protected 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 )
@@ -58,7 +58,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..29027dac 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" );
-
         when( mockPrompter.prompt( startsWith( "What is the release version for \"" + project.getName() + "\"?" ),
-                                   eq( "1.0" ) ) ).thenReturn( "2.0" );
-        phase.setPrompter( mockPrompter );
+                eq( "1.0" ) ) ).thenReturn( "2.0" );
+        MapReleaseVersionsPhase phase = new MapReleaseVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( project );
 
@@ -118,12 +115,10 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_RELEASE_VERSIONS );
         MavenProject project = createProject( "artifactId", "1.0-SNAPSHOT" );
-
         when( mockPrompter.prompt( startsWith( "What is the release version for \"" + project.getName() + "\"?" ),
-                                   eq( "1.0" ) ) ).thenReturn( "2.0" );
-        phase.setPrompter( mockPrompter );
+                eq( "1.0" ) ) ).thenReturn( "2.0" );
+        MapReleaseVersionsPhase phase = new MapReleaseVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( project );
 
@@ -145,12 +140,10 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_RELEASE_VERSIONS );
         MavenProject project = createProject( "artifactId", "1.0-SNAPSHOT" );
-
         when( mockPrompter.prompt( startsWith( "What is the release version for \"" + project.getName() + "\"?" ),
-                                   eq( "1.0" ) ) ).thenReturn( "1.0.0" );
-        phase.setPrompter( mockPrompter );
+                eq( "1.0" ) ) ).thenReturn( "1.0.0" );
+        MapReleaseVersionsPhase phase = new MapReleaseVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( project );
 
@@ -185,12 +178,10 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_RELEASE_VERSIONS );
         MavenProject project = createProject( "artifactId", "SNAPSHOT" );
-
         when( mockPrompter.prompt( startsWith( "What is the release version for \"" + project.getName() + "\"?" ),
-                                   eq( "1.0" ) ) ).thenReturn( "2.0" );
-        phase.setPrompter( mockPrompter );
+                eq( "1.0" ) ) ).thenReturn( "2.0" );
+        MapReleaseVersionsPhase phase = new MapReleaseVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( project );
 
@@ -228,13 +219,11 @@ public class MapVersionsPhaseTest
         // prepare
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "SNAPSHOT" ) );
 
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_RELEASE_VERSIONS );
+        MapReleaseVersionsPhase phase = new MapReleaseVersionsPhase( mockPrompter, versionPolicies );
 
         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         builder.addReleaseVersion( "groupId:artifactId", "2.0" );
 
-        phase.setPrompter( mockPrompter );
-
         // execute
         phase.execute( ReleaseUtils.buildReleaseDescriptor( builder ), new DefaultReleaseEnvironment(), reactorProjects );
 
@@ -270,15 +259,13 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Arrays.asList( rootProject, moduleProject );
 
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_RELEASE_VERSIONS );
+        MapReleaseVersionsPhase phase = new MapReleaseVersionsPhase( mockPrompter, versionPolicies );
 
         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder()
             .setInteractive(false) // batch mode
             .setAutoVersionSubmodules( true )
             .addReleaseVersion( "groupId:artifactId", "2.0" );
 
-        phase.setPrompter( mockPrompter );
-
         // execute
         phase.execute( ReleaseUtils.buildReleaseDescriptor( builder ), new DefaultReleaseEnvironment(), reactorProjects );
 
@@ -314,7 +301,7 @@ public class MapVersionsPhaseTest
 
         List<MavenProject> reactorProjects = Arrays.asList( rootProject, moduleProject );
 
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_RELEASE_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder()
             .setInteractive( false ) // batch mode
@@ -322,10 +309,6 @@ public class MapVersionsPhaseTest
             .setDefaultDevelopmentVersion( "1.1-SNAPSHOT" )
             .addDevelopmentVersion( "groupId:artifactId", "2.0-SNAPSHOT" );
 
-        phase.setConvertToSnapshot( true );
-        phase.setPrompter( mockPrompter );
-
-
         // execute
         phase.execute( ReleaseUtils.buildReleaseDescriptor( builder ), new DefaultReleaseEnvironment(), reactorProjects );
 
@@ -350,7 +333,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_RELEASE_VERSIONS );
+        MapReleaseVersionsPhase phase = new MapReleaseVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0-SNAPSHOT" ) );
 
@@ -370,7 +353,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_RELEASE_VERSIONS );
+        MapReleaseVersionsPhase phase = new MapReleaseVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0-SNAPSHOT" ) );
 
@@ -390,12 +373,10 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
         MavenProject project = createProject( "artifactId", "1.0" );
-
         when( mockPrompter.prompt( startsWith( "What is the new development version for \"" + project.getName()
-            + "\"?" ), eq( "1.1-SNAPSHOT" ) ) ).thenReturn( "2.0-SNAPSHOT" );
-        phase.setPrompter( mockPrompter );
+                + "\"?" ), eq( "1.1-SNAPSHOT" ) ) ).thenReturn( "2.0-SNAPSHOT" );
+        MapReleaseVersionsPhase phase = new MapReleaseVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( project );
 
@@ -430,11 +411,9 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
         MavenProject project = createProject( "artifactId", "1.0" );
 
-        phase.setPrompter( mockPrompter );
-
         List<MavenProject> reactorProjects = Collections.singletonList( project );
 
         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
@@ -464,9 +443,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
-
-        phase.setPrompter( mockPrompter );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
@@ -500,11 +477,9 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
-        phase.setPrompter( mockPrompter );
-
         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
         builder.setInteractive( false );
         builder.addDevelopmentVersion( "groupId:artifactId", "2-SNAPSHOT" );
@@ -534,11 +509,9 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
-
         when( mockPrompter.prompt( isA( String.class ),
-                                   isA( String.class ) ) ).thenThrow( new PrompterException( "..." ) );
-        phase.setPrompter( mockPrompter );
+                isA( String.class ) ) ).thenThrow( new PrompterException( "..." ) );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
 
@@ -580,12 +553,11 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
         MavenProject project = createProject( "artifactId", "foo" );
 
         when( mockPrompter.prompt( startsWith( "What is the new development version for \"" + project.getName()
-            + "\"?" ), eq( "1.1-SNAPSHOT" ) ) ).thenReturn( "2.0-SNAPSHOT" );
-        phase.setPrompter( mockPrompter );
+                + "\"?" ), eq( "1.1-SNAPSHOT" ) ) ).thenReturn( "2.0-SNAPSHOT" );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( project );
 
@@ -614,9 +586,8 @@ public class MapVersionsPhaseTest
 
     @Test
     public void testAdjustVersionNonInteractive()
-        throws Exception
     {
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "foo" ) );
 
@@ -654,7 +625,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -676,7 +647,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -698,7 +669,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -721,7 +692,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -744,7 +715,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -766,7 +737,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -788,7 +759,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -809,7 +780,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -830,7 +801,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -852,7 +823,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -874,7 +845,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -895,7 +866,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -916,7 +887,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // verify
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -938,7 +909,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // verify
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -960,7 +931,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // verify
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
@@ -982,7 +953,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // verify
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
@@ -1004,7 +975,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // verify
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_RELEASE_VERSIONS );
+        MapReleaseVersionsPhase phase = new MapReleaseVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -1027,7 +998,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // verify
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_RELEASE_VERSIONS );
+        MapReleaseVersionsPhase phase = new MapReleaseVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -1050,7 +1021,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // verify
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_RELEASE_VERSIONS );
+        MapReleaseVersionsPhase phase = new MapReleaseVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
@@ -1073,7 +1044,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // verify
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_RELEASE_VERSIONS );
+        MapReleaseVersionsPhase phase = new MapReleaseVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
@@ -1096,7 +1067,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -1119,7 +1090,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -1142,7 +1113,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
@@ -1165,7 +1136,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_DEVELOPMENT_VERSIONS );
+        MapDevelopmentVersionsPhase phase = new MapDevelopmentVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
@@ -1188,7 +1159,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_BRANCH_VERSIONS );
+        MapBranchVersionsPhase phase = new MapBranchVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -1212,7 +1183,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_BRANCH_VERSIONS );
+        MapBranchVersionsPhase phase = new MapBranchVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -1236,7 +1207,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_BRANCH_VERSIONS );
+        MapBranchVersionsPhase phase = new MapBranchVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
@@ -1265,7 +1236,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_BRANCH_VERSIONS );
+        MapBranchVersionsPhase phase = new MapBranchVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
@@ -1294,7 +1265,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_BRANCH_VERSIONS );
+        MapBranchVersionsPhase phase = new MapBranchVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -1321,7 +1292,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_BRANCH_VERSIONS );
+        MapBranchVersionsPhase phase = new MapBranchVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -1348,7 +1319,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_BRANCH_VERSIONS );
+        MapBranchVersionsPhase phase = new MapBranchVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -1373,7 +1344,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_BRANCH_VERSIONS );
+        MapBranchVersionsPhase phase = new MapBranchVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -1398,7 +1369,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_BRANCH_VERSIONS );
+        MapBranchVersionsPhase phase = new MapBranchVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -1422,7 +1393,7 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_BRANCH_VERSIONS );
+        MapBranchVersionsPhase phase = new MapBranchVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -1446,7 +1417,12 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_BRANCH_VERSIONS );
+        // updateBranchVersions is set to true, so suggest the next snapshot version
+        // org.apache.maven.release:maven-release-manager:(,2.4) > 1.2-SNAPSHOT
+        // org.apache.maven.release:maven-release-manager:[2.4,) > 1.3-SNAPSHOT
+        when( mockPrompter.prompt( startsWith( "What is the branch version for" ),
+                eq( "1.3-SNAPSHOT" ) ) ).thenReturn( "2.0-SNAPSHOT" );
+        MapBranchVersionsPhase phase = new MapBranchVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -1454,13 +1430,6 @@ public class MapVersionsPhaseTest
         builder.setBranchCreation( true );
         builder.setUpdateBranchVersions( true );
 
-        // updateBranchVersions is set to true, so suggest the next snapshot version
-        // org.apache.maven.release:maven-release-manager:(,2.4) > 1.2-SNAPSHOT
-        // org.apache.maven.release:maven-release-manager:[2.4,) > 1.3-SNAPSHOT
-        when( mockPrompter.prompt( startsWith( "What is the branch version for" ),
-                                   eq( "1.3-SNAPSHOT" ) ) ).thenReturn( "2.0-SNAPSHOT" );
-        phase.setPrompter( mockPrompter );
-
         // test
         phase.execute( ReleaseUtils.buildReleaseDescriptor( builder ), new DefaultReleaseEnvironment(), reactorProjects );
 
@@ -1475,7 +1444,12 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_BRANCH_VERSIONS );
+        // updateBranchVersions is set to true, so suggest the next snapshot version
+        // org.apache.maven.release:maven-release-manager:(,2.4) > 1.2-SNAPSHOT
+        // org.apache.maven.release:maven-release-manager:[2.4,) > 1.3-SNAPSHOT
+        when( mockPrompter.prompt( startsWith( "What is the branch version for" ),
+                eq( "1.3-SNAPSHOT" ) ) ).thenReturn( "2.0-SNAPSHOT" );
+        MapBranchVersionsPhase phase = new MapBranchVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2-SNAPSHOT" ) );
 
@@ -1483,13 +1457,6 @@ public class MapVersionsPhaseTest
         builder.setBranchCreation( true );
         builder.setUpdateBranchVersions( true );
 
-        // updateBranchVersions is set to true, so suggest the next snapshot version
-        // org.apache.maven.release:maven-release-manager:(,2.4) > 1.2-SNAPSHOT
-        // org.apache.maven.release:maven-release-manager:[2.4,) > 1.3-SNAPSHOT
-        when( mockPrompter.prompt( startsWith( "What is the branch version for" ),
-                                   eq( "1.3-SNAPSHOT" ) ) ).thenReturn( "2.0-SNAPSHOT" );
-        phase.setPrompter( mockPrompter );
-
         // test
         phase.simulate( ReleaseUtils.buildReleaseDescriptor( builder ), new DefaultReleaseEnvironment(), reactorProjects );
 
@@ -1504,7 +1471,12 @@ public class MapVersionsPhaseTest
         throws Exception
     {
         // prepare
-        MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.class, TEST_MAP_BRANCH_VERSIONS );
+        // updateBranchVersions is set to true, so suggest the next snapshot version
+        // org.apache.maven.release:maven-release-manager:(,2.4) > 1.2-SNAPSHOT (yes, one step back!)
+        // org.apache.maven.release:maven-release-manager:[2.4,) > 1.3-SNAPSHOT
+        when( mockPrompter.prompt( startsWith( "What is the branch version for" ),
+                eq( "1.3-SNAPSHOT" ) ) ).thenReturn( "2.1-SNAPSHOT" );
+        MapBranchVersionsPhase phase = new MapBranchVersionsPhase( mockPrompter, versionPolicies );
 
         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.2" ) );
 
@@ -1513,13 +1485,6 @@ public class MapVersionsPhaseTest
         builder.setUpdateBranchVersions( true );
         builder.setUpdateVersionsToSnapshot( true );
... 2451 lines suppressed ...