diff --git a/src/main/java/org/apache/maven/plugins/dependency/DisplayAncestorsMojo.java b/src/main/java/org/apache/maven/plugins/dependency/DisplayAncestorsMojo.java
index 9c94bb9..59c97dd 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/DisplayAncestorsMojo.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/DisplayAncestorsMojo.java
@@ -69,7 +69,7 @@
 
     private ArrayList<String> collectAncestors()
     {
-        final ArrayList<String> ancestors = new ArrayList<String>();
+        final ArrayList<String> ancestors = new ArrayList<>();
 
         MavenProject currentAncestor = project.getParent();
         while ( currentAncestor != null )
diff --git a/src/main/java/org/apache/maven/plugins/dependency/GetMojo.java b/src/main/java/org/apache/maven/plugins/dependency/GetMojo.java
index 420c71b..be72b9f 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/GetMojo.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/GetMojo.java
@@ -20,7 +20,6 @@
  */
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
@@ -200,7 +199,7 @@
             new ArtifactRepositoryPolicy( true, ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS,
                                           ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN );
 
-        List<ArtifactRepository> repoList = new ArrayList<ArtifactRepository>();
+        List<ArtifactRepository> repoList = new ArrayList<>();
 
         if ( pomRemoteRepositories != null )
         {
@@ -210,7 +209,7 @@
         if ( remoteRepositories != null )
         {
             // Use the same format as in the deploy plugin id::layout::url
-            List<String> repos = Arrays.asList( StringUtils.split( remoteRepositories, "," ) );
+            String[] repos = StringUtils.split( remoteRepositories, "," );
             for ( String repo : repos )
             {
                 repoList.add( parseRepository( repo, always ) );
@@ -240,11 +239,7 @@
                 artifactResolver.resolveArtifact( buildingRequest, toArtifactCoordinate( coordinate ) );
             }
         }
-        catch ( ArtifactResolverException e )
-        {
-            throw new MojoExecutionException( "Couldn't download artifact: " + e.getMessage(), e );
-        }
-        catch ( DependencyResolverException e )
+        catch ( ArtifactResolverException | DependencyResolverException e )
         {
             throw new MojoExecutionException( "Couldn't download artifact: " + e.getMessage(), e );
         }
diff --git a/src/main/java/org/apache/maven/plugins/dependency/PurgeLocalRepositoryMojo.java b/src/main/java/org/apache/maven/plugins/dependency/PurgeLocalRepositoryMojo.java
index 5ddcf66..22a0dd3 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/PurgeLocalRepositoryMojo.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/PurgeLocalRepositoryMojo.java
@@ -295,7 +295,7 @@
     /**
      * Includes only snapshot artifacts
      */
-    private class SnapshotsFilter
+    private static class SnapshotsFilter
         extends AbstractFilter
     {
         @Override
@@ -333,7 +333,7 @@
             return;
         }
 
-        Set<Artifact> purgedArtifacts = new HashSet<Artifact>();
+        Set<Artifact> purgedArtifacts = new HashSet<>();
         if ( shouldPurgeAllProjectsInReactor() )
         {
             for ( MavenProject reactorProject : reactorProjects )
@@ -393,21 +393,10 @@
             {
                 reResolveArtifacts( theProject, resolvedArtifactsToPurge, artifactFilter );
             }
-            catch ( ArtifactResolutionException e )
+            catch ( ArtifactResolutionException | ArtifactNotFoundException e )
             {
                 String failureMessage = "Failed to refresh project dependencies for: " + theProject.getId();
-                MojoFailureException failure = new MojoFailureException( failureMessage );
-                failure.initCause( e );
-
-                throw failure;
-            }
-            catch ( ArtifactNotFoundException e )
-            {
-                String failureMessage = "Failed to refresh project dependencies for: " + theProject.getId();
-                MojoFailureException failure = new MojoFailureException( failureMessage );
-                failure.initCause( e );
-
-                throw failure;
+                throw new MojoFailureException( failureMessage, e );
             }
         }
     }
@@ -502,7 +491,7 @@
     private TransformableFilter createPurgeArtifactsFilter( MavenProject theProject, List<Dependency> dependencies,
                                                             Set<Artifact> purgedArtifacts )
     {
-        List<TransformableFilter> subFilters = new ArrayList<TransformableFilter>();
+        List<TransformableFilter> subFilters = new ArrayList<>();
 
         // System dependencies should never be purged
         subFilters.add( ScopeFilter.excluding( Artifact.SCOPE_SYSTEM ) );
@@ -536,7 +525,7 @@
             subFilters.add( new DirectDependencyFilter( theProject.getArtifact(), dependencies ) );
         }
 
-        List<String> exclusions = new ArrayList<String>( reactorProjects.size() );
+        List<String> exclusions = new ArrayList<>( reactorProjects.size() );
         // It doesn't make sense to include projects from the reactor here since they're likely not able to be resolved
         for ( MavenProject reactorProject : reactorProjects )
         {
@@ -572,7 +561,7 @@
      */
     private List<String> parseIncludes( String theInclude )
     {
-        List<String> theIncludes = new ArrayList<String>();
+        List<String> theIncludes = new ArrayList<>();
 
         if ( theInclude != null )
         {
@@ -592,7 +581,7 @@
                 dependencyResolver.resolveDependencies( session.getProjectBuildingRequest(), theProject.getModel(),
                                                         filter );
 
-            Set<Artifact> resolvedArtifacts = new LinkedHashSet<Artifact>();
+            Set<Artifact> resolvedArtifacts = new LinkedHashSet<>();
 
             for ( ArtifactResult artResult : results )
             {
@@ -607,7 +596,7 @@
                 + ". Falling back to non-transitive mode for initial artifact resolution." );
         }
 
-        Set<Artifact> resolvedArtifacts = new LinkedHashSet<Artifact>();
+        Set<Artifact> resolvedArtifacts = new LinkedHashSet<>();
 
         ArtifactFilter artifactFilter = filter.transform( new ArtifactIncludeFilterTransformer() );
 
@@ -701,7 +690,7 @@
             }
         }
 
-        List<Artifact> missingArtifacts = new ArrayList<Artifact>();
+        List<Artifact> missingArtifacts = new ArrayList<>();
 
         for ( Artifact artifact : artifacts )
         {
@@ -718,7 +707,7 @@
 
         if ( missingArtifacts.size() > 0 )
         {
-            StringBuffer message = new StringBuffer( "required artifacts missing:" );
+            StringBuilder message = new StringBuilder( "required artifacts missing:" );
             message.append( System.lineSeparator() );
             for ( Artifact missingArtifact : missingArtifacts )
             {
diff --git a/src/main/java/org/apache/maven/plugins/dependency/analyze/AbstractAnalyzeMojo.java b/src/main/java/org/apache/maven/plugins/dependency/analyze/AbstractAnalyzeMojo.java
index c23116a..c943111 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/analyze/AbstractAnalyzeMojo.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/analyze/AbstractAnalyzeMojo.java
@@ -315,12 +315,12 @@
             analysis = analysis.ignoreNonCompile();
         }
 
-        Set<Artifact> usedDeclared = new LinkedHashSet<Artifact>( analysis.getUsedDeclaredArtifacts() );
-        Set<Artifact> usedUndeclared = new LinkedHashSet<Artifact>( analysis.getUsedUndeclaredArtifacts() );
-        Set<Artifact> unusedDeclared = new LinkedHashSet<Artifact>( analysis.getUnusedDeclaredArtifacts() );
+        Set<Artifact> usedDeclared = new LinkedHashSet<>( analysis.getUsedDeclaredArtifacts() );
+        Set<Artifact> usedUndeclared = new LinkedHashSet<>( analysis.getUsedUndeclaredArtifacts() );
+        Set<Artifact> unusedDeclared = new LinkedHashSet<>( analysis.getUnusedDeclaredArtifacts() );
 
-        Set<Artifact> ignoredUsedUndeclared = new LinkedHashSet<Artifact>();
-        Set<Artifact> ignoredUnusedDeclared = new LinkedHashSet<Artifact>();
+        Set<Artifact> ignoredUsedUndeclared = new LinkedHashSet<>();
+        Set<Artifact> ignoredUnusedDeclared = new LinkedHashSet<>();
 
         ignoredUsedUndeclared.addAll( filterDependencies( usedUndeclared, ignoredDependencies ) );
         ignoredUsedUndeclared.addAll( filterDependencies( usedUndeclared, ignoredUsedUndeclaredDependencies ) );
@@ -497,7 +497,7 @@
         throws MojoExecutionException
     {
         ArtifactFilter filter = new StrictPatternExcludesArtifactFilter( Arrays.asList( excludes ) );
-        List<Artifact> result = new ArrayList<Artifact>();
+        List<Artifact> result = new ArrayList<>();
 
         for ( Iterator<Artifact> it = artifacts.iterator(); it.hasNext(); )
         {
diff --git a/src/main/java/org/apache/maven/plugins/dependency/analyze/AnalyzeDepMgt.java b/src/main/java/org/apache/maven/plugins/dependency/analyze/AnalyzeDepMgt.java
index 3fa1a0e..b2c0ca9 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/analyze/AnalyzeDepMgt.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/analyze/AnalyzeDepMgt.java
@@ -135,8 +135,8 @@
         if ( depMgtDependencies != null && !depMgtDependencies.isEmpty() )
         {
             // put all the dependencies from depMgt into a map for quick lookup
-            Map<String, Dependency> depMgtMap = new HashMap<String, Dependency>();
-            Map<String, Exclusion> exclusions = new HashMap<String, Exclusion>();
+            Map<String, Dependency> depMgtMap = new HashMap<>();
+            Map<String, Exclusion> exclusions = new HashMap<>();
             for ( Dependency depMgtDependency : depMgtDependencies )
             {
                 depMgtMap.put( depMgtDependency.getManagementKey(), depMgtDependency );
@@ -146,7 +146,7 @@
             }
 
             // get dependencies for the project (including transitive)
-            Set<Artifact> allDependencyArtifacts = new LinkedHashSet<Artifact>( project.getArtifacts() );
+            Set<Artifact> allDependencyArtifacts = new LinkedHashSet<>( project.getArtifacts() );
 
             // don't warn if a dependency that is directly listed overrides
             // depMgt. That's ok.
@@ -195,7 +195,7 @@
      */
     public Map<String, Exclusion> addExclusions( List<Exclusion> exclusionList )
     {
-        Map<String, Exclusion> exclusions = new HashMap<String, Exclusion>();
+        Map<String, Exclusion> exclusions = new HashMap<>();
         if ( exclusionList != null )
         {
             for ( Exclusion exclusion : exclusionList )
@@ -216,7 +216,7 @@
      */
     public List<Artifact> getExclusionErrors( Map<String, Exclusion> exclusions, Set<Artifact> allDependencyArtifacts )
     {
-        List<Artifact> list = new ArrayList<Artifact>();
+        List<Artifact> list = new ArrayList<>();
 
         for ( Artifact artifact : allDependencyArtifacts )
         {
@@ -257,7 +257,7 @@
     public Map<Artifact, Dependency> getMismatch( Map<String, Dependency> depMgtMap,
                                                   Set<Artifact> allDependencyArtifacts )
     {
-        Map<Artifact, Dependency> mismatchMap = new HashMap<Artifact, Dependency>();
+        Map<Artifact, Dependency> mismatchMap = new HashMap<>();
 
         for ( Artifact dependencyArtifact : allDependencyArtifacts )
         {
diff --git a/src/main/java/org/apache/maven/plugins/dependency/analyze/AnalyzeDuplicateMojo.java b/src/main/java/org/apache/maven/plugins/dependency/analyze/AnalyzeDuplicateMojo.java
index 3c17ac3..4c82742 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/analyze/AnalyzeDuplicateMojo.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/analyze/AnalyzeDuplicateMojo.java
@@ -158,7 +158,7 @@
 
     private Set<String> findDuplicateDependencies( List<Dependency> modelDependencies )
     {
-        List<String> modelDependencies2 = new ArrayList<String>();
+        List<String> modelDependencies2 = new ArrayList<>();
         for ( Dependency dep : modelDependencies )
         {
             modelDependencies2.add( dep.getManagementKey() );
@@ -166,7 +166,7 @@
 
         // @formatter:off
         return new LinkedHashSet<String>( 
-                CollectionUtils.disjunction( modelDependencies2, new LinkedHashSet<String>( modelDependencies2 ) ) );
+                CollectionUtils.disjunction( modelDependencies2, new LinkedHashSet<>( modelDependencies2 ) ) );
         // @formatter:on
     }
 }
diff --git a/src/main/java/org/apache/maven/plugins/dependency/fromConfiguration/AbstractFromConfigurationMojo.java b/src/main/java/org/apache/maven/plugins/dependency/fromConfiguration/AbstractFromConfigurationMojo.java
index 377923c..b41a428 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/fromConfiguration/AbstractFromConfigurationMojo.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/fromConfiguration/AbstractFromConfigurationMojo.java
@@ -22,6 +22,7 @@
 import java.io.File;
 import java.util.Collections;
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.handler.ArtifactHandler;
@@ -297,10 +298,10 @@
     {
         for ( Dependency dependency : dependencies )
         {
-            if ( StringUtils.equals( dependency.getArtifactId(), artifact.getArtifactId() )
-                && StringUtils.equals( dependency.getGroupId(), artifact.getGroupId() )
-                && ( looseMatch || StringUtils.equals( dependency.getClassifier(), artifact.getClassifier() ) )
-                && ( looseMatch || StringUtils.equals( dependency.getType(), artifact.getType() ) ) )
+            if ( Objects.equals( dependency.getArtifactId(), artifact.getArtifactId() )
+                && Objects.equals( dependency.getGroupId(), artifact.getGroupId() )
+                && ( looseMatch || Objects.equals( dependency.getClassifier(), artifact.getClassifier() ) )
+                && ( looseMatch || Objects.equals( dependency.getType(), artifact.getType() ) ) )
             {
                 artifact.setVersion( dependency.getVersion() );
 
diff --git a/src/main/java/org/apache/maven/plugins/dependency/fromConfiguration/ArtifactItem.java b/src/main/java/org/apache/maven/plugins/dependency/fromConfiguration/ArtifactItem.java
index 4a8ad6c..6a83466 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/fromConfiguration/ArtifactItem.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/fromConfiguration/ArtifactItem.java
@@ -20,13 +20,13 @@
  */
 
 import java.io.File;
+import java.util.Objects;
 
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.ArtifactUtils;
 import org.apache.maven.plugins.dependency.utils.DependencyUtil;
 import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
 import org.codehaus.plexus.components.io.filemappers.FileMapper;
-import org.codehaus.plexus.util.StringUtils;
 
 /**
  * ArtifactItem represents information specified in the plugin configuration section for each artifact.
@@ -253,11 +253,11 @@
     {
         if ( this.classifier == null )
         {
-            return groupId + ":" + artifactId + ":" + StringUtils.defaultString( version, "?" ) + ":" + type;
+            return groupId + ":" + artifactId + ":" + Objects.toString( version, "?" ) + ":" + type;
         }
         else
         {
-            return groupId + ":" + artifactId + ":" + classifier + ":" + StringUtils.defaultString( version, "?" ) + ":"
+            return groupId + ":" + artifactId + ":" + classifier + ":" + Objects.toString( version, "?" ) + ":"
                 + type;
         }
     }
diff --git a/src/main/java/org/apache/maven/plugins/dependency/fromDependencies/AbstractDependencyFilterMojo.java b/src/main/java/org/apache/maven/plugins/dependency/fromDependencies/AbstractDependencyFilterMojo.java
index 03c6c54..a896865 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/fromDependencies/AbstractDependencyFilterMojo.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/fromDependencies/AbstractDependencyFilterMojo.java
@@ -306,7 +306,7 @@
         if ( includeParents )
         {
             // add dependencies parents
-            for ( Artifact dep : new ArrayList<Artifact>( artifacts ) )
+            for ( Artifact dep : new ArrayList<>( artifacts ) )
             {
                 addParentArtifacts( buildProjectFromArtifact( dep ), artifacts );
             }
@@ -391,7 +391,7 @@
     protected DependencyStatusSets getClassifierTranslatedDependencies( Set<Artifact> artifacts, boolean stopOnFailure )
         throws MojoExecutionException
     {
-        Set<Artifact> unResolvedArtifacts = new LinkedHashSet<Artifact>();
+        Set<Artifact> unResolvedArtifacts = new LinkedHashSet<>();
         Set<Artifact> resolvedArtifacts = artifacts;
         DependencyStatusSets status = new DependencyStatusSets();
 
@@ -410,7 +410,7 @@
             artifacts = status.getResolvedDependencies();
 
             // resolve the rest of the artifacts
-            resolvedArtifacts = resolve( new LinkedHashSet<ArtifactCoordinate>( coordinates ), stopOnFailure );
+            resolvedArtifacts = resolve( new LinkedHashSet<>( coordinates ), stopOnFailure );
 
             // calculate the artifacts not resolved.
             unResolvedArtifacts.addAll( artifacts );
@@ -450,7 +450,7 @@
         }
 
         // calculate the skipped artifacts
-        Set<Artifact> skippedArtifacts = new LinkedHashSet<Artifact>();
+        Set<Artifact> skippedArtifacts = new LinkedHashSet<>();
         skippedArtifacts.addAll( artifacts );
         skippedArtifacts.removeAll( unMarkedArtifacts );
 
@@ -469,7 +469,7 @@
     {
         ProjectBuildingRequest buildingRequest = newResolveArtifactProjectBuildingRequest();
 
-        Set<Artifact> resolvedArtifacts = new LinkedHashSet<Artifact>();
+        Set<Artifact> resolvedArtifacts = new LinkedHashSet<>();
         for ( ArtifactCoordinate coordinate : coordinates )
         {
             try
diff --git a/src/main/java/org/apache/maven/plugins/dependency/fromDependencies/BuildClasspathMojo.java b/src/main/java/org/apache/maven/plugins/dependency/fromDependencies/BuildClasspathMojo.java
index d3a62af..ea14b73 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/fromDependencies/BuildClasspathMojo.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/fromDependencies/BuildClasspathMojo.java
@@ -190,7 +190,7 @@
             getLog().info( "No dependencies found." );
         }
 
-        List<Artifact> artList = new ArrayList<Artifact>( artifacts );
+        List<Artifact> artList = new ArrayList<>( artifacts );
 
         StringBuilder sb = new StringBuilder();
         Iterator<Artifact> i = artList.iterator();
@@ -343,7 +343,7 @@
         }
         catch ( IOException ex )
         {
-            throw new MojoExecutionException( "Error while writting to classpath file '" + out + "': " + ex.toString(),
+            throw new MojoExecutionException( "Error while writing to classpath file '" + out + "': " + ex.toString(),
                                               ex );
         }
         finally
diff --git a/src/main/java/org/apache/maven/plugins/dependency/resolvers/AbstractResolveMojo.java b/src/main/java/org/apache/maven/plugins/dependency/resolvers/AbstractResolveMojo.java
index e63db81..a83e253 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/resolvers/AbstractResolveMojo.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/resolvers/AbstractResolveMojo.java
@@ -138,7 +138,7 @@
         Iterable<ArtifactResult> artifactResults =
             getDependencyResolver().resolveDependencies( buildingRequest, artifact, null );
 
-        Set<Artifact> artifacts = new LinkedHashSet<Artifact>();
+        Set<Artifact> artifacts = new LinkedHashSet<>();
 
         for ( final ArtifactResult artifactResult : artifactResults )
         {
diff --git a/src/main/java/org/apache/maven/plugins/dependency/resolvers/ResolveDependenciesMojo.java b/src/main/java/org/apache/maven/plugins/dependency/resolvers/ResolveDependenciesMojo.java
index e7b2a48..135580f 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/resolvers/ResolveDependenciesMojo.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/resolvers/ResolveDependenciesMojo.java
@@ -161,7 +161,7 @@
             sb.append( System.lineSeparator() );
             sb.append( "The following files were skipped:" );
             sb.append( System.lineSeparator() );
-            Set<Artifact> skippedDependencies = new LinkedHashSet<Artifact>();
+            Set<Artifact> skippedDependencies = new LinkedHashSet<>();
             skippedDependencies.addAll( results.getSkippedDependencies() );
             sb.append( buildArtifactListOutput( skippedDependencies, outputAbsoluteArtifactFilename, theOutputScope,
                                                 theSort ) );
@@ -172,7 +172,7 @@
             sb.append( System.lineSeparator() );
             sb.append( "The following files have NOT been resolved:" );
             sb.append( System.lineSeparator() );
-            Set<Artifact> unResolvedDependencies = new LinkedHashSet<Artifact>();
+            Set<Artifact> unResolvedDependencies = new LinkedHashSet<>();
             unResolvedDependencies.addAll( results.getUnResolvedDependencies() );
             sb.append( buildArtifactListOutput( unResolvedDependencies, outputAbsoluteArtifactFilename, theOutputScope,
                                                 theSort ) );
@@ -186,7 +186,7 @@
                                                    boolean theOutputScope, boolean theSort )
     {
         StringBuilder sb = new StringBuilder();
-        List<String> artifactStringList = new ArrayList<String>();
+        List<String> artifactStringList = new ArrayList<>();
         for ( Artifact artifact : artifacts )
         {
             MessageBuilder messageBuilder = MessageUtils.buffer();
@@ -331,7 +331,7 @@
                 }
             }
         }
-        catch ( ClassNotFoundException e )
+        catch ( ClassNotFoundException | SecurityException | IllegalAccessException | IllegalArgumentException e )
         {
             // do nothing
         }
@@ -339,18 +339,6 @@
         {
             e.printStackTrace();
         }
-        catch ( SecurityException e )
-        {
-            // do nothing
-        }
-        catch ( IllegalAccessException e )
-        {
-            // do nothing
-        }
-        catch ( IllegalArgumentException e )
-        {
-            // do nothing
-        }
         catch ( InvocationTargetException e )
         {
             Throwable cause = e.getCause();
diff --git a/src/main/java/org/apache/maven/plugins/dependency/resolvers/ResolvePluginsMojo.java b/src/main/java/org/apache/maven/plugins/dependency/resolvers/ResolvePluginsMojo.java
index 643b004..33f774b 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/resolvers/ResolvePluginsMojo.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/resolvers/ResolvePluginsMojo.java
@@ -100,8 +100,10 @@
                     }
 
                     String id = plugin.toString();
-                    sb.append( "   " + id + ( outputAbsoluteArtifactFilename ? ":" + artifactFilename : "" ) );
-                    sb.append( System.lineSeparator() );
+                    sb.append( "   " )
+                            .append( id )
+                            .append( outputAbsoluteArtifactFilename ? ":" + artifactFilename : "" )
+                            .append( System.lineSeparator() );
 
                     if ( !excludeTransitive )
                     {
@@ -128,8 +130,10 @@
                             }
 
                             id = artifact.toString();
-                            sb.append( "      " + id + ( outputAbsoluteArtifactFilename ? ":" + artifactFilename : "" )
-                                + System.lineSeparator() );
+                            sb.append( "      " )
+                                    .append( id )
+                                    .append( outputAbsoluteArtifactFilename ? ":" + artifactFilename : "" )
+                                    .append( System.lineSeparator() );
                         }
                     }
                 }
@@ -146,19 +150,7 @@
                 }
             }
         }
-        catch ( final IOException e )
-        {
-            throw new MojoExecutionException( e.getMessage(), e );
-        }
-        catch ( final ArtifactFilterException e )
-        {
-            throw new MojoExecutionException( e.getMessage(), e );
-        }
-        catch ( ArtifactResolverException e )
-        {
-            throw new MojoExecutionException( e.getMessage(), e );
-        }
-        catch ( DependencyResolverException e )
+        catch ( IOException | ArtifactFilterException | ArtifactResolverException | DependencyResolverException e )
         {
             throw new MojoExecutionException( e.getMessage(), e );
         }
@@ -177,16 +169,16 @@
         final Set<Artifact> plugins = getProject().getPluginArtifacts();
         final Set<Artifact> reports = getProject().getReportArtifacts();
 
-        Set<Artifact> artifacts = new LinkedHashSet<Artifact>();
+        Set<Artifact> artifacts = new LinkedHashSet<>();
         artifacts.addAll( reports );
         artifacts.addAll( plugins );
 
         final FilterArtifacts filter = getArtifactsFilter();
         artifacts = filter.filter( artifacts );
 
-        Set<Artifact> resolvedArtifacts = new LinkedHashSet<Artifact>( artifacts.size() );
+        Set<Artifact> resolvedArtifacts = new LinkedHashSet<>( artifacts.size() );
         // final ArtifactFilter filter = getPluginFilter();
-        for ( final Artifact artifact : new LinkedHashSet<Artifact>( artifacts ) )
+        for ( final Artifact artifact : new LinkedHashSet<>( artifacts ) )
         {
             // if ( !filter.include( artifact ) )
             // {
diff --git a/src/main/java/org/apache/maven/plugins/dependency/tree/TGFDependencyNodeVisitor.java b/src/main/java/org/apache/maven/plugins/dependency/tree/TGFDependencyNodeVisitor.java
index eb8cc0e..d08fee0 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/tree/TGFDependencyNodeVisitor.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/tree/TGFDependencyNodeVisitor.java
@@ -95,7 +95,7 @@
     /**
      * List of edges.
      */
-    private List<EdgeAppender> edges = new ArrayList<EdgeAppender>();
+    private List<EdgeAppender> edges = new ArrayList<>();
 
     /**
      * Constructor.
diff --git a/src/main/java/org/apache/maven/plugins/dependency/tree/TreeMojo.java b/src/main/java/org/apache/maven/plugins/dependency/tree/TreeMojo.java
index 1acc162..ab1e7b2 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/tree/TreeMojo.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/tree/TreeMojo.java
@@ -427,7 +427,7 @@
      */
     private DependencyNodeFilter createDependencyNodeFilter()
     {
-        List<DependencyNodeFilter> filters = new ArrayList<DependencyNodeFilter>();
+        List<DependencyNodeFilter> filters = new ArrayList<>();
 
         // filter includes
         if ( includes != null )
diff --git a/src/main/java/org/apache/maven/plugins/dependency/utils/DependencyStatusSets.java b/src/main/java/org/apache/maven/plugins/dependency/utils/DependencyStatusSets.java
index ff007c2..40b6750 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/utils/DependencyStatusSets.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/utils/DependencyStatusSets.java
@@ -52,15 +52,15 @@
     {
         if ( resolved != null )
         {
-            this.resolvedDependencies = new LinkedHashSet<Artifact>( resolved );
+            this.resolvedDependencies = new LinkedHashSet<>( resolved );
         }
         if ( unResolved != null )
         {
-            this.unResolvedDependencies = new LinkedHashSet<Artifact>( unResolved );
+            this.unResolvedDependencies = new LinkedHashSet<>( unResolved );
         }
         if ( skipped != null )
         {
-            this.skippedDependencies = new LinkedHashSet<Artifact>( skipped );
+            this.skippedDependencies = new LinkedHashSet<>( skipped );
         }
     }
 
@@ -79,7 +79,7 @@
     {
         if ( resolvedDependencies != null )
         {
-            this.resolvedDependencies = new LinkedHashSet<Artifact>( resolvedDependencies );
+            this.resolvedDependencies = new LinkedHashSet<>( resolvedDependencies );
         }
         else
         {
@@ -102,7 +102,7 @@
     {
         if ( skippedDependencies != null )
         {
-            this.skippedDependencies = new LinkedHashSet<Artifact>( skippedDependencies );
+            this.skippedDependencies = new LinkedHashSet<>( skippedDependencies );
         }
         else
         {
@@ -125,7 +125,7 @@
     {
         if ( unResolvedDependencies != null )
         {
-            this.unResolvedDependencies = new LinkedHashSet<Artifact>( unResolvedDependencies );
+            this.unResolvedDependencies = new LinkedHashSet<>( unResolvedDependencies );
         }
         else
         {
diff --git a/src/main/java/org/apache/maven/plugins/dependency/utils/DependencyUtil.java b/src/main/java/org/apache/maven/plugins/dependency/utils/DependencyUtil.java
index 86aec5e..5af5a42 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/utils/DependencyUtil.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/utils/DependencyUtil.java
@@ -24,6 +24,7 @@
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.StringReader;
+import java.util.Objects;
 
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.ArtifactUtils;
@@ -205,7 +206,7 @@
         // if the classifier and type are the same (sources), then don't
         // repeat.
         // avoids names like foo-sources-sources
-        if ( !StringUtils.equals( artifact.getClassifier(), artifact.getType() ) )
+        if ( !Objects.equals( artifact.getClassifier(), artifact.getType() ) )
         {
             sb.append( "-" );
             sb.append( artifact.getType() );
diff --git a/src/main/java/org/apache/maven/plugins/dependency/utils/filters/DestFileFilter.java b/src/main/java/org/apache/maven/plugins/dependency/utils/filters/DestFileFilter.java
index 0801210..d0afceb 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/utils/filters/DestFileFilter.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/utils/filters/DestFileFilter.java
@@ -111,7 +111,7 @@
     public Set<Artifact> filter( Set<Artifact> artifacts )
         throws ArtifactFilterException
     {
-        Set<Artifact> result = new LinkedHashSet<Artifact>();
+        Set<Artifact> result = new LinkedHashSet<>();
 
         for ( Artifact artifact : artifacts )
         {
diff --git a/src/main/java/org/apache/maven/plugins/dependency/utils/filters/MarkerFileFilter.java b/src/main/java/org/apache/maven/plugins/dependency/utils/filters/MarkerFileFilter.java
index 3a54a68..b3148af 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/utils/filters/MarkerFileFilter.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/utils/filters/MarkerFileFilter.java
@@ -72,7 +72,7 @@
     public Set<Artifact> filter( Set<Artifact> artifacts )
         throws ArtifactFilterException
     {
-        Set<Artifact> result = new LinkedHashSet<Artifact>();
+        Set<Artifact> result = new LinkedHashSet<>();
 
         for ( Artifact artifact : artifacts )
         {
diff --git a/src/main/java/org/apache/maven/plugins/dependency/utils/translators/ClassifierTypeTranslator.java b/src/main/java/org/apache/maven/plugins/dependency/utils/translators/ClassifierTypeTranslator.java
index 41f51bc..a2d385a 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/utils/translators/ClassifierTypeTranslator.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/utils/translators/ClassifierTypeTranslator.java
@@ -66,7 +66,7 @@
         Set<ArtifactCoordinate> results;
 
         log.debug( "Translating Artifacts using Classifier: " + this.classifier + " and Type: " + this.type );
-        results = new LinkedHashSet<ArtifactCoordinate>();
+        results = new LinkedHashSet<>();
         for ( Artifact artifact : artifacts )
         {
             // this translator must pass both type and classifier here so we
diff --git a/src/test/java/org/apache/maven/plugins/dependency/analyze/TestAnalyzeDepMgt.java b/src/test/java/org/apache/maven/plugins/dependency/analyze/TestAnalyzeDepMgt.java
index 21c6e69..268ac1d 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/analyze/TestAnalyzeDepMgt.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/analyze/TestAnalyzeDepMgt.java
@@ -19,6 +19,8 @@
  * under the License.
  */
 
+import static org.junit.Assert.assertNotEquals;
+
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -28,12 +30,10 @@
 import java.util.Set;
 
 import junit.framework.TestCase;
-
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.DependencyManagement;
 import org.apache.maven.model.Exclusion;
-import org.apache.maven.plugins.dependency.analyze.AnalyzeDepMgt;
 import org.apache.maven.plugins.dependency.testUtils.DependencyArtifactStubFactory;
 import org.apache.maven.plugins.dependency.testUtils.stubs.DependencyProjectStub;
 import org.apache.maven.project.MavenProject;
@@ -82,7 +82,7 @@
         exclusion.setVersion( "3.0" );
 
         exclusion.addExclusion( ex );
-        List<Dependency> list = new ArrayList<Dependency>();
+        List<Dependency> list = new ArrayList<>();
         list.add( exclusion );
 
         depMgt = new DependencyManagement();
@@ -117,25 +117,25 @@
         // sure it's ok before
         // testing the next one
         dep.setType( "t" );
-        assertFalse( dep.getManagementKey().equals( mojo.getArtifactManagementKey( artifact ) ) );
+        assertNotEquals( dep.getManagementKey(), mojo.getArtifactManagementKey( artifact ) );
 
         dep.setType( "type" );
         assertEquals( dep.getManagementKey(), mojo.getArtifactManagementKey( artifact ) );
 
         dep.setArtifactId( "a" );
-        assertFalse( dep.getManagementKey().equals( mojo.getArtifactManagementKey( artifact ) ) );
+        assertNotEquals( dep.getManagementKey(), mojo.getArtifactManagementKey( artifact ) );
 
         dep.setArtifactId( "artifact" );
         assertEquals( dep.getManagementKey(), mojo.getArtifactManagementKey( artifact ) );
 
         dep.setClassifier( "c" );
-        assertFalse( dep.getManagementKey().equals( mojo.getArtifactManagementKey( artifact ) ) );
+        assertNotEquals( dep.getManagementKey(), mojo.getArtifactManagementKey( artifact ) );
 
         dep.setClassifier( "class" );
         assertEquals( dep.getManagementKey(), mojo.getArtifactManagementKey( artifact ) );
 
         dep.setGroupId( "g" );
-        assertFalse( dep.getManagementKey().equals( mojo.getArtifactManagementKey( artifact ) ) );
+        assertNotEquals( dep.getManagementKey(), mojo.getArtifactManagementKey( artifact ) );
 
         dep.setGroupId( "group" );
         dep.setClassifier( null );
@@ -152,7 +152,7 @@
 
         assertEquals( 0, mojo.addExclusions( null ).size() );
 
-        List<Exclusion> list = new ArrayList<Exclusion>();
+        List<Exclusion> list = new ArrayList<>();
         list.add( ex );
         Map<String, Exclusion> map = mojo.addExclusions( list );
 
@@ -163,7 +163,7 @@
 
     public void testGetExclusionErrors()
     {
-        List<Exclusion> list = new ArrayList<Exclusion>();
+        List<Exclusion> list = new ArrayList<>();
         list.add( ex );
 
         // already tested this method so I can trust it.
@@ -179,7 +179,7 @@
     public void testGetMismatch()
         throws IOException
     {
-        Map<String, Dependency> depMgtMap = new HashMap<String, Dependency>();
+        Map<String, Dependency> depMgtMap = new HashMap<>();
 
         depMgtMap.put( exclusion.getManagementKey(), exclusion );
 
diff --git a/src/test/java/org/apache/maven/plugins/dependency/fromConfiguration/TestCopyMojo.java b/src/test/java/org/apache/maven/plugins/dependency/fromConfiguration/TestCopyMojo.java
index 3519e4d..19dbcd4 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/fromConfiguration/TestCopyMojo.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/fromConfiguration/TestCopyMojo.java
@@ -124,7 +124,7 @@
         item.setGroupId( "groupId" );
         item.setVersion( "1.0" );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>( 1 );
+        List<ArtifactItem> list = new ArrayList<>( 1 );
         list.add( createArtifact( item ) );
 
         mojo.setArtifactItems( createArtifactItemArtifacts( list ) );
@@ -204,8 +204,8 @@
         for ( ArtifactItem item : list )
         {
             // these will be null because no processing has occured only when everything is skipped
-            assertEquals( null, item.getOutputDirectory() );
-            assertEquals( null, item.getDestFileName() );
+            assertNull( item.getOutputDirectory() );
+            assertNull( item.getDestFileName() );
         }
 
     }
@@ -310,7 +310,7 @@
         item.setGroupId( "groupId" );
         item.setType( "type" );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>();
+        List<ArtifactItem> list = new ArrayList<>();
         list.add( item );
         mojo.setArtifactItems( list );
 
@@ -341,7 +341,7 @@
         dep2.setType( item.getType() );
         dep2.setVersion( "2.1" );
 
-        List<Dependency> list = new ArrayList<Dependency>( 2 );
+        List<Dependency> list = new ArrayList<>( 2 );
         list.add( dep2 );
         list.add( dep );
 
@@ -358,7 +358,7 @@
         item.setGroupId( "groupId" );
         item.setType( "type" );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>();
+        List<ArtifactItem> list = new ArrayList<>();
         list.add( item );
         mojo.setArtifactItems( list );
 
@@ -392,7 +392,7 @@
         createArtifact( item );
         item.setVersion( null );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>();
+        List<ArtifactItem> list = new ArrayList<>();
         list.add( item );
         mojo.setArtifactItems( list );
 
@@ -411,7 +411,7 @@
         item.setGroupId( "groupId" );
         item.setType( "type" );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>();
+        List<ArtifactItem> list = new ArrayList<>();
         list.add( item );
         mojo.setArtifactItems( list );
 
@@ -439,7 +439,7 @@
         dep2.setType( item.getType() );
         dep2.setVersion( "3.1" );
 
-        List<Dependency> list = new ArrayList<Dependency>( 2 );
+        List<Dependency> list = new ArrayList<>( 2 );
         list.add( dep2 );
         list.add( dep );
 
@@ -466,7 +466,7 @@
         item.setGroupId( "groupId" );
         item.setType( "type" );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>();
+        List<ArtifactItem> list = new ArrayList<>();
         list.add( item );
 
         mojo.setArtifactItems( list );
@@ -499,7 +499,7 @@
         item.setGroupId( "groupId" );
         item.setType( "type" );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>();
+        List<ArtifactItem> list = new ArrayList<>();
         list.add( item );
 
         mojo.setArtifactItems( list );
@@ -539,7 +539,7 @@
         item.setGroupId( "groupId" );
         item.setType( "type" );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>();
+        List<ArtifactItem> list = new ArrayList<>();
         list.add( item );
 
         mojo.setArtifactItems( list );
@@ -575,7 +575,7 @@
         item.setType( "type" );
         item.setVersion( "1.0" );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>();
+        List<ArtifactItem> list = new ArrayList<>();
         list.add( item );
         mojo.setArtifactItems( list );
 
@@ -613,7 +613,7 @@
 
         ArtifactItem item = new ArtifactItem( release );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>( 1 );
+        List<ArtifactItem> list = new ArrayList<>( 1 );
         list.add( item );
         mojo.setArtifactItems( list );
 
@@ -644,7 +644,7 @@
 
         ArtifactItem item = new ArtifactItem( artifact );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>( 1 );
+        List<ArtifactItem> list = new ArrayList<>( 1 );
         list.add( item );
         mojo.setArtifactItems( list );
 
@@ -676,7 +676,7 @@
 
         ArtifactItem item = new ArtifactItem( release );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>( 1 );
+        List<ArtifactItem> list = new ArrayList<>( 1 );
         list.add( item );
         mojo.setArtifactItems( list );
 
@@ -705,7 +705,7 @@
 
         ArtifactItem item = new ArtifactItem( artifact );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>( 1 );
+        List<ArtifactItem> list = new ArrayList<>( 1 );
         list.add( item );
         mojo.setArtifactItems( list );
 
@@ -734,7 +734,7 @@
 
         ArtifactItem item = new ArtifactItem( artifact );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>( 1 );
+        List<ArtifactItem> list = new ArrayList<>( 1 );
         list.add( item );
         mojo.setArtifactItems( list );
         mojo.setOverWriteIfNewer( true );
diff --git a/src/test/java/org/apache/maven/plugins/dependency/fromConfiguration/TestIncludeExcludeUnpackMojo.java b/src/test/java/org/apache/maven/plugins/dependency/fromConfiguration/TestIncludeExcludeUnpackMojo.java
index 227b43b..54fa28d 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/fromConfiguration/TestIncludeExcludeUnpackMojo.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/fromConfiguration/TestIncludeExcludeUnpackMojo.java
@@ -64,7 +64,7 @@
         stubFactory.setSrcFile( new File( getBasedir() + File.separatorChar + PACKED_FILE_PATH ) );
         Artifact artifact = stubFactory.createArtifact( "test", "test", "1.0", Artifact.SCOPE_COMPILE, "jar", null );
         ArtifactItem item = stubFactory.getArtifactItem( artifact );
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>( 1 );
+        List<ArtifactItem> list = new ArrayList<>( 1 );
         list.add( item );
         assertNotNull( mojo );
         assertNotNull( mojo.getProject() );
@@ -229,7 +229,7 @@
         Artifact artifact = stubFactory.createArtifact( "test", "test", "1.0", Artifact.SCOPE_COMPILE, "jar", null );
         ArtifactItem item = stubFactory.getArtifactItem( artifact );
         item.setIncludes( "**/*" );
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>( 1 );
+        List<ArtifactItem> list = new ArrayList<>( 1 );
         list.add( item );
         mojo.setArtifactItems( list );
         mojo.setIncludes( "**/test2" + UNPACKED_FILE_SUFFIX );
@@ -246,7 +246,7 @@
         Artifact artifact = stubFactory.createArtifact( "test", "test", "1.0", Artifact.SCOPE_COMPILE, "jar", null );
         ArtifactItem item = stubFactory.getArtifactItem( artifact );
         item.setExcludes( "**/*" );
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>( 1 );
+        List<ArtifactItem> list = new ArrayList<>( 1 );
         list.add( item );
         mojo.setArtifactItems( list );
         mojo.setExcludes( "**/test2" + UNPACKED_FILE_SUFFIX );
@@ -260,7 +260,7 @@
     public void testIncludeArtifactItemMultipleMarker()
         throws Exception
     {
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>();
+        List<ArtifactItem> list = new ArrayList<>();
         Artifact artifact = stubFactory.createArtifact( "test", "test", "1.0", Artifact.SCOPE_COMPILE, "jar", null );
         ArtifactItem item = stubFactory.getArtifactItem( artifact );
         item.setOverWrite( "false" );
@@ -282,7 +282,7 @@
     public void testIncludeArtifactItemMultipleExecutions()
         throws Exception
     {
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>();
+        List<ArtifactItem> list = new ArrayList<>();
         Artifact artifact = stubFactory.createArtifact( "test", "test", "1.0", Artifact.SCOPE_COMPILE, "jar", null );
         ArtifactItem item = stubFactory.getArtifactItem( artifact );
         item.setOverWrite( "false" );
diff --git a/src/test/java/org/apache/maven/plugins/dependency/fromConfiguration/TestUnpackMojo.java b/src/test/java/org/apache/maven/plugins/dependency/fromConfiguration/TestUnpackMojo.java
index c9ba0eb..eb3ae75 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/fromConfiguration/TestUnpackMojo.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/fromConfiguration/TestUnpackMojo.java
@@ -100,7 +100,7 @@
         item.setGroupId( "groupId" );
         item.setVersion( "1.0" );
 
-        ArrayList<ArtifactItem> list = new ArrayList<ArtifactItem>( 1 );
+        ArrayList<ArtifactItem> list = new ArrayList<>( 1 );
         list.add( createArtifact( item ) );
 
         mojo.setArtifactItems( list );
@@ -220,7 +220,7 @@
         item.setGroupId( "groupId" );
         item.setType( "type" );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>();
+        List<ArtifactItem> list = new ArrayList<>();
         list.add( item );
         mojo.setArtifactItems( list );
 
@@ -251,7 +251,7 @@
         dep2.setType( item.getType() );
         dep2.setVersion( "2.1" );
 
-        List<Dependency> list = new ArrayList<Dependency>( 2 );
+        List<Dependency> list = new ArrayList<>( 2 );
         list.add( dep2 );
         list.add( dep );
 
@@ -268,7 +268,7 @@
         item.setGroupId( "groupId" );
         item.setType( "jar" );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>();
+        List<ArtifactItem> list = new ArrayList<>();
         list.add( item );
         mojo.setArtifactItems( list );
 
@@ -290,7 +290,7 @@
         item.setGroupId( "groupId" );
         item.setType( "war" );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>();
+        List<ArtifactItem> list = new ArrayList<>();
         list.add( item );
         mojo.setArtifactItems( list );
 
@@ -318,7 +318,7 @@
         dep2.setType( item.getType() );
         dep2.setVersion( "3.1" );
 
-        List<Dependency> list = new ArrayList<Dependency>( 2 );
+        List<Dependency> list = new ArrayList<>( 2 );
         list.add( dep2 );
         list.add( dep );
 
@@ -345,7 +345,7 @@
         item.setGroupId( "groupId" );
         item.setType( "jar" );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>();
+        List<ArtifactItem> list = new ArrayList<>();
         list.add( item );
 
         mojo.setArtifactItems( list );
@@ -382,7 +382,7 @@
         stubFactory.createArtifact( "groupId", "artifactId-2", VersionRange.createFromVersion( "3.1" ), null, "jar",
                                     "classifier", false );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>();
+        List<ArtifactItem> list = new ArrayList<>();
         list.add( item );
 
         mojo.setArtifactItems( list );
@@ -418,7 +418,7 @@
         item.setType( "type" );
         item.setVersion( "1.0" );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>();
+        List<ArtifactItem> list = new ArrayList<>();
         list.add( item );
         mojo.setArtifactItems( list );
 
@@ -456,7 +456,7 @@
 
         ArtifactItem item = new ArtifactItem( createArtifact( release ) );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>( 1 );
+        List<ArtifactItem> list = new ArrayList<>( 1 );
         list.add( item );
         mojo.setArtifactItems( list );
 
@@ -476,7 +476,7 @@
 
         ArtifactItem item = new ArtifactItem( createArtifact( artifact ) );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>( 1 );
+        List<ArtifactItem> list = new ArrayList<>( 1 );
         list.add( item );
         mojo.setArtifactItems( list );
 
@@ -496,7 +496,7 @@
 
         ArtifactItem item = new ArtifactItem( createArtifact( release ) );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>( 1 );
+        List<ArtifactItem> list = new ArrayList<>( 1 );
         list.add( item );
         mojo.setArtifactItems( list );
 
@@ -516,7 +516,7 @@
 
         ArtifactItem item = new ArtifactItem( createArtifact( artifact ) );
 
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>( 1 );
+        List<ArtifactItem> list = new ArrayList<>( 1 );
         list.add( item );
         mojo.setArtifactItems( list );
 
diff --git a/src/test/java/org/apache/maven/plugins/dependency/fromDependencies/TestCopyDependenciesMojo.java b/src/test/java/org/apache/maven/plugins/dependency/fromDependencies/TestCopyDependenciesMojo.java
index 0cd26c0..b90cfd3 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/fromDependencies/TestCopyDependenciesMojo.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/fromDependencies/TestCopyDependenciesMojo.java
@@ -524,7 +524,7 @@
         throws MojoExecutionException, InterruptedException, IOException, MojoFailureException
     {
 
-        Set<Artifact> artifacts = new HashSet<Artifact>();
+        Set<Artifact> artifacts = new HashSet<>();
         Artifact release = stubFactory.getReleaseArtifact();
         assertTrue( release.getFile().setLastModified( System.currentTimeMillis() - 2000 ) );
 
@@ -555,7 +555,7 @@
         throws MojoExecutionException, InterruptedException, IOException, MojoFailureException
     {
 
-        Set<Artifact> artifacts = new HashSet<Artifact>();
+        Set<Artifact> artifacts = new HashSet<>();
         Artifact release = stubFactory.getReleaseArtifact();
 
         assertTrue( release.getFile().setLastModified( 1000L ) );
@@ -587,7 +587,7 @@
         throws MojoExecutionException, InterruptedException, IOException, MojoFailureException
     {
 
-        Set<Artifact> artifacts = new HashSet<Artifact>();
+        Set<Artifact> artifacts = new HashSet<>();
         Artifact snap = stubFactory.getSnapshotArtifact();
         assertTrue( snap.getFile().setLastModified( 1000L ) );
         assertEquals( 1000L, snap.getFile().lastModified() );         
@@ -618,7 +618,7 @@
         throws MojoExecutionException, InterruptedException, IOException, MojoFailureException
     {
 
-        Set<Artifact> artifacts = new HashSet<Artifact>();
+        Set<Artifact> artifacts = new HashSet<>();
         Artifact snap = stubFactory.getSnapshotArtifact();
         assertTrue( snap.getFile().setLastModified( 1000L ) );
         assertEquals( 1000L, snap.getFile().lastModified() );
@@ -758,7 +758,7 @@
     {
         mojo.setCopyPom( true );
 
-        Set<Artifact> set = new HashSet<Artifact>();
+        Set<Artifact> set = new HashSet<>();
         set.add( stubFactory.createArtifact( "org.apache.maven", "maven-artifact", "2.0.7", Artifact.SCOPE_COMPILE ) );
         stubFactory.createArtifact( "org.apache.maven", "maven-artifact", "2.0.7", Artifact.SCOPE_COMPILE, "pom",
                                     null );
diff --git a/src/test/java/org/apache/maven/plugins/dependency/fromDependencies/TestUnpackDependenciesMojo2.java b/src/test/java/org/apache/maven/plugins/dependency/fromDependencies/TestUnpackDependenciesMojo2.java
index 56b5bed..c4d603c 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/fromDependencies/TestUnpackDependenciesMojo2.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/fromDependencies/TestUnpackDependenciesMojo2.java
@@ -100,7 +100,7 @@
         throws MojoExecutionException, InterruptedException, IOException, MojoFailureException
     {
 
-        Set<Artifact> artifacts = new HashSet<Artifact>();
+        Set<Artifact> artifacts = new HashSet<>();
         Artifact release = stubFactory.getReleaseArtifact();
         assertTrue( release.getFile().setLastModified( System.currentTimeMillis() - 2000 ) );
 
@@ -120,7 +120,7 @@
         throws MojoExecutionException, InterruptedException, IOException, MojoFailureException
     {
 
-        Set<Artifact> artifacts = new HashSet<Artifact>();
+        Set<Artifact> artifacts = new HashSet<>();
         Artifact release = stubFactory.getReleaseArtifact();
         assertTrue( release.getFile().setLastModified( System.currentTimeMillis() - 2000 ) );
 
@@ -141,7 +141,7 @@
         throws MojoExecutionException, InterruptedException, IOException, MojoFailureException
     {
 
-        Set<Artifact> artifacts = new HashSet<Artifact>();
+        Set<Artifact> artifacts = new HashSet<>();
         Artifact snap = stubFactory.getSnapshotArtifact();
         assertTrue( snap.getFile().setLastModified( System.currentTimeMillis() - 2000 ) );
 
@@ -163,7 +163,7 @@
         throws MojoExecutionException, InterruptedException, IOException, MojoFailureException
     {
 
-        Set<Artifact> artifacts = new HashSet<Artifact>();
+        Set<Artifact> artifacts = new HashSet<>();
         Artifact snap = stubFactory.getSnapshotArtifact();
         assertTrue( snap.getFile().setLastModified( System.currentTimeMillis() - 2000 ) );
 
@@ -186,7 +186,7 @@
         throws MojoExecutionException, InterruptedException, IOException, MojoFailureException
     {
 
-        Set<Artifact> artifacts = new HashSet<Artifact>();
+        Set<Artifact> artifacts = new HashSet<>();
         Artifact snap = stubFactory.getSnapshotArtifact();
         assertTrue( snap.getFile().setLastModified( System.currentTimeMillis() - 2000 ) );
 
diff --git a/src/test/java/org/apache/maven/plugins/dependency/testUtils/DependencyArtifactStubFactory.java b/src/test/java/org/apache/maven/plugins/dependency/testUtils/DependencyArtifactStubFactory.java
index 6f8ed9b..807c6f9 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/testUtils/DependencyArtifactStubFactory.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/testUtils/DependencyArtifactStubFactory.java
@@ -59,7 +59,7 @@
 
     public List<ArtifactItem> getArtifactItems( Collection<Artifact> artifacts )
     {
-        List<ArtifactItem> list = new ArrayList<ArtifactItem>();
+        List<ArtifactItem> list = new ArrayList<>();
         for ( Artifact artifact : artifacts )
         {
             list.add( getArtifactItem( artifact ) );
diff --git a/src/test/java/org/apache/maven/plugins/dependency/testUtils/DependencyTestUtils.java b/src/test/java/org/apache/maven/plugins/dependency/testUtils/DependencyTestUtils.java
index adb73cb..43790f3 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/testUtils/DependencyTestUtils.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/testUtils/DependencyTestUtils.java
@@ -19,6 +19,8 @@
  * under the License.    
  */
 
+import static org.junit.Assert.assertTrue;
+
 import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.Field;
@@ -28,13 +30,11 @@
 import org.apache.maven.artifact.factory.DefaultArtifactFactory;
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.handler.manager.DefaultArtifactHandlerManager;
-import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.logging.Log;
 import org.apache.maven.plugin.testing.SilentLog;
 import org.apache.maven.shared.model.fileset.FileSet;
 import org.apache.maven.shared.model.fileset.util.FileSetManager;
 import org.codehaus.plexus.util.ReflectionUtils;
-import static junit.framework.Assert.assertTrue;
 
 public class DependencyTestUtils
 {
@@ -66,7 +66,7 @@
     {
         ArtifactFactory artifactFactory;
         ArtifactHandlerManager manager = new DefaultArtifactHandlerManager();
-        setVariableValueToObject( manager, "artifactHandlers", new HashMap() );
+        setVariableValueToObject( manager, "artifactHandlers", new HashMap<>() );
 
         artifactFactory = new DefaultArtifactFactory();
         setVariableValueToObject( artifactFactory, "artifactHandlerManager", manager );
diff --git a/src/test/java/org/apache/maven/plugins/dependency/testUtils/stubs/DependencyProjectStub.java b/src/test/java/org/apache/maven/plugins/dependency/testUtils/stubs/DependencyProjectStub.java
index 158255e..f8bafdb 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/testUtils/stubs/DependencyProjectStub.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/testUtils/stubs/DependencyProjectStub.java
@@ -39,9 +39,11 @@
 import org.apache.maven.model.Build;
 import org.apache.maven.model.CiManagement;
 import org.apache.maven.model.Contributor;
+import org.apache.maven.model.Dependency;
 import org.apache.maven.model.DependencyManagement;
 import org.apache.maven.model.Developer;
 import org.apache.maven.model.DistributionManagement;
+import org.apache.maven.model.Extension;
 import org.apache.maven.model.IssueManagement;
 import org.apache.maven.model.License;
 import org.apache.maven.model.MailingList;
@@ -50,7 +52,10 @@
 import org.apache.maven.model.Plugin;
 import org.apache.maven.model.PluginManagement;
 import org.apache.maven.model.Prerequisites;
+import org.apache.maven.model.Profile;
+import org.apache.maven.model.ReportPlugin;
 import org.apache.maven.model.Reporting;
+import org.apache.maven.model.Repository;
 import org.apache.maven.model.Resource;
 import org.apache.maven.model.Scm;
 import org.apache.maven.plugin.testing.stubs.DefaultArtifactHandlerStub;
@@ -75,29 +80,29 @@
 
     private MavenProject parent;
 
-    private List dependencies;
+    private List<Dependency> dependencies;
 
     private File file;
 
-    private List collectedProjects;
+    private List<MavenProject> collectedProjects;
 
-    private List attachedArtifacts;
+    private List<Artifact> attachedArtifacts;
 
-    private List compileSourceRoots;
+    private List<String> compileSourceRoots;
 
-    private List testCompileSourceRoots;
+    private List<String> testCompileSourceRoots;
 
-    private List scriptSourceRoots;
+    private List<String> scriptSourceRoots;
 
-    private List pluginArtifactRepositories;
+    private List<ArtifactRepository> pluginArtifactRepositories;
 
     // private ArtifactRepository releaseArtifactRepository;
 
     // private ArtifactRepository snapshotArtifactRepository;
 
-    private List activeProfiles;
+    private List<Profile> activeProfiles;
 
-    private Set dependencyArtifacts;
+    private Set<Artifact> dependencyArtifacts;
 
     private DependencyManagement dependencyManagement;
 
@@ -119,27 +124,27 @@
 
     private boolean executionRoot;
 
-    private List compileArtifacts;
+    private List<Artifact> compileArtifacts;
 
-    private List compileDependencies;
+    private List<Dependency> compileDependencies;
 
-    private List systemDependencies;
+    private List<Dependency> systemDependencies;
 
-    private List testClasspathElements;
+    private List<String> testClasspathElements;
 
-    private List testDependencies;
+    private List<Dependency> testDependencies;
 
-    private List systemClasspathElements;
+    private List<String> systemClasspathElements;
 
-    private List systemArtifacts;
+    private List<Artifact> systemArtifacts;
 
-    private List testArtifacts;
+    private List<Artifact> testArtifacts;
 
-    private List runtimeArtifacts;
+    private List<Artifact> runtimeArtifacts;
 
-    private List runtimeDependencies;
+    private List<Dependency> runtimeDependencies;
 
-    private List runtimeClasspathElements;
+    private List<String> runtimeClasspathElements;
 
     private String modelVersion;
 
@@ -155,7 +160,7 @@
 
     private String defaultGoal;
 
-    private Set artifacts;
+    private Set<Artifact> artifacts;
 
     private Properties properties;
 
@@ -218,14 +223,14 @@
         this.parent = mavenProject;
     }
 
-    public void setRemoteArtifactRepositories( List list )
+    public void setRemoteArtifactRepositories( List<ArtifactRepository> list )
     {
 
     }
 
-    public List getRemoteArtifactRepositories()
+    public List<ArtifactRepository> getRemoteArtifactRepositories()
     {
-        return Collections.singletonList( "" );
+        return Collections.emptyList();
     }
 
     public boolean hasParent()
@@ -248,16 +253,16 @@
         return new File( PlexusTestCase.getBasedir() );
     }
 
-    public void setDependencies( List list )
+    public void setDependencies( List<Dependency> list )
     {
         dependencies = list;
     }
 
-    public List getDependencies()
+    public List<Dependency> getDependencies()
     {
         if ( dependencies == null )
         {
-            dependencies = Collections.EMPTY_LIST;
+            dependencies = Collections.emptyList();
         }
         return dependencies;
     }
@@ -313,106 +318,106 @@
         }
     }
 
-    public List getCompileSourceRoots()
+    public List<String> getCompileSourceRoots()
     {
         return compileSourceRoots;
     }
 
-    public List getScriptSourceRoots()
+    public List<String> getScriptSourceRoots()
     {
         return scriptSourceRoots;
     }
 
-    public List getTestCompileSourceRoots()
+    public List<String> getTestCompileSourceRoots()
     {
         return testCompileSourceRoots;
     }
 
-    public List getCompileClasspathElements()
+    public List<String> getCompileClasspathElements()
         throws DependencyResolutionRequiredException
     {
         return compileSourceRoots;
     }
 
-    public void setCompileArtifacts( List compileArtifacts )
+    public void setCompileArtifacts( List<Artifact> compileArtifacts )
     {
         this.compileArtifacts = compileArtifacts;
     }
 
-    public List getCompileArtifacts()
+    public List<Artifact> getCompileArtifacts()
     {
         return compileArtifacts;
     }
 
-    public List getCompileDependencies()
+    public List<Dependency> getCompileDependencies()
     {
         return compileDependencies;
     }
 
-    public List getTestClasspathElements()
+    public List<String> getTestClasspathElements()
         throws DependencyResolutionRequiredException
     {
         return testClasspathElements;
     }
 
-    public List getTestArtifacts()
+    public List<Artifact> getTestArtifacts()
     {
         return testArtifacts;
     }
 
-    public List getTestDependencies()
+    public List<Dependency> getTestDependencies()
     {
         return testDependencies;
     }
 
-    public List getRuntimeClasspathElements()
+    public List<String> getRuntimeClasspathElements()
         throws DependencyResolutionRequiredException
     {
         return runtimeClasspathElements;
     }
 
-    public List getRuntimeArtifacts()
+    public List<Artifact> getRuntimeArtifacts()
     {
         return runtimeArtifacts;
     }
 
-    public List getRuntimeDependencies()
+    public List<Dependency> getRuntimeDependencies()
     {
         return runtimeDependencies;
     }
 
-    public List getSystemClasspathElements()
+    public List<String> getSystemClasspathElements()
         throws DependencyResolutionRequiredException
     {
         return systemClasspathElements;
     }
 
-    public List getSystemArtifacts()
+    public List<Artifact> getSystemArtifacts()
     {
         return systemArtifacts;
     }
 
-    public void setRuntimeClasspathElements( List runtimeClasspathElements )
+    public void setRuntimeClasspathElements( List<String> runtimeClasspathElements )
     {
         this.runtimeClasspathElements = runtimeClasspathElements;
     }
 
-    public void setAttachedArtifacts( List attachedArtifacts )
+    public void setAttachedArtifacts( List<Artifact> attachedArtifacts )
     {
         this.attachedArtifacts = attachedArtifacts;
     }
 
-    public void setCompileSourceRoots( List compileSourceRoots )
+    public void setCompileSourceRoots( List<String> compileSourceRoots )
     {
         this.compileSourceRoots = compileSourceRoots;
     }
 
-    public void setTestCompileSourceRoots( List testCompileSourceRoots )
+    public void setTestCompileSourceRoots( List<String> testCompileSourceRoots )
     {
         this.testCompileSourceRoots = testCompileSourceRoots;
     }
 
-    public void setScriptSourceRoots( List scriptSourceRoots )
+    public void setScriptSourceRoots( List<String> scriptSourceRoots )
     {
         this.scriptSourceRoots = scriptSourceRoots;
     }
@@ -447,47 +452,47 @@
         // this.buildOverlay = buildOverlay;
     }
 
-    public void setCompileDependencies( List compileDependencies )
+    public void setCompileDependencies( List<Dependency> compileDependencies )
     {
         this.compileDependencies = compileDependencies;
     }
 
-    public void setSystemDependencies( List systemDependencies )
+    public void setSystemDependencies( List<Dependency> systemDependencies )
     {
         this.systemDependencies = systemDependencies;
     }
 
-    public void setTestClasspathElements( List testClasspathElements )
+    public void setTestClasspathElements( List<String> testClasspathElements )
     {
         this.testClasspathElements = testClasspathElements;
     }
 
-    public void setTestDependencies( List testDependencies )
+    public void setTestDependencies( List<Dependency> testDependencies )
     {
         this.testDependencies = testDependencies;
     }
 
-    public void setSystemClasspathElements( List systemClasspathElements )
+    public void setSystemClasspathElements( List<String> systemClasspathElements )
     {
         this.systemClasspathElements = systemClasspathElements;
     }
 
-    public void setSystemArtifacts( List systemArtifacts )
+    public void setSystemArtifacts( List<Artifact> systemArtifacts )
     {
         this.systemArtifacts = systemArtifacts;
     }
 
-    public void setTestArtifacts( List testArtifacts )
+    public void setTestArtifacts( List<Artifact> testArtifacts )
     {
         this.testArtifacts = testArtifacts;
     }
 
-    public void setRuntimeArtifacts( List runtimeArtifacts )
+    public void setRuntimeArtifacts( List<Artifact> runtimeArtifacts )
     {
         this.runtimeArtifacts = runtimeArtifacts;
     }
 
-    public void setRuntimeDependencies( List runtimeDependencies )
+    public void setRuntimeDependencies( List<Dependency> runtimeDependencies )
     {
         this.runtimeDependencies = runtimeDependencies;
     }
@@ -497,7 +502,7 @@
         this.model = model;
     }
 
-    public List getSystemDependencies()
+    public List<Dependency> getSystemDependencies()
     {
         return systemDependencies;
     }
@@ -657,9 +662,9 @@
 
     }
 
-    public List getMailingLists()
+    public List<MailingList> getMailingLists()
     {
-        return Collections.singletonList( "" );
+        return Collections.emptyList();
     }
 
     public void addMailingList( MailingList mailingList )
@@ -672,9 +677,9 @@
 
     }
 
-    public List getDevelopers()
+    public List<Developer> getDevelopers()
     {
-        return Collections.singletonList( "" );
+        return Collections.emptyList();
     }
 
     public void addDeveloper( Developer developer )
@@ -682,14 +687,14 @@
 
     }
 
-    public void setContributors( List list )
+    public void setContributors( List<Contributor> list )
     {
 
     }
 
-    public List getContributors()
+    public List<Contributor> getContributors()
     {
-        return Collections.singletonList( "" );
+        return Collections.emptyList();
     }
 
     public void addContributor( Contributor contributor )
@@ -707,14 +712,14 @@
         return null;
     }
 
-    public List getResources()
+    public List<Resource> getResources()
     {
-        return Collections.singletonList( "" );
+        return Collections.emptyList();
     }
 
-    public List getTestResources()
+    public List<Resource> getTestResources()
     {
-        return Collections.singletonList( "" );
+        return Collections.emptyList();
     }
 
     public void addResource( Resource resource )
@@ -742,9 +747,9 @@
 
     }
 
-    public List getLicenses()
+    public List<License> getLicenses()
     {
-        return Collections.singletonList( "" );
+        return Collections.emptyList();
     }
 
     public void addLicense( License license )
@@ -752,16 +757,16 @@
 
     }
 
-    public void setArtifacts( Set set )
+    public void setArtifacts( Set<Artifact> set )
     {
         this.artifacts = set;
     }
 
-    public Set getArtifacts()
+    public Set<Artifact> getArtifacts()
     {
         if ( artifacts == null )
         {
-            return Collections.EMPTY_SET;
+            return Collections.emptySet();
         }
         else
         {
@@ -769,54 +774,54 @@
         }
     }
 
-    public Map getArtifactMap()
+    public Map<String, Artifact> getArtifactMap()
     {
-        return Collections.singletonMap( "", "" );
+        return Collections.emptyMap();
     }
 
-    public void setPluginArtifacts( Set set )
+    public void setPluginArtifacts( Set<Artifact> set )
     {
 
     }
 
-    public Set getPluginArtifacts()
+    public Set<Artifact> getPluginArtifacts()
     {
-        return Collections.singleton( "" );
+        return Collections.emptySet();
     }
 
-    public Map getPluginArtifactMap()
+    public Map<String, Artifact> getPluginArtifactMap()
     {
-        return Collections.singletonMap( "", "" );
+        return Collections.emptyMap();
     }
 
-    public void setReportArtifacts( Set set )
+    public void setReportArtifacts( Set<Artifact> set )
     {
 
     }
 
-    public Set getReportArtifacts()
+    public Set<Artifact> getReportArtifacts()
     {
-        return Collections.singleton( "" );
+        return Collections.emptySet();
     }
 
-    public Map getReportArtifactMap()
+    public Map<String, Artifact> getReportArtifactMap()
     {
-        return Collections.singletonMap( "", "" );
+        return Collections.emptyMap();
     }
 
-    public void setExtensionArtifacts( Set set )
+    public void setExtensionArtifacts( Set<Artifact> set )
     {
 
     }
 
-    public Set getExtensionArtifacts()
+    public Set<Artifact> getExtensionArtifacts()
     {
-        return Collections.singleton( "" );
+        return Collections.emptySet();
     }
 
-    public Map getExtensionArtifactMap()
+    public Map<String, Artifact> getExtensionArtifactMap()
     {
-        return Collections.singletonMap( "", "" );
+        return Collections.emptyMap();
     }
 
     public void setParentArtifact( Artifact artifact )
@@ -829,22 +834,22 @@
         return null;
     }
 
-    public List getRepositories()
+    public List<Repository> getRepositories()
     {
-        return Collections.singletonList( "" );
+        return Collections.emptyList();
     }
 
-    public List getReportPlugins()
+    public List<ReportPlugin> getReportPlugins()
     {
-        return Collections.singletonList( "" );
+        return Collections.emptyList();
     }
 
-    public List getBuildPlugins()
+    public List<Plugin> getBuildPlugins()
     {
-        return Collections.singletonList( "" );
+        return Collections.emptyList();
     }
 
-    public List getModules()
+    public List<String> getModules()
     {
         return Collections.singletonList( "" );
     }
@@ -864,22 +869,22 @@
 
     }
 
-    public List getCollectedProjects()
+    public List<MavenProject> getCollectedProjects()
     {
         return collectedProjects;
     }
 
-    public void setCollectedProjects( List list )
+    public void setCollectedProjects( List<MavenProject> list )
     {
         this.collectedProjects = list;
     }
 
-    public void setPluginArtifactRepositories( List list )
+    public void setPluginArtifactRepositories( List<ArtifactRepository> list )
     {
         this.pluginArtifactRepositories = list;
     }
 
-    public List getPluginArtifactRepositories()
+    public List<ArtifactRepository> getPluginArtifactRepositories()
     {
         return pluginArtifactRepositories;
     }
@@ -889,17 +894,17 @@
         return null;
     }
 
-    public List getPluginRepositories()
+    public List<Repository> getPluginRepositories()
     {
-        return Collections.singletonList( "" );
+        return Collections.emptyList();
     }
 
-    public void setActiveProfiles( List list )
+    public void setActiveProfiles( List<Profile> list )
     {
         activeProfiles = list;
     }
 
-    public List getActiveProfiles()
+    public List<Profile> getActiveProfiles()
     {
         return activeProfiles;
     }
@@ -916,7 +921,7 @@
         }
     }
 
-    public List getAttachedArtifacts()
+    public List<Artifact> getAttachedArtifacts()
     {
         return attachedArtifacts;
     }
@@ -953,12 +958,12 @@
 
     }
 
-    public Set getDependencyArtifacts()
+    public Set<Artifact> getDependencyArtifacts()
     {
         return dependencyArtifacts;
     }
 
-    public void setDependencyArtifacts( Set set )
+    public void setDependencyArtifacts( Set<Artifact> set )
     {
         this.dependencyArtifacts = set;
     }
@@ -983,15 +988,15 @@
         return originalModel;
     }
 
-    public List getBuildExtensions()
+    public List<Extension> getBuildExtensions()
     {
-        return Collections.singletonList( "" );
+        return Collections.emptyList();
     }
 
-    public Set createArtifacts( ArtifactFactory artifactFactory, String string, ArtifactFilter artifactFilter )
+    public Set<Artifact> createArtifacts( ArtifactFactory artifactFactory, String string, ArtifactFilter artifactFilter )
         throws InvalidDependencyVersionException
     {
-        return Collections.EMPTY_SET;
+        return Collections.emptySet();
     }
 
     public void addProjectReference( MavenProject mavenProject )
@@ -1013,14 +1018,14 @@
         return properties;
     }
 
-    public List getFilters()
+    public List<String> getFilters()
     {
         return Collections.singletonList( "" );
     }
 
-    public Map getProjectReferences()
+    public Map<String, MavenProject> getProjectReferences()
     {
-        return Collections.singletonMap( "", "" );
+        return Collections.emptyMap();
     }
 
     public boolean isExecutionRoot()
diff --git a/src/test/java/org/apache/maven/plugins/dependency/tree/TestTreeMojo.java b/src/test/java/org/apache/maven/plugins/dependency/tree/TestTreeMojo.java
index 2979eb5..5a640dd 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/tree/TestTreeMojo.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/tree/TestTreeMojo.java
@@ -19,16 +19,15 @@
  * under the License.
  */
 
-import java.io.File;
 import java.io.BufferedReader;
+import java.io.File;
 import java.io.FileReader;
-import java.util.Set;
-import java.util.List;
 import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
 
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.plugins.dependency.AbstractDependencyMojoTestCase;
-import org.apache.maven.plugins.dependency.tree.TreeMojo;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.dependency.graph.DependencyNode;
 
@@ -174,7 +173,7 @@
         mojo.execute();
 
         BufferedReader fp1 = new BufferedReader( new FileReader( outputFileName ) );
-        List<String> contents = new ArrayList<String>();
+        List<String> contents = new ArrayList<>();
 
         String line;
         while ( ( line = fp1.readLine() ) != null )
diff --git a/src/test/java/org/apache/maven/plugins/dependency/utils/TestDependencyUtil.java b/src/test/java/org/apache/maven/plugins/dependency/utils/TestDependencyUtil.java
index e015e5c..2ea2fc5 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/utils/TestDependencyUtil.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/utils/TestDependencyUtil.java
@@ -42,7 +42,7 @@
 public class TestDependencyUtil
     extends TestCase
 {
-    List<Artifact> artifacts = new ArrayList<Artifact>();
+    List<Artifact> artifacts = new ArrayList<>();
 
     Log log = new SilentLog();
 
diff --git a/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestDestFileFilter.java b/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestDestFileFilter.java
index e2df590..76655b0 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestDestFileFilter.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestDestFileFilter.java
@@ -41,7 +41,7 @@
 public class TestDestFileFilter
     extends TestCase
 {
-    Set<Artifact> artifacts = new HashSet<Artifact>();
+    Set<Artifact> artifacts = new HashSet<>();
 
     Log log = new SilentLog();
 
@@ -215,7 +215,7 @@
     public void testGettersSetters()
     {
         DestFileFilter filter = new DestFileFilter( null );
-        assertTrue( filter.getOutputFileDirectory() == null );
+        assertNull( filter.getOutputFileDirectory() );
         filter.setOutputFileDirectory( outputFolder );
         assertSame( outputFolder, filter.getOutputFileDirectory() );
 
diff --git a/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestMarkerFileFilter.java b/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestMarkerFileFilter.java
index 474cd99..cb3168a 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestMarkerFileFilter.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestMarkerFileFilter.java
@@ -41,7 +41,7 @@
 public class TestMarkerFileFilter
     extends TestCase
 {
-    Set<Artifact> artifacts = new HashSet<Artifact>();
+    Set<Artifact> artifacts = new HashSet<>();
 
     Log log = new SilentLog();
 
@@ -127,11 +127,11 @@
         throws IOException, MojoExecutionException, ArtifactFilterException
     {
         // filter includes release artifact because no marker present
-        // filter includes snapshot artifact becaues it is newer than marker
+        // filter includes snapshot artifact because it is newer than marker
         DependencyArtifactStubFactory fileFact = new DependencyArtifactStubFactory( outputFolder, true );
         Artifact snap = fileFact.getSnapshotArtifact();
         Artifact release = fileFact.getReleaseArtifact();
-        Set<Artifact> tempArtifacts = new HashSet<Artifact>();
+        Set<Artifact> tempArtifacts = new HashSet<>();
         tempArtifacts.add( snap );
         tempArtifacts.add( release );
         DefaultFileMarkerHandler handler = new DefaultFileMarkerHandler( snap, outputFolder );
@@ -165,17 +165,17 @@
     {
         MarkerFileFilter filter =
             new MarkerFileFilter( true, false, true, new DefaultFileMarkerHandler( outputFolder ) );
-        assertEquals( true, filter.isOverWriteReleases() );
-        assertEquals( false, filter.isOverWriteSnapshots() );
-        assertEquals( true, filter.isOverWriteIfNewer() );
+        assertTrue( filter.isOverWriteReleases() );
+        assertFalse( filter.isOverWriteSnapshots() );
+        assertTrue( filter.isOverWriteIfNewer() );
 
         filter.setOverWriteReleases( false );
         filter.setOverWriteSnapshots( true );
         filter.setOverWriteIfNewer( false );
 
-        assertEquals( false, filter.isOverWriteReleases() );
-        assertEquals( true, filter.isOverWriteSnapshots() );
-        assertEquals( false, filter.isOverWriteIfNewer() );
+        assertFalse( filter.isOverWriteReleases() );
+        assertTrue( filter.isOverWriteSnapshots() );
+        assertFalse( filter.isOverWriteIfNewer() );
 
     }
 
diff --git a/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestResolveMarkerFileFilter.java b/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestResolveMarkerFileFilter.java
index ea47d1b..76f6098 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestResolveMarkerFileFilter.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestResolveMarkerFileFilter.java
@@ -44,7 +44,7 @@
 public class TestResolveMarkerFileFilter
     extends TestCase
 {
-    Set<Artifact> artifacts = new HashSet<Artifact>();
+    Set<Artifact> artifacts = new HashSet<>();
 
     Log log = new SilentLog();
 
diff --git a/src/test/java/org/apache/maven/plugins/dependency/utils/markers/TestDefaultMarkerFileHandler.java b/src/test/java/org/apache/maven/plugins/dependency/utils/markers/TestDefaultMarkerFileHandler.java
index 71f1ff5..4704511 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/utils/markers/TestDefaultMarkerFileHandler.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/utils/markers/TestDefaultMarkerFileHandler.java
@@ -43,7 +43,7 @@
 public class TestDefaultMarkerFileHandler
     extends TestCase
 {
-    List<Artifact> artifacts = new ArrayList<Artifact>();
+    List<Artifact> artifacts = new ArrayList<>();
 
     Log log = new SilentLog();
 
@@ -163,11 +163,11 @@
     public void testGetterSetter()
     {
         DefaultFileMarkerHandler handler = new DefaultFileMarkerHandler( null, null );
-        assertTrue( handler.getArtifact() == null );
+        assertNull( handler.getArtifact() );
         handler.setArtifact( artifacts.get( 0 ) );
         assertSame( artifacts.get( 0 ), handler.getArtifact() );
 
-        assertTrue( handler.getMarkerFilesDirectory() == null );
+        assertNull( handler.getMarkerFilesDirectory() );
         handler.setMarkerFilesDirectory( outputFolder );
         assertSame( outputFolder, handler.getMarkerFilesDirectory() );
     }
diff --git a/src/test/java/org/apache/maven/plugins/dependency/utils/markers/TestSourcesMarkerFileHandler.java b/src/test/java/org/apache/maven/plugins/dependency/utils/markers/TestSourcesMarkerFileHandler.java
index d9ebe78..fa36d1a 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/utils/markers/TestSourcesMarkerFileHandler.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/utils/markers/TestSourcesMarkerFileHandler.java
@@ -43,7 +43,7 @@
 public class TestSourcesMarkerFileHandler
     extends TestCase
 {
-    List<Artifact> artifacts = new ArrayList<Artifact>();
+    List<Artifact> artifacts = new ArrayList<>();
 
     Log log = new SilentLog();
 
diff --git a/src/test/java/org/apache/maven/plugins/dependency/utils/markers/TestUnpackMarkerFileHandler.java b/src/test/java/org/apache/maven/plugins/dependency/utils/markers/TestUnpackMarkerFileHandler.java
index c291eea..b903666 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/utils/markers/TestUnpackMarkerFileHandler.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/utils/markers/TestUnpackMarkerFileHandler.java
@@ -37,7 +37,7 @@
 public class TestUnpackMarkerFileHandler
     extends AbstractMojoTestCase
 {
-    List<ArtifactItem> artifactItems = new ArrayList<ArtifactItem>();
+    List<ArtifactItem> artifactItems = new ArrayList<>();
 
     Log log = new SilentLog();
 
@@ -180,13 +180,13 @@
     public void testGetterSetter()
     {
         UnpackFileMarkerHandler handler = new UnpackFileMarkerHandler( null, null );
-        assertTrue( handler.getArtifactItem() == null );
-        assertTrue( handler.getArtifact() == null );
+        assertNull( handler.getArtifactItem() );
+        assertNull( handler.getArtifact() );
         handler.setArtifactItem( artifactItems.get( 0 ) );
         assertSame( artifactItems.get( 0 ), handler.getArtifactItem() );
         assertSame( artifactItems.get( 0 ).getArtifact(), handler.getArtifact() );
 
-        assertTrue( handler.getMarkerFilesDirectory() == null );
+        assertNull( handler.getMarkerFilesDirectory() );
         handler.setMarkerFilesDirectory( outputFolder );
         assertSame( outputFolder, handler.getMarkerFilesDirectory() );
     }
diff --git a/src/test/java/org/apache/maven/plugins/dependency/utils/translators/TestClassifierTypeTranslator.java b/src/test/java/org/apache/maven/plugins/dependency/utils/translators/TestClassifierTypeTranslator.java
index add9dd3..02f2bb8 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/utils/translators/TestClassifierTypeTranslator.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/utils/translators/TestClassifierTypeTranslator.java
@@ -49,7 +49,7 @@
 public class TestClassifierTypeTranslator
     extends AbstractDependencyMojoTestCase
 {
-    Set<Artifact> artifacts = new HashSet<Artifact>();
+    Set<Artifact> artifacts = new HashSet<>();
 
     ArtifactFactory artifactFactory;
 
@@ -69,7 +69,7 @@
         super.setUp( "classifiertype-translator", false );
 
         artifactHandlerManager = new DefaultArtifactHandlerManager();
-        this.setVariableValueToObject( artifactHandlerManager, "artifactHandlers", new HashMap() );
+        this.setVariableValueToObject( artifactHandlerManager, "artifactHandlers", new HashMap<>() );
 
         artifactFactory = new DefaultArtifactFactory();
         this.setVariableValueToObject( artifactFactory, "artifactHandlerManager", artifactHandlerManager );
