Repository: mojohaus/versions
Pull request #1211 (2025-01-28 13:53:36)

Bump commons-codec:commons-codec from 1.17.2 to 1.18.0
Bumps [commons-codec:commons-codec](https://github.com/apache/commons-codec) from 1.17.2 to 1.18.0.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/apache/commons-codec/blob/master/RELEASE-NOTES.txt">commons-codec:commons-codec's changelog</a>.</em></p>
<blockquote>
<h2>Apache Commons Codec 1.18.0 Release Notes</h2>
<p>The Apache Commons Codec team is pleased to announce the release of Apache Commons Codec 1.18.0.</p>
<p>The Apache Commons Codec component contains encoders and decoders for
formats such as Base16, Base32, Base64, digest, and Hexadecimal. In addition to these
widely used encoders and decoders, the codec package also maintains a
collection of phonetic encoding utilities.</p>
<p>This is a feature and maintenance release. Java 8 or later is required.</p>
<h2>New features</h2>
<ul>
<li>
<pre><code>        Add Base32.Builder.setHexDecodeTable(boolean). Thanks to Gary Gregory, Julian Reschke.
</code></pre>
</li>
<li>
<pre><code>        Add Base32.Builder.setHexEncodeTable(boolean). Thanks to Gary Gregory, Julian Reschke.
</code></pre>
</li>
</ul>
<h2>Changes</h2>
<ul>
<li>
<pre><code>        Bump org.apache.commons:commons-parent from 78 to 79. Thanks to Gary Gregory.
</code></pre>
</li>
</ul>
<p>For complete information on Apache Commons Codec, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons Codec website:</p>
<p><a href="https://commons.apache.org/proper/commons-codec/">https://commons.apache.org/proper/commons-codec/</a></p>
<p>Download page: <a href="https://commons.apache.org/proper/commons-codec/download_codec.cgi">https://commons.apache.org/proper/commons-codec/download_codec.cgi</a></p>
<hr />
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/apache/commons-codec/commit/5f76abb946164b943bc2cf367bc1d70b8f6e70d1"><code>5f76abb</code></a> Update contributing file from user feedback</li>
<li><a href="https://github.com/apache/commons-codec/commit/a38de9528197b2d01e5b6c9b2e0af3a624cff017"><code>a38de95</code></a> Prepare for the next release candidate</li>
<li><a href="https://github.com/apache/commons-codec/commit/0689dc8b2b0e2eded0fabeee5aea999bec4b0c94"><code>0689dc8</code></a> Prepare for the next release candidate</li>
<li><a href="https://github.com/apache/commons-codec/commit/40982220a4552fd04545dcb13ab1d47905a5d1a9"><code>4098222</code></a> Port from Doxia 1 to 2</li>
<li><a href="https://github.com/apache/commons-codec/commit/ebb29e9a7edf2e7367871c9219c7bc189e340b09"><code>ebb29e9</code></a> Make test fixture package private</li>
<li><a href="https://github.com/apache/commons-codec/commit/110a9f8629de61b1d227c98a588ccfca94bdaf24"><code>110a9f8</code></a> Don't need to end a paragraph with an extra line break</li>
<li><a href="https://github.com/apache/commons-codec/commit/6444237f6430852341e0666594e73228c2cd51d2"><code>6444237</code></a> Remove background color from site page</li>
<li><a href="https://github.com/apache/commons-codec/commit/9062af4ebbebb68f830ff052979510c7922c872f"><code>9062af4</code></a> Merge branch 'master' of</li>
<li><a href="https://github.com/apache/commons-codec/commit/963ee73837704ccece2b85bc8b714f6566d26fd0"><code>963ee73</code></a> Include more in the source assembly</li>
<li><a href="https://github.com/apache/commons-codec/commit/94b9c51724d4f09a298b192e75f7b077b48777fd"><code>94b9c51</code></a> Add a file extension to TODO file</li>
<li>Additional commits viewable in <a href="https://github.com/apache/commons-codec/compare/rel/commons-codec-1.17.2...rel/commons-codec-1.18.0">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=commons-codec:commons-codec&package-manager=maven&previous-version=1.17.2&new-version=1.18.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

You can trigger a rebase of this PR by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>

> **Note**
> Automatic rebases have been disabled on this pull request as it has been open for over 30 days.



Patch:
diff --git a/.github/workflows/pr-automation.yml b/.github/workflows/pr-automation.yml
index 11f193d5..53075957 100644
--- a/.github/workflows/pr-automation.yml
+++ b/.github/workflows/pr-automation.yml
@@ -20,8 +20,6 @@ on:
   pull_request_target:
     types:
       - closed
-      - unlabeled
-      - demilestoned
 
 jobs:
   pr-automation:
diff --git a/pom.xml b/pom.xml
index db3d0202..972843b1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
   <parent>
     <groupId>org.codehaus.mojo</groupId>
     <artifactId>mojo-parent</artifactId>
-    <version>86</version>
+    <version>87</version>
   </parent>
 
   <groupId>org.codehaus.mojo.versions</groupId>
@@ -137,7 +137,7 @@
     <fluidoVersion>${maven-fluido-skin.version}</fluidoVersion>
     <modelloNamespaceRuleVersion>2.1.0</modelloNamespaceRuleVersion>
     <modelloNamespaceReportVersion>2.0.0</modelloNamespaceReportVersion>
-    <byteBuddyVersion>1.16.1</byteBuddyVersion>
+    <byteBuddyVersion>1.17.1</byteBuddyVersion>
 
     <!-- use the same version as in Maven core -->
     <mavenResolverVersion>1.4.1</mavenResolverVersion>
@@ -353,7 +353,7 @@
       <dependency>
         <groupId>commons-codec</groupId>
         <artifactId>commons-codec</artifactId>
-        <version>1.17.2</version>
+        <version>1.18.0</version>
       </dependency>
       <dependency>
         <groupId>commons-io</groupId>
diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/api/AbstractVersionDetails.java b/versions-common/src/main/java/org/codehaus/mojo/versions/api/AbstractVersionDetails.java
index 596db451..fbbd3262 100644
--- a/versions-common/src/main/java/org/codehaus/mojo/versions/api/AbstractVersionDetails.java
+++ b/versions-common/src/main/java/org/codehaus/mojo/versions/api/AbstractVersionDetails.java
@@ -36,7 +36,7 @@ import org.apache.maven.artifact.versioning.VersionRange;
 import org.codehaus.mojo.versions.ordering.BoundArtifactVersion;
 import org.codehaus.mojo.versions.ordering.InvalidSegmentException;
 import org.codehaus.mojo.versions.ordering.VersionComparator;
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
+import org.codehaus.mojo.versions.utils.ArtifactVersionService;
 
 import static java.util.Collections.reverseOrder;
 import static java.util.Optional.empty;
@@ -63,8 +63,14 @@ public abstract class AbstractVersionDetails implements VersionDetails {
      */
     private ArtifactVersion currentVersion = null;
 
+    /**
+     * holds the current version range
+     */
     private VersionRange currentVersionRange = null;
 
+    /**
+     * displays more verbose information about discovered updates
+     */
     protected boolean verboseDetail = true;
 
     protected AbstractVersionDetails() {}
@@ -128,7 +134,7 @@ public abstract class AbstractVersionDetails implements VersionDetails {
                 selectedRestriction.map(Restriction::getUpperBound).orElse(actualVersion);
         ArtifactVersion lowerBound = allowDowngrade
                 ? getLowerBound(selectedRestrictionUpperBound, unchangedSegment)
-                        .map(DefaultArtifactVersionCache::of)
+                        .map(ArtifactVersionService::getArtifactVersion)
                         .orElse(null)
                 : selectedRestrictionUpperBound;
         ArtifactVersion upperBound = unchangedSegment
@@ -176,7 +182,7 @@ public abstract class AbstractVersionDetails implements VersionDetails {
 
     @Override
     public final void setCurrentVersion(String currentVersion) {
-        setCurrentVersion(currentVersion == null ? null : DefaultArtifactVersionCache.of(currentVersion));
+        setCurrentVersion(currentVersion == null ? null : ArtifactVersionService.getArtifactVersion(currentVersion));
     }
 
     @Override
@@ -230,10 +236,10 @@ public abstract class AbstractVersionDetails implements VersionDetails {
     public final ArtifactVersion[] getNewerVersions(
             String versionString, Optional<Segment> unchangedSegment, boolean includeSnapshots, boolean allowDowngrade)
             throws InvalidSegmentException {
-        ArtifactVersion currentVersion = DefaultArtifactVersionCache.of(versionString);
+        ArtifactVersion currentVersion = ArtifactVersionService.getArtifactVersion(versionString);
         ArtifactVersion lowerBound = allowDowngrade
                 ? getLowerBound(currentVersion, unchangedSegment)
-                        .map(DefaultArtifactVersionCache::of)
+                        .map(ArtifactVersionService::getArtifactVersion)
                         .orElse(null)
                 : currentVersion;
         ArtifactVersion upperBound = unchangedSegment
@@ -250,7 +256,7 @@ public abstract class AbstractVersionDetails implements VersionDetails {
             String actualVersion, Optional<Segment> unchangedSegment, boolean includeSnapshots, boolean allowDowngrade)
             throws InvalidSegmentException {
         Restriction segmentRestriction = restrictionForUnchangedSegment(
-                DefaultArtifactVersionCache.of(actualVersion), unchangedSegment, allowDowngrade);
+                ArtifactVersionService.getArtifactVersion(actualVersion), unchangedSegment, allowDowngrade);
         Restriction lookupRestriction;
         if (!allowDowngrade
                 && Optional.ofNullable(currentVersion)
diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/api/ArtifactAssociation.java b/versions-common/src/main/java/org/codehaus/mojo/versions/api/ArtifactAssociation.java
index 530068f5..bd673f26 100644
--- a/versions-common/src/main/java/org/codehaus/mojo/versions/api/ArtifactAssociation.java
+++ b/versions-common/src/main/java/org/codehaus/mojo/versions/api/ArtifactAssociation.java
@@ -28,7 +28,13 @@ import org.apache.maven.artifact.Artifact;
  * @since 1.0-alpha-3
  */
 public interface ArtifactAssociation extends Comparable<ArtifactAssociation> {
+    /**
+     * @return whether the current association uses plugin repositories
+     */
     boolean isUsePluginRepositories();
 
+    /**
+     * @return associated artifact
+     */
     Artifact getArtifact();
 }
diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/api/DefaultVersionsHelper.java b/versions-common/src/main/java/org/codehaus/mojo/versions/api/DefaultVersionsHelper.java
index 8f74bb77..1024fbcf 100644
--- a/versions-common/src/main/java/org/codehaus/mojo/versions/api/DefaultVersionsHelper.java
+++ b/versions-common/src/main/java/org/codehaus/mojo/versions/api/DefaultVersionsHelper.java
@@ -22,7 +22,6 @@ package org.codehaus.mojo.versions.api;
 import javax.xml.stream.XMLStreamException;
 
 import java.io.BufferedInputStream;
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URISyntaxException;
@@ -34,7 +33,6 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -57,10 +55,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.ArtifactUtils;
-import org.apache.maven.artifact.DefaultArtifact;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
-import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
 import org.apache.maven.artifact.versioning.Restriction;
 import org.apache.maven.artifact.versioning.VersionRange;
@@ -81,7 +76,8 @@ import org.codehaus.mojo.versions.model.RuleSet;
 import org.codehaus.mojo.versions.model.io.stax.RuleStaxReader;
 import org.codehaus.mojo.versions.ordering.VersionComparator;
 import org.codehaus.mojo.versions.ordering.VersionComparators;
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
+import org.codehaus.mojo.versions.utils.ArtifactVersionService;
 import org.codehaus.mojo.versions.utils.DependencyComparator;
 import org.codehaus.mojo.versions.utils.PluginComparator;
 import org.codehaus.mojo.versions.utils.RegexUtils;
@@ -99,6 +95,7 @@ import org.eclipse.aether.resolution.VersionRangeResolutionException;
 
 import static java.util.Collections.emptyList;
 import static java.util.Collections.singletonList;
+import static java.util.Objects.requireNonNull;
 import static java.util.Optional.empty;
 import static java.util.Optional.of;
 import static java.util.Optional.ofNullable;
@@ -128,7 +125,7 @@ public class DefaultVersionsHelper implements VersionsHelper {
      */
     private RuleSet ruleSet;
 
-    private final ArtifactHandlerManager artifactHandlerManager;
+    private final ArtifactFactory artifactFactory;
 
     private final RepositorySystem repositorySystem;
 
@@ -166,12 +163,12 @@ public class DefaultVersionsHelper implements VersionsHelper {
      * Private constructor used by the builder
      */
     private DefaultVersionsHelper(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             MavenSession mavenSession,
             MojoExecution mojoExecution,
             Log log) {
-        this.artifactHandlerManager = artifactHandlerManager;
+        this.artifactFactory = requireNonNull(artifactFactory);
         this.repositorySystem = repositorySystem;
         this.mavenSession = mavenSession;
         this.mojoExecution = mojoExecution;
@@ -310,7 +307,7 @@ public class DefaultVersionsHelper implements VersionsHelper {
 
                                 return false;
                             }))
-                            .map(v -> DefaultArtifactVersionCache.of(v.toString()))
+                            .map(v -> ArtifactVersionService.getArtifactVersion(v.toString()))
                             .collect(Collectors.toList()),
                     getVersionComparator(artifact));
         } catch (VersionRangeResolutionException e) {
@@ -451,68 +448,6 @@ public class DefaultVersionsHelper implements VersionsHelper {
         return bestFit;
     }
 
-    @Override
-    public Artifact createPluginArtifact(String groupId, String artifactId, String version) {
-        return createDependencyArtifact(groupId, artifactId, version, "maven-plugin", null, "runtime", false);
-    }
-
-    @Override
-    public Artifact createDependencyArtifact(
-            String groupId,
-            String artifactId,
-            String version,
-            String type,
-            String classifier,
-            String scope,
-            boolean optional) {
-        try {
-            return new DefaultArtifact(
-                    groupId,
-                    artifactId,
-                    VersionRange.createFromVersionSpec(StringUtils.isNotBlank(version) ? version : "[0,]"),
-                    scope,
-                    type,
-                    classifier,
-                    artifactHandlerManager.getArtifactHandler(type),
-                    optional);
-        } catch (InvalidVersionSpecificationException e) {
-            // version should have a proper format
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Override
-    public Artifact createDependencyArtifact(Dependency dependency) {
-        Artifact artifact = createDependencyArtifact(
-                dependency.getGroupId(),
-                dependency.getArtifactId(),
-                dependency.getVersion(),
-                dependency.getType(),
-                dependency.getClassifier(),
-                dependency.getScope(),
-                false);
-
-        if (Artifact.SCOPE_SYSTEM.equals(dependency.getScope()) && dependency.getSystemPath() != null) {
-            artifact.setFile(new File(dependency.getSystemPath()));
-        }
-        return artifact;
-    }
-
-    @Override
-    public Set<Artifact> extractArtifacts(Collection<MavenProject> mavenProjects) {
-        Set<Artifact> result = new HashSet<>();
-        for (MavenProject project : mavenProjects) {
-            result.add(project.getArtifact());
-        }
-
-        return result;
-    }
-
-    @Override
-    public ArtifactVersion createArtifactVersion(String version) {
-        return DefaultArtifactVersionCache.of(version);
-    }
-
     public Map<Dependency, ArtifactVersions> lookupDependenciesUpdates(
             Stream<Dependency> dependencies,
             boolean usePluginRepositories,
@@ -557,7 +492,7 @@ public class DefaultVersionsHelper implements VersionsHelper {
             boolean allowSnapshots)
             throws VersionRetrievalException {
         ArtifactVersions allVersions = lookupArtifactVersions(
-                createDependencyArtifact(dependency), null, usePluginRepositories, useProjectRepositories);
+                artifactFactory.createArtifact(dependency), null, usePluginRepositories, useProjectRepositories);
         return new ArtifactVersions(
                 allVersions.getArtifact(),
                 Arrays.stream(allVersions.getAllUpdates(allowSnapshots)).collect(Collectors.toList()),
@@ -600,7 +535,7 @@ public class DefaultVersionsHelper implements VersionsHelper {
                 lookupDependenciesUpdates(pluginDependencies.stream(), false, allowSnapshots);
 
         ArtifactVersions allVersions = lookupArtifactVersions(
-                createPluginArtifact(plugin.getGroupId(), plugin.getArtifactId(), version), true);
+                artifactFactory.createMavenPluginArtifact(plugin.getGroupId(), plugin.getArtifactId(), version), true);
         ArtifactVersions updatedVersions = new ArtifactVersions(
                 allVersions.getArtifact(),
                 Arrays.stream(allVersions.getAllUpdates(allowSnapshots)).collect(Collectors.toList()),
@@ -617,15 +552,19 @@ public class DefaultVersionsHelper implements VersionsHelper {
     public Map<Property, PropertyVersions> getVersionPropertiesMap(VersionPropertiesMapRequest request)
             throws MojoExecutionException {
         Map<String, Property> properties = new HashMap<>();
+        // Populate properties map from request
         if (request.getPropertyDefinitions() != null) {
             Arrays.stream(request.getPropertyDefinitions()).forEach(p -> properties.put(p.getName(), p));
         }
+
         Map<String, PropertyVersionsBuilder> builders = new HashMap<>();
+
+        // Auto-link items if required
         if (request.isAutoLinkItems()) {
             final PropertyVersionsBuilder[] propertyVersionsBuilders;
             try {
                 propertyVersionsBuilders = PomHelper.getPropertyVersionsBuilders(
-                        this, request.getMavenProject(), request.isIncludeParent());
+                        this, artifactFactory, request.getMavenProject(), request.isIncludeParent());
             } catch (ExpressionEvaluationException | IOException e) {
                 throw new MojoExecutionException(e.getMessage(), e);
             }
@@ -674,7 +613,7 @@ public class DefaultVersionsHelper implements VersionsHelper {
             if (builder == null || !builder.isAssociated()) {
                 getLog().debug("Property ${" + property.getName() + "}: Looks like this property is not "
                         + "associated with any dependency...");
-                builder = new PropertyVersionsBuilder(null, property.getName(), this);
+                builder = new PropertyVersionsBuilder(this, null, property.getName());
             }
             if (!property.isAutoLinkDependencies()) {
                 getLog().debug("Property ${" + property.getName() + "}: Removing any autoLinkDependencies");
@@ -684,7 +623,7 @@ public class DefaultVersionsHelper implements VersionsHelper {
             if (dependencies != null) {
                 for (Dependency dependency : dependencies) {
                     getLog().debug("Property ${" + property.getName() + "}: Adding association to " + dependency);
-                    builder.withAssociation(this.createDependencyArtifact(dependency), false);
+                    builder.withAssociation(artifactFactory.createArtifact(dependency), false);
                 }
             }
             try {
@@ -701,7 +640,7 @@ public class DefaultVersionsHelper implements VersionsHelper {
                 final PropertyVersions versions;
                 try {
                     if (currentVersion != null) {
-                        builder.withCurrentVersion(DefaultArtifactVersionCache.of(currentVersion))
+                        builder.withCurrentVersion(ArtifactVersionService.getArtifactVersion(currentVersion))
                                 .withCurrentVersionRange(VersionRange.createFromVersionSpec(currentVersion));
                     }
                 } catch (InvalidVersionSpecificationException e) {
@@ -720,7 +659,6 @@ public class DefaultVersionsHelper implements VersionsHelper {
      * Builder class for {@linkplain DefaultVersionsHelper}
      */
     public static class Builder {
-        private ArtifactHandlerManager artifactHandlerManager;
         private Collection<String> ignoredVersions;
         private RuleSet ruleSet;
         private String serverId;
@@ -729,7 +667,7 @@ public class DefaultVersionsHelper implements VersionsHelper {
         private MavenSession mavenSession;
         private MojoExecution mojoExecution;
         private RepositorySystem repositorySystem;
-
+        private ArtifactFactory artifactFactory;
         private Map<String, Wagon> wagonMap;
 
         public Builder() {}
@@ -929,11 +867,6 @@ public class DefaultVersionsHelper implements VersionsHelper {
             return pos == -1 ? empty() : of(url.substring(0, pos).trim());
         }
 
-        public Builder withArtifactHandlerManager(ArtifactHandlerManager artifactHandlerManager) {
-            this.artifactHandlerManager = artifactHandlerManager;
-            return this;
-        }
-
         public Builder withIgnoredVersions(Collection<String> ignoredVersions) {
             this.ignoredVersions = ignoredVersions;
             return this;
@@ -979,14 +912,19 @@ public class DefaultVersionsHelper implements VersionsHelper {
             return this;
         }
 
+        public Builder withArtifactFactory(ArtifactFactory artifactFactory) {
+            this.artifactFactory = artifactFactory;
+            return this;
+        }
+
         /**
          * Builds the constructed {@linkplain DefaultVersionsHelper} object
          * @return constructed {@linkplain DefaultVersionsHelper}
          * @throws MojoExecutionException should the constructor with the RuleSet retrieval doesn't succeed
          */
         public DefaultVersionsHelper build() throws MojoExecutionException {
-            DefaultVersionsHelper instance = new DefaultVersionsHelper(
-                    artifactHandlerManager, repositorySystem, mavenSession, mojoExecution, log);
+            DefaultVersionsHelper instance =
+                    new DefaultVersionsHelper(artifactFactory, repositorySystem, mavenSession, mojoExecution, log);
             if (ruleSet != null) {
                 if (!isBlank(rulesUri)) {
                     log.warn("rulesUri is ignored if rules are specified in pom or as parameters");
diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/api/IgnoreVersionHelper.java b/versions-common/src/main/java/org/codehaus/mojo/versions/api/IgnoreVersionHelper.java
index e06510b3..489a2273 100644
--- a/versions-common/src/main/java/org/codehaus/mojo/versions/api/IgnoreVersionHelper.java
+++ b/versions-common/src/main/java/org/codehaus/mojo/versions/api/IgnoreVersionHelper.java
@@ -27,9 +27,10 @@ import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
 import org.apache.maven.artifact.versioning.VersionRange;
 import org.codehaus.mojo.versions.model.IgnoreVersion;
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
 import org.eclipse.aether.version.Version;
 
+import static org.codehaus.mojo.versions.utils.ArtifactVersionService.getArtifactVersion;
+
 /**
  * Helper class for {@link IgnoreVersion}
  */
@@ -81,7 +82,7 @@ public class IgnoreVersionHelper {
 
     private static boolean isVersionIgnoredRange(Version version, IgnoreVersion ignoreVersion) {
         try {
-            ArtifactVersion aVersion = DefaultArtifactVersionCache.of(version.toString());
+            ArtifactVersion aVersion = getArtifactVersion(version.toString());
             VersionRange versionRange = VersionRange.createFromVersionSpec(ignoreVersion.getVersion());
             if (versionRange.hasRestrictions()) {
                 return versionRange.containsVersion(aVersion);
diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/api/PomHelper.java b/versions-common/src/main/java/org/codehaus/mojo/versions/api/PomHelper.java
index 052dfe05..bc560ab0 100644
--- a/versions-common/src/main/java/org/codehaus/mojo/versions/api/PomHelper.java
+++ b/versions-common/src/main/java/org/codehaus/mojo/versions/api/PomHelper.java
@@ -77,6 +77,7 @@ import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.project.ProjectBuildingResult;
 import org.apache.maven.shared.utils.io.IOUtil;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.ModelNode;
 import org.codehaus.mojo.versions.utils.RegexUtils;
 import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
@@ -96,7 +97,7 @@ import static org.codehaus.mojo.versions.api.PomHelper.Marks.PARENT_START;
  * @author Stephen Connolly
  * @since 1.0-alpha-3
  */
-public final class PomHelper {
+public class PomHelper {
     public static final String APACHE_MAVEN_PLUGINS_GROUPID = "org.apache.maven.plugins";
 
     public static final Pattern PATTERN_PROJECT_PROPERTIES = Pattern.compile("/project/properties");
@@ -839,7 +840,7 @@ public final class PomHelper {
      * @since 1.0-alpha-3
      */
     public static PropertyVersionsBuilder[] getPropertyVersionsBuilders(
-            VersionsHelper helper, MavenProject project, boolean includeParent)
+            VersionsHelper helper, ArtifactFactory artifactFactory, MavenProject project, boolean includeParent)
             throws ExpressionEvaluationException, IOException {
         ExpressionEvaluator expressionEvaluator = helper.getExpressionEvaluator(project);
         Map<MavenProject, Model> reactorModels =
@@ -863,30 +864,31 @@ public final class PomHelper {
                 addProperties(helper, propertiesMap, profile.getId(), profile.getProperties());
                 if (profile.getDependencyManagement() != null) {
                     addDependencyAssocations(
-                            helper,
+                            artifactFactory,
                             expressionEvaluator,
                             propertiesMap,
                             profile.getDependencyManagement().getDependencies(),
                             false);
                 }
-                addDependencyAssocations(helper, expressionEvaluator, propertiesMap, profile.getDependencies(), false);
+                addDependencyAssocations(
+                        artifactFactory, expressionEvaluator, propertiesMap, profile.getDependencies(), false);
                 if (profile.getBuild() != null) {
                     if (profile.getBuild().getPluginManagement() != null) {
                         addPluginAssociations(
-                                helper,
+                                artifactFactory,
                                 expressionEvaluator,
                                 propertiesMap,
                                 profile.getBuild().getPluginManagement().getPlugins());
                     }
                     addPluginAssociations(
-                            helper,
+                            artifactFactory,
                             expressionEvaluator,
                             propertiesMap,
                             profile.getBuild().getPlugins());
                 }
                 if (profile.getReporting() != null) {
                     addReportPluginAssociations(
-                            helper,
+                            artifactFactory,
                             expressionEvaluator,
                             propertiesMap,
                             profile.getReporting().getPlugins());
@@ -906,30 +908,31 @@ public final class PomHelper {
 
             if (model.getDependencyManagement() != null) {
                 addDependencyAssocations(
-                        helper,
+                        artifactFactory,
                         expressionEvaluator,
                         propertiesMap,
                         model.getDependencyManagement().getDependencies(),
                         false);
             }
-            addDependencyAssocations(helper, expressionEvaluator, propertiesMap, model.getDependencies(), false);
+            addDependencyAssocations(
+                    artifactFactory, expressionEvaluator, propertiesMap, model.getDependencies(), false);
             if (model.getBuild() != null) {
                 if (model.getBuild().getPluginManagement() != null) {
                     addPluginAssociations(
-                            helper,
+                            artifactFactory,
                             expressionEvaluator,
                             propertiesMap,
                             model.getBuild().getPluginManagement().getPlugins());
                 }
                 addPluginAssociations(
-                        helper,
+                        artifactFactory,
                         expressionEvaluator,
                         propertiesMap,
                         model.getBuild().getPlugins());
             }
             if (model.getReporting() != null) {
                 addReportPluginAssociations(
-                        helper,
+                        artifactFactory,
                         expressionEvaluator,
                         propertiesMap,
                         model.getReporting().getPlugins());
@@ -942,30 +945,31 @@ public final class PomHelper {
                 }
                 if (profile.getDependencyManagement() != null) {
                     addDependencyAssocations(
-                            helper,
+                            artifactFactory,
                             expressionEvaluator,
                             propertiesMap,
                             profile.getDependencyManagement().getDependencies(),
                             false);
                 }
-                addDependencyAssocations(helper, expressionEvaluator, propertiesMap, profile.getDependencies(), false);
+                addDependencyAssocations(
+                        artifactFactory, expressionEvaluator, propertiesMap, profile.getDependencies(), false);
                 if (profile.getBuild() != null) {
                     if (profile.getBuild().getPluginManagement() != null) {
                         addPluginAssociations(
-                                helper,
+                                artifactFactory,
                                 expressionEvaluator,
                                 propertiesMap,
                                 profile.getBuild().getPluginManagement().getPlugins());
                     }
                     addPluginAssociations(
-                            helper,
+                            artifactFactory,
                             expressionEvaluator,
                             propertiesMap,
                             profile.getBuild().getPlugins());
                 }
                 if (profile.getReporting() != null) {
                     addReportPluginAssociations(
-                            helper,
+                            artifactFactory,
                             expressionEvaluator,
                             propertiesMap,
                             profile.getReporting().getPlugins());
@@ -983,7 +987,6 @@ public final class PomHelper {
      * Takes a list of {@link org.apache.maven.model.Plugin} instances and adds associations to properties used to
      * define versions of the plugin artifact or any of the plugin dependencies specified in the pom.
      *
-     * @param helper              Our helper.
      * @param expressionEvaluator Our expression evaluator.
      * @param result              The map of {@link org.codehaus.mojo.versions.api.PropertyVersionsBuilder} keyed by
      *                            property name.
@@ -991,7 +994,7 @@ public final class PomHelper {
      * @throws ExpressionEvaluationException if an expression cannot be evaluated.
      */
     private static void addPluginAssociations(
-            VersionsHelper helper,
+            ArtifactFactory artifactFactory,
             ExpressionEvaluator expressionEvaluator,
             Map<String, PropertyVersionsBuilder> result,
             List<Plugin> plugins)
@@ -1024,19 +1027,19 @@ public final class PomHelper {
                         // might as well capture the current value
                         String evaluatedVersion = (String) expressionEvaluator.evaluate(plugin.getVersion());
                         property.withAssociation(
-                                helper.createPluginArtifact(groupId, artifactId, evaluatedVersion), true);
+                                artifactFactory.createMavenPluginArtifact(groupId, artifactId, evaluatedVersion), true);
                         if (!propertyRef.equals(version)) {
                             addBounds(property, version, propertyRef);
                         }
                     }
                 }
             }
-            addDependencyAssocations(helper, expressionEvaluator, result, plugin.getDependencies(), true);
+            addDependencyAssocations(artifactFactory, expressionEvaluator, result, plugin.getDependencies(), true);
         }
     }
 
     private static void addReportPluginAssociations(
-            VersionsHelper helper,
+            ArtifactFactory artifactFactory,
             ExpressionEvaluator expressionEvaluator,
             Map<String, PropertyVersionsBuilder> result,
             List<ReportPlugin> reportPlugins)
@@ -1069,7 +1072,7 @@ public final class PomHelper {
                         // might as well capture the current value
                         String versionEvaluated = (String) expressionEvaluator.evaluate(plugin.getVersion());
                         property.withAssociation(
-                                helper.createPluginArtifact(groupId, artifactId, versionEvaluated), true);
+                                artifactFactory.createMavenPluginArtifact(groupId, artifactId, versionEvaluated), true);
                         if (!propertyRef.equals(version)) {
                             addBounds(property, version, propertyRef);
                         }
@@ -1080,7 +1083,7 @@ public final class PomHelper {
     }
 
     private static void addDependencyAssocations(
-            VersionsHelper helper,
+            ArtifactFactory artifactFactory,
             ExpressionEvaluator expressionEvaluator,
             Map<String, PropertyVersionsBuilder> result,
             List<Dependency> dependencies,
@@ -1114,7 +1117,7 @@ public final class PomHelper {
                         // might as well capture the current value
                         String versionEvaluated = (String) expressionEvaluator.evaluate(dependency.getVersion());
                         property.withAssociation(
-                                helper.createDependencyArtifact(
+                                artifactFactory.createArtifact(
                                         groupId,
                                         artifactId,
                                         versionEvaluated,
@@ -1163,7 +1166,7 @@ public final class PomHelper {
         }
         for (String propertyName : properties.stringPropertyNames()) {
             if (!result.containsKey(propertyName)) {
-                result.put(propertyName, new PropertyVersionsBuilder(profileId, propertyName, helper));
+                result.put(propertyName, new PropertyVersionsBuilder(helper, profileId, propertyName));
             }
         }
     }
diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/api/PropertyVersions.java b/versions-common/src/main/java/org/codehaus/mojo/versions/api/PropertyVersions.java
index 9ec604d4..7578d3cb 100644
--- a/versions-common/src/main/java/org/codehaus/mojo/versions/api/PropertyVersions.java
+++ b/versions-common/src/main/java/org/codehaus/mojo/versions/api/PropertyVersions.java
@@ -29,6 +29,7 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
+import java.util.stream.Collectors;
 
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.ArtifactUtils;
@@ -41,9 +42,8 @@ import org.apache.maven.project.MavenProject;
 import org.codehaus.mojo.versions.ordering.BoundArtifactVersion;
 import org.codehaus.mojo.versions.ordering.InvalidSegmentException;
 import org.codehaus.mojo.versions.ordering.VersionComparator;
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
+import org.codehaus.mojo.versions.utils.ArtifactVersionService;
 
-import static java.util.Optional.empty;
 import static org.codehaus.mojo.versions.api.Segment.SUBINCREMENTAL;
 
 /**
@@ -262,16 +262,6 @@ public class PropertyVersions extends AbstractVersionDetails {
                 + '\'' + ", associations=" + associations + '}';
     }
 
-    public ArtifactVersion getNewestVersion(
-            String currentVersion,
-            Property property,
-            boolean allowSnapshots,
-            List<MavenProject> reactorProjects,
-            VersionsHelper helper)
-            throws InvalidVersionSpecificationException, InvalidSegmentException {
-        return getNewestVersion(currentVersion, property, allowSnapshots, reactorProjects, helper, false, empty());
-    }
-
     /**
      * Retrieves the newest artifact version for the given property-denoted artifact or {@code null} if no newer
      * version could be found.
@@ -306,10 +296,10 @@ public class PropertyVersions extends AbstractVersionDetails {
                 property.getVersion() != null ? VersionRange.createFromVersionSpec(property.getVersion()) : null;
         helper.getLog().debug("Property ${" + property.getName() + "}: Restricting results to " + range);
 
-        ArtifactVersion currentVersion = DefaultArtifactVersionCache.of(versionString);
+        ArtifactVersion currentVersion = ArtifactVersionService.getArtifactVersion(versionString);
         ArtifactVersion lowerBound = allowDowngrade
                 ? getLowerBound(currentVersion, upperBoundSegment)
-                        .map(DefaultArtifactVersionCache::of)
+                        .map(ArtifactVersionService::getArtifactVersion)
                         .orElse(null)
                 : currentVersion;
         if (helper.getLog().isDebugEnabled()) {
@@ -333,7 +323,8 @@ public class PropertyVersions extends AbstractVersionDetails {
 
         if (property.isSearchReactor()) {
             helper.getLog().debug("Property ${" + property.getName() + "}: Searching reactor for a valid version...");
-            Set<Artifact> reactorArtifacts = helper.extractArtifacts(reactorProjects);
+            Set<Artifact> reactorArtifacts =
+                    reactorProjects.stream().map(MavenProject::getArtifact).collect(Collectors.toSet());
             ArtifactVersion[] reactorVersions = getVersions(reactorArtifacts);
             helper.getLog()
                     .debug("Property ${" + property.getName()
diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/api/PropertyVersionsBuilder.java b/versions-common/src/main/java/org/codehaus/mojo/versions/api/PropertyVersionsBuilder.java
index d591128c..b21b1835 100644
--- a/versions-common/src/main/java/org/codehaus/mojo/versions/api/PropertyVersionsBuilder.java
+++ b/versions-common/src/main/java/org/codehaus/mojo/versions/api/PropertyVersionsBuilder.java
@@ -29,6 +29,7 @@ import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.VersionRange;
 import org.codehaus.mojo.versions.ordering.VersionComparator;
+import org.codehaus.mojo.versions.utils.ArtifactVersionService;
 
 /**
  * Builds {@link org.codehaus.mojo.versions.api.PropertyVersions} instances.
@@ -60,7 +61,7 @@ public class PropertyVersionsBuilder {
      * @param name The property name.
      * @param helper The {@link org.codehaus.mojo.versions.api.DefaultVersionsHelper}.
      */
-    PropertyVersionsBuilder(String profileId, String name, VersionsHelper helper) {
+    PropertyVersionsBuilder(VersionsHelper helper, String profileId, String name) {
         this.profileId = profileId;
         this.name = name;
         this.associations = new TreeSet<>();
@@ -103,7 +104,7 @@ public class PropertyVersionsBuilder {
         ArtifactVersion lowerBound = null;
         boolean includeLower = true;
         for (Map.Entry<String, Boolean> entry : lowerBounds.entrySet()) {
-            ArtifactVersion candidate = helper.createArtifactVersion(entry.getKey());
+            ArtifactVersion candidate = ArtifactVersionService.getArtifactVersion(entry.getKey());
             if (lowerBound == null) {
                 lowerBound = candidate;
                 includeLower = entry.getValue();
@@ -120,7 +121,7 @@ public class PropertyVersionsBuilder {
         ArtifactVersion upperBound = null;
         boolean includeUpper = true;
         for (Map.Entry<String, Boolean> entry : upperBounds.entrySet()) {
-            ArtifactVersion candidate = helper.createArtifactVersion(entry.getKey());
+            ArtifactVersion candidate = ArtifactVersionService.getArtifactVersion(entry.getKey());
             if (upperBound == null) {
                 upperBound = candidate;
                 includeUpper = entry.getValue();
diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/api/VersionsHelper.java b/versions-common/src/main/java/org/codehaus/mojo/versions/api/VersionsHelper.java
index e55f12c0..fd4453b7 100644
--- a/versions-common/src/main/java/org/codehaus/mojo/versions/api/VersionsHelper.java
+++ b/versions-common/src/main/java/org/codehaus/mojo/versions/api/VersionsHelper.java
@@ -19,15 +19,11 @@ package org.codehaus.mojo.versions.api;
  * under the License.
  */
 
-import java.util.Collection;
-import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.stream.Stream;
 
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
-import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.VersionRange;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Plugin;
@@ -70,68 +66,6 @@ public interface VersionsHelper {
      */
     VersionComparator getVersionComparator(String groupId, String artifactId);
 
-    /**
-     * Shorthand method for <code>repositorySystem.createPluginArtifact(...)</code>.
-     *
-     * @param groupId The group Id.
-     * @param artifactId The artifact Id.
-     * @param version The version range.
-     * @return the corresponding plugin artifact.
-     * @since 1.0-alpha-3
-     */
-    Artifact createPluginArtifact(String groupId, String artifactId, String version);
-
-    /**
-     * Shorthand method for <code>repositorySystem.createDependencyArtifact(...)</code>.
-     *
-     * @param groupId The group id.
-     * @param artifactId The artifact id.
-     * @param version The version (possibly a range)
-     * @param type The type.
-     * @param classifier The classifier.
-     * @param scope The scope.
-     * @param optional If optional or not.
-     * @return The corresponding dependency artifact.
-     * @since 1.0-alpha-3
-     */
-    Artifact createDependencyArtifact(
-            String groupId,
-            String artifactId,
-            String version,
-            String type,
-            String classifier,
-            String scope,
-            boolean optional);
-
-    /**
-     * Shorthand method for <code>repositorySystem.createDependencyArtifact(...)</code> which extracts the
-     * parameters from the Dependency instance.
-     *
-     * @param dependency The dependency to create the artifact for.
-     * @return The corresponding dependency artifact.
-     * @since 1.0-alpha-3
-     */
-    Artifact createDependencyArtifact(Dependency dependency);
-
-    /**
-     * Takes a {@link List} of {@link org.apache.maven.project.MavenProject} instances and converts it into a
-     * {@link Set} of {@link Artifact} instances.
-     *
-     * @param mavenProjects the {@link List} of {@link org.apache.maven.project.MavenProject} instances.
-     * @return a {@link Set} of {@link Artifact} instances.
-     * @since 1.0-alpha-3
-     */
-    Set<Artifact> extractArtifacts(Collection<MavenProject> mavenProjects);
-
-    /**
-     * Creates an {@link ArtifactVersion} instance from a string.
-     *
-     * @param version the string representation of the version.
-     * @return The artifact version.
-     * @since 1.0-beta-1
-     */
-    ArtifactVersion createArtifactVersion(String version);
-
     /**
      * Looks up the versions of the specified artifact that are available in either the local repository, or the
      * appropriate remote repositories.
diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/filtering/WildcardMatcher.java b/versions-common/src/main/java/org/codehaus/mojo/versions/filtering/WildcardMatcher.java
index 17b466c2..964a56e2 100644
--- a/versions-common/src/main/java/org/codehaus/mojo/versions/filtering/WildcardMatcher.java
+++ b/versions-common/src/main/java/org/codehaus/mojo/versions/filtering/WildcardMatcher.java
@@ -4,7 +4,7 @@ import java.util.function.Predicate;
 
 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
 import org.apache.maven.artifact.versioning.VersionRange;
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
+import org.codehaus.mojo.versions.utils.ArtifactVersionService;
 
 public class WildcardMatcher implements Predicate<String> {
     public static final String WILDCARD = "*";
@@ -61,7 +61,8 @@ public class WildcardMatcher implements Predicate<String> {
 
     private boolean isVersionIncludedInRange(final String version, final String range) {
         try {
-            return VersionRange.createFromVersionSpec(range).containsVersion(DefaultArtifactVersionCache.of(version));
+            return VersionRange.createFromVersionSpec(range)
+                    .containsVersion(ArtifactVersionService.getArtifactVersion(version));
         } catch (InvalidVersionSpecificationException e) {
             return false;
         }
diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/BoundArtifactVersion.java b/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/BoundArtifactVersion.java
index dbb7ff06..cc555eb1 100644
--- a/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/BoundArtifactVersion.java
+++ b/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/BoundArtifactVersion.java
@@ -23,7 +23,7 @@ import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.codehaus.mojo.versions.api.Segment;
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
+import org.codehaus.mojo.versions.utils.ArtifactVersionService;
 
 /**
  * <p>Represents an <b>immutable</b> artifact version with all segments <em>major</em> to the given segment
@@ -68,7 +68,7 @@ public class BoundArtifactVersion implements ArtifactVersion {
             }
         }
         versionBuilder.append(Integer.MAX_VALUE);
-        comparable = DefaultArtifactVersionCache.of(versionBuilder.toString());
+        comparable = ArtifactVersionService.getArtifactVersion(versionBuilder.toString());
     }
 
     /**
diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/MavenVersionComparator.java b/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/MavenVersionComparator.java
index 923b3891..c01c1b67 100644
--- a/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/MavenVersionComparator.java
+++ b/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/MavenVersionComparator.java
@@ -23,7 +23,8 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.ComparableVersion;
 import org.codehaus.mojo.versions.api.Segment;
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
+
+import static org.codehaus.mojo.versions.utils.ArtifactVersionService.getArtifactVersion;
 
 /**
  * A comparator which uses Maven's version rules, i.e. 1.3.34 &gt; 1.3.9 but 1.3.4.3.2.34 &lt; 1.3.4.3.2.9.
@@ -90,7 +91,7 @@ public class MavenVersionComparator extends AbstractVersionComparator {
         if (innerGetSegmentCount(v) == 1) {
             // only the qualifier
             version = VersionComparators.alphaNumIncrement(version);
-            return DefaultArtifactVersionCache.of(version);
+            return getArtifactVersion(version);
         } else {
             int major = v.getMajorVersion();
             int minor = v.getMinorVersion();
@@ -155,7 +156,7 @@ public class MavenVersionComparator extends AbstractVersionComparator {
                 result.append('-');
                 result.append(build);
             }
-            return DefaultArtifactVersionCache.of(result.toString());
+            return getArtifactVersion(result.toString());
         }
     }
 
diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/MercuryVersionComparator.java b/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/MercuryVersionComparator.java
index b7c526ca..a32d185d 100644
--- a/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/MercuryVersionComparator.java
+++ b/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/MercuryVersionComparator.java
@@ -25,7 +25,8 @@ import java.util.StringTokenizer;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.ComparableVersion;
 import org.codehaus.mojo.versions.api.Segment;
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
+
+import static org.codehaus.mojo.versions.utils.ArtifactVersionService.getArtifactVersion;
 
 /**
  * A comparator which uses Mercury's version rules.
@@ -115,6 +116,6 @@ public class MercuryVersionComparator extends AbstractVersionComparator {
                 index++;
             }
         }
-        return DefaultArtifactVersionCache.of(result.toString());
+        return getArtifactVersion(result.toString());
     }
 }
diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/NumericVersionComparator.java b/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/NumericVersionComparator.java
index dee1194c..f9cd607f 100644
--- a/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/NumericVersionComparator.java
+++ b/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/NumericVersionComparator.java
@@ -24,7 +24,8 @@ import java.util.StringTokenizer;
 
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.codehaus.mojo.versions.api.Segment;
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
+
+import static org.codehaus.mojo.versions.utils.ArtifactVersionService.getArtifactVersion;
 
 /**
  * A comparator which will compare all segments of a dot separated version string as numbers if possible, i.e. 1.3.34
@@ -243,6 +244,6 @@ public class NumericVersionComparator extends AbstractVersionComparator {
             tok.nextToken();
             buf.append("0");
         }
-        return DefaultArtifactVersionCache.of(buf.toString());
+        return getArtifactVersion(buf.toString());
     }
 }
diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/VersionComparators.java b/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/VersionComparators.java
index 63751b90..0f6cc1ad 100644
--- a/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/VersionComparators.java
+++ b/versions-common/src/main/java/org/codehaus/mojo/versions/ordering/VersionComparators.java
@@ -23,7 +23,8 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.apache.maven.artifact.versioning.ArtifactVersion;
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
+
+import static org.codehaus.mojo.versions.utils.ArtifactVersionService.getArtifactVersion;
 
 /**
  * Utility.
@@ -116,7 +117,7 @@ public final class VersionComparators {
         final String version = v.toString();
         final Matcher matcher = SNAPSHOT_PATTERN.matcher(version);
         if (matcher.find()) {
-            return DefaultArtifactVersionCache.of(version.substring(0, matcher.start(1) - 1));
+            return getArtifactVersion(version.substring(0, matcher.start(1) - 1));
         }
         return v;
     }
diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/utils/ArtifactFactory.java b/versions-common/src/main/java/org/codehaus/mojo/versions/utils/ArtifactFactory.java
new file mode 100644
index 00000000..8c56fd0f
--- /dev/null
+++ b/versions-common/src/main/java/org/codehaus/mojo/versions/utils/ArtifactFactory.java
@@ -0,0 +1,81 @@
+package org.codehaus.mojo.versions.utils;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import java.io.File;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.DefaultArtifact;
+import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
+import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
+import org.apache.maven.artifact.versioning.VersionRange;
+import org.apache.maven.model.Dependency;
+
+@Named
+public class ArtifactFactory {
+    private final ArtifactHandlerManager artifactHandlerManager;
+
+    /**
+     * Constructs a new instance
+     * @param artifactHandlerManager {@link ArtifactHandlerManager} instance
+     */
+    @Inject
+    public ArtifactFactory(ArtifactHandlerManager artifactHandlerManager) {
+        this.artifactHandlerManager = artifactHandlerManager;
+    }
+
+    /**
+     * Creates a new {@link Artifact} instance
+     */
+    public Artifact createArtifact(
+            String groupId,
+            String artifactId,
+            String version,
+            String type,
+            String classifier,
+            String scope,
+            boolean optional) {
+        try {
+            return new DefaultArtifact(
+                    groupId,
+                    artifactId,
+                    VersionRange.createFromVersionSpec(StringUtils.isNotBlank(version) ? version : "[0,]"),
+                    scope,
+                    type,
+                    classifier,
+                    artifactHandlerManager.getArtifactHandler(type),
+                    optional);
+        } catch (InvalidVersionSpecificationException e) {
+            // version should have a proper format
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * Creates a new "maven-plugin"-type artifact
+     */
+    public Artifact createMavenPluginArtifact(String groupId, String artifactId, String version) {
+        return createArtifact(groupId, artifactId, version, "maven-plugin", null, "runtime", false);
+    }
+
+    /**
+     * Creates an {@link Artifact} object based on a {@link Dependency} instance
+     */
+    public Artifact createArtifact(Dependency dependency) {
+        Artifact artifact = createArtifact(
+                dependency.getGroupId(),
+                dependency.getArtifactId(),
+                dependency.getVersion(),
+                dependency.getType(),
+                dependency.getClassifier(),
+                dependency.getScope(),
+                false);
+
+        if (Artifact.SCOPE_SYSTEM.equals(dependency.getScope()) && dependency.getSystemPath() != null) {
+            artifact.setFile(new File(dependency.getSystemPath()));
+        }
+        return artifact;
+    }
+}
diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/utils/DefaultArtifactVersionCache.java b/versions-common/src/main/java/org/codehaus/mojo/versions/utils/ArtifactVersionService.java
similarity index 92%
rename from versions-common/src/main/java/org/codehaus/mojo/versions/utils/DefaultArtifactVersionCache.java
rename to versions-common/src/main/java/org/codehaus/mojo/versions/utils/ArtifactVersionService.java
index 1abfc1be..73303ca6 100644
--- a/versions-common/src/main/java/org/codehaus/mojo/versions/utils/DefaultArtifactVersionCache.java
+++ b/versions-common/src/main/java/org/codehaus/mojo/versions/utils/ArtifactVersionService.java
@@ -22,12 +22,13 @@ import java.util.Map;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import org.apache.commons.collections4.map.LRUMap;
+import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
 
 /**
  * Simple cache for {@link org.apache.maven.artifact.versioning.ArtifactVersion}
  */
-public class DefaultArtifactVersionCache {
+public class ArtifactVersionService {
     private static final int MAX_CACHE_SIZE = 512;
     private static final Map<String, DefaultArtifactVersion> CACHE = new LRUMap<>(MAX_CACHE_SIZE);
     private static final ReentrantReadWriteLock CACHE_LOCK = new ReentrantReadWriteLock();
@@ -35,7 +36,7 @@ public class DefaultArtifactVersionCache {
     /**
      * Get a ComparableVersion representing the version in a string.
      */
-    public static DefaultArtifactVersion of(String version) {
+    public static ArtifactVersion getArtifactVersion(String version) {
         try {
             CACHE_LOCK.readLock().lock();
             DefaultArtifactVersion result = CACHE.get(version);
diff --git a/versions-enforcer/src/main/java/org/codehaus/mojo/versions/enforcer/MaxDependencyUpdates.java b/versions-enforcer/src/main/java/org/codehaus/mojo/versions/enforcer/MaxDependencyUpdates.java
index 00bae3b8..bef9330f 100644
--- a/versions-enforcer/src/main/java/org/codehaus/mojo/versions/enforcer/MaxDependencyUpdates.java
+++ b/versions-enforcer/src/main/java/org/codehaus/mojo/versions/enforcer/MaxDependencyUpdates.java
@@ -46,6 +46,7 @@ import org.codehaus.mojo.versions.api.Segment;
 import org.codehaus.mojo.versions.api.VersionRetrievalException;
 import org.codehaus.mojo.versions.api.VersionsHelper;
 import org.codehaus.mojo.versions.model.RuleSet;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.DependencyComparator;
 import org.eclipse.aether.RepositorySystem;
 
@@ -64,6 +65,10 @@ import static org.codehaus.mojo.versions.utils.MavenProjectUtils.extractPluginDe
 
 @Named("maxDependencyUpdates")
 public class MaxDependencyUpdates extends AbstractEnforcerRule {
+    private final ArtifactFactory artifactFactory;
+
+    private final ArtifactHandlerManager artifactHandlerManager;
+
     /**
      * Maximum allowed number of updates.
      *
@@ -257,8 +262,6 @@ public class MaxDependencyUpdates extends AbstractEnforcerRule {
 
     private final MavenProject project;
 
-    private final ArtifactHandlerManager artifactHandlerManager;
-
     private final RepositorySystem repositorySystem;
 
     private final Map<String, Wagon> wagonMap;
@@ -270,12 +273,14 @@ public class MaxDependencyUpdates extends AbstractEnforcerRule {
     @Inject
     public MaxDependencyUpdates(
             MavenProject project,
+            ArtifactFactory artifactFactory,
             ArtifactHandlerManager artifactHandlerManager,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
             MavenSession mavenSession,
             MojoExecution mojoExecution) {
         this.project = project;
+        this.artifactFactory = artifactFactory;
         this.artifactHandlerManager = artifactHandlerManager;
         this.repositorySystem = repositorySystem;
         this.wagonMap = wagonMap;
@@ -291,7 +296,7 @@ public class MaxDependencyUpdates extends AbstractEnforcerRule {
             throws EnforcerRuleError {
         try {
             return new DefaultVersionsHelper.Builder()
-                    .withArtifactHandlerManager(artifactHandlerManager)
+                    .withArtifactFactory(artifactFactory)
                     .withRepositorySystem(repositorySystem)
                     .withWagonMap(wagonMap)
                     .withServerId(serverId)
diff --git a/versions-maven-plugin/pom.xml b/versions-maven-plugin/pom.xml
index f3ee85ae..080c35fd 100644
--- a/versions-maven-plugin/pom.xml
+++ b/versions-maven-plugin/pom.xml
@@ -241,7 +241,7 @@
           <pomExcludes>
             <!--
               ! This test is not really intended as part of regular integration test suite
-              ! as it highly depends on the minute conditions of the build cluster,
+              ! as it highly depends on the state of the build cluster,
               ! internet connection speed (since retrieval times are included in the timeout)
               ! or individual machine where it's being tested.
               ! Not deleting as it might be helpful with assessing performance measurements.
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractDependencyUpdatesReport.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractDependencyUpdatesReport.java
index 5c60bee5..0c5c1132 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractDependencyUpdatesReport.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractDependencyUpdatesReport.java
@@ -29,7 +29,6 @@ import java.util.Set;
 import java.util.TreeSet;
 import java.util.stream.Collectors;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.model.Dependency;
@@ -41,6 +40,7 @@ import org.codehaus.mojo.versions.api.ArtifactVersions;
 import org.codehaus.mojo.versions.api.VersionRetrievalException;
 import org.codehaus.mojo.versions.reporting.ReportRendererFactory;
 import org.codehaus.mojo.versions.reporting.model.DependencyUpdatesModel;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.DependencyComparator;
 import org.codehaus.mojo.versions.utils.MavenProjectUtils;
 import org.codehaus.mojo.versions.xml.DependencyUpdatesXmlReportRenderer;
@@ -113,11 +113,11 @@ public abstract class AbstractDependencyUpdatesReport extends AbstractVersionsRe
 
     protected AbstractDependencyUpdatesReport(
             I18N i18n,
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
             ReportRendererFactory rendererFactory) {
-        super(i18n, artifactHandlerManager, repositorySystem, wagonMap, rendererFactory);
+        super(i18n, artifactFactory, repositorySystem, wagonMap, rendererFactory);
     }
 
     /**
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractPluginUpdatesReport.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractPluginUpdatesReport.java
index eb5abfea..f6f3807f 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractPluginUpdatesReport.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractPluginUpdatesReport.java
@@ -27,7 +27,6 @@ import java.util.Set;
 import java.util.TreeSet;
 import java.util.function.BinaryOperator;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.plugins.annotations.Parameter;
@@ -38,6 +37,7 @@ import org.codehaus.mojo.versions.api.PluginUpdatesDetails;
 import org.codehaus.mojo.versions.api.VersionRetrievalException;
 import org.codehaus.mojo.versions.reporting.ReportRendererFactory;
 import org.codehaus.mojo.versions.reporting.model.PluginUpdatesModel;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.PluginComparator;
 import org.codehaus.mojo.versions.xml.PluginUpdatesXmlReportRenderer;
 import org.codehaus.plexus.i18n.I18N;
@@ -77,11 +77,11 @@ public abstract class AbstractPluginUpdatesReport extends AbstractVersionsReport
 
     protected AbstractPluginUpdatesReport(
             I18N i18n,
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
             ReportRendererFactory rendererFactory) {
-        super(i18n, artifactHandlerManager, repositorySystem, wagonMap, rendererFactory);
+        super(i18n, artifactFactory, repositorySystem, wagonMap, rendererFactory);
     }
 
     /**
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractPropertyUpdatesReport.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractPropertyUpdatesReport.java
index b789683a..91879577 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractPropertyUpdatesReport.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractPropertyUpdatesReport.java
@@ -25,7 +25,6 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.TreeMap;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Parameter;
@@ -37,6 +36,7 @@ import org.codehaus.mojo.versions.api.PropertyVersions;
 import org.codehaus.mojo.versions.api.VersionsHelper.VersionPropertiesMapRequest;
 import org.codehaus.mojo.versions.reporting.ReportRendererFactory;
 import org.codehaus.mojo.versions.reporting.model.PropertyUpdatesModel;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.PropertyComparator;
 import org.codehaus.mojo.versions.xml.PropertyUpdatesXmlReportRenderer;
 import org.codehaus.plexus.i18n.I18N;
@@ -100,11 +100,11 @@ public abstract class AbstractPropertyUpdatesReport extends AbstractVersionsRepo
 
     protected AbstractPropertyUpdatesReport(
             I18N i18n,
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
             ReportRendererFactory rendererFactory) {
-        super(i18n, artifactHandlerManager, repositorySystem, wagonMap, rendererFactory);
+        super(i18n, artifactFactory, repositorySystem, wagonMap, rendererFactory);
     }
 
     /**
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsDependencyUpdaterMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsDependencyUpdaterMojo.java
index b7437870..49e79aaa 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsDependencyUpdaterMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsDependencyUpdaterMojo.java
@@ -28,7 +28,6 @@ import java.util.regex.Pattern;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Parent;
@@ -44,6 +43,7 @@ import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
 import org.codehaus.mojo.versions.api.recording.DependencyChangeRecord;
 import org.codehaus.mojo.versions.recording.DefaultDependencyChangeRecord;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
 import org.codehaus.mojo.versions.utils.DependencyComparator;
 import org.eclipse.aether.RepositorySystem;
@@ -137,11 +137,12 @@ public abstract class AbstractVersionsDependencyUpdaterMojo extends AbstractVers
 
     @Inject
     protected AbstractVersionsDependencyUpdaterMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     /**
@@ -198,13 +199,12 @@ public abstract class AbstractVersionsDependencyUpdaterMojo extends AbstractVers
      * @return Artifact
      * @since 1.0-alpha-3
      */
-    protected Artifact findArtifact(Dependency dependency) {
+    protected Optional<Artifact> findArtifact(Dependency dependency) {
         return Optional.ofNullable(getProject().getDependencyArtifacts())
                 // no mutation, so parallelStream is safe
                 .flatMap(artifacts -> artifacts.parallelStream()
                         .filter(artifact -> compare(artifact, dependency))
-                        .findAny())
-                .orElse(null);
+                        .findAny());
     }
 
     /**
@@ -216,11 +216,7 @@ public abstract class AbstractVersionsDependencyUpdaterMojo extends AbstractVers
      * @since 1.0-alpha-3
      */
     protected Artifact toArtifact(Dependency dependency) throws MojoExecutionException {
-        Artifact artifact = findArtifact(dependency);
-        if (artifact == null) {
-            return getHelper().createDependencyArtifact(dependency);
-        }
-        return artifact;
+        return findArtifact(dependency).orElse(artifactFactory.createArtifact(dependency));
     }
 
     protected Artifact toArtifact(Parent model) throws MojoExecutionException {
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsDisplayMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsDisplayMojo.java
index 29bd5349..d38bbc73 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsDisplayMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsDisplayMojo.java
@@ -30,10 +30,11 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
+import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.wagon.Wagon;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.RepositorySystem;
 
 /**
@@ -91,11 +92,12 @@ public abstract class AbstractVersionsDisplayMojo extends AbstractVersionsUpdate
 
     @Inject
     protected AbstractVersionsDisplayMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @SuppressWarnings("unchecked")
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsReport.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsReport.java
index c2dfebae..59767e6e 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsReport.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsReport.java
@@ -23,7 +23,6 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -35,6 +34,7 @@ import org.codehaus.mojo.versions.api.DefaultVersionsHelper;
 import org.codehaus.mojo.versions.api.VersionsHelper;
 import org.codehaus.mojo.versions.model.RuleSet;
 import org.codehaus.mojo.versions.reporting.ReportRendererFactory;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.plexus.i18n.I18N;
 import org.eclipse.aether.RepositorySystem;
 
@@ -53,8 +53,6 @@ public abstract class AbstractVersionsReport<T> extends AbstractMavenReport {
      */
     protected I18N i18n;
 
-    protected ArtifactHandlerManager artifactHandlerManager;
-
     /**
      * Skip entire check.
      *
@@ -158,16 +156,18 @@ public abstract class AbstractVersionsReport<T> extends AbstractMavenReport {
      */
     protected Map<String, Wagon> wagonMap;
 
+    private final ArtifactFactory artifactFactory;
+
     // --------------------- GETTER / SETTER METHODS ---------------------
 
     protected AbstractVersionsReport(
             I18N i18n,
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
             ReportRendererFactory rendererFactory) {
         this.i18n = i18n;
-        this.artifactHandlerManager = artifactHandlerManager;
+        this.artifactFactory = artifactFactory;
         this.repositorySystem = repositorySystem;
         this.wagonMap = wagonMap;
         this.rendererFactory = rendererFactory;
@@ -177,7 +177,7 @@ public abstract class AbstractVersionsReport<T> extends AbstractMavenReport {
         if (helper == null) {
             try {
                 helper = new DefaultVersionsHelper.Builder()
-                        .withArtifactHandlerManager(artifactHandlerManager)
+                        .withArtifactFactory(artifactFactory)
                         .withRepositorySystem(repositorySystem)
                         .withWagonMap(wagonMap)
                         .withServerId(serverId)
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsUpdaterMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsUpdaterMojo.java
index ed751439..e5497882 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsUpdaterMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsUpdaterMojo.java
@@ -34,7 +34,6 @@ import java.util.Optional;
 import java.util.Set;
 
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
@@ -59,6 +58,7 @@ import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
 import org.codehaus.mojo.versions.model.RuleSet;
 import org.codehaus.mojo.versions.ordering.InvalidSegmentException;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.RepositorySystem;
 
 import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
@@ -70,9 +70,6 @@ import static java.util.Optional.ofNullable;
  * @author Stephen Connolly
  */
 public abstract class AbstractVersionsUpdaterMojo extends AbstractMojo {
-
-    // ------------------------------ FIELDS ------------------------------
-
     /**
      * The Maven Project.
      *
@@ -81,11 +78,6 @@ public abstract class AbstractVersionsUpdaterMojo extends AbstractMojo {
     @Parameter(defaultValue = "${project}", required = true, readonly = true)
     protected MavenProject project;
 
-    /**
-     * The (injected) {@link ArtifactHandlerManager} instance.
-     */
-    protected final ArtifactHandlerManager artifactHandlerManager;
-
     /**
      * The (injected) {@link org.eclipse.aether.RepositorySystem} instance.
      */
@@ -137,7 +129,7 @@ public abstract class AbstractVersionsUpdaterMojo extends AbstractMojo {
     protected MavenSession session;
 
     @Parameter(defaultValue = "${mojoExecution}", required = true, readonly = true)
-    private MojoExecution mojoExecution;
+    protected MojoExecution mojoExecution;
 
     /**
      * The format used to record changes. If "none" is specified, no changes are recorded.
@@ -193,15 +185,18 @@ public abstract class AbstractVersionsUpdaterMojo extends AbstractMojo {
      */
     protected final Map<String, Wagon> wagonMap;
 
+    protected final ArtifactFactory artifactFactory;
+
     // --------------------- GETTER / SETTER METHODS ---------------------
 
     @Inject
     protected AbstractVersionsUpdaterMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        this.artifactHandlerManager = artifactHandlerManager;
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        this.artifactFactory = artifactFactory;
         this.repositorySystem = repositorySystem;
         this.wagonMap = wagonMap;
         this.changeRecorders = changeRecorders;
@@ -212,7 +207,7 @@ public abstract class AbstractVersionsUpdaterMojo extends AbstractMojo {
     public VersionsHelper getHelper() throws MojoExecutionException {
         if (helper == null) {
             helper = new DefaultVersionsHelper.Builder()
-                    .withArtifactHandlerManager(artifactHandlerManager)
+                    .withArtifactFactory(artifactFactory)
                     .withRepositorySystem(repositorySystem)
                     .withWagonMap(wagonMap)
                     .withServerId(serverId)
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/CompareDependenciesMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/CompareDependenciesMojo.java
index 1c13a0bb..47b02c15 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/CompareDependenciesMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/CompareDependenciesMojo.java
@@ -29,7 +29,6 @@ import java.util.Map;
 import java.util.Objects;
 
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -49,6 +48,7 @@ import org.codehaus.mojo.versions.api.VersionsHelper;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
 import org.codehaus.mojo.versions.api.recording.DependencyChangeRecord;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
 import org.eclipse.aether.RepositorySystem;
 
@@ -151,12 +151,13 @@ public class CompareDependenciesMojo extends AbstractVersionsDependencyUpdaterMo
 
     @Inject
     public CompareDependenciesMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
             ProjectBuilder projectBuilder,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
         this.projectBuilder = projectBuilder;
     }
 
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesAggregateReport.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesAggregateReport.java
index ab794ffa..79c258f0 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesAggregateReport.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesAggregateReport.java
@@ -22,7 +22,6 @@ import javax.inject.Inject;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.ResolutionScope;
@@ -30,6 +29,7 @@ import org.apache.maven.project.MavenProject;
 import org.apache.maven.wagon.Wagon;
 import org.codehaus.mojo.versions.reporting.ReportRendererFactory;
 import org.codehaus.mojo.versions.reporting.util.AggregateReportUtils;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.plexus.i18n.I18N;
 import org.eclipse.aether.RepositorySystem;
 
@@ -48,11 +48,11 @@ public class DependencyUpdatesAggregateReport extends AbstractDependencyUpdatesR
     @Inject
     protected DependencyUpdatesAggregateReport(
             I18N i18n,
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
             ReportRendererFactory rendererFactory) {
-        super(i18n, artifactHandlerManager, repositorySystem, wagonMap, rendererFactory);
+        super(i18n, artifactFactory, repositorySystem, wagonMap, rendererFactory);
     }
 
     /**
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesReport.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesReport.java
index bcd4208f..506d67e4 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesReport.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesReport.java
@@ -24,12 +24,12 @@ import javax.inject.Inject;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.apache.maven.wagon.Wagon;
 import org.codehaus.mojo.versions.reporting.ReportRendererFactory;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.plexus.i18n.I18N;
 import org.eclipse.aether.RepositorySystem;
 
@@ -45,11 +45,11 @@ public class DependencyUpdatesReport extends AbstractDependencyUpdatesReport {
     @Inject
     protected DependencyUpdatesReport(
             I18N i18n,
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
             ReportRendererFactory rendererFactory) {
-        super(i18n, artifactHandlerManager, repositorySystem, wagonMap, rendererFactory);
+        super(i18n, artifactFactory, repositorySystem, wagonMap, rendererFactory);
     }
 
     /**
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojo.java
index 9cae6bf8..47d9ea9e 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojo.java
@@ -29,7 +29,6 @@ import java.util.Set;
 import java.util.TreeSet;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -44,6 +43,7 @@ import org.codehaus.mojo.versions.filtering.WildcardMatcher;
 import org.codehaus.mojo.versions.internal.DependencyUpdatesLoggingHelper;
 import org.codehaus.mojo.versions.internal.DependencyUpdatesLoggingHelper.DependencyUpdatesResult;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.DependencyComparator;
 import org.codehaus.mojo.versions.utils.MavenProjectUtils;
 import org.codehaus.mojo.versions.utils.SegmentUtils;
@@ -322,11 +322,12 @@ public class DisplayDependencyUpdatesMojo extends AbstractVersionsDisplayMojo {
 
     @Inject
     public DisplayDependencyUpdatesMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayExtensionUpdatesMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayExtensionUpdatesMojo.java
index eed47bf9..ea8723d9 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayExtensionUpdatesMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayExtensionUpdatesMojo.java
@@ -27,7 +27,6 @@ import java.util.Optional;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Extension;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -43,6 +42,7 @@ import org.codehaus.mojo.versions.filtering.DependencyFilter;
 import org.codehaus.mojo.versions.filtering.WildcardMatcher;
 import org.codehaus.mojo.versions.internal.DependencyUpdatesLoggingHelper;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
 import org.codehaus.mojo.versions.utils.ExtensionUtils;
 import org.codehaus.mojo.versions.utils.SegmentUtils;
@@ -155,11 +155,12 @@ public class DisplayExtensionUpdatesMojo extends AbstractVersionsDisplayMojo {
 
     @Inject
     public DisplayExtensionUpdatesMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayParentUpdatesMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayParentUpdatesMojo.java
index 452c540b..1e653b5d 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayParentUpdatesMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayParentUpdatesMojo.java
@@ -28,7 +28,6 @@ import java.util.Optional;
 import java.util.stream.Collectors;
 
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
 import org.apache.maven.artifact.versioning.VersionRange;
@@ -43,7 +42,8 @@ import org.codehaus.mojo.versions.api.VersionRetrievalException;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
 import org.codehaus.mojo.versions.ordering.InvalidSegmentException;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
+import org.codehaus.mojo.versions.utils.ArtifactVersionService;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
 import org.codehaus.mojo.versions.utils.SegmentUtils;
 import org.eclipse.aether.RepositorySystem;
@@ -143,11 +143,12 @@ public class DisplayParentUpdatesMojo extends AbstractVersionsDisplayMojo {
 
     @Inject
     public DisplayParentUpdatesMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
@@ -176,7 +177,7 @@ public class DisplayParentUpdatesMojo extends AbstractVersionsDisplayMojo {
         ArtifactVersion artifactVersion;
         try {
             artifactVersion = skipResolution
-                    ? DefaultArtifactVersionCache.of(parentVersion)
+                    ? ArtifactVersionService.getArtifactVersion(parentVersion)
                     : resolveTargetVersion(initialVersion);
         } catch (VersionRetrievalException | InvalidVersionSpecificationException | InvalidSegmentException e) {
             throw new MojoExecutionException(e.getMessage(), e);
@@ -223,13 +224,12 @@ public class DisplayParentUpdatesMojo extends AbstractVersionsDisplayMojo {
     protected ArtifactVersion resolveTargetVersion(String initialVersion)
             throws MojoExecutionException, VersionRetrievalException, InvalidVersionSpecificationException,
                     InvalidSegmentException {
-        Artifact artifact = getHelper()
-                .createDependencyArtifact(DependencyBuilder.newBuilder()
-                        .withGroupId(getProject().getParent().getGroupId())
-                        .withArtifactId(getProject().getParent().getArtifactId())
-                        .withVersion(initialVersion)
-                        .withType("pom")
-                        .build());
+        Artifact artifact = artifactFactory.createArtifact(DependencyBuilder.newBuilder()
+                .withGroupId(getProject().getParent().getGroupId())
+                .withArtifactId(getProject().getParent().getArtifactId())
+                .withVersion(initialVersion)
+                .withType("pom")
+                .build());
 
         VersionRange targetVersionRange = VersionRange.createFromVersionSpec(initialVersion);
         if (targetVersionRange.getRecommendedVersion() != null) {
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayPluginUpdatesMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayPluginUpdatesMojo.java
index 06a267ad..7b0625a4 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayPluginUpdatesMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayPluginUpdatesMojo.java
@@ -54,7 +54,6 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.ArtifactUtils;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.lifecycle.LifecycleExecutor;
@@ -88,7 +87,8 @@ import org.codehaus.mojo.versions.api.VersionRetrievalException;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
 import org.codehaus.mojo.versions.ordering.MavenVersionComparator;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
+import org.codehaus.mojo.versions.utils.ArtifactVersionService;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
 import org.codehaus.mojo.versions.utils.ExtensionUtils;
 import org.codehaus.mojo.versions.utils.PluginComparator;
@@ -184,15 +184,16 @@ public class DisplayPluginUpdatesMojo extends AbstractVersionsDisplayMojo {
     @Inject
     @SuppressWarnings("checkstyle:ParameterNumber")
     public DisplayPluginUpdatesMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             ProjectBuilder projectBuilder,
             Map<String, Wagon> wagonMap,
             LifecycleExecutor lifecycleExecutor,
             ModelInterpolator modelInterpolator,
             RuntimeInformation runtimeInformation,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
         this.projectBuilder = projectBuilder;
         this.lifecycleExecutor = lifecycleExecutor;
         this.modelInterpolator = modelInterpolator;
@@ -364,7 +365,8 @@ public class DisplayPluginUpdatesMojo extends AbstractVersionsDisplayMojo {
 
         List<String> pluginUpdates = new ArrayList<>();
         List<String> pluginLockdowns = new ArrayList<>();
-        ArtifactVersion curMavenVersion = DefaultArtifactVersionCache.of(runtimeInformation.getMavenVersion());
+        ArtifactVersion curMavenVersion =
+                ArtifactVersionService.getArtifactVersion(runtimeInformation.getMavenVersion());
         ArtifactVersion specMavenVersion = MinimalMavenBuildVersionFinder.find(getProject(), getLog());
         ArtifactVersion minMavenVersion = null;
         boolean superPomDrivingMinVersion = false;
@@ -452,8 +454,8 @@ public class DisplayPluginUpdatesMojo extends AbstractVersionsDisplayMojo {
                     && artifactVersion != null
                     && newVersion != null
                     && effectiveVersion != null
-                    && DefaultArtifactVersionCache.of(effectiveVersion)
-                                    .compareTo(DefaultArtifactVersionCache.of(newVersion))
+                    && ArtifactVersionService.getArtifactVersion(effectiveVersion)
+                                    .compareTo(ArtifactVersionService.getArtifactVersion(newVersion))
                             < 0) {
                 pluginUpdates.add(pad(
                         compactKey(plugin.getGroupId(), plugin.getArtifactId()),
@@ -564,8 +566,8 @@ public class DisplayPluginUpdatesMojo extends AbstractVersionsDisplayMojo {
             ArtifactVersion curMavenVersion,
             Map<ArtifactVersion, Map<String, String>> mavenUpgrades)
             throws MojoExecutionException, VersionRetrievalException {
-        Artifact artifactRange =
-                getHelper().createPluginArtifact(plugin.getGroupId(), plugin.getArtifactId(), effectiveVersion);
+        Artifact artifactRange = artifactFactory.createMavenPluginArtifact(
+                plugin.getGroupId(), plugin.getArtifactId(), effectiveVersion);
         ArtifactVersion[] newerVersions =
                 getHelper().lookupArtifactVersions(artifactRange, true).getVersions(this.allowSnapshots);
         ArtifactVersion minRequires = null;
@@ -634,14 +636,13 @@ public class DisplayPluginUpdatesMojo extends AbstractVersionsDisplayMojo {
      */
     private MavenProject getPluginProject(String groupId, String artifactId, String version)
             throws MojoExecutionException, ProjectBuildingException, ArtifactResolutionException {
-        Artifact probe = getHelper()
-                .createDependencyArtifact(DependencyBuilder.newBuilder()
-                        .withGroupId(groupId)
-                        .withArtifactId(artifactId)
-                        .withVersion(version)
-                        .withType("pom")
-                        .withScope(Artifact.SCOPE_RUNTIME)
-                        .build());
+        Artifact probe = artifactFactory.createArtifact(DependencyBuilder.newBuilder()
+                .withGroupId(groupId)
+                .withArtifactId(artifactId)
+                .withVersion(version)
+                .withType("pom")
+                .withScope(Artifact.SCOPE_RUNTIME)
+                .build());
         getHelper().resolveArtifact(probe, true);
         ProjectBuildingResult result = projectBuilder.build(
                 probe,
@@ -831,7 +832,7 @@ public class DisplayPluginUpdatesMojo extends AbstractVersionsDisplayMojo {
     private ArtifactVersion getPrerequisitesMavenVersion(MavenProject pluginProject) {
         return ofNullable(pluginProject.getPrerequisites())
                 .map(Prerequisites::getMaven)
-                .map(DefaultArtifactVersionCache::of)
+                .map(ArtifactVersionService::getArtifactVersion)
                 .orElse(null);
     }
 
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayPropertyUpdatesMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayPropertyUpdatesMojo.java
index 72e5fa8c..5c8d5b1d 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayPropertyUpdatesMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayPropertyUpdatesMojo.java
@@ -27,7 +27,6 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.TreeSet;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -43,6 +42,7 @@ import org.codehaus.mojo.versions.api.VersionsHelper;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
 import org.codehaus.mojo.versions.ordering.InvalidSegmentException;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.RepositorySystem;
 
 import static java.util.Optional.empty;
@@ -153,11 +153,12 @@ public class DisplayPropertyUpdatesMojo extends AbstractVersionsDisplayMojo {
 
     @Inject
     public DisplayPropertyUpdatesMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/ForceReleasesMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/ForceReleasesMojo.java
index 153d9e59..c51db0ea 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/ForceReleasesMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/ForceReleasesMojo.java
@@ -24,7 +24,6 @@ import java.util.Map;
 import java.util.regex.Matcher;
 
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.VersionRange;
 import org.apache.maven.model.Dependency;
@@ -40,6 +39,7 @@ import org.codehaus.mojo.versions.api.VersionRetrievalException;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
 import org.codehaus.mojo.versions.api.recording.DependencyChangeRecord;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.RepositorySystem;
 
 import static java.util.Collections.singletonList;
@@ -88,11 +88,12 @@ public class ForceReleasesMojo extends AbstractVersionsDependencyUpdaterMojo {
 
     @Inject
     public ForceReleasesMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/LockSnapshotsMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/LockSnapshotsMojo.java
index fc7e73d6..fa69d503 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/LockSnapshotsMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/LockSnapshotsMojo.java
@@ -31,7 +31,6 @@ import java.util.regex.Pattern;
 
 import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.DependencyManagement;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -41,9 +40,9 @@ import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.wagon.Wagon;
 import org.codehaus.mojo.versions.api.PomHelper;
-import org.codehaus.mojo.versions.api.VersionsHelper;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.resolution.VersionRequest;
 import org.eclipse.aether.resolution.VersionResolutionException;
@@ -96,11 +95,12 @@ public class LockSnapshotsMojo extends AbstractVersionsDependencyUpdaterMojo {
 
     @Inject
     public LockSnapshotsMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
@@ -243,11 +243,9 @@ public class LockSnapshotsMojo extends AbstractVersionsDependencyUpdaterMojo {
      *
      * @param dep dependency for which to retrieve the locked version
      * @return The timestamp version if exists, otherwise {@link Optional#empty()}
-     * @throws MojoExecutionException thrown if retrieval of {@link VersionsHelper} fails
      * @throws VersionResolutionException thrown if version resolution fails
      */
-    private Optional<String> resolveSnapshotVersion(Dependency dep)
-            throws MojoExecutionException, VersionResolutionException {
-        return resolveSnapshotVersion(getHelper().createDependencyArtifact(dep));
+    private Optional<String> resolveSnapshotVersion(Dependency dep) throws VersionResolutionException {
+        return resolveSnapshotVersion(artifactFactory.createArtifact(dep));
     }
 }
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/MinimalMavenBuildVersionFinder.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/MinimalMavenBuildVersionFinder.java
index f7890c9f..67589da6 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/MinimalMavenBuildVersionFinder.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/MinimalMavenBuildVersionFinder.java
@@ -12,7 +12,7 @@ import org.apache.maven.model.PluginExecution;
 import org.apache.maven.model.Prerequisites;
 import org.apache.maven.plugin.logging.Log;
 import org.apache.maven.project.MavenProject;
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
+import org.codehaus.mojo.versions.utils.ArtifactVersionService;
 import org.codehaus.plexus.util.xml.Xpp3Dom;
 
 import static java.util.Optional.ofNullable;
@@ -44,7 +44,7 @@ class MinimalMavenBuildVersionFinder {
                         getEnforcerMavenVersion(mavenProject, log),
                         ofNullable(mavenProject.getPrerequisites())
                                 .map(Prerequisites::getMaven)
-                                .map(DefaultArtifactVersionCache::of)
+                                .map(ArtifactVersionService::getArtifactVersion)
                                 .orElse(null))
                 .orElse(null);
     }
@@ -167,7 +167,7 @@ class MinimalMavenBuildVersionFinder {
         }
 
         if (openIndicesCount == 0) {
-            return DefaultArtifactVersionCache.of(versionRange);
+            return ArtifactVersionService.getArtifactVersion(versionRange);
         }
 
         if (!((versionRange.charAt(0) == '[' || versionRange.charAt(0) == '(')
@@ -186,7 +186,7 @@ class MinimalMavenBuildVersionFinder {
 
         if (commaIndex == -1) {
             if (versionRange.charAt(0) == '[' && versionRange.charAt(versionRange.length() - 1) == ']') {
-                return DefaultArtifactVersionCache.of(innerString);
+                return ArtifactVersionService.getArtifactVersion(innerString);
             } else {
                 return null;
             }
@@ -200,13 +200,13 @@ class MinimalMavenBuildVersionFinder {
             String minimumVersion = innerString.substring(0, innerString.length() - 1);
 
             if (versionRange.charAt(0) == '[' && versionRange.charAt(versionRange.length() - 1) == ')') {
-                return DefaultArtifactVersionCache.of(minimumVersion);
+                return ArtifactVersionService.getArtifactVersion(minimumVersion);
             }
 
             if (versionRange.charAt(0) == '(' && versionRange.charAt(versionRange.length() - 1) == ')') {
                 // this is actually wrong - the Maven version should be higher than this,
                 // the Maven version cannot be equal to this, but the Maven Enforcer plugin should capture this
-                return DefaultArtifactVersionCache.of(minimumVersion);
+                return ArtifactVersionService.getArtifactVersion(minimumVersion);
             }
 
             return null;
@@ -215,13 +215,13 @@ class MinimalMavenBuildVersionFinder {
         String minimumVersion = innerString.substring(0, commaIndex);
 
         if (versionRange.charAt(0) == '[') {
-            return DefaultArtifactVersionCache.of(minimumVersion);
+            return ArtifactVersionService.getArtifactVersion(minimumVersion);
         }
 
         if (versionRange.charAt(0) == '(') {
             // this is actually wrong - the Maven version should be higher than this,
             // the Maven version cannot be equal to this, but the Maven Enforcer plugin should capture this
-            return DefaultArtifactVersionCache.of(minimumVersion);
+            return ArtifactVersionService.getArtifactVersion(minimumVersion);
         }
 
         return null;
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/ParentUpdatesReport.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/ParentUpdatesReport.java
index a09d8974..5be877ac 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/ParentUpdatesReport.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/ParentUpdatesReport.java
@@ -24,7 +24,6 @@ import javax.inject.Inject;
 import java.util.Locale;
 import java.util.Map;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.ResolutionScope;
@@ -34,6 +33,7 @@ import org.codehaus.mojo.versions.api.ArtifactVersions;
 import org.codehaus.mojo.versions.api.VersionRetrievalException;
 import org.codehaus.mojo.versions.reporting.ReportRendererFactory;
 import org.codehaus.mojo.versions.reporting.model.ParentUpdatesModel;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
 import org.codehaus.plexus.i18n.I18N;
 import org.eclipse.aether.RepositorySystem;
@@ -50,11 +50,11 @@ public class ParentUpdatesReport extends AbstractVersionsReport<ParentUpdatesMod
     @Inject
     protected ParentUpdatesReport(
             I18N i18n,
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
             ReportRendererFactory rendererFactory) {
-        super(i18n, artifactHandlerManager, repositorySystem, wagonMap, rendererFactory);
+        super(i18n, artifactFactory, repositorySystem, wagonMap, rendererFactory);
     }
 
     /**
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/PluginUpdatesAggregateReport.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/PluginUpdatesAggregateReport.java
index 745c20ea..4ced219a 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/PluginUpdatesAggregateReport.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/PluginUpdatesAggregateReport.java
@@ -22,7 +22,6 @@ import javax.inject.Inject;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.ResolutionScope;
@@ -30,6 +29,7 @@ import org.apache.maven.project.MavenProject;
 import org.apache.maven.wagon.Wagon;
 import org.codehaus.mojo.versions.reporting.ReportRendererFactory;
 import org.codehaus.mojo.versions.reporting.util.AggregateReportUtils;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.plexus.i18n.I18N;
 import org.eclipse.aether.RepositorySystem;
 
@@ -48,11 +48,11 @@ public class PluginUpdatesAggregateReport extends AbstractPluginUpdatesReport {
     @Inject
     protected PluginUpdatesAggregateReport(
             I18N i18n,
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
             ReportRendererFactory rendererFactory) {
-        super(i18n, artifactHandlerManager, repositorySystem, wagonMap, rendererFactory);
+        super(i18n, artifactFactory, repositorySystem, wagonMap, rendererFactory);
     }
 
     @Override
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/PluginUpdatesReport.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/PluginUpdatesReport.java
index dd0c69f3..25fb6f7a 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/PluginUpdatesReport.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/PluginUpdatesReport.java
@@ -24,12 +24,12 @@ import javax.inject.Inject;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.apache.maven.wagon.Wagon;
 import org.codehaus.mojo.versions.reporting.ReportRendererFactory;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.plexus.i18n.I18N;
 import org.eclipse.aether.RepositorySystem;
 
@@ -45,11 +45,11 @@ public class PluginUpdatesReport extends AbstractPluginUpdatesReport {
     @Inject
     protected PluginUpdatesReport(
             I18N i18n,
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
             ReportRendererFactory rendererFactory) {
-        super(i18n, artifactHandlerManager, repositorySystem, wagonMap, rendererFactory);
+        super(i18n, artifactFactory, repositorySystem, wagonMap, rendererFactory);
     }
 
     /**
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/PropertyUpdatesAggregateReport.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/PropertyUpdatesAggregateReport.java
index 4d482744..bdcae001 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/PropertyUpdatesAggregateReport.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/PropertyUpdatesAggregateReport.java
@@ -21,7 +21,6 @@ import javax.inject.Inject;
 
 import java.util.Map;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.ResolutionScope;
@@ -33,6 +32,7 @@ import org.codehaus.mojo.versions.api.PropertyVersions;
 import org.codehaus.mojo.versions.api.VersionsHelper;
 import org.codehaus.mojo.versions.reporting.ReportRendererFactory;
 import org.codehaus.mojo.versions.reporting.util.AggregateReportUtils;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.plexus.i18n.I18N;
 import org.eclipse.aether.RepositorySystem;
 
@@ -52,11 +52,11 @@ public class PropertyUpdatesAggregateReport extends AbstractPropertyUpdatesRepor
     @Inject
     protected PropertyUpdatesAggregateReport(
             I18N i18n,
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
             ReportRendererFactory rendererFactory) {
-        super(i18n, artifactHandlerManager, repositorySystem, wagonMap, rendererFactory);
+        super(i18n, artifactFactory, repositorySystem, wagonMap, rendererFactory);
     }
 
     /**
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/PropertyUpdatesReport.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/PropertyUpdatesReport.java
index 139963a7..490b17af 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/PropertyUpdatesReport.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/PropertyUpdatesReport.java
@@ -23,7 +23,6 @@ import javax.inject.Inject;
 
 import java.util.Map;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.ResolutionScope;
@@ -32,6 +31,7 @@ import org.apache.maven.wagon.Wagon;
 import org.codehaus.mojo.versions.api.Property;
 import org.codehaus.mojo.versions.api.PropertyVersions;
 import org.codehaus.mojo.versions.reporting.ReportRendererFactory;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.plexus.i18n.I18N;
 import org.eclipse.aether.RepositorySystem;
 
@@ -47,11 +47,11 @@ public class PropertyUpdatesReport extends AbstractPropertyUpdatesReport {
     @Inject
     protected PropertyUpdatesReport(
             I18N i18n,
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
             ReportRendererFactory rendererFactory) {
-        super(i18n, artifactHandlerManager, repositorySystem, wagonMap, rendererFactory);
+        super(i18n, artifactFactory, repositorySystem, wagonMap, rendererFactory);
     }
 
     /**
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/ResolveRangesMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/ResolveRangesMojo.java
index 095045fd..979c27cf 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/ResolveRangesMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/ResolveRangesMojo.java
@@ -31,7 +31,6 @@ import java.util.regex.Pattern;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
 import org.apache.maven.model.Dependency;
@@ -50,6 +49,7 @@ import org.codehaus.mojo.versions.api.VersionsHelper;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
 import org.codehaus.mojo.versions.ordering.InvalidSegmentException;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.RepositorySystem;
 
 import static java.util.Optional.empty;
@@ -164,11 +164,12 @@ public class ResolveRangesMojo extends AbstractVersionsDependencyUpdaterMojo {
 
     @Inject
     public ResolveRangesMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/SetMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/SetMojo.java
index e583cdc2..8de5dc44 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/SetMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/SetMojo.java
@@ -38,7 +38,6 @@ import java.util.regex.Pattern;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.maven.artifact.ArtifactUtils;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.Parent;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -55,6 +54,7 @@ import org.codehaus.mojo.versions.change.VersionChanger;
 import org.codehaus.mojo.versions.change.VersionChangerFactory;
 import org.codehaus.mojo.versions.ordering.ReactorDepthComparator;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.ContextualLog;
 import org.codehaus.mojo.versions.utils.DelegatingContextualLog;
 import org.codehaus.mojo.versions.utils.RegexUtils;
@@ -261,13 +261,14 @@ public class SetMojo extends AbstractVersionsUpdaterMojo {
 
     @Inject
     public SetMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             ProjectBuilder projectBuilder,
             Map<String, Wagon> wagonMap,
             Map<String, ChangeRecorder> changeRecorders,
-            Prompter prompter) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Prompter prompter)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
         this.projectBuilder = projectBuilder;
         this.prompter = prompter;
     }
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/SetPropertyMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/SetPropertyMojo.java
index 732965ef..fa11585f 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/SetPropertyMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/SetPropertyMojo.java
@@ -26,7 +26,6 @@ import java.io.IOException;
 import java.util.Arrays;
 import java.util.Map;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugins.annotations.Mojo;
@@ -38,6 +37,7 @@ import org.codehaus.mojo.versions.api.PropertyVersions;
 import org.codehaus.mojo.versions.api.VersionsHelper;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.PropertiesVersionsFileReader;
 import org.eclipse.aether.RepositorySystem;
 
@@ -104,11 +104,12 @@ public class SetPropertyMojo extends AbstractVersionsUpdaterMojo {
 
     @Inject
     public SetPropertyMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/SetScmTagMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/SetScmTagMojo.java
index 87f76737..31765688 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/SetScmTagMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/SetScmTagMojo.java
@@ -8,7 +8,6 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Scm;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -18,6 +17,7 @@ import org.apache.maven.wagon.Wagon;
 import org.codehaus.mojo.versions.api.PomHelper;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.RepositorySystem;
 
 import static org.apache.commons.lang3.StringUtils.isAllBlank;
@@ -74,11 +74,12 @@ public class SetScmTagMojo extends AbstractVersionsUpdaterMojo {
 
     @Inject
     public SetScmTagMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UnlockSnapshotsMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UnlockSnapshotsMojo.java
index bd06f7e0..a5ced10d 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UnlockSnapshotsMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UnlockSnapshotsMojo.java
@@ -25,7 +25,6 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.DependencyManagement;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -39,6 +38,7 @@ import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
 import org.codehaus.mojo.versions.api.recording.DependencyChangeRecord;
 import org.codehaus.mojo.versions.recording.DefaultDependencyChangeRecord;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.RepositorySystem;
 
 /**
@@ -88,11 +88,12 @@ public class UnlockSnapshotsMojo extends AbstractVersionsDependencyUpdaterMojo {
 
     @Inject
     public UnlockSnapshotsMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UpdateChildModulesMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UpdateChildModulesMojo.java
index dca26032..48d49813 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UpdateChildModulesMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UpdateChildModulesMojo.java
@@ -29,7 +29,6 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.maven.artifact.ArtifactUtils;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.Parent;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -40,6 +39,7 @@ import org.apache.maven.wagon.Wagon;
 import org.codehaus.mojo.versions.api.PomHelper;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.RepositorySystem;
 
 /**
@@ -76,11 +76,12 @@ public class UpdateChildModulesMojo extends AbstractVersionsUpdaterMojo {
 
     @Inject
     public UpdateChildModulesMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UpdateParentMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UpdateParentMojo.java
index 3514486e..0f28e57e 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UpdateParentMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UpdateParentMojo.java
@@ -25,7 +25,6 @@ import java.util.stream.Stream;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
 import org.apache.maven.artifact.versioning.VersionRange;
@@ -43,6 +42,7 @@ import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
 import org.codehaus.mojo.versions.api.recording.DependencyChangeRecord;
 import org.codehaus.mojo.versions.recording.DefaultDependencyChangeRecord;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
 import org.eclipse.aether.RepositorySystem;
 
@@ -143,11 +143,12 @@ public class UpdateParentMojo extends UseLatestVersionsMojoBase {
 
     @Inject
     public UpdateParentMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
@@ -187,7 +188,7 @@ public class UpdateParentMojo extends UseLatestVersionsMojoBase {
 
     @Override
     protected Optional<ArtifactVersion> versionProducer(Stream<ArtifactVersion> stream) {
-        Artifact artifact = helper.createDependencyArtifact(DependencyBuilder.newBuilder()
+        Artifact artifact = artifactFactory.createArtifact(DependencyBuilder.newBuilder()
                 .withGroupId(getProject().getParent().getGroupId())
                 .withArtifactId(getProject().getParent().getArtifactId())
                 .withVersion(getProject().getParent().getVersion())
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UpdatePropertiesMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UpdatePropertiesMojo.java
index 98594e23..457c03d5 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UpdatePropertiesMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UpdatePropertiesMojo.java
@@ -24,7 +24,6 @@ import javax.xml.stream.XMLStreamException;
 
 import java.util.Map;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugins.annotations.Mojo;
@@ -34,6 +33,7 @@ import org.codehaus.mojo.versions.api.Property;
 import org.codehaus.mojo.versions.api.VersionsHelper;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.RepositorySystem;
 
 /**
@@ -94,11 +94,12 @@ public class UpdatePropertiesMojo extends UpdatePropertiesMojoBase {
 
     @Inject
     public UpdatePropertiesMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UpdatePropertiesMojoBase.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UpdatePropertiesMojoBase.java
index 1534f6e9..50b98694 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UpdatePropertiesMojoBase.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UpdatePropertiesMojoBase.java
@@ -20,7 +20,6 @@ import javax.xml.stream.XMLStreamException;
 import java.util.Map;
 import java.util.Optional;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -37,6 +36,7 @@ import org.codehaus.mojo.versions.ordering.InvalidSegmentException;
 import org.codehaus.mojo.versions.recording.DefaultDependencyChangeRecord;
 import org.codehaus.mojo.versions.recording.DefaultPropertyChangeRecord;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.RepositorySystem;
 
 import static java.util.Optional.empty;
@@ -140,11 +140,12 @@ public abstract class UpdatePropertiesMojoBase extends AbstractVersionsDependenc
     private boolean processParent = false;
 
     public UpdatePropertiesMojoBase(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UpdatePropertyMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UpdatePropertyMojo.java
index ddf2e8dd..b27490b2 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UpdatePropertyMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UpdatePropertyMojo.java
@@ -24,7 +24,6 @@ import javax.xml.stream.XMLStreamException;
 
 import java.util.Map;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugins.annotations.Mojo;
@@ -34,6 +33,7 @@ import org.codehaus.mojo.versions.api.Property;
 import org.codehaus.mojo.versions.api.VersionsHelper;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.RepositorySystem;
 
 /**
@@ -97,11 +97,12 @@ public class UpdatePropertyMojo extends UpdatePropertiesMojoBase {
 
     @Inject
     public UpdatePropertyMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseDepVersionMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseDepVersionMojo.java
index 52e8544a..88ff5ec0 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseDepVersionMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseDepVersionMojo.java
@@ -41,7 +41,6 @@ import java.util.stream.Stream;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.ModelBase;
@@ -57,6 +56,7 @@ import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
 import org.codehaus.mojo.versions.api.recording.DependencyChangeRecord.ChangeKind;
 import org.codehaus.mojo.versions.recording.DefaultPropertyChangeRecord;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.DependencyComparator;
 import org.codehaus.mojo.versions.utils.ModelNode;
 import org.eclipse.aether.RepositorySystem;
@@ -160,11 +160,12 @@ public class UseDepVersionMojo extends AbstractVersionsDependencyUpdaterMojo {
 
     @Inject
     public UseDepVersionMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseNextReleasesMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseNextReleasesMojo.java
index 7db052f3..2899469d 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseNextReleasesMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseNextReleasesMojo.java
@@ -22,13 +22,14 @@ import java.util.Optional;
 import java.util.stream.Stream;
 
 import org.apache.maven.artifact.ArtifactUtils;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.model.Dependency;
+import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.wagon.Wagon;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.RepositorySystem;
 
 /**
@@ -76,11 +77,12 @@ public class UseNextReleasesMojo extends UseLatestVersionsMojoBase {
 
     @Inject
     public UseNextReleasesMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseNextSnapshotsMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseNextSnapshotsMojo.java
index fe4c6c3a..ca3272eb 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseNextSnapshotsMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseNextSnapshotsMojo.java
@@ -22,13 +22,14 @@ import java.util.Optional;
 import java.util.stream.Stream;
 
 import org.apache.maven.artifact.ArtifactUtils;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.model.Dependency;
+import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.wagon.Wagon;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.RepositorySystem;
 
 /**
@@ -95,11 +96,12 @@ public class UseNextSnapshotsMojo extends UseLatestVersionsMojoBase {
 
     @Inject
     public UseNextSnapshotsMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseNextVersionsMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseNextVersionsMojo.java
index 68392f7b..7715de93 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseNextVersionsMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseNextVersionsMojo.java
@@ -21,13 +21,14 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.model.Dependency;
+import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.wagon.Wagon;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.RepositorySystem;
 
 /**
@@ -90,11 +91,12 @@ public class UseNextVersionsMojo extends UseLatestVersionsMojoBase {
 
     @Inject
     public UseNextVersionsMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseReactorMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseReactorMojo.java
index b6b18a14..ccd80d6d 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseReactorMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseReactorMojo.java
@@ -28,7 +28,6 @@ import java.util.Map;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.DependencyManagement;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -41,6 +40,7 @@ import org.codehaus.mojo.versions.api.PomHelper;
 import org.codehaus.mojo.versions.api.VersionRetrievalException;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.RepositorySystem;
 
 /**
@@ -108,11 +108,12 @@ public class UseReactorMojo extends AbstractVersionsDependencyUpdaterMojo {
 
     @Inject
     public UseReactorMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     /**
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseReleasesMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseReleasesMojo.java
index 898500da..bad39d39 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseReleasesMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseReleasesMojo.java
@@ -26,7 +26,6 @@ import java.util.Optional;
 import java.util.regex.Matcher;
 
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.DependencyManagement;
@@ -41,6 +40,7 @@ import org.codehaus.mojo.versions.api.VersionRetrievalException;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
 import org.codehaus.mojo.versions.api.recording.DependencyChangeRecord;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.RepositorySystem;
 
 import static java.util.Collections.singletonList;
@@ -122,11 +122,12 @@ public class UseReleasesMojo extends AbstractVersionsDependencyUpdaterMojo {
 
     @Inject
     public UseReleasesMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     /**


Test patch:
diff --git a/versions-common/src/test/java/org/codehaus/mojo/versions/api/DefaultVersionsHelperTest.java b/versions-common/src/test/java/org/codehaus/mojo/versions/api/DefaultVersionsHelperTest.java
index 6cdb592d..d60ead26 100644
--- a/versions-common/src/test/java/org/codehaus/mojo/versions/api/DefaultVersionsHelperTest.java
+++ b/versions-common/src/test/java/org/codehaus/mojo/versions/api/DefaultVersionsHelperTest.java
@@ -51,6 +51,7 @@ import org.codehaus.mojo.versions.model.IgnoreVersion;
 import org.codehaus.mojo.versions.model.Rule;
 import org.codehaus.mojo.versions.model.RuleSet;
 import org.codehaus.mojo.versions.ordering.VersionComparators;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.repository.RemoteRepository;
@@ -61,13 +62,15 @@ import org.eclipse.aether.util.version.GenericVersionScheme;
 import org.eclipse.aether.version.InvalidVersionSpecificationException;
 import org.eclipse.aether.version.Version;
 import org.hamcrest.CoreMatchers;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 
 import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
 import static java.util.Collections.emptyList;
 import static java.util.Collections.singletonList;
 import static java.util.Collections.singletonMap;
-import static org.codehaus.mojo.versions.utils.MockUtils.mockArtifactHandlerManager;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsInAnyOrder;
 import static org.hamcrest.Matchers.equalTo;
@@ -89,6 +92,15 @@ import static org.mockito.Mockito.when;
  * Test {@link DefaultVersionsHelper}
  */
 class DefaultVersionsHelperTest {
+
+    @Mock
+    ArtifactFactory artifactFactory;
+
+    @BeforeEach
+    public void beforeEach() {
+        MockitoAnnotations.openMocks(this);
+    }
+
     @Test
     public void testPerRuleVersionsIgnored() throws Exception {
         final RepositorySystem repositorySystem = mock(org.eclipse.aether.RepositorySystem.class);
@@ -261,6 +273,7 @@ class DefaultVersionsHelperTest {
         when(mavenSession.getRepositorySession()).thenReturn(new DefaultRepositorySystemSession());
 
         return new DefaultVersionsHelper.Builder()
+                .withArtifactFactory(artifactFactory)
                 .withRepositorySystem(repositorySystem)
                 .withWagonMap(singletonMap("file", mockFileWagon(new URI(rulesUri))))
                 .withServerId("")
@@ -274,6 +287,7 @@ class DefaultVersionsHelperTest {
     @Test
     void testIgnoredVersionsShouldBeTheOnlyPresentInAnEmptyRuleSet() throws MojoExecutionException {
         DefaultVersionsHelper versionsHelper = new DefaultVersionsHelper.Builder()
+                .withArtifactFactory(artifactFactory)
                 .withLog(new SystemStreamLog())
                 .withIgnoredVersions(Arrays.asList(".*-M.", ".*-SNAPSHOT"))
                 .build();
@@ -289,6 +303,7 @@ class DefaultVersionsHelperTest {
     @Test
     void testDefaultsShouldBePresentInAnEmptyRuleSet() throws MojoExecutionException, IllegalAccessException {
         DefaultVersionsHelper versionsHelper = new DefaultVersionsHelper.Builder()
+                .withArtifactFactory(artifactFactory)
                 .withLog(new SystemStreamLog())
                 .withIgnoredVersions(singletonList(".*-M."))
                 .build();
@@ -299,6 +314,7 @@ class DefaultVersionsHelperTest {
     @Test
     void testIgnoredVersionsShouldExtendTheRuleSet() throws MojoExecutionException, IllegalAccessException {
         DefaultVersionsHelper versionsHelper = new DefaultVersionsHelper.Builder()
+                .withArtifactFactory(artifactFactory)
                 .withLog(new SystemStreamLog())
                 .withRuleSet(new RuleSet() {
                     {
@@ -379,22 +395,6 @@ class DefaultVersionsHelperTest {
                 equalTo(RepositoryPolicy.UPDATE_POLICY_DAILY));
     }
 
-    @Test
-    void createPluginArtifact() throws Exception {
-
-        DefaultVersionsHelper versionsHelper = new DefaultVersionsHelper.Builder()
-                .withArtifactHandlerManager(mockArtifactHandlerManager())
-                .build();
-
-        Artifact artifact = versionsHelper.createPluginArtifact("groupId", "artifactId", "version");
-        assertEquals("groupId", artifact.getGroupId());
-        assertEquals("artifactId", artifact.getArtifactId());
-        assertEquals("version", artifact.getVersion());
-        assertEquals("maven-plugin", artifact.getType());
-        assertEquals("runtime", artifact.getScope());
-        assertEquals("jar", artifact.getArtifactHandler().getExtension());
-    }
-
     private static Version parseVersion(String version) {
         try {
             return new GenericVersionScheme().parseVersion(version);
diff --git a/versions-common/src/test/java/org/codehaus/mojo/versions/api/PropertyVersionsBuilderTest.java b/versions-common/src/test/java/org/codehaus/mojo/versions/api/PropertyVersionsBuilderTest.java
new file mode 100644
index 00000000..39f4d086
--- /dev/null
+++ b/versions-common/src/test/java/org/codehaus/mojo/versions/api/PropertyVersionsBuilderTest.java
@@ -0,0 +1,52 @@
+package org.codehaus.mojo.versions.api;
+
+import org.apache.maven.artifact.Artifact;
+import org.codehaus.mojo.versions.ordering.MavenVersionComparator;
+import org.codehaus.mojo.versions.ordering.VersionComparator;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.endsWith;
+import static org.hamcrest.Matchers.startsWith;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+public class PropertyVersionsBuilderTest {
+
+    @Mock
+    private VersionsHelper versionsHelper;
+
+    @Mock
+    private Artifact artifact;
+
+    private PropertyVersionsBuilder builder;
+
+    @BeforeEach
+    public void beforeEach() {
+        builder = new PropertyVersionsBuilder(versionsHelper, null, "property").withAssociation(artifact, false);
+        VersionComparator comparator = new MavenVersionComparator();
+        when(versionsHelper.getVersionComparator(any(Artifact.class))).thenReturn(comparator);
+    }
+
+    @ParameterizedTest
+    @ValueSource(booleans = {true, false})
+    public void testGetVersionRangeLowerBound(boolean inclusive) {
+        builder.withLowerBound("3", true).withLowerBound("1", inclusive).withLowerBound("2", false);
+        String versionRange = builder.getVersionRange();
+        assertThat(versionRange, startsWith((inclusive ? '[' : '(') + "1,"));
+    }
+
+    @ParameterizedTest
+    @ValueSource(booleans = {true, false})
+    public void testGetVersionRangeUpperBound(boolean inclusive) {
+        builder.withUpperBound("1", true).withUpperBound("3", inclusive).withUpperBound("2", false);
+        String versionRange = builder.getVersionRange();
+        assertThat(versionRange, endsWith(",3" + (inclusive ? ']' : ')')));
+    }
+}
diff --git a/versions-common/src/test/java/org/codehaus/mojo/versions/ordering/BoundArtifactVersionTest.java b/versions-common/src/test/java/org/codehaus/mojo/versions/ordering/BoundArtifactVersionTest.java
index 0b463733..11233937 100644
--- a/versions-common/src/test/java/org/codehaus/mojo/versions/ordering/BoundArtifactVersionTest.java
+++ b/versions-common/src/test/java/org/codehaus/mojo/versions/ordering/BoundArtifactVersionTest.java
@@ -19,7 +19,7 @@ package org.codehaus.mojo.versions.ordering;
  */
 
 import org.apache.maven.artifact.versioning.ArtifactVersion;
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
+import org.codehaus.mojo.versions.utils.ArtifactVersionService;
 import org.junit.jupiter.api.Test;
 
 import static org.codehaus.mojo.versions.api.Segment.INCREMENTAL;
@@ -37,56 +37,56 @@ class BoundArtifactVersionTest {
     @Test
     void testMajorUpperBoundGreaterThanNextMajor() {
         BoundArtifactVersion bound = new BoundArtifactVersion("1.2.3", MAJOR);
-        ArtifactVersion artifactVersion = DefaultArtifactVersionCache.of("2.0.0");
+        ArtifactVersion artifactVersion = ArtifactVersionService.getArtifactVersion("2.0.0");
         assertThat(bound.compareTo(artifactVersion), greaterThan(0));
     }
 
     @Test
     void testSubIncrementalUpperBoundGreaterThanNextSubIncremental() {
         BoundArtifactVersion bound = new BoundArtifactVersion("1.2.3-2", SUBINCREMENTAL);
-        ArtifactVersion artifactVersion = DefaultArtifactVersionCache.of("1.2.3-3");
+        ArtifactVersion artifactVersion = ArtifactVersionService.getArtifactVersion("1.2.3-3");
         assertThat(bound.compareTo(artifactVersion), greaterThan(0));
     }
 
     @Test
     void testVersionShorterThanSegment() {
         BoundArtifactVersion bound = new BoundArtifactVersion("1.1", INCREMENTAL);
-        ArtifactVersion artifactVersion = DefaultArtifactVersionCache.of("1.1.3");
+        ArtifactVersion artifactVersion = ArtifactVersionService.getArtifactVersion("1.1.3");
         assertThat(bound.compareTo(artifactVersion), greaterThan(0));
     }
 
     @Test
     void testVersionBoundArtifactVersionShorterThanConcreteVersionAndSegment() {
         BoundArtifactVersion bound = new BoundArtifactVersion("1.1", SUBINCREMENTAL);
-        ArtifactVersion artifactVersion = DefaultArtifactVersionCache.of("1.1.3");
+        ArtifactVersion artifactVersion = ArtifactVersionService.getArtifactVersion("1.1.3");
         assertThat(bound.compareTo(artifactVersion), lessThan(0));
     }
 
     @Test
     void testVersionSubIncrementalBoundGreaterThanSubIncremental() {
         BoundArtifactVersion bound = new BoundArtifactVersion("1.1", SUBINCREMENTAL);
-        ArtifactVersion artifactVersion = DefaultArtifactVersionCache.of("1.1.0-2");
+        ArtifactVersion artifactVersion = ArtifactVersionService.getArtifactVersion("1.1.0-2");
         assertThat(bound.compareTo(artifactVersion), greaterThan(0));
     }
 
     @Test
     void testVersionSubIncrementalBoundGreaterThanIncremental() {
         BoundArtifactVersion bound = new BoundArtifactVersion("1.1", INCREMENTAL);
-        ArtifactVersion artifactVersion = DefaultArtifactVersionCache.of("1.1.3");
+        ArtifactVersion artifactVersion = ArtifactVersionService.getArtifactVersion("1.1.3");
         assertThat(bound.compareTo(artifactVersion), greaterThan(0));
     }
 
     @Test
     void testVersionSubIncrementalBoundGreaterThanMinor() {
         BoundArtifactVersion bound = new BoundArtifactVersion("1.1", MINOR);
-        ArtifactVersion artifactVersion = DefaultArtifactVersionCache.of("1.3");
+        ArtifactVersion artifactVersion = ArtifactVersionService.getArtifactVersion("1.3");
         assertThat(bound.compareTo(artifactVersion), greaterThan(0));
     }
 
     @Test
     void testSnapshotWithSubIncremental() {
         BoundArtifactVersion bound = new BoundArtifactVersion("1.0.0-SNAPSHOT", MINOR);
-        ArtifactVersion artifactVersion = DefaultArtifactVersionCache.of("1.0.0");
+        ArtifactVersion artifactVersion = ArtifactVersionService.getArtifactVersion("1.0.0");
         assertThat(bound.compareTo(artifactVersion), greaterThan(0));
     }
 }
diff --git a/versions-common/src/test/java/org/codehaus/mojo/versions/ordering/MercuryVersionComparatorTest.java b/versions-common/src/test/java/org/codehaus/mojo/versions/ordering/MercuryVersionComparatorTest.java
index db1ab45f..1ef5163b 100644
--- a/versions-common/src/test/java/org/codehaus/mojo/versions/ordering/MercuryVersionComparatorTest.java
+++ b/versions-common/src/test/java/org/codehaus/mojo/versions/ordering/MercuryVersionComparatorTest.java
@@ -19,9 +19,9 @@ package org.codehaus.mojo.versions.ordering;
  * under the License.
  */
 
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
 import org.junit.jupiter.api.Test;
 
+import static org.codehaus.mojo.versions.utils.ArtifactVersionService.getArtifactVersion;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 class MercuryVersionComparatorTest extends VersionComparatorTestBase {
@@ -31,11 +31,11 @@ class MercuryVersionComparatorTest extends VersionComparatorTestBase {
 
     @Test
     void testSegmentCounting() {
-        assertEquals(1, instance.getSegmentCount(DefaultArtifactVersionCache.of("5")));
-        assertEquals(2, instance.getSegmentCount(DefaultArtifactVersionCache.of("5.0")));
-        assertEquals(2, instance.getSegmentCount(DefaultArtifactVersionCache.of("5-0")));
-        assertEquals(3, instance.getSegmentCount(DefaultArtifactVersionCache.of("5.3.a")));
-        assertEquals(6, instance.getSegmentCount(DefaultArtifactVersionCache.of("5.0.a.1.4.5")));
-        assertEquals(0, instance.getSegmentCount(DefaultArtifactVersionCache.of("")));
+        assertEquals(1, instance.getSegmentCount(getArtifactVersion("5")));
+        assertEquals(2, instance.getSegmentCount(getArtifactVersion("5.0")));
+        assertEquals(2, instance.getSegmentCount(getArtifactVersion("5-0")));
+        assertEquals(3, instance.getSegmentCount(getArtifactVersion("5.3.a")));
+        assertEquals(6, instance.getSegmentCount(getArtifactVersion("5.0.a.1.4.5")));
+        assertEquals(0, instance.getSegmentCount(getArtifactVersion("")));
     }
 }
diff --git a/versions-common/src/test/java/org/codehaus/mojo/versions/ordering/VersionComparatorTestBase.java b/versions-common/src/test/java/org/codehaus/mojo/versions/ordering/VersionComparatorTestBase.java
index 431651e7..f997e0f4 100644
--- a/versions-common/src/test/java/org/codehaus/mojo/versions/ordering/VersionComparatorTestBase.java
+++ b/versions-common/src/test/java/org/codehaus/mojo/versions/ordering/VersionComparatorTestBase.java
@@ -20,9 +20,9 @@ package org.codehaus.mojo.versions.ordering;
 
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.codehaus.mojo.versions.api.Segment;
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
 import org.junit.jupiter.api.Test;
 
+import static org.codehaus.mojo.versions.utils.ArtifactVersionService.getArtifactVersion;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.greaterThan;
 import static org.hamcrest.Matchers.lessThan;
@@ -39,7 +39,7 @@ abstract class VersionComparatorTestBase {
     }
 
     protected static ArtifactVersion version(String version) {
-        return DefaultArtifactVersionCache.of(version);
+        return getArtifactVersion(version);
     }
 
     @Test
diff --git a/versions-common/src/test/java/org/codehaus/mojo/versions/utils/ArtifactFactoryTest.java b/versions-common/src/test/java/org/codehaus/mojo/versions/utils/ArtifactFactoryTest.java
new file mode 100644
index 00000000..c1dae56e
--- /dev/null
+++ b/versions-common/src/test/java/org/codehaus/mojo/versions/utils/ArtifactFactoryTest.java
@@ -0,0 +1,47 @@
+package org.codehaus.mojo.versions.utils;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.handler.DefaultArtifactHandler;
+import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import static java.util.Optional.of;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalTo;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+public class ArtifactFactoryTest {
+    @Mock
+    ArtifactHandlerManager artifactHandlerManager;
+
+    @BeforeEach
+    public void beforeEach() {
+        when(artifactHandlerManager.getArtifactHandler(any())).thenAnswer(i -> of(i.getArgument(0))
+                .map(type -> new DefaultArtifactHandler(String.valueOf(type)) {
+                    {
+                        if (type.equals("maven-plugin")) {
+                            setExtension("jar");
+                        }
+                    }
+                })
+                .get());
+    }
+
+    @Test
+    void createPluginArtifact() throws Exception {
+        ArtifactFactory artifactFactory = new ArtifactFactory(artifactHandlerManager);
+        Artifact artifact = artifactFactory.createMavenPluginArtifact("groupId", "artifactId", "version");
+        assertThat("groupId", equalTo(artifact.getGroupId()));
+        assertThat("artifactId", equalTo(artifact.getArtifactId()));
+        assertThat("version", equalTo(artifact.getVersion()));
+        assertThat("maven-plugin", equalTo(artifact.getType()));
+        assertThat("runtime", equalTo(artifact.getScope()));
+        assertThat("jar", equalTo(artifact.getArtifactHandler().getExtension()));
+    }
+}
diff --git a/versions-common/src/test/java/org/codehaus/mojo/versions/utils/ArtifactVersionUtils.java b/versions-common/src/test/java/org/codehaus/mojo/versions/utils/ArtifactVersionUtils.java
index ed2da2e9..6c51d9da 100644
--- a/versions-common/src/test/java/org/codehaus/mojo/versions/utils/ArtifactVersionUtils.java
+++ b/versions-common/src/test/java/org/codehaus/mojo/versions/utils/ArtifactVersionUtils.java
@@ -30,7 +30,7 @@ public class ArtifactVersionUtils {
      * @return {@link ArtifactVersion} from the given version string
      */
     public static ArtifactVersion version(String version) {
-        return DefaultArtifactVersionCache.of(version);
+        return ArtifactVersionService.getArtifactVersion(version);
     }
 
     /**
@@ -39,6 +39,8 @@ public class ArtifactVersionUtils {
      * @return array of {@link ArtifactVersion} objects based on the input array of version strings
      */
     public static ArtifactVersion[] versions(String... versions) {
-        return Arrays.stream(versions).map(DefaultArtifactVersionCache::of).toArray(ArtifactVersion[]::new);
+        return Arrays.stream(versions)
+                .map(ArtifactVersionService::getArtifactVersion)
+                .toArray(ArtifactVersion[]::new);
     }
 }
diff --git a/versions-enforcer/src/test/java/org/codehaus/mojo/versions/enforcer/MaxDependencyUpdatesTest.java b/versions-enforcer/src/test/java/org/codehaus/mojo/versions/enforcer/MaxDependencyUpdatesTest.java
index 7d1df6ab..7043b6f8 100644
--- a/versions-enforcer/src/test/java/org/codehaus/mojo/versions/enforcer/MaxDependencyUpdatesTest.java
+++ b/versions-enforcer/src/test/java/org/codehaus/mojo/versions/enforcer/MaxDependencyUpdatesTest.java
@@ -18,20 +18,22 @@ package org.codehaus.mojo.versions.enforcer;
  * under the License.
  */
 
+import java.util.Collections;
 import java.util.HashMap;
 
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.enforcer.rule.api.EnforcerLogger;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
 import org.apache.maven.execution.MavenSession;
+import org.apache.maven.plugin.MojoExecution;
 import org.apache.maven.project.MavenProject;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
 import org.codehaus.mojo.versions.utils.MockUtils;
 import org.eclipse.aether.RepositorySystem;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
@@ -60,13 +62,27 @@ class MaxDependencyUpdatesTest {
     @Mock
     private RepositorySystem repositorySystem;
 
-    private ArtifactHandlerManager artifactHandlerManager = mockArtifactHandlerManager();
+    @Mock
+    private MojoExecution mojoExecution;
+
+    private ArtifactFactory artifactFactory;
+
+    private ArtifactHandlerManager artifactHandlerManager;
 
-    @InjectMocks
     private MaxDependencyUpdates maxDependencyUpdates;
 
     @BeforeEach
     public void setup() {
+        artifactHandlerManager = mockArtifactHandlerManager();
+        artifactFactory = new ArtifactFactory(artifactHandlerManager);
+        maxDependencyUpdates = new MaxDependencyUpdates(
+                project,
+                artifactFactory,
+                artifactHandlerManager,
+                repositorySystem,
+                Collections.emptyMap(),
+                mavenSession,
+                mojoExecution);
         maxDependencyUpdates.setLog(enforcerLogger);
     }
 
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestReleasesMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestReleasesMojo.java
index c3a42cc7..78b0bc11 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestReleasesMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestReleasesMojo.java
@@ -23,13 +23,14 @@ import java.util.Optional;
 import java.util.stream.Stream;
 
 import org.apache.maven.artifact.ArtifactUtils;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.model.Dependency;
+import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.wagon.Wagon;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.RepositorySystem;
 
 /**
@@ -113,11 +114,12 @@ public class UseLatestReleasesMojo extends UseLatestVersionsMojoBase {
 
     @Inject
     public UseLatestReleasesMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestSnapshotsMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestSnapshotsMojo.java
index 51632e06..ac316941 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestSnapshotsMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestSnapshotsMojo.java
@@ -23,13 +23,14 @@ import java.util.Optional;
 import java.util.stream.Stream;
 
 import org.apache.maven.artifact.ArtifactUtils;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.model.Dependency;
+import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.wagon.Wagon;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.RepositorySystem;
 
 /**
@@ -96,11 +97,12 @@ public class UseLatestSnapshotsMojo extends UseLatestVersionsMojoBase {
 
     @Inject
     public UseLatestSnapshotsMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestVersionsMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestVersionsMojo.java
index 6951cb23..f8884d74 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestVersionsMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestVersionsMojo.java
@@ -22,13 +22,14 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.model.Dependency;
+import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.wagon.Wagon;
 import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.eclipse.aether.RepositorySystem;
 
 /**
@@ -117,11 +118,12 @@ public class UseLatestVersionsMojo extends UseLatestVersionsMojoBase {
 
     @Inject
     public UseLatestVersionsMojo(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     @Override
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestVersionsMojoBase.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestVersionsMojoBase.java
index f52e9f71..36eca236 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestVersionsMojoBase.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestVersionsMojoBase.java
@@ -30,7 +30,6 @@ import java.util.concurrent.Executors;
 import java.util.stream.Stream;
 
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.DependencyManagement;
@@ -46,7 +45,8 @@ import org.codehaus.mojo.versions.api.recording.ChangeRecorder;
 import org.codehaus.mojo.versions.api.recording.DependencyChangeRecord;
 import org.codehaus.mojo.versions.ordering.InvalidSegmentException;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
+import org.codehaus.mojo.versions.utils.ArtifactVersionService;
 import org.codehaus.mojo.versions.utils.SegmentUtils;
 import org.eclipse.aether.RepositorySystem;
 
@@ -82,11 +82,12 @@ public abstract class UseLatestVersionsMojoBase extends AbstractVersionsDependen
     private final ExecutorService executor = Executors.newFixedThreadPool(numThreads);
 
     public UseLatestVersionsMojoBase(
-            ArtifactHandlerManager artifactHandlerManager,
+            ArtifactFactory artifactFactory,
             RepositorySystem repositorySystem,
             Map<String, Wagon> wagonMap,
-            Map<String, ChangeRecorder> changeRecorders) {
-        super(artifactHandlerManager, repositorySystem, wagonMap, changeRecorders);
+            Map<String, ChangeRecorder> changeRecorders)
+            throws MojoExecutionException {
+        super(artifactFactory, repositorySystem, wagonMap, changeRecorders);
     }
 
     /**
@@ -230,7 +231,7 @@ public abstract class UseLatestVersionsMojoBase extends AbstractVersionsDependen
                                         return;
                                     } else if (getLog().isDebugEnabled()) {
                                         ArtifactVersion selectedVersion =
-                                                DefaultArtifactVersionCache.of(dep.getVersion());
+                                                ArtifactVersionService.getArtifactVersion(dep.getVersion());
                                         getLog().debug("Selected version:" + selectedVersion);
                                         getLog().debug("Looking for newer versions of " + toString(dep));
                                     }
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/AbstractVersionsUpdaterMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/AbstractVersionsUpdaterMojoTest.java
index 0e68f1c6..4f58abad 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/AbstractVersionsUpdaterMojoTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/AbstractVersionsUpdaterMojoTest.java
@@ -20,7 +20,7 @@ package org.codehaus.mojo.versions;
  */
 
 import org.codehaus.mojo.versions.ordering.NumericVersionComparator;
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
+import org.codehaus.mojo.versions.utils.ArtifactVersionService;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
@@ -36,7 +36,8 @@ public class AbstractVersionsUpdaterMojoTest {
     private NumericVersionComparator instance = new NumericVersionComparator();
 
     private int instanceCompare(String v1, String v2) {
-        return instance.compare(DefaultArtifactVersionCache.of(v1), DefaultArtifactVersionCache.of(v2));
+        return instance.compare(
+                ArtifactVersionService.getArtifactVersion(v1), ArtifactVersionService.getArtifactVersion(v2));
     }
 
     /**
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DependencyUpdatesReportTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DependencyUpdatesReportTest.java
index 84c83e65..52586eaa 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DependencyUpdatesReportTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DependencyUpdatesReportTest.java
@@ -37,6 +37,7 @@ import org.apache.maven.project.MavenProject;
 import org.apache.maven.reporting.MavenReportException;
 import org.codehaus.mojo.versions.model.RuleSet;
 import org.codehaus.mojo.versions.reporting.ReportRendererFactoryImpl;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
 import org.codehaus.mojo.versions.utils.MockUtils;
 import org.codehaus.plexus.i18n.I18N;
@@ -68,7 +69,7 @@ public class DependencyUpdatesReportTest {
         TestDependencyUpdatesReport() {
             super(
                     MOCK_I18N,
-                    mockArtifactHandlerManager(),
+                    new ArtifactFactory(mockArtifactHandlerManager()),
                     mockAetherRepositorySystem(),
                     null,
                     new ReportRendererFactoryImpl(MOCK_I18N));
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DependencyUpdatesXmlRendererTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DependencyUpdatesXmlRendererTest.java
index 22d10f0b..27d67712 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DependencyUpdatesXmlRendererTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DependencyUpdatesXmlRendererTest.java
@@ -28,7 +28,7 @@ import org.apache.maven.artifact.DefaultArtifact;
 import org.codehaus.mojo.versions.api.ArtifactVersions;
 import org.codehaus.mojo.versions.ordering.MavenVersionComparator;
 import org.codehaus.mojo.versions.reporting.model.DependencyUpdatesModel;
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
+import org.codehaus.mojo.versions.utils.ArtifactVersionService;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
 import org.codehaus.mojo.versions.xml.DependencyUpdatesXmlReportRenderer;
 import org.junit.After;
@@ -81,10 +81,10 @@ public class DependencyUpdatesXmlRendererTest {
                                                         "default",
                                                         null),
                                                 Arrays.asList(
-                                                        DefaultArtifactVersionCache.of("1.0.0"),
-                                                        DefaultArtifactVersionCache.of("1.0.1"),
-                                                        DefaultArtifactVersionCache.of("1.1.0"),
-                                                        DefaultArtifactVersionCache.of("2.0.0")),
+                                                        ArtifactVersionService.getArtifactVersion("1.0.0"),
+                                                        ArtifactVersionService.getArtifactVersion("1.0.1"),
+                                                        ArtifactVersionService.getArtifactVersion("1.1.0"),
+                                                        ArtifactVersionService.getArtifactVersion("2.0.0")),
                                                 new MavenVersionComparator())),
                                 emptyMap()),
                         tempFile,
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojoTest.java
index 84791b13..6c3ae95b 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojoTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojoTest.java
@@ -22,6 +22,7 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 
+import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.InputLocation;
 import org.apache.maven.model.InputSource;
 import org.apache.maven.model.Model;
@@ -31,9 +32,11 @@ import org.apache.maven.plugin.testing.MojoRule;
 import org.apache.maven.project.MavenProject;
 import org.codehaus.mojo.versions.filtering.WildcardMatcher;
 import org.codehaus.mojo.versions.model.TestIgnoreVersions;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.CloseableTempFile;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
 import org.hamcrest.Matchers;
+import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
@@ -53,6 +56,7 @@ import static org.hamcrest.Matchers.hasItem;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.not;
 import static org.hamcrest.Matchers.notNullValue;
+import static org.mockito.MockitoAnnotations.openMocks;
 
 /**
  * Basic tests for {@linkplain DisplayDependencyUpdatesMojo}.
@@ -61,6 +65,16 @@ public class DisplayDependencyUpdatesMojoTest extends AbstractMojoTestCase {
     @Rule
     public final MojoRule mojoRule = new MojoRule(this);
 
+    private ArtifactFactory artifactFactory;
+
+    @Before
+    public void setUp() throws Exception {
+        super.setUp();
+        openMocks(this);
+        ArtifactHandlerManager artifactHandlerManager = mockArtifactHandlerManager();
+        artifactFactory = new ArtifactFactory(artifactHandlerManager);
+    }
+
     @Test
     public void testValidateGAVListSuccessful() throws MojoExecutionException {
         DisplayDependencyUpdatesMojo.validateGAVList(
@@ -142,7 +156,7 @@ public class DisplayDependencyUpdatesMojoTest extends AbstractMojoTestCase {
     public void testVersionsWithQualifiersNotConsideredAsMinorUpdates() throws Exception {
         try (CloseableTempFile tempFile = new CloseableTempFile("display-dependency-updates")) {
             new DisplayDependencyUpdatesMojo(
-                    mockArtifactHandlerManager(),
+                    artifactFactory,
                     mockAetherRepositorySystem(new HashMap<String, String[]>() {
                         {
                             put(
@@ -180,7 +194,7 @@ public class DisplayDependencyUpdatesMojoTest extends AbstractMojoTestCase {
     public void testAllowMajorUpdatesFalse() throws Exception {
         try (CloseableTempFile tempFile = new CloseableTempFile("display-dependency-updates")) {
             new DisplayDependencyUpdatesMojo(
-                    mockArtifactHandlerManager(),
+                    artifactFactory,
                     mockAetherRepositorySystem(new HashMap<String, String[]>() {
                         {
                             put("default-dependency", new String[] {"1.0.0", "1.1.0", "2.0.0"});
@@ -213,7 +227,7 @@ public class DisplayDependencyUpdatesMojoTest extends AbstractMojoTestCase {
     public void testAllowMinorUpdatesFalse() throws Exception {
         try (CloseableTempFile tempFile = new CloseableTempFile("display-dependency-updates")) {
             new DisplayDependencyUpdatesMojo(
-                    mockArtifactHandlerManager(),
+                    artifactFactory,
                     mockAetherRepositorySystem(new HashMap<String, String[]>() {
                         {
                             put("default-dependency", new String[] {"1.0.0", "1.0.1", "1.1.0", "2.0.0"});
@@ -247,7 +261,7 @@ public class DisplayDependencyUpdatesMojoTest extends AbstractMojoTestCase {
     public void testAllowIncrementalUpdatesFalse() throws Exception {
         try (CloseableTempFile tempFile = new CloseableTempFile("display-dependency-updates")) {
             new DisplayDependencyUpdatesMojo(
-                    mockArtifactHandlerManager(),
+                    artifactFactory,
                     mockAetherRepositorySystem(new HashMap<String, String[]>() {
                         {
                             put("default-dependency", new String[] {"1.0.0", "1.0.0-1", "1.0.1", "1.1.0", "2.0.0"});
@@ -282,7 +296,7 @@ public class DisplayDependencyUpdatesMojoTest extends AbstractMojoTestCase {
     public void testVersionsWithQualifiersNotConsideredAsIncrementalUpdates() throws Exception {
         try (CloseableTempFile tempFile = new CloseableTempFile("display-dependency-updates")) {
             new DisplayDependencyUpdatesMojo(
-                    mockArtifactHandlerManager(),
+                    artifactFactory,
                     mockAetherRepositorySystem(new HashMap<String, String[]>() {
                         {
                             put(
@@ -381,7 +395,7 @@ public class DisplayDependencyUpdatesMojoTest extends AbstractMojoTestCase {
     public void testAllowSnapshots() throws Exception {
         try (CloseableTempFile tempFile = new CloseableTempFile("display-dependency-updates")) {
             new DisplayDependencyUpdatesMojo(
-                    mockArtifactHandlerManager(),
+                    artifactFactory,
                     mockAetherRepositorySystem(new HashMap<String, String[]>() {
                         {
                             put("default-dependency", new String[] {"2.0.0-SNAPSHOT"});
@@ -412,7 +426,7 @@ public class DisplayDependencyUpdatesMojoTest extends AbstractMojoTestCase {
     private void testAllowUpdatesFromLesserSegments(String availableVersion) throws Exception {
         try (CloseableTempFile tempFile = new CloseableTempFile("display-dependency-updates")) {
             new DisplayDependencyUpdatesMojo(
-                    mockArtifactHandlerManager(),
+                    artifactFactory,
                     mockAetherRepositorySystem(new HashMap<String, String[]>() {
                         {
                             put("default-dependency", new String[] {availableVersion});
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DisplayExtensionUpdatesMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DisplayExtensionUpdatesMojoTest.java
index 17a6bafc..c50c412b 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DisplayExtensionUpdatesMojoTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DisplayExtensionUpdatesMojoTest.java
@@ -22,12 +22,14 @@ import java.nio.file.Path;
 import java.util.Collections;
 import java.util.HashMap;
 
+import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Build;
 import org.apache.maven.model.Model;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.project.MavenProject;
 import org.codehaus.mojo.versions.api.PomHelper;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.ExtensionBuilder;
 import org.junit.After;
 import org.junit.Before;
@@ -47,6 +49,7 @@ import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.empty;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mockStatic;
+import static org.mockito.MockitoAnnotations.openMocks;
 
 /**
  * Basic tests for {@linkplain DisplayExtensionUpdatesMojo}.
@@ -57,9 +60,16 @@ public class DisplayExtensionUpdatesMojoTest {
     private DisplayExtensionUpdatesMojo mojo;
     private Path tempPath;
 
+    private PomHelper pomHelper;
+
+    private ArtifactFactory artifactFactory;
+
     @Before
-    public void setUp() throws IllegalAccessException, IOException {
-        mojo = new DisplayExtensionUpdatesMojo(mockArtifactHandlerManager(), mockAetherRepositorySystem(), null, null);
+    public void setUp() throws IllegalAccessException, IOException, MojoExecutionException {
+        openMocks(this);
+        ArtifactHandlerManager artifactHandlerManager = mockArtifactHandlerManager();
+        artifactFactory = new ArtifactFactory(artifactHandlerManager);
+        mojo = new DisplayExtensionUpdatesMojo(artifactFactory, mockAetherRepositorySystem(), null, null);
         mojo.project = new MavenProject() {
             {
                 setModel(new Model() {
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DisplayParentUpdatesMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DisplayParentUpdatesMojoTest.java
index 5165c50b..29647312 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DisplayParentUpdatesMojoTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DisplayParentUpdatesMojoTest.java
@@ -36,6 +36,7 @@ import org.apache.maven.plugin.testing.stubs.DefaultArtifactHandlerStub;
 import org.apache.maven.project.MavenProject;
 import org.codehaus.mojo.versions.api.VersionRetrievalException;
 import org.codehaus.mojo.versions.ordering.InvalidSegmentException;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.TestUtils;
 import org.eclipse.aether.RepositorySystem;
 import org.junit.After;
@@ -54,6 +55,7 @@ import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.notNullValue;
 import static org.hamcrest.Matchers.nullValue;
 import static org.hamcrest.Matchers.stringContainsInOrder;
+import static org.mockito.MockitoAnnotations.openMocks;
 
 public class DisplayParentUpdatesMojoTest {
     private DisplayParentUpdatesMojo mojo;
@@ -62,6 +64,8 @@ public class DisplayParentUpdatesMojoTest {
 
     private static RepositorySystem repositorySystem;
 
+    private static ArtifactFactory artifactFactory;
+
     private Path tempDir;
 
     private Path tempFile;
@@ -69,6 +73,7 @@ public class DisplayParentUpdatesMojoTest {
     @BeforeClass
     public static void setUpStatic() {
         artifactHandlerManager = mockArtifactHandlerManager();
+        artifactFactory = new ArtifactFactory(artifactHandlerManager);
         repositorySystem = mockAetherRepositorySystem(new HashMap<String, String[]>() {
             {
                 put("parent-artifact", new String[] {"0.9.0", "1.0.0", "1.0.1-SNAPSHOT"});
@@ -81,10 +86,10 @@ public class DisplayParentUpdatesMojoTest {
     }
 
     @Before
-    public void setUp() throws IllegalAccessException, IOException {
+    public void setUp() throws IllegalAccessException, IOException, MojoExecutionException {
         tempDir = TestUtils.createTempDir("display-property-updates");
         tempFile = Files.createTempFile(tempDir, "output", "");
-        mojo = new DisplayParentUpdatesMojo(artifactHandlerManager, repositorySystem, null, null) {
+        mojo = new DisplayParentUpdatesMojo(artifactFactory, repositorySystem, null, null) {
             {
                 setProject(createProject());
                 reactorProjects = Collections.emptyList();
@@ -93,6 +98,7 @@ public class DisplayParentUpdatesMojoTest {
         };
         mojo.outputFile = tempFile.toFile();
         mojo.setPluginContext(new HashMap<>());
+        openMocks(this);
     }
 
     @After
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/ForceReleasesMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/ForceReleasesMojoTest.java
index 72944e7d..3b9bd3b0 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/ForceReleasesMojoTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/ForceReleasesMojoTest.java
@@ -3,6 +3,7 @@ package org.codehaus.mojo.versions;
 import javax.xml.stream.XMLStreamException;
 
 import org.apache.maven.artifact.DefaultArtifact;
+import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Model;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -11,6 +12,7 @@ import org.apache.maven.project.MavenProject;
 import org.codehaus.mojo.versions.api.PomHelper;
 import org.codehaus.mojo.versions.api.VersionRetrievalException;
 import org.codehaus.mojo.versions.change.DefaultDependencyVersionChange;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
 import org.codehaus.mojo.versions.utils.TestChangeRecorder;
 import org.junit.Before;
@@ -30,6 +32,7 @@ import static org.hamcrest.Matchers.startsWith;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.mockStatic;
+import static org.mockito.MockitoAnnotations.openMocks;
 
 /*
  * Copyright MojoHaus and Contributors
@@ -53,11 +56,16 @@ public class ForceReleasesMojoTest extends AbstractMojoTestCase {
     private TestChangeRecorder changeRecorder;
     private ForceReleasesMojo mojo;
 
+    private ArtifactFactory artifactFactory;
+
     @Before
-    public void setUp() throws IllegalAccessException {
+    public void setUp() throws Exception {
+        super.setUp();
+        openMocks(this);
+        ArtifactHandlerManager artifactHandlerManager = mockArtifactHandlerManager();
+        artifactFactory = new ArtifactFactory(artifactHandlerManager);
         changeRecorder = new TestChangeRecorder();
-        mojo = new ForceReleasesMojo(
-                mockArtifactHandlerManager(), mockAetherRepositorySystem(), null, changeRecorder.asTestMap());
+        mojo = new ForceReleasesMojo(artifactFactory, mockAetherRepositorySystem(), null, changeRecorder.asTestMap());
         setVariableValueToObject(mojo, "reactorProjects", emptyList());
         mojo.project = new MavenProject() {
             {
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/LockSnapshotsMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/LockSnapshotsMojoTest.java
index 613713be..4cb7f79b 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/LockSnapshotsMojoTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/LockSnapshotsMojoTest.java
@@ -21,6 +21,7 @@ import java.util.List;
 import java.util.function.UnaryOperator;
 
 import org.apache.maven.artifact.DefaultArtifact;
+import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Model;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -28,17 +29,20 @@ import org.apache.maven.plugin.testing.stubs.DefaultArtifactHandlerStub;
 import org.apache.maven.project.MavenProject;
 import org.codehaus.mojo.versions.api.PomHelper;
 import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
 import org.codehaus.mojo.versions.utils.MockUtils;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.resolution.VersionRequest;
 import org.eclipse.aether.resolution.VersionResolutionException;
 import org.eclipse.aether.resolution.VersionResult;
+import org.junit.Before;
 import org.junit.Test;
 import org.mockito.MockedStatic;
 
 import static java.util.Collections.emptyList;
 import static java.util.Collections.singletonList;
+import static org.codehaus.mojo.versions.utils.MockUtils.mockArtifactHandlerManager;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.mockStatic;
@@ -49,8 +53,16 @@ import static org.mockito.Mockito.when;
  */
 public class LockSnapshotsMojoTest {
 
-    private LockSnapshotsMojo createMojo(RepositorySystem repositorySystem) {
-        return new LockSnapshotsMojo(null, repositorySystem, null, null) {
+    private ArtifactFactory artifactFactory;
+
+    @Before
+    public void setUp() throws MojoExecutionException {
+        ArtifactHandlerManager artifactHandlerManager = mockArtifactHandlerManager();
+        artifactFactory = new ArtifactFactory(artifactHandlerManager);
+    }
+
+    private LockSnapshotsMojo createMojo(RepositorySystem repositorySystem) throws MojoExecutionException {
+        return new LockSnapshotsMojo(artifactFactory, repositorySystem, null, null) {
             {
                 reactorProjects = emptyList();
                 project = new MavenProject(new Model() {
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/MinimalMavenBuildVersionFinderTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/MinimalMavenBuildVersionFinderTest.java
index 036e5868..251df258 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/MinimalMavenBuildVersionFinderTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/MinimalMavenBuildVersionFinderTest.java
@@ -2,8 +2,9 @@ package org.codehaus.mojo.versions;
 
 import java.util.Optional;
 
+import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
+import org.codehaus.mojo.versions.utils.ArtifactVersionService;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
@@ -16,7 +17,7 @@ public class MinimalMavenBuildVersionFinderTest {
 
     @Test
     public void testValidVersionRanges() {
-        DefaultArtifactVersion expectedMinimumVersion = DefaultArtifactVersionCache.of("1.0");
+        ArtifactVersion expectedMinimumVersion = ArtifactVersionService.getArtifactVersion("1.0");
         assertEquals(expectedMinimumVersion, MinimalMavenBuildVersionFinder.getMinimumVersionFromRange("1.0"));
         assertEquals(expectedMinimumVersion, MinimalMavenBuildVersionFinder.getMinimumVersionFromRange("[1.0]"));
         assertEquals(expectedMinimumVersion, MinimalMavenBuildVersionFinder.getMinimumVersionFromRange("[1.0,)"));
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/ParentUpdatesReportTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/ParentUpdatesReportTest.java
index d06454d3..5d66919a 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/ParentUpdatesReportTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/ParentUpdatesReportTest.java
@@ -35,16 +35,17 @@ import org.apache.maven.plugin.testing.stubs.DefaultArtifactHandlerStub;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.reporting.MavenReportException;
 import org.codehaus.mojo.versions.reporting.ReportRendererFactoryImpl;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.plexus.i18n.I18N;
 import org.junit.Test;
 
 import static org.codehaus.mojo.versions.utils.MockUtils.mockAetherRepositorySystem;
-import static org.codehaus.mojo.versions.utils.MockUtils.mockArtifactHandlerManager;
 import static org.codehaus.mojo.versions.utils.MockUtils.mockI18N;
 import static org.codehaus.mojo.versions.utils.MockUtils.mockMavenSession;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.allOf;
+import static org.mockito.Mockito.mock;
 
 /**
  * Basic tests for {@linkplain ParentUpdatesReport}.
@@ -60,7 +61,7 @@ public class ParentUpdatesReportTest {
         SinkFactory sinkFactory = new Xhtml5SinkFactory();
         new ParentUpdatesReport(
                 MOCK_I18N,
-                mockArtifactHandlerManager(),
+                mock(ArtifactFactory.class),
                 mockAetherRepositorySystem(new HashMap<String, String[]>() {
                     {
                         put("default-artifact", new String[] {"1.0.0", "1.0.1", "1.1.0", "2.0.0", "2.0.1-SNAPSHOT"});
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/PluginUpdatesReportTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/PluginUpdatesReportTest.java
index e5597238..943ae768 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/PluginUpdatesReportTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/PluginUpdatesReportTest.java
@@ -37,6 +37,7 @@ import org.apache.maven.project.MavenProject;
 import org.apache.maven.reporting.MavenReportException;
 import org.codehaus.mojo.versions.model.RuleSet;
 import org.codehaus.mojo.versions.reporting.ReportRendererFactoryImpl;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.MockUtils;
 import org.codehaus.plexus.i18n.I18N;
 import org.eclipse.aether.RepositorySystem;
@@ -64,7 +65,7 @@ public class PluginUpdatesReportTest {
         TestPluginUpdatesReport() {
             super(
                     MOCK_I18N,
-                    mockArtifactHandlerManager(),
+                    new ArtifactFactory(mockArtifactHandlerManager()),
                     mockAetherRepositorySystem(),
                     null,
                     new ReportRendererFactoryImpl(MOCK_I18N));
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/PluginUpdatesXmlRendererTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/PluginUpdatesXmlRendererTest.java
index 96d496a7..9ada3928 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/PluginUpdatesXmlRendererTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/PluginUpdatesXmlRendererTest.java
@@ -31,7 +31,7 @@ import org.codehaus.mojo.versions.api.ArtifactVersions;
 import org.codehaus.mojo.versions.api.PluginUpdatesDetails;
 import org.codehaus.mojo.versions.ordering.MavenVersionComparator;
 import org.codehaus.mojo.versions.reporting.model.PluginUpdatesModel;
-import org.codehaus.mojo.versions.utils.DefaultArtifactVersionCache;
+import org.codehaus.mojo.versions.utils.ArtifactVersionService;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
 import org.codehaus.mojo.versions.xml.DependencyUpdatesXmlReportRenderer;
 import org.codehaus.mojo.versions.xml.PluginUpdatesXmlReportRenderer;
@@ -74,7 +74,7 @@ public class PluginUpdatesXmlRendererTest {
                                 new ArtifactVersions(
                                         artifactOf("default-group", "artifactA", "1.0.0"),
                                         Stream.of("1.0.0", "1.0.1", "1.1.0", "2.0.0")
-                                                .map(DefaultArtifactVersionCache::of)
+                                                .map(ArtifactVersionService::getArtifactVersion)
                                                 .collect(Collectors.toList()),
                                         new MavenVersionComparator()),
                                 singletonMap(
@@ -86,7 +86,7 @@ public class PluginUpdatesXmlRendererTest {
                                         new ArtifactVersions(
                                                 artifactOf("default-group", "artifactB", "1.0.0"),
                                                 Stream.of("1.0.0", "1.0.1-SNAPSHOT", "1.1.0-rc1", "2.0.0")
-                                                        .map(DefaultArtifactVersionCache::of)
+                                                        .map(ArtifactVersionService::getArtifactVersion)
                                                         .collect(Collectors.toList()),
                                                 new MavenVersionComparator())),
                                 false)),
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/SetMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/SetMojoTest.java
index 73038277..301279f1 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/SetMojoTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/SetMojoTest.java
@@ -10,12 +10,14 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.apache.commons.lang3.tuple.Triple;
+import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Model;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugin.testing.AbstractMojoTestCase;
 import org.apache.maven.plugin.testing.MojoRule;
 import org.apache.maven.project.MavenProject;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.TestLog;
 import org.codehaus.mojo.versions.utils.TestUtils;
 import org.junit.After;
@@ -24,12 +26,14 @@ import org.junit.Rule;
 import org.junit.Test;
 
 import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
+import static org.codehaus.mojo.versions.utils.MockUtils.mockArtifactHandlerManager;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.matchesPattern;
 import static org.hamcrest.Matchers.matchesRegex;
 import static org.hamcrest.Matchers.not;
+import static org.mockito.MockitoAnnotations.openMocks;
 
 public class SetMojoTest extends AbstractMojoTestCase {
     @Rule
@@ -37,10 +41,15 @@ public class SetMojoTest extends AbstractMojoTestCase {
 
     private Path tempDir;
 
+    protected ArtifactFactory artifactFactory;
+
     @Before
     public void setUp() throws Exception {
         super.setUp();
+        openMocks(this);
         tempDir = TestUtils.createTempDir("set");
+        ArtifactHandlerManager artifactHandlerManager = mockArtifactHandlerManager();
+        artifactFactory = new ArtifactFactory(artifactHandlerManager);
     }
 
     @After
@@ -65,8 +74,8 @@ public class SetMojoTest extends AbstractMojoTestCase {
     }
 
     @Test
-    public void testNextSnapshotIndexLowerBound() {
-        new SetMojo(null, null, null, null, null, null) {
+    public void testNextSnapshotIndexLowerBound() throws MojoExecutionException {
+        new SetMojo(artifactFactory, null, null, null, null, null) {
             {
                 try {
                     getIncrementedVersion("1.0.0", 0);
@@ -79,8 +88,8 @@ public class SetMojoTest extends AbstractMojoTestCase {
     }
 
     @Test
-    public void testNextSnapshotIndexUpperBound() {
-        new SetMojo(null, null, null, null, null, null) {
+    public void testNextSnapshotIndexUpperBound() throws MojoExecutionException {
+        new SetMojo(artifactFactory, null, null, null, null, null) {
             {
                 try {
                     getIncrementedVersion("1.0.0", 4);
@@ -98,7 +107,7 @@ public class SetMojoTest extends AbstractMojoTestCase {
     @Test
     public void testNextSnapshotIndexWithoutNextSnapshot() throws MojoFailureException {
         try {
-            new SetMojo(null, null, null, null, null, null) {
+            new SetMojo(artifactFactory, null, null, null, null, null) {
                 {
                     project = new MavenProject();
                     project.setParent(new MavenProject());
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UpdateParentMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UpdateParentMojoTest.java
index 780bdb19..55f2d5ba 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UpdateParentMojoTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UpdateParentMojoTest.java
@@ -33,9 +33,7 @@ import org.apache.maven.project.MavenProject;
 import org.codehaus.mojo.versions.api.VersionRetrievalException;
 import org.codehaus.mojo.versions.change.DefaultDependencyVersionChange;
 import org.codehaus.mojo.versions.ordering.InvalidSegmentException;
-import org.codehaus.mojo.versions.utils.TestChangeRecorder;
 import org.eclipse.aether.RepositorySystem;
-import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -52,8 +50,6 @@ import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.nullValue;
 
 public class UpdateParentMojoTest extends UseLatestVersionsMojoTestBase {
-    private TestChangeRecorder changeRecorder;
-
     private static ArtifactHandlerManager artifactHandlerManager;
 
     private static RepositorySystem repositorySystem;
@@ -73,11 +69,9 @@ public class UpdateParentMojoTest extends UseLatestVersionsMojoTestBase {
         });
     }
 
-    @Before
-    public void setUp() throws IllegalAccessException {
-        changeRecorder = new TestChangeRecorder();
-
-        mojo = new UpdateParentMojo(artifactHandlerManager, repositorySystem, null, changeRecorder.asTestMap()) {
+    @Override
+    protected UseLatestVersionsMojoBase createMojo() throws IllegalAccessException, MojoExecutionException {
+        return new UpdateParentMojo(artifactFactory, repositorySystem, null, changeRecorder.asTestMap()) {
             {
                 setProject(createProject());
                 reactorProjects = Collections.emptyList();
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestReleasesMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestReleasesMojoTest.java
index a58453d0..dfc2340e 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestReleasesMojoTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestReleasesMojoTest.java
@@ -20,6 +20,7 @@ import javax.xml.stream.XMLStreamException;
 import java.util.HashMap;
 
 import org.apache.maven.model.Model;
+import org.apache.maven.plugin.MojoExecution;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.project.MavenProject;
@@ -27,7 +28,6 @@ import org.codehaus.mojo.versions.api.VersionRetrievalException;
 import org.codehaus.mojo.versions.change.DefaultDependencyVersionChange;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
 import org.hamcrest.Matchers;
-import org.junit.Before;
 import org.junit.Test;
 
 import static java.util.Collections.emptyList;
@@ -35,47 +35,46 @@ import static java.util.Collections.singletonList;
 import static org.apache.maven.artifact.Artifact.SCOPE_COMPILE;
 import static org.apache.maven.plugin.testing.ArtifactStubFactory.setVariableValueToObject;
 import static org.codehaus.mojo.versions.utils.MockUtils.mockAetherRepositorySystem;
-import static org.codehaus.mojo.versions.utils.MockUtils.mockArtifactHandlerManager;
 import static org.codehaus.mojo.versions.utils.MockUtils.mockMavenSession;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.empty;
 import static org.hamcrest.Matchers.hasItem;
+import static org.mockito.Mockito.mock;
 
 public class UseLatestReleasesMojoTest extends UseLatestVersionsMojoTestBase {
 
-    @Before
-    public void setUp() throws Exception {
-        changeRecorder = createChangeRecorder();
-        mojo =
-                new UseLatestReleasesMojo(
-                        mockArtifactHandlerManager(), createRepositorySystem(), null, changeRecorder.asTestMap()) {
+    @Override
+    protected UseLatestReleasesMojo createMojo() throws IllegalAccessException, MojoExecutionException {
+        return new UseLatestReleasesMojo(artifactFactory, createRepositorySystem(), null, changeRecorder.asTestMap()) {
+            {
+                reactorProjects = emptyList();
+                mojoExecution = mock(MojoExecution.class);
+                MavenProject project = new MavenProject() {
                     {
-                        reactorProjects = emptyList();
-                        MavenProject project = new MavenProject() {
+                        setModel(new Model() {
                             {
-                                setModel(new Model() {
-                                    {
-                                        setGroupId("default-group");
-                                        setArtifactId("project-artifact");
-                                        setVersion("1.0.0-SNAPSHOT");
+                                setGroupId("default-group");
+                                setArtifactId("project-artifact");
+                                setVersion("1.0.0-SNAPSHOT");
 
-                                        setDependencies(singletonList(DependencyBuilder.newBuilder()
-                                                .withGroupId("default-group")
-                                                .withArtifactId("dependency-artifact")
-                                                .withVersion("0.9.0")
-                                                .withScope(SCOPE_COMPILE)
-                                                .withType("jar")
-                                                .withClassifier("default")
-                                                .build()));
-                                    }
-                                });
+                                setDependencies(singletonList(DependencyBuilder.newBuilder()
+                                        .withGroupId("default-group")
+                                        .withArtifactId("dependency-artifact")
+                                        .withVersion("0.9.0")
+                                        .withScope(SCOPE_COMPILE)
+                                        .withType("jar")
+                                        .withClassifier("default")
+                                        .build()));
                             }
-                        };
-                        setProject(project);
-
-                        session = mockMavenSession();
+                        });
                     }
                 };
+                setProject(project);
+
+                session = mockMavenSession();
+                setVariableValueToObject(this, "processDependencyManagement", false);
+            }
+        };
     }
 
     @Test
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestSnapshotsMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestSnapshotsMojoTest.java
index 9e84b122..c0ef87a5 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestSnapshotsMojoTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestSnapshotsMojoTest.java
@@ -8,52 +8,49 @@ import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.project.MavenProject;
 import org.codehaus.mojo.versions.api.VersionRetrievalException;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
-import org.junit.Before;
 import org.junit.Test;
 
 import static java.util.Collections.emptyList;
 import static java.util.Collections.singletonList;
 import static org.apache.maven.artifact.Artifact.SCOPE_COMPILE;
-import static org.codehaus.mojo.versions.utils.MockUtils.mockArtifactHandlerManager;
+import static org.apache.maven.plugin.testing.ArtifactStubFactory.setVariableValueToObject;
 import static org.codehaus.mojo.versions.utils.MockUtils.mockMavenSession;
 
 public class UseLatestSnapshotsMojoTest extends UseLatestVersionsMojoTestBase {
-    @Before
-    public void setUp() throws Exception {
-        changeRecorder = createChangeRecorder();
-        mojo =
-                new UseLatestSnapshotsMojo(
-                        mockArtifactHandlerManager(), createRepositorySystem(), null, changeRecorder.asTestMap()) {
+    @Override
+    protected UseLatestVersionsMojoBase createMojo() throws IllegalAccessException, MojoExecutionException {
+        return new UseLatestSnapshotsMojo(artifactFactory, createRepositorySystem(), null, changeRecorder.asTestMap()) {
+            {
+                reactorProjects = emptyList();
+                MavenProject project = new MavenProject() {
                     {
-                        reactorProjects = emptyList();
-                        MavenProject project = new MavenProject() {
+                        setModel(new Model() {
                             {
-                                setModel(new Model() {
-                                    {
-                                        setGroupId("default-group");
-                                        setArtifactId("project-artifact");
-                                        setVersion("1.0.0-SNAPSHOT");
+                                setGroupId("default-group");
+                                setArtifactId("project-artifact");
+                                setVersion("1.0.0-SNAPSHOT");
 
-                                        setDependencies(singletonList(DependencyBuilder.newBuilder()
-                                                .withGroupId("default-group")
-                                                .withArtifactId("dependency-artifact")
-                                                .withVersion("0.9.0")
-                                                .withScope(SCOPE_COMPILE)
-                                                .withType("jar")
-                                                .withClassifier("default")
-                                                .build()));
-                                    }
-                                });
+                                setDependencies(singletonList(DependencyBuilder.newBuilder()
+                                        .withGroupId("default-group")
+                                        .withArtifactId("dependency-artifact")
+                                        .withVersion("0.9.0")
+                                        .withScope(SCOPE_COMPILE)
+                                        .withType("jar")
+                                        .withClassifier("default")
+                                        .build()));
                             }
-                        };
-                        setProject(project);
-
-                        session = mockMavenSession();
-                        allowMajorUpdates = true;
-                        allowMinorUpdates = true;
-                        allowIncrementalUpdates = true;
+                        });
                     }
                 };
+                setProject(project);
+
+                session = mockMavenSession();
+                allowMajorUpdates = true;
+                allowMinorUpdates = true;
+                allowIncrementalUpdates = true;
+                setVariableValueToObject(this, "processDependencyManagement", false);
+            }
+        };
     }
 
     @Test
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestVersionsMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestVersionsMojoTest.java
index 8e30e208..7a852574 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestVersionsMojoTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestVersionsMojoTest.java
@@ -29,36 +29,42 @@ import org.apache.maven.project.MavenProject;
 import org.codehaus.mojo.versions.api.VersionRetrievalException;
 import org.codehaus.mojo.versions.change.DefaultDependencyVersionChange;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
-import org.junit.Before;
 import org.junit.Test;
 
 import static java.util.Collections.emptyList;
 import static org.apache.maven.artifact.Artifact.SCOPE_COMPILE;
 import static org.apache.maven.plugin.testing.ArtifactStubFactory.setVariableValueToObject;
-import static org.codehaus.mojo.versions.utils.MockUtils.mockArtifactHandlerManager;
 import static org.codehaus.mojo.versions.utils.MockUtils.mockMavenSession;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.hasItem;
 
 public class UseLatestVersionsMojoTest extends UseLatestVersionsMojoTestBase {
 
-    @Before
-    public void setUp() throws Exception {
-        changeRecorder = createChangeRecorder();
-        mojo =
-                new UseLatestVersionsMojo(
-                        mockArtifactHandlerManager(), createRepositorySystem(), null, changeRecorder.asTestMap()) {
+    @Override
+    protected UseLatestVersionsMojoBase createMojo() throws IllegalAccessException, MojoExecutionException {
+        return new UseLatestVersionsMojo(artifactFactory, createRepositorySystem(), null, changeRecorder.asTestMap()) {
+            {
+                reactorProjects = emptyList();
+                MavenProject project = new MavenProject() {
                     {
-                        reactorProjects = emptyList();
-                        MavenProject project = new MavenProject() {
+                        setModel(new Model() {
                             {
-                                setModel(new Model() {
-                                    {
-                                        setGroupId("default-group");
-                                        setArtifactId("project-artifact");
-                                        setVersion("1.0.0-SNAPSHOT");
-
-                                        setDependencies(Collections.singletonList(DependencyBuilder.newBuilder()
+                                setGroupId("default-group");
+                                setArtifactId("project-artifact");
+                                setVersion("1.0.0-SNAPSHOT");
+
+                                setDependencies(Collections.singletonList(DependencyBuilder.newBuilder()
+                                        .withGroupId("default-group")
+                                        .withArtifactId("dependency-artifact")
+                                        .withVersion("1.1.1-SNAPSHOT")
+                                        .withType("pom")
+                                        .withClassifier("default")
+                                        .withScope(SCOPE_COMPILE)
+                                        .build()));
+
+                                setDependencyManagement(new DependencyManagement());
+                                getDependencyManagement()
+                                        .setDependencies(Collections.singletonList(DependencyBuilder.newBuilder()
                                                 .withGroupId("default-group")
                                                 .withArtifactId("dependency-artifact")
                                                 .withVersion("1.1.1-SNAPSHOT")
@@ -66,28 +72,16 @@ public class UseLatestVersionsMojoTest extends UseLatestVersionsMojoTestBase {
                                                 .withClassifier("default")
                                                 .withScope(SCOPE_COMPILE)
                                                 .build()));
-
-                                        setDependencyManagement(new DependencyManagement());
-                                        getDependencyManagement()
-                                                .setDependencies(
-                                                        Collections.singletonList(DependencyBuilder.newBuilder()
-                                                                .withGroupId("default-group")
-                                                                .withArtifactId("dependency-artifact")
-                                                                .withVersion("1.1.1-SNAPSHOT")
-                                                                .withType("pom")
-                                                                .withClassifier("default")
-                                                                .withScope(SCOPE_COMPILE)
-                                                                .build()));
-                                    }
-                                });
                             }
-                        };
-                        setProject(project);
-
-                        session = mockMavenSession();
+                        });
                     }
                 };
-        setVariableValueToObject(mojo, "processDependencyManagement", false);
+                setProject(project);
+
+                session = mockMavenSession();
+                setVariableValueToObject(this, "processDependencyManagement", false);
+            }
+        };
     }
 
     @Test
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestVersionsMojoTestBase.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestVersionsMojoTestBase.java
index ac43a641..98fe354b 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestVersionsMojoTestBase.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestVersionsMojoTestBase.java
@@ -6,22 +6,26 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 
+import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.project.MavenProject;
 import org.codehaus.mojo.versions.api.PomHelper;
 import org.codehaus.mojo.versions.api.VersionRetrievalException;
 import org.codehaus.mojo.versions.change.DefaultDependencyVersionChange;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
 import org.codehaus.mojo.versions.utils.TestChangeRecorder;
 import org.eclipse.aether.RepositorySystem;
 import org.hamcrest.core.Is;
+import org.junit.Before;
 import org.junit.Test;
 import org.mockito.MockedStatic;
 
 import static org.apache.maven.artifact.Artifact.SCOPE_COMPILE;
 import static org.apache.maven.plugin.testing.ArtifactStubFactory.setVariableValueToObject;
 import static org.codehaus.mojo.versions.utils.MockUtils.mockAetherRepositorySystem;
+import static org.codehaus.mojo.versions.utils.MockUtils.mockArtifactHandlerManager;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.empty;
 import static org.hamcrest.Matchers.hasItem;
@@ -36,6 +40,18 @@ public abstract class UseLatestVersionsMojoTestBase {
 
     protected TestChangeRecorder changeRecorder;
 
+    protected ArtifactFactory artifactFactory;
+
+    protected abstract UseLatestVersionsMojoBase createMojo() throws IllegalAccessException, MojoExecutionException;
+
+    @Before
+    public void setUp() throws Exception {
+        changeRecorder = new TestChangeRecorder();
+        ArtifactHandlerManager artifactHandlerManager = mockArtifactHandlerManager();
+        artifactFactory = new ArtifactFactory(artifactHandlerManager);
+        mojo = createMojo();
+    }
+
     protected RepositorySystem createRepositorySystem() {
         return mockAetherRepositorySystem(new HashMap<String, String[]>() {
             {
@@ -50,10 +66,6 @@ public abstract class UseLatestVersionsMojoTestBase {
         });
     }
 
-    protected TestChangeRecorder createChangeRecorder() {
-        return new TestChangeRecorder();
-    }
-
     protected void tryUpdate()
             throws MojoExecutionException, XMLStreamException, MojoFailureException, VersionRetrievalException {
         try (MockedStatic<PomHelper> pomHelper = mockStatic(PomHelper.class)) {
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseNextReleasesMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseNextReleasesMojoTest.java
index c2f0bcc7..9685bac4 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseNextReleasesMojoTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseNextReleasesMojoTest.java
@@ -20,8 +20,8 @@ import javax.xml.stream.XMLStreamException;
 import java.util.Collections;
 import java.util.HashMap;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Model;
+import org.apache.maven.plugin.MojoExecution;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.project.MavenProject;
@@ -29,10 +29,7 @@ import org.codehaus.mojo.versions.api.PomHelper;
 import org.codehaus.mojo.versions.api.VersionRetrievalException;
 import org.codehaus.mojo.versions.change.DefaultDependencyVersionChange;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
-import org.codehaus.mojo.versions.utils.TestChangeRecorder;
-import org.eclipse.aether.RepositorySystem;
 import org.hamcrest.Matchers;
-import org.junit.Before;
 import org.junit.Test;
 import org.mockito.MockedStatic;
 
@@ -41,36 +38,37 @@ import static java.util.Collections.singletonList;
 import static org.apache.maven.artifact.Artifact.SCOPE_COMPILE;
 import static org.apache.maven.plugin.testing.ArtifactStubFactory.setVariableValueToObject;
 import static org.codehaus.mojo.versions.utils.MockUtils.mockAetherRepositorySystem;
-import static org.codehaus.mojo.versions.utils.MockUtils.mockArtifactHandlerManager;
 import static org.codehaus.mojo.versions.utils.MockUtils.mockMavenSession;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.empty;
 import static org.hamcrest.Matchers.hasItem;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.mockStatic;
 
 /**
  * Unit tests for {@link UseNextReleasesMojo}
  */
-public class UseNextReleasesMojoTest {
+public class UseNextReleasesMojoTest extends UseLatestVersionsMojoTestBase {
 
-    private UseNextReleasesMojo mojo;
-    private TestChangeRecorder changeRecorder;
-
-    @Before
-    public void setUp() throws Exception {
-        ArtifactHandlerManager artifactHandlerManager = mockArtifactHandlerManager();
-        RepositorySystem repositorySystem = mockAetherRepositorySystem(new HashMap<String, String[]>() {
-            {
-                put("dependency-artifact", new String[] {"1.0.0", "1.1.0", "1.1.1-SNAPSHOT"});
-            }
-        });
-        changeRecorder = new TestChangeRecorder();
-        mojo = new UseNextReleasesMojo(artifactHandlerManager, repositorySystem, null, changeRecorder.asTestMap()) {
+    @Override
+    protected UseLatestVersionsMojoBase createMojo() throws IllegalAccessException, MojoExecutionException {
+        return new UseNextReleasesMojo(
+                artifactFactory,
+                mockAetherRepositorySystem(new HashMap<String, String[]>() {
+                    {
+                        put("dependency-artifact", new String[] {"1.0.0", "1.1.0", "1.1.1-SNAPSHOT"});
+                        put("other-artifact", new String[] {"1.0", "2.0", "2.0-SNAPSHOT"});
+                    }
+                }),
+                null,
+                changeRecorder.asTestMap()) {
             {
+                setVariableValueToObject(this, "processDependencyManagement", false);
                 reactorProjects = emptyList();
                 session = mockMavenSession();
+                mojoExecution = mock(MojoExecution.class);
                 project = new MavenProject() {
                     {
                         setModel(new Model() {
@@ -92,7 +90,6 @@ public class UseNextReleasesMojoTest {
                 };
             }
         };
-        setVariableValueToObject(mojo, "processDependencyManagement", false);
     }
 
     @Test
@@ -136,7 +133,8 @@ public class UseNextReleasesMojoTest {
 
     @Test
     public void testAllowDowngrade()
-            throws MojoExecutionException, XMLStreamException, MojoFailureException, VersionRetrievalException {
+            throws MojoExecutionException, XMLStreamException, MojoFailureException, VersionRetrievalException,
+                    IllegalAccessException {
         mojo.repositorySystem = mockAetherRepositorySystem(new HashMap<String, String[]>() {
             {
                 put("artifactA", new String[] {"1.0.0", "1.0.1-SNAPSHOT"});
@@ -148,7 +146,7 @@ public class UseNextReleasesMojoTest {
                         .withArtifactId("artifactA")
                         .withVersion("1.0.1-SNAPSHOT")
                         .build()));
-        mojo.allowDowngrade = true;
+        setVariableValueToObject(mojo, "allowDowngrade", true);
 
         try (MockedStatic<PomHelper> pomHelper = mockStatic(PomHelper.class)) {
             pomHelper
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseNextVersionsMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseNextVersionsMojoTest.java
index de22c7aa..24ab0559 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseNextVersionsMojoTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseNextVersionsMojoTest.java
@@ -20,8 +20,8 @@ import javax.xml.stream.XMLStreamException;
 import java.util.Collections;
 import java.util.HashMap;
 
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Model;
+import org.apache.maven.plugin.MojoExecution;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.project.MavenProject;
@@ -29,10 +29,7 @@ import org.codehaus.mojo.versions.api.PomHelper;
 import org.codehaus.mojo.versions.api.VersionRetrievalException;
 import org.codehaus.mojo.versions.change.DefaultDependencyVersionChange;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
-import org.codehaus.mojo.versions.utils.TestChangeRecorder;
-import org.eclipse.aether.RepositorySystem;
 import org.hamcrest.Matchers;
-import org.junit.Before;
 import org.junit.Test;
 import org.mockito.MockedStatic;
 
@@ -41,37 +38,37 @@ import static java.util.Collections.singletonList;
 import static org.apache.maven.artifact.Artifact.SCOPE_COMPILE;
 import static org.apache.maven.plugin.testing.ArtifactStubFactory.setVariableValueToObject;
 import static org.codehaus.mojo.versions.utils.MockUtils.mockAetherRepositorySystem;
-import static org.codehaus.mojo.versions.utils.MockUtils.mockArtifactHandlerManager;
 import static org.codehaus.mojo.versions.utils.MockUtils.mockMavenSession;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.empty;
 import static org.hamcrest.Matchers.hasItem;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.mockStatic;
 
 /**
  * Unit tests for {@link UseNextVersionsMojo}
  */
-public class UseNextVersionsMojoTest {
+public class UseNextVersionsMojoTest extends UseLatestVersionsMojoTestBase {
 
-    private UseNextVersionsMojo mojo;
-
-    private TestChangeRecorder changeRecorder;
-
-    @Before
-    public void setUp() throws Exception {
-        ArtifactHandlerManager artifactHandlerManager = mockArtifactHandlerManager();
-        RepositorySystem repositorySystem = mockAetherRepositorySystem(new HashMap<String, String[]>() {
-            {
-                put("dependency-artifact", new String[] {"1.0.0", "1.1.0-SNAPSHOT"});
-            }
-        });
-        changeRecorder = new TestChangeRecorder();
-        mojo = new UseNextVersionsMojo(artifactHandlerManager, repositorySystem, null, changeRecorder.asTestMap()) {
+    @Override
+    protected UseLatestVersionsMojoBase createMojo() throws IllegalAccessException, MojoExecutionException {
+        return new UseNextVersionsMojo(
+                artifactFactory,
+                mockAetherRepositorySystem(new HashMap<String, String[]>() {
+                    {
+                        put("dependency-artifact", new String[] {"1.0.0", "1.1.0-SNAPSHOT"});
+                        put("other-artifact", new String[] {"1.0", "2.0", "2.0-SNAPSHOT"});
+                    }
+                }),
+                null,
+                changeRecorder.asTestMap()) {
             {
+                setVariableValueToObject(this, "processDependencyManagement", false);
                 reactorProjects = emptyList();
                 session = mockMavenSession();
+                mojoExecution = mock(MojoExecution.class);
                 project = new MavenProject() {
                     {
                         setModel(new Model() {
@@ -93,7 +90,6 @@ public class UseNextVersionsMojoTest {
                 };
             }
         };
-        setVariableValueToObject(mojo, "processDependencyManagement", false);
     }
 
     @Test
@@ -139,7 +135,8 @@ public class UseNextVersionsMojoTest {
 
     @Test
     public void testAllowDowngrade()
-            throws MojoExecutionException, XMLStreamException, MojoFailureException, VersionRetrievalException {
+            throws MojoExecutionException, XMLStreamException, MojoFailureException, VersionRetrievalException,
+                    IllegalAccessException {
         mojo.repositorySystem = mockAetherRepositorySystem(new HashMap<String, String[]>() {
             {
                 put("artifactA", new String[] {"1.0.0", "1.0.1-SNAPSHOT"});
@@ -151,7 +148,7 @@ public class UseNextVersionsMojoTest {
                         .withArtifactId("artifactA")
                         .withVersion("1.0.1-SNAPSHOT")
                         .build()));
-        mojo.allowDowngrade = true;
+        setVariableValueToObject(mojo, "allowDowngrade", true);
 
         try (MockedStatic<PomHelper> pomHelper = mockStatic(PomHelper.class)) {
             pomHelper
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseReleasesMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseReleasesMojoTest.java
index fed4f724..2b706191 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseReleasesMojoTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseReleasesMojoTest.java
@@ -3,6 +3,7 @@ package org.codehaus.mojo.versions;
 import javax.xml.stream.XMLStreamException;
 
 import org.apache.maven.artifact.DefaultArtifact;
+import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.model.Model;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -11,6 +12,7 @@ import org.apache.maven.project.MavenProject;
 import org.codehaus.mojo.versions.api.PomHelper;
 import org.codehaus.mojo.versions.api.VersionRetrievalException;
 import org.codehaus.mojo.versions.change.DefaultDependencyVersionChange;
+import org.codehaus.mojo.versions.utils.ArtifactFactory;
 import org.codehaus.mojo.versions.utils.DependencyBuilder;
 import org.codehaus.mojo.versions.utils.TestChangeRecorder;
 import org.junit.Before;
@@ -53,11 +55,15 @@ public class UseReleasesMojoTest extends AbstractMojoTestCase {
     private TestChangeRecorder changeRecorder;
     private UseReleasesMojo mojo;
 
+    private ArtifactFactory artifactFactory;
+
     @Before
-    public void setUp() throws IllegalAccessException {
+    public void setUp() throws Exception {
+        super.setUp();
+        ArtifactHandlerManager artifactHandlerManager = mockArtifactHandlerManager();
+        artifactFactory = new ArtifactFactory(artifactHandlerManager);
         changeRecorder = new TestChangeRecorder();
-        mojo = new UseReleasesMojo(
-                mockArtifactHandlerManager(), mockAetherRepositorySystem(), null, changeRecorder.asTestMap());
+        mojo = new UseReleasesMojo(artifactFactory, mockAetherRepositorySystem(), null, changeRecorder.asTestMap());
         setVariableValueToObject(mojo, "reactorProjects", emptyList());
         mojo.project = new MavenProject() {
             {