Repository: mojohaus/versions
Pull request #1218 (2025-03-01 10:01:36)

Refactoring: ArtifactFactory and ArtifactVersionService
First stage of the refactoring job mentioned in #1212
- ArtifactFactory is split off DefaultVersionsHelper
- DefaultArtifactVersionChange renamed to ArtifactVersionService


Patch:
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() {
             {