You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by mi...@apache.org on 2021/06/20 10:10:54 UTC

[maven-resolver] branch master updated: [MRESOLVER-152] Perform null checks when interface contracts require it

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 125aa57  [MRESOLVER-152] Perform null checks when interface contracts require it
125aa57 is described below

commit 125aa57de8c79d2aacfa376af1c9e449ea4bbc92
Author: Youri Tomassen <gr...@gmail.com>
AuthorDate: Wed Jun 9 11:30:15 2021 +0200

    [MRESOLVER-152] Perform null checks when interface contracts require it
    
    * Add Objects.requireNonNull( Object, "cannot be null" ) on interface
      implementations
    * Update tests that violated non-null arguments
    
    This closes #112
---
 .../aether/DefaultRepositorySystemSession.java     |  3 ++
 .../basic/BasicRepositoryConnectorFactory.java     |  9 ++++--
 .../examples/util/ConsoleRepositoryListener.java   | 19 +++++++++++
 .../examples/util/ConsoleTransferListener.java     |  8 +++++
 .../internal/impl/AbstractChecksumPolicy.java      |  7 ++++
 .../internal/impl/DefaultArtifactResolver.java     |  6 +++-
 .../aether/internal/impl/DefaultDeployer.java      |  8 +++++
 .../aether/internal/impl/DefaultInstaller.java     |  3 +-
 .../impl/DefaultLocalRepositoryProvider.java       |  2 ++
 .../internal/impl/DefaultMetadataResolver.java     |  3 +-
 .../internal/impl/DefaultOfflineController.java    |  4 +++
 .../impl/DefaultRemoteRepositoryManager.java       |  5 +++
 .../impl/DefaultRepositoryEventDispatcher.java     |  1 +
 .../impl/DefaultRepositoryLayoutProvider.java      |  1 +
 .../internal/impl/DefaultRepositorySystem.java     | 35 ++++++++++++++++++++
 .../internal/impl/DefaultTransporterProvider.java  |  3 +-
 .../internal/impl/DefaultUpdateCheckManager.java   |  8 +++++
 .../internal/impl/DefaultUpdatePolicyAnalyzer.java |  4 +++
 .../EnhancedLocalRepositoryManagerFactory.java     |  9 ++++--
 .../impl/Maven2RepositoryLayoutFactory.java        |  4 +++
 .../aether/internal/impl/SafeTransferListener.java |  8 +++++
 .../impl/SimpleLocalRepositoryManager.java         | 14 ++++++++
 .../impl/SimpleLocalRepositoryManagerFactory.java  | 11 +++++--
 .../impl/collect/DefaultDependencyCollector.java   |  2 ++
 .../synccontext/DefaultSyncContextFactory.java     |  3 ++
 .../legacy/DefaultSyncContextFactory.java          |  3 ++
 .../aether/impl/StubVersionRangeResolver.java      |  4 +++
 .../eclipse/aether/impl/StubVersionResolver.java   |  4 +++
 .../aether/internal/impl/DefaultDeployerTest.java  |  3 ++
 .../impl/DefaultRemoteRepositoryManagerTest.java   |  3 ++
 .../internal/impl/RecordingRepositoryListener.java | 21 ++++++++++++
 .../internal/impl/StaticUpdateCheckManager.java    | 10 ++++++
 .../internal/impl/StubRemoteRepositoryManager.java |  7 ++++
 .../impl/StubRepositoryEventDispatcher.java        |  3 ++
 .../internal/impl/StubSyncContextFactory.java      |  3 ++
 .../internal/impl/StubVersionRangeResolver.java    |  4 +++
 .../aether/internal/impl/StubVersionResolver.java  |  4 +++
 .../collect/DefaultDependencyCollectorTest.java    |  7 ++--
 .../connector/transport/AbstractTransporter.java   |  7 ++++
 .../test/util/IniArtifactDescriptorReader.java     |  4 +++
 .../test/util/TestLocalRepositoryManager.java      | 24 ++++++++++++++
 .../internal/test/util/TestVersionScheme.java      |  5 +++
 .../classpath/ClasspathTransporterFactory.java     | 11 +++++--
 .../transport/file/FileTransporterFactory.java     | 11 +++++--
 .../transport/http/HttpTransporterFactory.java     | 11 +++++--
 .../transport/wagon/PlexusWagonConfigurator.java   | 11 +++----
 .../aether/transport/wagon/WagonTransporter.java   |  7 ++--
 .../transport/wagon/WagonTransporterFactory.java   | 15 ++++++---
 .../filter/AbstractPatternDependencyFilter.java    |  4 +++
 .../aether/util/filter/AndDependencyFilter.java    |  4 +++
 .../util/filter/ExclusionsDependencyFilter.java    |  4 +++
 .../graph/manager/ClassicDependencyManager.java    |  4 +++
 .../graph/manager/DefaultDependencyManager.java    |  4 +++
 .../util/graph/manager/NoopDependencyManager.java  |  4 +++
 .../graph/manager/TransitiveDependencyManager.java |  4 +++
 .../util/graph/selector/AndDependencySelector.java |  4 +++
 .../selector/ExclusionDependencySelector.java      |  4 +++
 .../graph/selector/OptionalDependencySelector.java |  4 +++
 .../graph/selector/ScopeDependencySelector.java    |  4 +++
 .../graph/selector/StaticDependencySelector.java   |  4 +++
 .../ChainedDependencyGraphTransformer.java         |  4 +++
 .../util/graph/transformer/ConflictIdSorter.java   |  3 ++
 .../util/graph/transformer/ConflictMarker.java     |  3 ++
 .../util/graph/transformer/ConflictResolver.java   |  2 ++
 .../transformer/JavaDependencyContextRefiner.java  |  4 +++
 .../graph/transformer/NearestVersionSelector.java  |  4 +++
 .../NoopDependencyGraphTransformer.java            |  4 +++
 .../graph/traverser/AndDependencyTraverser.java    |  4 +++
 .../util/graph/traverser/FatArtifactTraverser.java |  4 +++
 .../graph/traverser/StaticDependencyTraverser.java |  4 +++
 .../util/listener/ChainedRepositoryListener.java   | 21 ++++++++++++
 .../util/listener/ChainedTransferListener.java     |  8 +++++
 .../util/repository/ChainedAuthentication.java     |  4 +++
 .../util/repository/ChainedWorkspaceReader.java    |  4 +++
 .../util/repository/ComponentAuthentication.java   |  2 ++
 .../ConservativeAuthenticationSelector.java        |  1 +
 .../util/repository/ConservativeProxySelector.java |  1 +
 .../repository/DefaultAuthenticationSelector.java  |  3 ++
 .../util/repository/DefaultMirrorSelector.java     |  3 ++
 .../util/repository/DefaultProxySelector.java      |  1 +
 .../aether/util/repository/JreProxySelector.java   |  5 +++
 .../util/repository/SecretAuthentication.java      |  1 +
 .../repository/SimpleArtifactDescriptorPolicy.java |  4 +++
 .../repository/SimpleResolutionErrorPolicy.java    |  6 ++++
 .../util/repository/StringAuthentication.java      |  2 ++
 .../aether/util/version/GenericVersionScheme.java  |  5 +++
 .../util/filter/AbstractDependencyFilterTest.java  |  4 +++
 .../graph/selector/AndDependencySelectorTest.java  | 25 +++++++++++++--
 .../graph/transformer/SimpleConflictMarker.java    |  3 ++
 .../traverser/AndDependencyTraverserTest.java      | 37 ++++++++++++++++++++--
 .../graph/traverser/FatArtifactTraverserTest.java  | 29 ++++++++++++++++-
 .../traverser/StaticDependencyTraverserTest.java   | 31 +++++++++++++++++-
 .../visitor/FilteringDependencyVisitorTest.java    |  3 ++
 .../PathRecordingDependencyVisitorTest.java        |  3 ++
 94 files changed, 607 insertions(+), 45 deletions(-)

diff --git a/maven-resolver-api/src/main/java/org/eclipse/aether/DefaultRepositorySystemSession.java b/maven-resolver-api/src/main/java/org/eclipse/aether/DefaultRepositorySystemSession.java
index b2c05cd..90b32f4 100644
--- a/maven-resolver-api/src/main/java/org/eclipse/aether/DefaultRepositorySystemSession.java
+++ b/maven-resolver-api/src/main/java/org/eclipse/aether/DefaultRepositorySystemSession.java
@@ -815,6 +815,7 @@ public final class DefaultRepositorySystemSession
 
         public Proxy getProxy( RemoteRepository repository )
         {
+            requireNonNull( repository, "repository cannot be null" );
             return repository.getProxy();
         }
 
@@ -828,6 +829,7 @@ public final class DefaultRepositorySystemSession
 
         public RemoteRepository getMirror( RemoteRepository repository )
         {
+            requireNonNull( repository, "repository cannot be null" );
             return null;
         }
 
@@ -841,6 +843,7 @@ public final class DefaultRepositorySystemSession
 
         public Authentication getAuthentication( RemoteRepository repository )
         {
+            requireNonNull( repository, "repository cannot be null" );
             return repository.getAuthentication();
         }
 
diff --git a/maven-resolver-connector-basic/src/main/java/org/eclipse/aether/connector/basic/BasicRepositoryConnectorFactory.java b/maven-resolver-connector-basic/src/main/java/org/eclipse/aether/connector/basic/BasicRepositoryConnectorFactory.java
index 540b301..aa747a9 100644
--- a/maven-resolver-connector-basic/src/main/java/org/eclipse/aether/connector/basic/BasicRepositoryConnectorFactory.java
+++ b/maven-resolver-connector-basic/src/main/java/org/eclipse/aether/connector/basic/BasicRepositoryConnectorFactory.java
@@ -8,9 +8,9 @@ package org.eclipse.aether.connector.basic;
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  *  http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -139,7 +139,7 @@ public final class BasicRepositoryConnectorFactory
 
     /**
      * Sets the priority of this component.
-     * 
+     *
      * @param priority The priority.
      * @return This component for chaining, never {@code null}.
      */
@@ -152,6 +152,9 @@ public final class BasicRepositoryConnectorFactory
     public RepositoryConnector newInstance( RepositorySystemSession session, RemoteRepository repository )
         throws NoRepositoryConnectorException
     {
+        requireNonNull( "session", "session cannot be null" );
+        requireNonNull( "repository", "repository cannot be null" );
+
         return new BasicRepositoryConnector( session, repository, transporterProvider, layoutProvider,
                                              checksumPolicyProvider, fileProcessor );
     }
diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ConsoleRepositoryListener.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ConsoleRepositoryListener.java
index e1ffccf..d561d7f 100644
--- a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ConsoleRepositoryListener.java
+++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ConsoleRepositoryListener.java
@@ -24,6 +24,8 @@ import java.io.PrintStream;
 import org.eclipse.aether.AbstractRepositoryListener;
 import org.eclipse.aether.RepositoryEvent;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A simplistic repository listener that logs events to the console.
  */
@@ -45,87 +47,104 @@ public class ConsoleRepositoryListener
 
     public void artifactDeployed( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         out.println( "Deployed " + event.getArtifact() + " to " + event.getRepository() );
     }
 
     public void artifactDeploying( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         out.println( "Deploying " + event.getArtifact() + " to " + event.getRepository() );
     }
 
     public void artifactDescriptorInvalid( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         out.println( "Invalid artifact descriptor for " + event.getArtifact() + ": "
             + event.getException().getMessage() );
     }
 
     public void artifactDescriptorMissing( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         out.println( "Missing artifact descriptor for " + event.getArtifact() );
     }
 
     public void artifactInstalled( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         out.println( "Installed " + event.getArtifact() + " to " + event.getFile() );
     }
 
     public void artifactInstalling( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         out.println( "Installing " + event.getArtifact() + " to " + event.getFile() );
     }
 
     public void artifactResolved( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         out.println( "Resolved artifact " + event.getArtifact() + " from " + event.getRepository() );
     }
 
     public void artifactDownloading( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         out.println( "Downloading artifact " + event.getArtifact() + " from " + event.getRepository() );
     }
 
     public void artifactDownloaded( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         out.println( "Downloaded artifact " + event.getArtifact() + " from " + event.getRepository() );
     }
 
     public void artifactResolving( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         out.println( "Resolving artifact " + event.getArtifact() );
     }
 
     public void metadataDeployed( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         out.println( "Deployed " + event.getMetadata() + " to " + event.getRepository() );
     }
 
     public void metadataDeploying( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         out.println( "Deploying " + event.getMetadata() + " to " + event.getRepository() );
     }
 
     public void metadataInstalled( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         out.println( "Installed " + event.getMetadata() + " to " + event.getFile() );
     }
 
     public void metadataInstalling( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         out.println( "Installing " + event.getMetadata() + " to " + event.getFile() );
     }
 
     public void metadataInvalid( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         out.println( "Invalid metadata " + event.getMetadata() );
     }
 
     public void metadataResolved( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         out.println( "Resolved metadata " + event.getMetadata() + " from " + event.getRepository() );
     }
 
     public void metadataResolving( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         out.println( "Resolving metadata " + event.getMetadata() + " from " + event.getRepository() );
     }
 
diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ConsoleTransferListener.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ConsoleTransferListener.java
index bba92d8..ad48993 100644
--- a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ConsoleTransferListener.java
+++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ConsoleTransferListener.java
@@ -31,6 +31,8 @@ import org.eclipse.aether.transfer.MetadataNotFoundException;
 import org.eclipse.aether.transfer.TransferEvent;
 import org.eclipse.aether.transfer.TransferResource;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A simplistic transfer listener that logs uploads/downloads to the console.
  */
@@ -57,6 +59,7 @@ public class ConsoleTransferListener
     @Override
     public void transferInitiated( TransferEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         String message = event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploading" : "Downloading";
 
         out.println( message + ": " + event.getResource().getRepositoryUrl() + event.getResource().getResourceName() );
@@ -65,6 +68,7 @@ public class ConsoleTransferListener
     @Override
     public void transferProgressed( TransferEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         TransferResource resource = event.getResource();
         downloads.put( resource, event.getTransferredBytes() );
 
@@ -120,6 +124,7 @@ public class ConsoleTransferListener
     @Override
     public void transferSucceeded( TransferEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         transferCompleted( event );
 
         TransferResource resource = event.getResource();
@@ -147,6 +152,7 @@ public class ConsoleTransferListener
     @Override
     public void transferFailed( TransferEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         transferCompleted( event );
 
         if ( !( event.getException() instanceof MetadataNotFoundException ) )
@@ -157,6 +163,7 @@ public class ConsoleTransferListener
 
     private void transferCompleted( TransferEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         downloads.remove( event.getResource() );
 
         StringBuilder buffer = new StringBuilder( 64 );
@@ -167,6 +174,7 @@ public class ConsoleTransferListener
 
     public void transferCorrupted( TransferEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         event.getException().printStackTrace( out );
     }
 
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/AbstractChecksumPolicy.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/AbstractChecksumPolicy.java
index 7fe0822..32fb0a9 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/AbstractChecksumPolicy.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/AbstractChecksumPolicy.java
@@ -25,6 +25,8 @@ import org.eclipse.aether.transfer.TransferResource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static java.util.Objects.requireNonNull;
+
 abstract class AbstractChecksumPolicy
     implements ChecksumPolicy
 {
@@ -40,12 +42,15 @@ abstract class AbstractChecksumPolicy
 
     public boolean onChecksumMatch( String algorithm, int kind )
     {
+        requireNonNull( algorithm, "algorithm cannot be null" );
         return true;
     }
 
     public void onChecksumMismatch( String algorithm, int kind, ChecksumFailureException exception )
         throws ChecksumFailureException
     {
+        requireNonNull( algorithm, "algorithm cannot be null" );
+        requireNonNull( exception, "exception cannot be null" );
         if ( ( kind & KIND_UNOFFICIAL ) == 0 )
         {
             throw exception;
@@ -55,6 +60,8 @@ abstract class AbstractChecksumPolicy
     public void onChecksumError( String algorithm, int kind, ChecksumFailureException exception )
         throws ChecksumFailureException
     {
+        requireNonNull( algorithm, "algorithm cannot be null" );
+        requireNonNull( exception, "exception cannot be null" );
         logger.debug( "Could not validate {} checksum for {}", algorithm, resource.getResourceName(), exception );
     }
 
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java
index 12ef0d6..430ea38 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java
@@ -206,6 +206,9 @@ public class DefaultArtifactResolver
     public ArtifactResult resolveArtifact( RepositorySystemSession session, ArtifactRequest request )
         throws ArtifactResolutionException
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( session, "session cannot be null" );
+
         return resolveArtifacts( session, Collections.singleton( request ) ).get( 0 );
     }
 
@@ -213,7 +216,8 @@ public class DefaultArtifactResolver
                                                   Collection<? extends ArtifactRequest> requests )
         throws ArtifactResolutionException
     {
-
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( session, "session cannot be null" );
         try ( SyncContext syncContext = syncContextFactory.newInstance( session, false ) )
         {
             Collection<Artifact> artifacts = new ArrayList<>( requests.size() );
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDeployer.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDeployer.java
index 51a210e..4d87e68 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDeployer.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDeployer.java
@@ -202,6 +202,8 @@ public class DefaultDeployer
     public DeployResult deploy( RepositorySystemSession session, DeployRequest request )
         throws DeploymentException
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( request, "request cannot be null" );
         try
         {
             Utils.checkOffline( session, offlineController, request.getRepository() );
@@ -576,6 +578,7 @@ public class DefaultDeployer
             throws TransferCancelledException
         {
             super.transferInitiated( event );
+            requireNonNull( event, "event cannot be null" );
             catapult.artifactDeploying( transfer.getArtifact(), transfer.getFile() );
         }
 
@@ -583,6 +586,7 @@ public class DefaultDeployer
         public void transferFailed( TransferEvent event )
         {
             super.transferFailed( event );
+            requireNonNull( event, "event cannot be null" );
             catapult.artifactDeployed( transfer.getArtifact(), transfer.getFile(), transfer.getException() );
         }
 
@@ -590,6 +594,7 @@ public class DefaultDeployer
         public void transferSucceeded( TransferEvent event )
         {
             super.transferSucceeded( event );
+            requireNonNull( event, "event cannot be null" );
             catapult.artifactDeployed( transfer.getArtifact(), transfer.getFile(), null );
         }
 
@@ -615,6 +620,7 @@ public class DefaultDeployer
             throws TransferCancelledException
         {
             super.transferInitiated( event );
+            requireNonNull( event, "event cannot be null" );
             catapult.metadataDeploying( transfer.getMetadata(), transfer.getFile() );
         }
 
@@ -622,6 +628,7 @@ public class DefaultDeployer
         public void transferFailed( TransferEvent event )
         {
             super.transferFailed( event );
+            requireNonNull( event, "event cannot be null" );
             catapult.metadataDeployed( transfer.getMetadata(), transfer.getFile(), transfer.getException() );
         }
 
@@ -629,6 +636,7 @@ public class DefaultDeployer
         public void transferSucceeded( TransferEvent event )
         {
             super.transferSucceeded( event );
+            requireNonNull( event, "event cannot be null" );
             catapult.metadataDeployed( transfer.getMetadata(), transfer.getFile(), null );
         }
 
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultInstaller.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultInstaller.java
index 16f2145..6b3f7a7 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultInstaller.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultInstaller.java
@@ -142,7 +142,8 @@ public class DefaultInstaller
     public InstallResult install( RepositorySystemSession session, InstallRequest request )
         throws InstallationException
     {
-
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( request, "request cannot be null" );
         try ( SyncContext syncContext = syncContextFactory.newInstance( session, false ) )
         {
             return install( syncContext, session, request );
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultLocalRepositoryProvider.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultLocalRepositoryProvider.java
index da0d59c..26110ec 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultLocalRepositoryProvider.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultLocalRepositoryProvider.java
@@ -92,6 +92,8 @@ public class DefaultLocalRepositoryProvider
                                                              LocalRepository repository )
         throws NoLocalRepositoryManagerException
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( repository, "repository cannot be null" );
         PrioritizedComponents<LocalRepositoryManagerFactory> factories = new PrioritizedComponents<>( session );
         for ( LocalRepositoryManagerFactory factory : this.managerFactories )
         {
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultMetadataResolver.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultMetadataResolver.java
index 8774364..74e6739 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultMetadataResolver.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultMetadataResolver.java
@@ -169,7 +169,8 @@ public class DefaultMetadataResolver
     public List<MetadataResult> resolveMetadata( RepositorySystemSession session,
                                                  Collection<? extends MetadataRequest> requests )
     {
-
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( requests, "requests cannot be null" );
         try ( SyncContext syncContext = syncContextFactory.newInstance( session, false ) )
         {
             Collection<Metadata> metadata = new ArrayList<>( requests.size() );
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultOfflineController.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultOfflineController.java
index 63764eb..e4a3a86 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultOfflineController.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultOfflineController.java
@@ -30,6 +30,8 @@ import org.eclipse.aether.repository.RemoteRepository;
 import org.eclipse.aether.transfer.RepositoryOfflineException;
 import org.eclipse.aether.util.ConfigUtils;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * 
  */
@@ -53,6 +55,8 @@ public class DefaultOfflineController
     public void checkOffline( RepositorySystemSession session, RemoteRepository repository )
         throws RepositoryOfflineException
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( repository, "repository cannot be null" );
         if ( isOfflineProtocol( session, repository ) || isOfflineHost( session, repository ) )
         {
             return;
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRemoteRepositoryManager.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRemoteRepositoryManager.java
index 393f876..6c71277 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRemoteRepositoryManager.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRemoteRepositoryManager.java
@@ -131,6 +131,9 @@ public class DefaultRemoteRepositoryManager
                                                          List<RemoteRepository> recessiveRepositories,
                                                          boolean recessiveIsRaw )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( dominantRepositories, "dominantRepositories cannot be null" );
+        requireNonNull( recessiveRepositories, "recessiveRepositories cannot be null" );
         if ( recessiveRepositories.isEmpty() )
         {
             return dominantRepositories;
@@ -275,6 +278,8 @@ public class DefaultRemoteRepositoryManager
     public RepositoryPolicy getPolicy( RepositorySystemSession session, RemoteRepository repository, boolean releases,
                                        boolean snapshots )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( repository, "repository cannot be null" );
         RepositoryPolicy policy1 = releases ? repository.getPolicy( false ) : null;
         RepositoryPolicy policy2 = snapshots ? repository.getPolicy( true ) : null;
         return merge( session, policy1, policy2, true );
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositoryEventDispatcher.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositoryEventDispatcher.java
index e6ea7d3..864b1b2 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositoryEventDispatcher.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositoryEventDispatcher.java
@@ -85,6 +85,7 @@ public class DefaultRepositoryEventDispatcher
 
     public void dispatch( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         if ( !listeners.isEmpty() )
         {
             for ( RepositoryListener listener : listeners )
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositoryLayoutProvider.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositoryLayoutProvider.java
index 8b1c3f2..2dcfd08 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositoryLayoutProvider.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositoryLayoutProvider.java
@@ -90,6 +90,7 @@ public final class DefaultRepositoryLayoutProvider
     public RepositoryLayout newRepositoryLayout( RepositorySystemSession session, RemoteRepository repository )
         throws NoRepositoryLayoutException
     {
+        requireNonNull( session, "session cannot be null" );
         requireNonNull( repository, "remote repository cannot be null" );
 
         PrioritizedComponents<RepositoryLayoutFactory> factories = new PrioritizedComponents<>( session );
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositorySystem.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositorySystem.java
index eb0f79d..f079cff 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositorySystem.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositorySystem.java
@@ -239,6 +239,8 @@ public class DefaultRepositorySystem
         throws VersionResolutionException
     {
         validateSession( session );
+        requireNonNull( request, "request cannot be null" );
+
         return versionResolver.resolveVersion( session, request );
     }
 
@@ -246,6 +248,8 @@ public class DefaultRepositorySystem
         throws VersionRangeResolutionException
     {
         validateSession( session );
+        requireNonNull( request, "request cannot be null" );
+
         return versionRangeResolver.resolveVersionRange( session, request );
     }
 
@@ -254,6 +258,8 @@ public class DefaultRepositorySystem
         throws ArtifactDescriptorException
     {
         validateSession( session );
+        requireNonNull( request, "request cannot be null" );
+
         return artifactDescriptorReader.readArtifactDescriptor( session, request );
     }
 
@@ -261,6 +267,8 @@ public class DefaultRepositorySystem
         throws ArtifactResolutionException
     {
         validateSession( session );
+        requireNonNull( session, "session cannot be null" );
+
         return artifactResolver.resolveArtifact( session, request );
     }
 
@@ -269,6 +277,8 @@ public class DefaultRepositorySystem
         throws ArtifactResolutionException
     {
         validateSession( session );
+        requireNonNull( requests, "requests cannot be null" );
+
         return artifactResolver.resolveArtifacts( session, requests );
     }
 
@@ -276,6 +286,8 @@ public class DefaultRepositorySystem
                                                  Collection<? extends MetadataRequest> requests )
     {
         validateSession( session );
+        requireNonNull( requests, "requests cannot be null" );
+
         return metadataResolver.resolveMetadata( session, requests );
     }
 
@@ -283,6 +295,8 @@ public class DefaultRepositorySystem
         throws DependencyCollectionException
     {
         validateSession( session );
+        requireNonNull( request, "request cannot be null" );
+
         return dependencyCollector.collectDependencies( session, request );
     }
 
@@ -290,6 +304,7 @@ public class DefaultRepositorySystem
         throws DependencyResolutionException
     {
         validateSession( session );
+        requireNonNull( request, "request cannot be null" );
 
         RequestTrace trace = RequestTrace.newChild( request.getTrace(), request );
 
@@ -378,6 +393,8 @@ public class DefaultRepositorySystem
         throws InstallationException
     {
         validateSession( session );
+        requireNonNull( request, "request cannot be null" );
+
         return installer.install( session, request );
     }
 
@@ -385,12 +402,17 @@ public class DefaultRepositorySystem
         throws DeploymentException
     {
         validateSession( session );
+        requireNonNull( request, "request cannot be null" );
+
         return deployer.deploy( session, request );
     }
 
     public LocalRepositoryManager newLocalRepositoryManager( RepositorySystemSession session,
                                                              LocalRepository localRepository )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( localRepository, "localRepository cannot be null" );
+
         try
         {
             return localRepositoryProvider.newLocalRepositoryManager( session, localRepository );
@@ -411,6 +433,8 @@ public class DefaultRepositorySystem
                                                              List<RemoteRepository> repositories )
     {
         validateSession( session );
+        validateRepositories( repositories );
+
         repositories =
             remoteRepositoryManager.aggregateRepositories( session, new ArrayList<RemoteRepository>(), repositories,
                                                            true );
@@ -420,6 +444,8 @@ public class DefaultRepositorySystem
     public RemoteRepository newDeploymentRepository( RepositorySystemSession session, RemoteRepository repository )
     {
         validateSession( session );
+        requireNonNull( repository, "repository cannot be null" );
+
         RemoteRepository.Builder builder = new RemoteRepository.Builder( repository );
         Authentication auth = session.getAuthenticationSelector().getAuthentication( repository );
         builder.setAuthentication( auth );
@@ -442,6 +468,15 @@ public class DefaultRepositorySystem
         invalidSession( session.getData(), "data" );
     }
 
+    private void validateRepositories( List<RemoteRepository> repositories )
+    {
+        requireNonNull( repositories, "repositories cannot be null" );
+        for ( RemoteRepository repository: repositories )
+        {
+            requireNonNull( repository, "repository cannot be null" );
+        }
+    }
+
     private void invalidSession( Object obj, String name )
     {
         requireNonNull( obj, "repository system session's " + name + " cannot be null" );
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultTransporterProvider.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultTransporterProvider.java
index 43357e8..af1d1d4 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultTransporterProvider.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultTransporterProvider.java
@@ -90,7 +90,8 @@ public final class DefaultTransporterProvider
     public Transporter newTransporter( RepositorySystemSession session, RemoteRepository repository )
         throws NoTransporterException
     {
-        requireNonNull( repository, "remote repository cannot be null" );
+        requireNonNull( "session", "session cannot be null" );
+        requireNonNull( "repository", "repository cannot be null" );
 
         PrioritizedComponents<TransporterFactory> factories = new PrioritizedComponents<>( session );
         for ( TransporterFactory factory : this.factories )
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManager.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManager.java
index e4aba83..c48959d 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManager.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManager.java
@@ -116,6 +116,8 @@ public class DefaultUpdateCheckManager
 
     public void checkArtifact( RepositorySystemSession session, UpdateCheck<Artifact, ArtifactTransferException> check )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( check, "check cannot be null" );
         if ( check.getLocalLastUpdated() != 0
             && !isUpdatedRequired( session, check.getLocalLastUpdated(), check.getPolicy() ) )
         {
@@ -241,6 +243,8 @@ public class DefaultUpdateCheckManager
 
     public void checkMetadata( RepositorySystemSession session, UpdateCheck<Metadata, MetadataTransferException> check )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( check, "check cannot be null" );
         if ( check.getLocalLastUpdated() != 0
             && !isUpdatedRequired( session, check.getLocalLastUpdated(), check.getPolicy() ) )
         {
@@ -525,6 +529,8 @@ public class DefaultUpdateCheckManager
 
     public void touchArtifact( RepositorySystemSession session, UpdateCheck<Artifact, ArtifactTransferException> check )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( check, "check cannot be null" );
         File artifactFile = check.getFile();
         File touchFile = getArtifactTouchFile( artifactFile );
 
@@ -555,6 +561,8 @@ public class DefaultUpdateCheckManager
 
     public void touchMetadata( RepositorySystemSession session, UpdateCheck<Metadata, MetadataTransferException> check )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( check, "check cannot be null" );
         File metadataFile = check.getFile();
         File touchFile = getMetadataTouchFile( metadataFile );
 
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultUpdatePolicyAnalyzer.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultUpdatePolicyAnalyzer.java
index 5730c76..253ac59 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultUpdatePolicyAnalyzer.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultUpdatePolicyAnalyzer.java
@@ -30,6 +30,8 @@ import org.eclipse.aether.repository.RepositoryPolicy;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  */
 @Singleton
@@ -47,6 +49,7 @@ public class DefaultUpdatePolicyAnalyzer
 
     public String getEffectiveUpdatePolicy( RepositorySystemSession session, String policy1, String policy2 )
     {
+        requireNonNull( session, "session cannot be null" );
         return ordinalOfUpdatePolicy( policy1 ) < ordinalOfUpdatePolicy( policy2 ) ? policy1 : policy2;
     }
 
@@ -74,6 +77,7 @@ public class DefaultUpdatePolicyAnalyzer
 
     public boolean isUpdatedRequired( RepositorySystemSession session, long lastModified, String policy )
     {
+        requireNonNull( session, "session cannot be null" );
         boolean checkForUpdates;
 
         if ( policy == null )
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManagerFactory.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManagerFactory.java
index fb33ed5..56ace05 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManagerFactory.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManagerFactory.java
@@ -8,9 +8,9 @@ package org.eclipse.aether.internal.impl;
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  *  http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -69,6 +69,9 @@ public class EnhancedLocalRepositoryManagerFactory
     public LocalRepositoryManager newInstance( RepositorySystemSession session, LocalRepository repository )
         throws NoLocalRepositoryManagerException
     {
+        Objects.requireNonNull( "session", "session cannot be null" );
+        Objects.requireNonNull( "repository", "repository cannot be null" );
+
         if ( "".equals( repository.getContentType() ) || "default".equals( repository.getContentType() ) )
         {
             return new EnhancedLocalRepositoryManager( repository.getBasedir(), session, trackingFileManager );
@@ -86,7 +89,7 @@ public class EnhancedLocalRepositoryManagerFactory
 
     /**
      * Sets the priority of this component.
-     * 
+     *
      * @param priority The priority.
      * @return This component for chaining, never {@code null}.
      */
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory.java
index ddf3df7..82933e4 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory.java
@@ -38,6 +38,8 @@ import org.eclipse.aether.spi.connector.layout.RepositoryLayoutFactory;
 import org.eclipse.aether.transfer.NoRepositoryLayoutException;
 import org.eclipse.aether.util.ConfigUtils;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * Provides a Maven-2 repository layout for repositories with content type {@code "default"}.
  */
@@ -74,6 +76,8 @@ public final class Maven2RepositoryLayoutFactory
     public RepositoryLayout newInstance( RepositorySystemSession session, RemoteRepository repository )
         throws NoRepositoryLayoutException
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( repository, "repository cannot be null" );
         if ( !"default".equals( repository.getContentType() ) )
         {
             throw new NoRepositoryLayoutException( repository );
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/SafeTransferListener.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/SafeTransferListener.java
index 4a66a14..c690fd1 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/SafeTransferListener.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/SafeTransferListener.java
@@ -27,6 +27,8 @@ import org.eclipse.aether.transfer.TransferListener;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static java.util.Objects.requireNonNull;
+
 class SafeTransferListener
     extends AbstractTransferListener
 {
@@ -65,6 +67,7 @@ class SafeTransferListener
     public void transferInitiated( TransferEvent event )
         throws TransferCancelledException
     {
+        requireNonNull( event, "event cannot be null" );
         if ( listener != null )
         {
             try
@@ -82,6 +85,7 @@ class SafeTransferListener
     public void transferStarted( TransferEvent event )
         throws TransferCancelledException
     {
+        requireNonNull( event, "event cannot be null" );
         if ( listener != null )
         {
             try
@@ -99,6 +103,7 @@ class SafeTransferListener
     public void transferProgressed( TransferEvent event )
         throws TransferCancelledException
     {
+        requireNonNull( event, "event cannot be null" );
         if ( listener != null )
         {
             try
@@ -116,6 +121,7 @@ class SafeTransferListener
     public void transferCorrupted( TransferEvent event )
         throws TransferCancelledException
     {
+        requireNonNull( event, "event cannot be null" );
         if ( listener != null )
         {
             try
@@ -132,6 +138,7 @@ class SafeTransferListener
     @Override
     public void transferSucceeded( TransferEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         if ( listener != null )
         {
             try
@@ -148,6 +155,7 @@ class SafeTransferListener
     @Override
     public void transferFailed( TransferEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         if ( listener != null )
         {
             try
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/SimpleLocalRepositoryManager.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/SimpleLocalRepositoryManager.java
index 55f114b..9023d17 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/SimpleLocalRepositoryManager.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/SimpleLocalRepositoryManager.java
@@ -102,21 +102,27 @@ class SimpleLocalRepositoryManager
 
     public String getPathForLocalArtifact( Artifact artifact )
     {
+        requireNonNull( artifact, "artifact cannot be null" );
         return getPathForArtifact( artifact, true );
     }
 
     public String getPathForRemoteArtifact( Artifact artifact, RemoteRepository repository, String context )
     {
+        requireNonNull( artifact, "artifact cannot be null" );
+        requireNonNull( repository, "repository cannot be null" );
         return getPathForArtifact( artifact, false );
     }
 
     public String getPathForLocalMetadata( Metadata metadata )
     {
+        requireNonNull( metadata, "metadata cannot be null" );
         return getPath( metadata, "local" );
     }
 
     public String getPathForRemoteMetadata( Metadata metadata, RemoteRepository repository, String context )
     {
+        requireNonNull( metadata, "metadata cannot be null" );
+        requireNonNull( repository, "repository cannot be null" );
         return getPath( metadata, getRepositoryKey( repository, context ) );
     }
 
@@ -201,6 +207,8 @@ class SimpleLocalRepositoryManager
 
     public LocalArtifactResult find( RepositorySystemSession session, LocalArtifactRequest request )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( request, "request cannot be null" );
         String path = getPathForArtifact( request.getArtifact(), false );
         File file = new File( getRepository().getBasedir(), path );
 
@@ -216,6 +224,8 @@ class SimpleLocalRepositoryManager
 
     public void add( RepositorySystemSession session, LocalArtifactRegistration request )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( request, "request cannot be null" );
         // noop
     }
 
@@ -227,6 +237,8 @@ class SimpleLocalRepositoryManager
 
     public LocalMetadataResult find( RepositorySystemSession session, LocalMetadataRequest request )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( request, "request cannot be null" );
         LocalMetadataResult result = new LocalMetadataResult( request );
 
         String path;
@@ -255,6 +267,8 @@ class SimpleLocalRepositoryManager
 
     public void add( RepositorySystemSession session, LocalMetadataRegistration request )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( request, "request cannot be null" );
         // noop
     }
 
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/SimpleLocalRepositoryManagerFactory.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/SimpleLocalRepositoryManagerFactory.java
index 7ef6d88..1be1bce 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/SimpleLocalRepositoryManagerFactory.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/SimpleLocalRepositoryManagerFactory.java
@@ -8,9 +8,9 @@ package org.eclipse.aether.internal.impl;
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  *  http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -22,6 +22,8 @@ package org.eclipse.aether.internal.impl;
 import javax.inject.Named;
 import javax.inject.Singleton;
 
+import java.util.Objects;
+
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.repository.LocalRepository;
 import org.eclipse.aether.repository.LocalRepositoryManager;
@@ -46,6 +48,9 @@ public class SimpleLocalRepositoryManagerFactory
     public LocalRepositoryManager newInstance( RepositorySystemSession session, LocalRepository repository )
         throws NoLocalRepositoryManagerException
     {
+        Objects.requireNonNull( "session", "session cannot be null" );
+        Objects.requireNonNull( "repository", "repository cannot be null" );
+
         if ( "".equals( repository.getContentType() ) || "simple".equals( repository.getContentType() ) )
         {
             return new SimpleLocalRepositoryManager( repository.getBasedir() );
@@ -63,7 +68,7 @@ public class SimpleLocalRepositoryManagerFactory
 
     /**
      * Sets the priority of this component.
-     * 
+     *
      * @param priority The priority.
      * @return This component for chaining, never {@code null}.
      */
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java
index 6127451..05aca9c 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector.java
@@ -143,6 +143,8 @@ public class DefaultDependencyCollector
     public CollectResult collectDependencies( RepositorySystemSession session, CollectRequest request )
         throws DependencyCollectionException
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( request, "request cannot be null" );
         session = optimizeSession( session );
 
         RequestTrace trace = RequestTrace.newChild( request.getTrace(), request );
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/DefaultSyncContextFactory.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/DefaultSyncContextFactory.java
index 1775c75..733f25c 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/DefaultSyncContextFactory.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/DefaultSyncContextFactory.java
@@ -33,6 +33,8 @@ import org.eclipse.aether.spi.locator.Service;
 import org.eclipse.aether.spi.locator.ServiceLocator;
 import org.eclipse.aether.spi.synccontext.SyncContextFactory;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * Default {@link SyncContextFactory} implementation that uses named locks.
  */
@@ -78,6 +80,7 @@ public final class DefaultSyncContextFactory
     @Override
     public SyncContext newInstance( final RepositorySystemSession session, final boolean shared )
     {
+        requireNonNull( session, "session cannot be null" );
         return namedLockFactoryAdapter.newInstance( session, shared );
     }
 
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/legacy/DefaultSyncContextFactory.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/legacy/DefaultSyncContextFactory.java
index 7925ac6..669f558 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/legacy/DefaultSyncContextFactory.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/legacy/DefaultSyncContextFactory.java
@@ -31,6 +31,8 @@ import org.eclipse.aether.spi.locator.Service;
 import org.eclipse.aether.spi.locator.ServiceLocator;
 import org.eclipse.aether.spi.synccontext.SyncContextFactory;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * Deprecated {@link org.eclipse.aether.impl.SyncContextFactory} implementation that delegates to proper
  * {@link SyncContextFactory} implementation. Used in Guice/SISU where we cannot bind same instance to two keys,
@@ -66,6 +68,7 @@ public final class DefaultSyncContextFactory
     @Override
     public SyncContext newInstance( final RepositorySystemSession session, final boolean shared )
     {
+        requireNonNull( session, "session cannot be null" );
         return delegate.newInstance( session, shared );
     }
 }
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/impl/StubVersionRangeResolver.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/impl/StubVersionRangeResolver.java
index 924ff5a..d3ba164 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/impl/StubVersionRangeResolver.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/impl/StubVersionRangeResolver.java
@@ -23,12 +23,16 @@ import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.resolution.VersionRangeRequest;
 import org.eclipse.aether.resolution.VersionRangeResult;
 
+import static java.util.Objects.requireNonNull;
+
 public class StubVersionRangeResolver
     implements VersionRangeResolver
 {
 
     public VersionRangeResult resolveVersionRange( RepositorySystemSession session, VersionRangeRequest request )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( request, "request cannot be null" );
         return new VersionRangeResult( request );
     }
 
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/impl/StubVersionResolver.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/impl/StubVersionResolver.java
index 4baa461..f760f4c 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/impl/StubVersionResolver.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/impl/StubVersionResolver.java
@@ -24,6 +24,8 @@ import org.eclipse.aether.resolution.VersionRequest;
 import org.eclipse.aether.resolution.VersionResolutionException;
 import org.eclipse.aether.resolution.VersionResult;
 
+import static java.util.Objects.requireNonNull;
+
 public class StubVersionResolver
     implements VersionResolver
 {
@@ -31,6 +33,8 @@ public class StubVersionResolver
     public VersionResult resolveVersion( RepositorySystemSession session, VersionRequest request )
         throws VersionResolutionException
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( request, "request cannot be null" );
         return new VersionResult( request );
     }
 
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultDeployerTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultDeployerTest.java
index fa7dc42..6664d28 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultDeployerTest.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultDeployerTest.java
@@ -19,6 +19,7 @@ package org.eclipse.aether.internal.impl;
  * under the License.
  */
 
+import static java.util.Objects.requireNonNull;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
@@ -322,6 +323,8 @@ public class DefaultDeployerTest
             public void merge( File current, File result )
                 throws RepositoryException
             {
+                requireNonNull( current, "current cannot be null" );
+                requireNonNull( result, "result cannot be null" );
                 Properties props = new Properties();
 
                 try
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultRemoteRepositoryManagerTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultRemoteRepositoryManagerTest.java
index ecf1ba1..f799ed9 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultRemoteRepositoryManagerTest.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultRemoteRepositoryManagerTest.java
@@ -19,6 +19,7 @@ package org.eclipse.aether.internal.impl;
  * under the License.
  */
 
+import static java.util.Objects.requireNonNull;
 import static org.junit.Assert.*;
 
 import java.util.Arrays;
@@ -268,6 +269,7 @@ public class DefaultRemoteRepositoryManagerTest
 
         public String getEffectiveUpdatePolicy( RepositorySystemSession session, String policy1, String policy2 )
         {
+            requireNonNull( session, "session cannot be null" );
             return ordinalOfUpdatePolicy( policy1 ) < ordinalOfUpdatePolicy( policy2 ) ? policy1 : policy2;
         }
 
@@ -295,6 +297,7 @@ public class DefaultRemoteRepositoryManagerTest
 
         public boolean isUpdatedRequired( RepositorySystemSession session, long lastModified, String policy )
         {
+            requireNonNull( session, "session cannot be null" );
             return false;
         }
 
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/RecordingRepositoryListener.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/RecordingRepositoryListener.java
index a6f91f1..a9956da 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/RecordingRepositoryListener.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/RecordingRepositoryListener.java
@@ -26,6 +26,8 @@ import java.util.List;
 import org.eclipse.aether.RepositoryEvent;
 import org.eclipse.aether.RepositoryListener;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * Collects observed repository events for later inspection.
  */
@@ -47,96 +49,115 @@ class RecordingRepositoryListener
 
     public void artifactDescriptorInvalid( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         events.add( event );
     }
 
     public void artifactDescriptorMissing( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         events.add( event );
     }
 
     public void metadataInvalid( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         events.add( event );
     }
 
     public void artifactResolving( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         events.add( event );
     }
 
     public void artifactResolved( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         events.add( event );
     }
 
     public void artifactDownloading( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         events.add( event );
     }
 
     public void artifactDownloaded( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         events.add( event );
     }
 
     public void metadataDownloaded( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         events.add( event );
     }
 
     public void metadataDownloading( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         events.add( event );
     }
 
     public void metadataResolving( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         events.add( event );
     }
 
     public void metadataResolved( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         events.add( event );
     }
 
     public void artifactInstalling( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         events.add( event );
     }
 
     public void artifactInstalled( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         events.add( event );
     }
 
     public void metadataInstalling( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         events.add( event );
     }
 
     public void metadataInstalled( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         events.add( event );
     }
 
     public void artifactDeploying( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         events.add( event );
     }
 
     public void artifactDeployed( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         events.add( event );
     }
 
     public void metadataDeploying( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         events.add( event );
     }
 
     public void metadataDeployed( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         events.add( event );
     }
 
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StaticUpdateCheckManager.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StaticUpdateCheckManager.java
index 334d544..c9889d0 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StaticUpdateCheckManager.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StaticUpdateCheckManager.java
@@ -29,6 +29,8 @@ import org.eclipse.aether.transfer.ArtifactTransferException;
 import org.eclipse.aether.transfer.MetadataNotFoundException;
 import org.eclipse.aether.transfer.MetadataTransferException;
 
+import static java.util.Objects.requireNonNull;
+
 class StaticUpdateCheckManager
     implements UpdateCheckManager
 {
@@ -50,14 +52,20 @@ class StaticUpdateCheckManager
 
     public void touchMetadata( RepositorySystemSession session, UpdateCheck<Metadata, MetadataTransferException> check )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( check, "check cannot be null" );
     }
 
     public void touchArtifact( RepositorySystemSession session, UpdateCheck<Artifact, ArtifactTransferException> check )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( check, "check cannot be null" );
     }
 
     public void checkMetadata( RepositorySystemSession session, UpdateCheck<Metadata, MetadataTransferException> check )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( check, "check cannot be null" );
         check.setRequired( checkRequired );
 
         if ( check.getLocalLastUpdated() != 0L && localUpToDate )
@@ -72,6 +80,8 @@ class StaticUpdateCheckManager
 
     public void checkArtifact( RepositorySystemSession session, UpdateCheck<Artifact, ArtifactTransferException> check )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( check, "check cannot be null" );
         check.setRequired( checkRequired );
 
         if ( check.getLocalLastUpdated() != 0L && localUpToDate )
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubRemoteRepositoryManager.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubRemoteRepositoryManager.java
index 5471069..af66f34 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubRemoteRepositoryManager.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubRemoteRepositoryManager.java
@@ -27,6 +27,8 @@ import org.eclipse.aether.impl.RemoteRepositoryManager;
 import org.eclipse.aether.repository.RemoteRepository;
 import org.eclipse.aether.repository.RepositoryPolicy;
 
+import static java.util.Objects.requireNonNull;
+
 public class StubRemoteRepositoryManager
     implements RemoteRepositoryManager
 {
@@ -40,12 +42,17 @@ public class StubRemoteRepositoryManager
                                                          List<RemoteRepository> recessiveRepositories,
                                                          boolean recessiveIsRaw )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( dominantRepositories, "dominantRepositories cannot be null" );
+        requireNonNull( recessiveRepositories, "recessiveRepositories cannot be null" );
         return dominantRepositories;
     }
 
     public RepositoryPolicy getPolicy( RepositorySystemSession session, RemoteRepository repository, boolean releases,
                                        boolean snapshots )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( repository, "repository cannot be null" );
         RepositoryPolicy policy = repository.getPolicy( snapshots );
 
         String checksums = session.getChecksumPolicy();
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubRepositoryEventDispatcher.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubRepositoryEventDispatcher.java
index b5168e4..b1e9db4 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubRepositoryEventDispatcher.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubRepositoryEventDispatcher.java
@@ -23,6 +23,8 @@ import org.eclipse.aether.RepositoryEvent;
 import org.eclipse.aether.RepositoryListener;
 import org.eclipse.aether.impl.RepositoryEventDispatcher;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  */
 public class StubRepositoryEventDispatcher
@@ -31,6 +33,7 @@ public class StubRepositoryEventDispatcher
 
     public void dispatch( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         RepositoryListener listener = event.getSession().getRepositoryListener();
         if ( listener == null )
         {
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubSyncContextFactory.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubSyncContextFactory.java
index e8ac3bf..7cea5e6 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubSyncContextFactory.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubSyncContextFactory.java
@@ -27,6 +27,8 @@ import org.eclipse.aether.artifact.Artifact;
 import org.eclipse.aether.spi.synccontext.SyncContextFactory;
 import org.eclipse.aether.metadata.Metadata;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * 
  */
@@ -36,6 +38,7 @@ public class StubSyncContextFactory
 
     public SyncContext newInstance( RepositorySystemSession session, boolean shared )
     {
+        requireNonNull( session, "session cannot be null" );
         return new SyncContext()
         {
             public void close()
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubVersionRangeResolver.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubVersionRangeResolver.java
index ae415d7..5ace761 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubVersionRangeResolver.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubVersionRangeResolver.java
@@ -30,6 +30,8 @@ import org.eclipse.aether.version.Version;
 import org.eclipse.aether.version.VersionConstraint;
 import org.eclipse.aether.version.VersionScheme;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  */
 public class StubVersionRangeResolver
@@ -41,6 +43,8 @@ public class StubVersionRangeResolver
     public VersionRangeResult resolveVersionRange( RepositorySystemSession session, VersionRangeRequest request )
         throws VersionRangeResolutionException
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( request, "request cannot be null" );
         VersionRangeResult result = new VersionRangeResult( request );
         try
         {
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubVersionResolver.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubVersionResolver.java
index 10a54f1..9ef7e7a 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubVersionResolver.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubVersionResolver.java
@@ -24,6 +24,8 @@ import org.eclipse.aether.impl.VersionResolver;
 import org.eclipse.aether.resolution.VersionRequest;
 import org.eclipse.aether.resolution.VersionResult;
 
+import static java.util.Objects.requireNonNull;
+
 /* *
  */
 class StubVersionResolver
@@ -32,6 +34,8 @@ class StubVersionResolver
 
     public VersionResult resolveVersion( RepositorySystemSession session, VersionRequest request )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( request, "request cannot be null" );
         VersionResult result = new VersionResult( request ).setVersion( request.getArtifact().getVersion() );
         if ( request.getRepositories().size() > 0 )
         {
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectorTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectorTest.java
index 3232040..e8f2600 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectorTest.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectorTest.java
@@ -18,6 +18,7 @@ package org.eclipse.aether.internal.impl.collect;
  * specific language governing permissions and limitations
  * under the License.
  */
+import static java.util.Objects.requireNonNull;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -615,9 +616,10 @@ public class DefaultDependencyCollectorTest
             this.exclusions.put( id, exclusions != null ? Arrays.asList( exclusions ) : null );
         }
 
-        public DependencyManagement manageDependency( Dependency d )
+        public DependencyManagement manageDependency( Dependency dependency )
         {
-            String id = toKey( d );
+            requireNonNull( dependency, "dependency cannot be null" );
+            String id = toKey( dependency );
             DependencyManagement mgmt = new DependencyManagement();
             mgmt.setVersion( versions.get( id ) );
             mgmt.setScope( scopes.get( id ) );
@@ -638,6 +640,7 @@ public class DefaultDependencyCollectorTest
 
         public DependencyManager deriveChildManager( DependencyCollectionContext context )
         {
+            requireNonNull( context, "context cannot be null" );
             return this;
         }
 
diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/AbstractTransporter.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/AbstractTransporter.java
index 39e632c..125d84d 100644
--- a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/AbstractTransporter.java
+++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/AbstractTransporter.java
@@ -24,6 +24,7 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.Buffer;
 import java.nio.ByteBuffer;
+import java.util.Objects;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.eclipse.aether.transfer.TransferCancelledException;
@@ -48,6 +49,8 @@ public abstract class AbstractTransporter
     public void peek( PeekTask task )
         throws Exception
     {
+        Objects.requireNonNull( "task", "task cannot be null" );
+
         failIfClosed( task );
         implPeek( task );
     }
@@ -64,6 +67,8 @@ public abstract class AbstractTransporter
     public void get( GetTask task )
         throws Exception
     {
+        Objects.requireNonNull( "task", "task cannot be null" );
+
         failIfClosed( task );
         implGet( task );
     }
@@ -144,6 +149,8 @@ public abstract class AbstractTransporter
     public void put( PutTask task )
         throws Exception
     {
+        Objects.requireNonNull( "task", "task cannot be null" );
+
         failIfClosed( task );
         implPut( task );
     }
diff --git a/maven-resolver-test-util/src/main/java/org/eclipse/aether/internal/test/util/IniArtifactDescriptorReader.java b/maven-resolver-test-util/src/main/java/org/eclipse/aether/internal/test/util/IniArtifactDescriptorReader.java
index 4efe880..c571517 100644
--- a/maven-resolver-test-util/src/main/java/org/eclipse/aether/internal/test/util/IniArtifactDescriptorReader.java
+++ b/maven-resolver-test-util/src/main/java/org/eclipse/aether/internal/test/util/IniArtifactDescriptorReader.java
@@ -25,6 +25,8 @@ import org.eclipse.aether.resolution.ArtifactDescriptorException;
 import org.eclipse.aether.resolution.ArtifactDescriptorRequest;
 import org.eclipse.aether.resolution.ArtifactDescriptorResult;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * An artifact descriptor reader that gets data from a simple text file on the classpath. The data file for an artifact
  * with the coordinates {@code gid:aid:ext:ver} is expected to be named {@code gid_aid_ver.ini} and can optionally have
@@ -93,6 +95,8 @@ public class IniArtifactDescriptorReader
                                                             ArtifactDescriptorRequest request )
         throws ArtifactDescriptorException
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( request, "request cannot be null" );
         ArtifactDescriptorResult result = new ArtifactDescriptorResult( request );
         for ( Artifact artifact = request.getArtifact();; )
         {
diff --git a/maven-resolver-test-util/src/main/java/org/eclipse/aether/internal/test/util/TestLocalRepositoryManager.java b/maven-resolver-test-util/src/main/java/org/eclipse/aether/internal/test/util/TestLocalRepositoryManager.java
index 19828e9..9785933 100644
--- a/maven-resolver-test-util/src/main/java/org/eclipse/aether/internal/test/util/TestLocalRepositoryManager.java
+++ b/maven-resolver-test-util/src/main/java/org/eclipse/aether/internal/test/util/TestLocalRepositoryManager.java
@@ -37,6 +37,8 @@ import org.eclipse.aether.repository.LocalRepository;
 import org.eclipse.aether.repository.LocalRepositoryManager;
 import org.eclipse.aether.repository.RemoteRepository;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A simplistic local repository manager that uses a temporary base directory.
  */
@@ -71,6 +73,8 @@ public class TestLocalRepositoryManager
 
     public String getPathForLocalArtifact( Artifact artifact )
     {
+        requireNonNull( artifact, "artifact cannot be null" );
+
         String artifactId = artifact.getArtifactId();
         String groupId = artifact.getGroupId();
         String extension = artifact.getExtension();
@@ -83,11 +87,16 @@ public class TestLocalRepositoryManager
 
     public String getPathForRemoteArtifact( Artifact artifact, RemoteRepository repository, String context )
     {
+        requireNonNull( artifact, "artifact cannot be null" );
+        requireNonNull( repository, "repository cannot be null" );
+
         return getPathForLocalArtifact( artifact );
     }
 
     public String getPathForLocalMetadata( Metadata metadata )
     {
+        requireNonNull( metadata, "metadata cannot be null" );
+
         String artifactId = metadata.getArtifactId();
         String groupId = metadata.getGroupId();
         String version = metadata.getVersion();
@@ -96,11 +105,17 @@ public class TestLocalRepositoryManager
 
     public String getPathForRemoteMetadata( Metadata metadata, RemoteRepository repository, String context )
     {
+        requireNonNull( metadata, "metadata cannot be null" );
+        requireNonNull( repository, "repository cannot be null" );
+
         return getPathForLocalMetadata( metadata );
     }
 
     public LocalArtifactResult find( RepositorySystemSession session, LocalArtifactRequest request )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( request, "request cannot be null" );
+
         Artifact artifact = request.getArtifact();
 
         LocalArtifactResult result = new LocalArtifactResult( request );
@@ -113,11 +128,17 @@ public class TestLocalRepositoryManager
 
     public void add( RepositorySystemSession session, LocalArtifactRegistration request )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( request, "request cannot be null" );
+
         artifactRegistrations.add( request.getArtifact() );
     }
 
     public LocalMetadataResult find( RepositorySystemSession session, LocalMetadataRequest request )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( request, "request cannot be null" );
+
         Metadata metadata = request.getMetadata();
 
         LocalMetadataResult result = new LocalMetadataResult( request );
@@ -129,6 +150,9 @@ public class TestLocalRepositoryManager
 
     public void add( RepositorySystemSession session, LocalMetadataRegistration request )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( request, "request cannot be null" );
+
         metadataRegistrations.add( request.getMetadata() );
     }
 
diff --git a/maven-resolver-test-util/src/main/java/org/eclipse/aether/internal/test/util/TestVersionScheme.java b/maven-resolver-test-util/src/main/java/org/eclipse/aether/internal/test/util/TestVersionScheme.java
index e6aa2ed..5fd5c8a 100644
--- a/maven-resolver-test-util/src/main/java/org/eclipse/aether/internal/test/util/TestVersionScheme.java
+++ b/maven-resolver-test-util/src/main/java/org/eclipse/aether/internal/test/util/TestVersionScheme.java
@@ -28,6 +28,8 @@ import org.eclipse.aether.version.VersionConstraint;
 import org.eclipse.aether.version.VersionRange;
 import org.eclipse.aether.version.VersionScheme;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A version scheme using a generic version syntax.
  */
@@ -37,18 +39,21 @@ final class TestVersionScheme
 
     public Version parseVersion( final String version )
     {
+        requireNonNull( version, "version cannot be null" );
         return new TestVersion( version );
     }
 
     public VersionRange parseVersionRange( final String range )
         throws InvalidVersionSpecificationException
     {
+        requireNonNull( range, "range cannot be null" );
         return new TestVersionRange( range );
     }
 
     public VersionConstraint parseVersionConstraint( final String constraint )
         throws InvalidVersionSpecificationException
     {
+        requireNonNull( constraint, "constraint cannot be null" );
         Collection<VersionRange> ranges = new ArrayList<>();
 
         String process = constraint;
diff --git a/maven-resolver-transport-classpath/src/main/java/org/eclipse/aether/transport/classpath/ClasspathTransporterFactory.java b/maven-resolver-transport-classpath/src/main/java/org/eclipse/aether/transport/classpath/ClasspathTransporterFactory.java
index a1004be..5f5b48d 100644
--- a/maven-resolver-transport-classpath/src/main/java/org/eclipse/aether/transport/classpath/ClasspathTransporterFactory.java
+++ b/maven-resolver-transport-classpath/src/main/java/org/eclipse/aether/transport/classpath/ClasspathTransporterFactory.java
@@ -8,9 +8,9 @@ package org.eclipse.aether.transport.classpath;
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  *  http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -21,6 +21,8 @@ package org.eclipse.aether.transport.classpath;
 
 import javax.inject.Named;
 
+import java.util.Objects;
+
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.repository.RemoteRepository;
 import org.eclipse.aether.spi.connector.transport.Transporter;
@@ -67,7 +69,7 @@ public final class ClasspathTransporterFactory
 
     /**
      * Sets the priority of this component.
-     * 
+     *
      * @param priority The priority.
      * @return This component for chaining, never {@code null}.
      */
@@ -80,6 +82,9 @@ public final class ClasspathTransporterFactory
     public Transporter newInstance( RepositorySystemSession session, RemoteRepository repository )
         throws NoTransporterException
     {
+        Objects.requireNonNull( "session", "session cannot be null" );
+        Objects.requireNonNull( "repository", "repository cannot be null" );
+
         return new ClasspathTransporter( session, repository );
     }
 
diff --git a/maven-resolver-transport-file/src/main/java/org/eclipse/aether/transport/file/FileTransporterFactory.java b/maven-resolver-transport-file/src/main/java/org/eclipse/aether/transport/file/FileTransporterFactory.java
index bf78a6b..42e651f 100644
--- a/maven-resolver-transport-file/src/main/java/org/eclipse/aether/transport/file/FileTransporterFactory.java
+++ b/maven-resolver-transport-file/src/main/java/org/eclipse/aether/transport/file/FileTransporterFactory.java
@@ -8,9 +8,9 @@ package org.eclipse.aether.transport.file;
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  *  http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -21,6 +21,8 @@ package org.eclipse.aether.transport.file;
 
 import javax.inject.Named;
 
+import java.util.Objects;
+
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.repository.RemoteRepository;
 import org.eclipse.aether.spi.connector.transport.Transporter;
@@ -54,7 +56,7 @@ public final class FileTransporterFactory
 
     /**
      * Sets the priority of this component.
-     * 
+     *
      * @param priority The priority.
      * @return This component for chaining, never {@code null}.
      */
@@ -67,6 +69,9 @@ public final class FileTransporterFactory
     public Transporter newInstance( RepositorySystemSession session, RemoteRepository repository )
         throws NoTransporterException
     {
+        Objects.requireNonNull( "session", "session cannot be null" );
+        Objects.requireNonNull( "repository", "repository cannot be null" );
+
         return new FileTransporter( repository );
     }
 
diff --git a/maven-resolver-transport-http/src/main/java/org/eclipse/aether/transport/http/HttpTransporterFactory.java b/maven-resolver-transport-http/src/main/java/org/eclipse/aether/transport/http/HttpTransporterFactory.java
index efeb209..e748836 100644
--- a/maven-resolver-transport-http/src/main/java/org/eclipse/aether/transport/http/HttpTransporterFactory.java
+++ b/maven-resolver-transport-http/src/main/java/org/eclipse/aether/transport/http/HttpTransporterFactory.java
@@ -8,9 +8,9 @@ package org.eclipse.aether.transport.http;
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  *  http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -21,6 +21,8 @@ package org.eclipse.aether.transport.http;
 
 import javax.inject.Named;
 
+import java.util.Objects;
+
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.repository.RemoteRepository;
 import org.eclipse.aether.spi.connector.transport.Transporter;
@@ -56,7 +58,7 @@ public final class HttpTransporterFactory
 
     /**
      * Sets the priority of this component.
-     * 
+     *
      * @param priority The priority.
      * @return This component for chaining, never {@code null}.
      */
@@ -70,6 +72,9 @@ public final class HttpTransporterFactory
     public Transporter newInstance( RepositorySystemSession session, RemoteRepository repository )
         throws NoTransporterException
     {
+        Objects.requireNonNull( "session", "session cannot be null" );
+        Objects.requireNonNull( "repository", "repository cannot be null" );
+
         return new HttpTransporter( repository, session );
     }
 
diff --git a/maven-resolver-transport-wagon/src/main/java/org/eclipse/aether/internal/transport/wagon/PlexusWagonConfigurator.java b/maven-resolver-transport-wagon/src/main/java/org/eclipse/aether/internal/transport/wagon/PlexusWagonConfigurator.java
index a6d150c..7f8d7dc 100644
--- a/maven-resolver-transport-wagon/src/main/java/org/eclipse/aether/internal/transport/wagon/PlexusWagonConfigurator.java
+++ b/maven-resolver-transport-wagon/src/main/java/org/eclipse/aether/internal/transport/wagon/PlexusWagonConfigurator.java
@@ -8,9 +8,9 @@ package org.eclipse.aether.internal.transport.wagon;
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  *  http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -62,6 +62,9 @@ public class PlexusWagonConfigurator
     public void configure( Wagon wagon, Object configuration )
         throws Exception
     {
+        requireNonNull( wagon, "wagon cannot be null" );
+        requireNonNull( configuration, "configuration cannot be null" );
+
         PlexusConfiguration config;
         if ( configuration instanceof PlexusConfiguration )
         {
@@ -71,10 +74,6 @@ public class PlexusWagonConfigurator
         {
             config = new XmlPlexusConfiguration( (Xpp3Dom) configuration );
         }
-        else if ( configuration == null )
-        {
-            return;
-        }
         else
         {
             throw new IllegalArgumentException( "unexpected configuration type: "
diff --git a/maven-resolver-transport-wagon/src/main/java/org/eclipse/aether/transport/wagon/WagonTransporter.java b/maven-resolver-transport-wagon/src/main/java/org/eclipse/aether/transport/wagon/WagonTransporter.java
index c1eb637..6441d0c 100644
--- a/maven-resolver-transport-wagon/src/main/java/org/eclipse/aether/transport/wagon/WagonTransporter.java
+++ b/maven-resolver-transport-wagon/src/main/java/org/eclipse/aether/transport/wagon/WagonTransporter.java
@@ -29,6 +29,7 @@ import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Properties;
 import java.util.Queue;
 import java.util.UUID;
@@ -415,6 +416,8 @@ final class WagonTransporter
     private void execute( TransportTask task, TaskRunner runner )
         throws Exception
     {
+        Objects.requireNonNull( "task", "task cannot be null" );
+
         if ( closed.get() )
         {
             throw new IllegalStateException( "transporter closed, cannot execute task " + task );
@@ -625,9 +628,9 @@ final class WagonTransporter
             throws IOException
         {
             File tmp = newTempFile();
-            
+
             try ( InputStream in = task.newInputStream();
-                    OutputStream out = new FileOutputStream( tmp ) ) 
+                    OutputStream out = new FileOutputStream( tmp ) )
             {
                 copy( out, in );
             }
diff --git a/maven-resolver-transport-wagon/src/main/java/org/eclipse/aether/transport/wagon/WagonTransporterFactory.java b/maven-resolver-transport-wagon/src/main/java/org/eclipse/aether/transport/wagon/WagonTransporterFactory.java
index 75329e6..a8487d6 100644
--- a/maven-resolver-transport-wagon/src/main/java/org/eclipse/aether/transport/wagon/WagonTransporterFactory.java
+++ b/maven-resolver-transport-wagon/src/main/java/org/eclipse/aether/transport/wagon/WagonTransporterFactory.java
@@ -8,9 +8,9 @@ package org.eclipse.aether.transport.wagon;
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  *  http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -22,6 +22,8 @@ package org.eclipse.aether.transport.wagon;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import java.util.Objects;
+
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.repository.RemoteRepository;
 import org.eclipse.aether.spi.connector.transport.Transporter;
@@ -71,7 +73,7 @@ public final class WagonTransporterFactory
 
     /**
      * Sets the wagon provider to use to acquire and release wagon instances.
-     * 
+     *
      * @param wagonProvider The wagon provider to use, may be {@code null}.
      * @return This factory for chaining, never {@code null}.
      */
@@ -83,7 +85,7 @@ public final class WagonTransporterFactory
 
     /**
      * Sets the wagon configurator to use to apply provider-specific configuration to wagon instances.
-     * 
+     *
      * @param wagonConfigurator The wagon configurator to use, may be {@code null}.
      * @return This factory for chaining, never {@code null}.
      */
@@ -100,7 +102,7 @@ public final class WagonTransporterFactory
 
     /**
      * Sets the priority of this component.
-     * 
+     *
      * @param priority The priority.
      * @return This component for chaining, never {@code null}.
      */
@@ -113,6 +115,9 @@ public final class WagonTransporterFactory
     public Transporter newInstance( RepositorySystemSession session, RemoteRepository repository )
         throws NoTransporterException
     {
+        Objects.requireNonNull( "session", "session cannot be null" );
+        Objects.requireNonNull( "repository", "repository cannot be null" );
+
         return new WagonTransporter( wagonProvider, wagonConfigurator, repository, session );
     }
 
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/filter/AbstractPatternDependencyFilter.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/filter/AbstractPatternDependencyFilter.java
index 87d22ee..9929074 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/filter/AbstractPatternDependencyFilter.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/filter/AbstractPatternDependencyFilter.java
@@ -35,6 +35,8 @@ import org.eclipse.aether.version.Version;
 import org.eclipse.aether.version.VersionRange;
 import org.eclipse.aether.version.VersionScheme;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  */
 class AbstractPatternDependencyFilter
@@ -95,6 +97,8 @@ class AbstractPatternDependencyFilter
 
     public boolean accept( final DependencyNode node, List<DependencyNode> parents )
     {
+        requireNonNull( node, "node cannot be null" );
+        requireNonNull( parents, "parents cannot be null" );
         final Dependency dependency = node.getDependency();
         if ( dependency == null )
         {
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/filter/AndDependencyFilter.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/filter/AndDependencyFilter.java
index 6a45d78..3266073 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/filter/AndDependencyFilter.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/filter/AndDependencyFilter.java
@@ -28,6 +28,8 @@ import java.util.Set;
 import org.eclipse.aether.graph.DependencyFilter;
 import org.eclipse.aether.graph.DependencyNode;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A dependency filter that combines zero or more other filters using a logical {@code AND}. The resulting filter
  * accepts a given dependency node if and only if all constituent filters accept it.
@@ -87,6 +89,8 @@ public final class AndDependencyFilter
 
     public boolean accept( DependencyNode node, List<DependencyNode> parents )
     {
+        requireNonNull( node, "node cannot be null" );
+        requireNonNull( parents, "parents cannot be null" );
         for ( DependencyFilter filter : filters )
         {
             if ( !filter.accept( node, parents ) )
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/filter/ExclusionsDependencyFilter.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/filter/ExclusionsDependencyFilter.java
index ca76539..7513949 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/filter/ExclusionsDependencyFilter.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/filter/ExclusionsDependencyFilter.java
@@ -28,6 +28,8 @@ import org.eclipse.aether.graph.Dependency;
 import org.eclipse.aether.graph.DependencyFilter;
 import org.eclipse.aether.graph.DependencyNode;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A simple filter to exclude artifacts based on either artifact id or group id and artifact id.
  */
@@ -53,6 +55,8 @@ public final class ExclusionsDependencyFilter
 
     public boolean accept( DependencyNode node, List<DependencyNode> parents )
     {
+        requireNonNull( node, "node cannot be null" );
+        requireNonNull( parents, "parents cannot be null" );
         Dependency dependency = node.getDependency();
 
         if ( dependency == null )
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/ClassicDependencyManager.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/ClassicDependencyManager.java
index 25db443..01ecac3 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/ClassicDependencyManager.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/ClassicDependencyManager.java
@@ -34,6 +34,8 @@ import org.eclipse.aether.graph.Dependency;
 import org.eclipse.aether.graph.Exclusion;
 import org.eclipse.aether.util.artifact.JavaScopes;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A dependency manager that mimics the way Maven 2.x works.
  */
@@ -80,6 +82,7 @@ public final class ClassicDependencyManager
 
     public DependencyManager deriveChildManager( DependencyCollectionContext context )
     {
+        requireNonNull( context, "context cannot be null" );
         if ( depth >= 2 )
         {
             return this;
@@ -164,6 +167,7 @@ public final class ClassicDependencyManager
 
     public DependencyManagement manageDependency( Dependency dependency )
     {
+        requireNonNull( dependency, "dependency cannot be null" );
         DependencyManagement management = null;
 
         Object key = getKey( dependency.getArtifact() );
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/DefaultDependencyManager.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/DefaultDependencyManager.java
index ab0efcf..2952a19 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/DefaultDependencyManager.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/DefaultDependencyManager.java
@@ -35,6 +35,8 @@ import org.eclipse.aether.graph.Dependency;
 import org.eclipse.aether.graph.Exclusion;
 import org.eclipse.aether.util.artifact.JavaScopes;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A dependency manager managing dependencies on all levels supporting transitive dependency management.
  * <p>
@@ -88,6 +90,7 @@ public final class DefaultDependencyManager
 
     public DependencyManager deriveChildManager( final DependencyCollectionContext context )
     {
+        requireNonNull( context, "context cannot be null" );
         Map<Object, String> versions = this.managedVersions;
         Map<Object, String> scopes = this.managedScopes;
         Map<Object, Boolean> optionals = this.managedOptionals;
@@ -160,6 +163,7 @@ public final class DefaultDependencyManager
 
     public DependencyManagement manageDependency( Dependency dependency )
     {
+        requireNonNull( dependency, "dependency cannot be null" );
         DependencyManagement management = null;
 
         Object key = getKey( dependency.getArtifact() );
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/NoopDependencyManager.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/NoopDependencyManager.java
index ae8ee40..245c024 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/NoopDependencyManager.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/NoopDependencyManager.java
@@ -24,6 +24,8 @@ import org.eclipse.aether.collection.DependencyManagement;
 import org.eclipse.aether.collection.DependencyManager;
 import org.eclipse.aether.graph.Dependency;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A dependency manager that does not do any dependency management.
  */
@@ -46,11 +48,13 @@ public final class NoopDependencyManager
 
     public DependencyManager deriveChildManager( DependencyCollectionContext context )
     {
+        requireNonNull( context, "context cannot be null" );
         return this;
     }
 
     public DependencyManagement manageDependency( Dependency dependency )
     {
+        requireNonNull( dependency, "dependency cannot be null" );
         return null;
     }
 
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/TransitiveDependencyManager.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/TransitiveDependencyManager.java
index 3536e42..b5a0a2c 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/TransitiveDependencyManager.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/TransitiveDependencyManager.java
@@ -35,6 +35,8 @@ import org.eclipse.aether.graph.Dependency;
 import org.eclipse.aether.graph.Exclusion;
 import org.eclipse.aether.util.artifact.JavaScopes;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A dependency manager managing transitive dependencies supporting transitive dependency management.
  *
@@ -87,6 +89,7 @@ public final class TransitiveDependencyManager
 
     public DependencyManager deriveChildManager( final DependencyCollectionContext context )
     {
+        requireNonNull( context, "context cannot be null" );
         Map<Object, String> versions = managedVersions;
         Map<Object, String> scopes = managedScopes;
         Map<Object, Boolean> optionals = managedOptionals;
@@ -161,6 +164,7 @@ public final class TransitiveDependencyManager
 
     public DependencyManagement manageDependency( Dependency dependency )
     {
+        requireNonNull( dependency, "dependency cannot be null" );
         DependencyManagement management = null;
 
         Object key = getKey( dependency.getArtifact() );
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/AndDependencySelector.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/AndDependencySelector.java
index 8b11c8a..7e58458 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/AndDependencySelector.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/AndDependencySelector.java
@@ -30,6 +30,8 @@ import org.eclipse.aether.collection.DependencyCollectionContext;
 import org.eclipse.aether.collection.DependencySelector;
 import org.eclipse.aether.graph.Dependency;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A dependency selector that combines zero or more other selectors using a logical {@code AND}. The resulting selector
  * selects a given dependency if and only if all constituent selectors do so.
@@ -111,6 +113,7 @@ public final class AndDependencySelector
 
     public boolean selectDependency( Dependency dependency )
     {
+        requireNonNull( dependency, "dependency cannot be null" );
         for ( DependencySelector selector : selectors )
         {
             if ( !selector.selectDependency( dependency ) )
@@ -123,6 +126,7 @@ public final class AndDependencySelector
 
     public DependencySelector deriveChildSelector( DependencyCollectionContext context )
     {
+        requireNonNull( context, "context cannot be null" );
         int seen = 0;
         Set<DependencySelector> childSelectors = null;
 
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/ExclusionDependencySelector.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/ExclusionDependencySelector.java
index cd7def0..ba92f22 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/ExclusionDependencySelector.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/ExclusionDependencySelector.java
@@ -30,6 +30,8 @@ import org.eclipse.aether.collection.DependencySelector;
 import org.eclipse.aether.graph.Dependency;
 import org.eclipse.aether.graph.Exclusion;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A dependency selector that applies exclusions based on artifact coordinates.
  * 
@@ -78,6 +80,7 @@ public final class ExclusionDependencySelector
 
     public boolean selectDependency( Dependency dependency )
     {
+        requireNonNull( dependency, "dependency cannot be null" );
         Artifact artifact = dependency.getArtifact();
         for ( Exclusion exclusion : exclusions )
         {
@@ -117,6 +120,7 @@ public final class ExclusionDependencySelector
 
     public DependencySelector deriveChildSelector( DependencyCollectionContext context )
     {
+        requireNonNull( context, "context cannot be null" );
         Dependency dependency = context.getDependency();
         Collection<Exclusion> exclusions = ( dependency != null ) ? dependency.getExclusions() : null;
         if ( exclusions == null || exclusions.isEmpty() )
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/OptionalDependencySelector.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/OptionalDependencySelector.java
index 145484c..d384eb4 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/OptionalDependencySelector.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/OptionalDependencySelector.java
@@ -23,6 +23,8 @@ import org.eclipse.aether.collection.DependencyCollectionContext;
 import org.eclipse.aether.collection.DependencySelector;
 import org.eclipse.aether.graph.Dependency;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A dependency selector that excludes optional dependencies which occur beyond level one of the dependency graph.
  * 
@@ -49,11 +51,13 @@ public final class OptionalDependencySelector
 
     public boolean selectDependency( Dependency dependency )
     {
+        requireNonNull( dependency, "dependency cannot be null" );
         return depth < 2 || !dependency.isOptional();
     }
 
     public DependencySelector deriveChildSelector( DependencyCollectionContext context )
     {
+        requireNonNull( context, "context cannot be null" );
         if ( depth >= 2 )
         {
             return this;
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/ScopeDependencySelector.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/ScopeDependencySelector.java
index 75a8fd6..00fc26d 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/ScopeDependencySelector.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/ScopeDependencySelector.java
@@ -30,6 +30,8 @@ import org.eclipse.aether.collection.DependencyCollectionContext;
 import org.eclipse.aether.collection.DependencySelector;
 import org.eclipse.aether.graph.Dependency;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A dependency selector that filters transitive dependencies based on their scope. Direct dependencies are always
  * included regardless of their scope. <em>Note:</em> This filter does not assume any relationships between the scopes.
@@ -99,6 +101,7 @@ public final class ScopeDependencySelector
 
     public boolean selectDependency( Dependency dependency )
     {
+        requireNonNull( dependency, "dependency cannot be null" );
         if ( !transitive )
         {
             return true;
@@ -111,6 +114,7 @@ public final class ScopeDependencySelector
 
     public DependencySelector deriveChildSelector( DependencyCollectionContext context )
     {
+        requireNonNull( context, "context cannot be null" );
         if ( this.transitive || context.getDependency() == null )
         {
             return this;
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/StaticDependencySelector.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/StaticDependencySelector.java
index e3acc35..edcee44 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/StaticDependencySelector.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/StaticDependencySelector.java
@@ -23,6 +23,8 @@ import org.eclipse.aether.collection.DependencyCollectionContext;
 import org.eclipse.aether.collection.DependencySelector;
 import org.eclipse.aether.graph.Dependency;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A dependency selector that always includes or excludes dependencies.
  */
@@ -44,11 +46,13 @@ public final class StaticDependencySelector
 
     public boolean selectDependency( Dependency dependency )
     {
+        requireNonNull( dependency, "dependency cannot be null" );
         return select;
     }
 
     public DependencySelector deriveChildSelector( DependencyCollectionContext context )
     {
+        requireNonNull( context, "context cannot be null" );
         return this;
     }
 
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/ChainedDependencyGraphTransformer.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/ChainedDependencyGraphTransformer.java
index d7f1771..449eeeb 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/ChainedDependencyGraphTransformer.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/ChainedDependencyGraphTransformer.java
@@ -24,6 +24,8 @@ import org.eclipse.aether.collection.DependencyGraphTransformationContext;
 import org.eclipse.aether.collection.DependencyGraphTransformer;
 import org.eclipse.aether.graph.DependencyNode;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A dependency graph transformer that chains other transformers.
  */
@@ -75,6 +77,8 @@ public final class ChainedDependencyGraphTransformer
     public DependencyNode transformGraph( DependencyNode node, DependencyGraphTransformationContext context )
         throws RepositoryException
     {
+        requireNonNull( node, "node cannot be null" );
+        requireNonNull( context, "context cannot be null" );
         for ( DependencyGraphTransformer transformer : transformers )
         {
             node = transformer.transformGraph( node, context );
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictIdSorter.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictIdSorter.java
index 7a07385..b8cc3ad 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictIdSorter.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictIdSorter.java
@@ -28,6 +28,7 @@ import java.util.IdentityHashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import static java.util.Objects.requireNonNull;
 
 import org.eclipse.aether.RepositoryException;
 import org.eclipse.aether.collection.DependencyGraphTransformationContext;
@@ -52,6 +53,8 @@ public final class ConflictIdSorter
     public DependencyNode transformGraph( DependencyNode node, DependencyGraphTransformationContext context )
         throws RepositoryException
     {
+        requireNonNull( node, "node cannot be null" );
+        requireNonNull( context, "context cannot be null" );
         Map<?, ?> conflictIds = (Map<?, ?>) context.get( TransformationContextKeys.CONFLICT_IDS );
         if ( conflictIds == null )
         {
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictMarker.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictMarker.java
index 85df74a..5a0092c 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictMarker.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictMarker.java
@@ -26,6 +26,7 @@ import java.util.HashSet;
 import java.util.IdentityHashMap;
 import java.util.Map;
 import java.util.Set;
+import static java.util.Objects.requireNonNull;
 
 import org.eclipse.aether.RepositoryException;
 import org.eclipse.aether.artifact.Artifact;
@@ -53,6 +54,8 @@ public final class ConflictMarker
     public DependencyNode transformGraph( DependencyNode node, DependencyGraphTransformationContext context )
         throws RepositoryException
     {
+        requireNonNull( node, "node cannot be null" );
+        requireNonNull( context, "context cannot be null" );
         @SuppressWarnings( "unchecked" )
         Map<String, Object> stats = (Map<String, Object>) context.get( TransformationContextKeys.STATS );
         long time1 = System.nanoTime();
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictResolver.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictResolver.java
index e4471a0..fdc424d 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictResolver.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictResolver.java
@@ -117,6 +117,8 @@ public final class ConflictResolver
     public DependencyNode transformGraph( DependencyNode node, DependencyGraphTransformationContext context )
         throws RepositoryException
     {
+        requireNonNull( node, "node cannot be null" );
+        requireNonNull( context, "context cannot be null" );
         List<?> sortedConflictIds = (List<?>) context.get( TransformationContextKeys.SORTED_CONFLICT_IDS );
         if ( sortedConflictIds == null )
         {
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/JavaDependencyContextRefiner.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/JavaDependencyContextRefiner.java
index d96e04e..5d5b0cc 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/JavaDependencyContextRefiner.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/JavaDependencyContextRefiner.java
@@ -26,6 +26,8 @@ import org.eclipse.aether.graph.Dependency;
 import org.eclipse.aether.graph.DependencyNode;
 import org.eclipse.aether.util.artifact.JavaScopes;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A dependency graph transformer that refines the request context for nodes that belong to the "project" context by
  * appending the classpath type to which the node belongs. For instance, a compile-time project dependency will be
@@ -40,6 +42,8 @@ public final class JavaDependencyContextRefiner
     public DependencyNode transformGraph( DependencyNode node, DependencyGraphTransformationContext context )
         throws RepositoryException
     {
+        requireNonNull( node, "node cannot be null" );
+        requireNonNull( context, "context cannot be null" );
         String ctx = node.getRequestContext();
 
         if ( "project".equals( ctx ) )
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/NearestVersionSelector.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/NearestVersionSelector.java
index 2e0c34f..28ead5e 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/NearestVersionSelector.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/NearestVersionSelector.java
@@ -36,6 +36,8 @@ import org.eclipse.aether.util.graph.visitor.PathRecordingDependencyVisitor;
 import org.eclipse.aether.version.Version;
 import org.eclipse.aether.version.VersionConstraint;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A version selector for use with {@link ConflictResolver} that resolves version conflicts using a nearest-wins
  * strategy. If there is no single node that satisfies all encountered version ranges, the selector will fail.
@@ -151,6 +153,8 @@ public final class NearestVersionSelector
         {
             public boolean accept( DependencyNode node, List<DependencyNode> parents )
             {
+                requireNonNull( node, "node cannot be null" );
+                requireNonNull( parents, "parents cannot be null" );
                 return context.isIncluded( node );
             }
         };
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/NoopDependencyGraphTransformer.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/NoopDependencyGraphTransformer.java
index 55b6175..f217c4f 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/NoopDependencyGraphTransformer.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/NoopDependencyGraphTransformer.java
@@ -24,6 +24,8 @@ import org.eclipse.aether.collection.DependencyGraphTransformationContext;
 import org.eclipse.aether.collection.DependencyGraphTransformer;
 import org.eclipse.aether.graph.DependencyNode;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A dependency graph transformer that does not perform any changes on its input.
  */
@@ -47,6 +49,8 @@ public final class NoopDependencyGraphTransformer
     public DependencyNode transformGraph( DependencyNode node, DependencyGraphTransformationContext context )
         throws RepositoryException
     {
+        requireNonNull( node, "node cannot be null" );
+        requireNonNull( context, "context cannot be null" );
         return node;
     }
 
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/traverser/AndDependencyTraverser.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/traverser/AndDependencyTraverser.java
index 0823483..eda5a9d 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/traverser/AndDependencyTraverser.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/traverser/AndDependencyTraverser.java
@@ -29,6 +29,8 @@ import org.eclipse.aether.collection.DependencyCollectionContext;
 import org.eclipse.aether.collection.DependencyTraverser;
 import org.eclipse.aether.graph.Dependency;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A dependency traverser that combines zero or more other traversers using a logical {@code AND}. The resulting
  * traverser enables processing of child dependencies if and only if all constituent traversers request traversal.
@@ -111,6 +113,7 @@ public final class AndDependencyTraverser
 
     public boolean traverseDependency( Dependency dependency )
     {
+        requireNonNull( dependency, "dependency cannot be null" );
         for ( DependencyTraverser traverser : traversers )
         {
             if ( !traverser.traverseDependency( dependency ) )
@@ -123,6 +126,7 @@ public final class AndDependencyTraverser
 
     public DependencyTraverser deriveChildTraverser( DependencyCollectionContext context )
     {
+        requireNonNull( context, "context cannot be null" );
         int seen = 0;
         Set<DependencyTraverser> childTraversers = null;
 
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/traverser/FatArtifactTraverser.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/traverser/FatArtifactTraverser.java
index 40ce616..67ba4e3 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/traverser/FatArtifactTraverser.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/traverser/FatArtifactTraverser.java
@@ -24,6 +24,8 @@ import org.eclipse.aether.collection.DependencyCollectionContext;
 import org.eclipse.aether.collection.DependencyTraverser;
 import org.eclipse.aether.graph.Dependency;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A dependency traverser that excludes the dependencies of fat artifacts from the traversal. Fat artifacts are
  * artifacts that have the property {@link org.eclipse.aether.artifact.ArtifactProperties#INCLUDES_DEPENDENCIES} set to
@@ -44,12 +46,14 @@ public final class FatArtifactTraverser
 
     public boolean traverseDependency( Dependency dependency )
     {
+        requireNonNull( dependency, "dependency cannot be null" );
         String prop = dependency.getArtifact().getProperty( ArtifactProperties.INCLUDES_DEPENDENCIES, "" );
         return !Boolean.parseBoolean( prop );
     }
 
     public DependencyTraverser deriveChildTraverser( DependencyCollectionContext context )
     {
+        requireNonNull( context, "context cannot be null" );
         return this;
     }
 
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/traverser/StaticDependencyTraverser.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/traverser/StaticDependencyTraverser.java
index 5e2a703..3d605ae 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/traverser/StaticDependencyTraverser.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/traverser/StaticDependencyTraverser.java
@@ -23,6 +23,8 @@ import org.eclipse.aether.collection.DependencyCollectionContext;
 import org.eclipse.aether.collection.DependencyTraverser;
 import org.eclipse.aether.graph.Dependency;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A dependency traverser which always or never traverses children.
  */
@@ -44,11 +46,13 @@ public final class StaticDependencyTraverser
 
     public boolean traverseDependency( Dependency dependency )
     {
+        requireNonNull( dependency, "dependency cannot be null" );
         return traverse;
     }
 
     public DependencyTraverser deriveChildTraverser( DependencyCollectionContext context )
     {
+        requireNonNull( context, "context cannot be null" );
         return this;
     }
 
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/listener/ChainedRepositoryListener.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/listener/ChainedRepositoryListener.java
index c268a9d..1b310fe 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/listener/ChainedRepositoryListener.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/listener/ChainedRepositoryListener.java
@@ -28,6 +28,8 @@ import org.eclipse.aether.AbstractRepositoryListener;
 import org.eclipse.aether.RepositoryEvent;
 import org.eclipse.aether.RepositoryListener;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A repository listener that delegates to zero or more other listeners (multicast). The list of target listeners is
  * thread-safe, i.e. target listeners can be added or removed by any thread at any time.
@@ -134,6 +136,7 @@ public final class ChainedRepositoryListener
     @Override
     public void artifactDeployed( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( RepositoryListener listener : listeners )
         {
             try
@@ -150,6 +153,7 @@ public final class ChainedRepositoryListener
     @Override
     public void artifactDeploying( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( RepositoryListener listener : listeners )
         {
             try
@@ -166,6 +170,7 @@ public final class ChainedRepositoryListener
     @Override
     public void artifactDescriptorInvalid( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( RepositoryListener listener : listeners )
         {
             try
@@ -182,6 +187,7 @@ public final class ChainedRepositoryListener
     @Override
     public void artifactDescriptorMissing( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( RepositoryListener listener : listeners )
         {
             try
@@ -198,6 +204,7 @@ public final class ChainedRepositoryListener
     @Override
     public void artifactDownloaded( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( RepositoryListener listener : listeners )
         {
             try
@@ -214,6 +221,7 @@ public final class ChainedRepositoryListener
     @Override
     public void artifactDownloading( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( RepositoryListener listener : listeners )
         {
             try
@@ -230,6 +238,7 @@ public final class ChainedRepositoryListener
     @Override
     public void artifactInstalled( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( RepositoryListener listener : listeners )
         {
             try
@@ -246,6 +255,7 @@ public final class ChainedRepositoryListener
     @Override
     public void artifactInstalling( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( RepositoryListener listener : listeners )
         {
             try
@@ -262,6 +272,7 @@ public final class ChainedRepositoryListener
     @Override
     public void artifactResolved( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( RepositoryListener listener : listeners )
         {
             try
@@ -278,6 +289,7 @@ public final class ChainedRepositoryListener
     @Override
     public void artifactResolving( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( RepositoryListener listener : listeners )
         {
             try
@@ -294,6 +306,7 @@ public final class ChainedRepositoryListener
     @Override
     public void metadataDeployed( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( RepositoryListener listener : listeners )
         {
             try
@@ -310,6 +323,7 @@ public final class ChainedRepositoryListener
     @Override
     public void metadataDeploying( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( RepositoryListener listener : listeners )
         {
             try
@@ -326,6 +340,7 @@ public final class ChainedRepositoryListener
     @Override
     public void metadataDownloaded( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( RepositoryListener listener : listeners )
         {
             try
@@ -342,6 +357,7 @@ public final class ChainedRepositoryListener
     @Override
     public void metadataDownloading( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( RepositoryListener listener : listeners )
         {
             try
@@ -358,6 +374,7 @@ public final class ChainedRepositoryListener
     @Override
     public void metadataInstalled( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( RepositoryListener listener : listeners )
         {
             try
@@ -374,6 +391,7 @@ public final class ChainedRepositoryListener
     @Override
     public void metadataInstalling( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( RepositoryListener listener : listeners )
         {
             try
@@ -390,6 +408,7 @@ public final class ChainedRepositoryListener
     @Override
     public void metadataInvalid( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( RepositoryListener listener : listeners )
         {
             try
@@ -406,6 +425,7 @@ public final class ChainedRepositoryListener
     @Override
     public void metadataResolved( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( RepositoryListener listener : listeners )
         {
             try
@@ -422,6 +442,7 @@ public final class ChainedRepositoryListener
     @Override
     public void metadataResolving( RepositoryEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( RepositoryListener listener : listeners )
         {
             try
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/listener/ChainedTransferListener.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/listener/ChainedTransferListener.java
index 42e23b5..d664886 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/listener/ChainedTransferListener.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/listener/ChainedTransferListener.java
@@ -29,6 +29,8 @@ import org.eclipse.aether.transfer.TransferCancelledException;
 import org.eclipse.aether.transfer.TransferEvent;
 import org.eclipse.aether.transfer.TransferListener;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A transfer listener that delegates to zero or more other listeners (multicast). The list of target listeners is
  * thread-safe, i.e. target listeners can be added or removed by any thread at any time.
@@ -136,6 +138,7 @@ public final class ChainedTransferListener
     public void transferInitiated( TransferEvent event )
         throws TransferCancelledException
     {
+        requireNonNull( event, "event cannot be null" );
         for ( TransferListener listener : listeners )
         {
             try
@@ -153,6 +156,7 @@ public final class ChainedTransferListener
     public void transferStarted( TransferEvent event )
         throws TransferCancelledException
     {
+        requireNonNull( event, "event cannot be null" );
         for ( TransferListener listener : listeners )
         {
             try
@@ -170,6 +174,7 @@ public final class ChainedTransferListener
     public void transferProgressed( TransferEvent event )
         throws TransferCancelledException
     {
+        requireNonNull( event, "event cannot be null" );
         for ( TransferListener listener : listeners )
         {
             try
@@ -187,6 +192,7 @@ public final class ChainedTransferListener
     public void transferCorrupted( TransferEvent event )
         throws TransferCancelledException
     {
+        requireNonNull( event, "event cannot be null" );
         for ( TransferListener listener : listeners )
         {
             try
@@ -203,6 +209,7 @@ public final class ChainedTransferListener
     @Override
     public void transferSucceeded( TransferEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( TransferListener listener : listeners )
         {
             try
@@ -219,6 +226,7 @@ public final class ChainedTransferListener
     @Override
     public void transferFailed( TransferEvent event )
     {
+        requireNonNull( event, "event cannot be null" );
         for ( TransferListener listener : listeners )
         {
             try
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ChainedAuthentication.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ChainedAuthentication.java
index 57ae4ee..ee303e7 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ChainedAuthentication.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ChainedAuthentication.java
@@ -27,6 +27,8 @@ import org.eclipse.aether.repository.Authentication;
 import org.eclipse.aether.repository.AuthenticationContext;
 import org.eclipse.aether.repository.AuthenticationDigest;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * Authentication that aggregates other authentication blocks. When multiple input authentication blocks provide the
  * same authentication key, the last written value wins.
@@ -63,6 +65,7 @@ final class ChainedAuthentication
 
     public void fill( AuthenticationContext context, String key, Map<String, String> data )
     {
+        requireNonNull( context, "context cannot be null" );
         for ( Authentication authentication : authentications )
         {
             authentication.fill( context, key, data );
@@ -71,6 +74,7 @@ final class ChainedAuthentication
 
     public void digest( AuthenticationDigest digest )
     {
+        requireNonNull( digest, "digest cannot be null" );
         for ( Authentication authentication : authentications )
         {
             authentication.digest( digest );
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ChainedWorkspaceReader.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ChainedWorkspaceReader.java
index 02740da..1f41d21 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ChainedWorkspaceReader.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ChainedWorkspaceReader.java
@@ -30,6 +30,8 @@ import org.eclipse.aether.artifact.Artifact;
 import org.eclipse.aether.repository.WorkspaceReader;
 import org.eclipse.aether.repository.WorkspaceRepository;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A workspace reader that delegates to a chain of other readers, effectively aggregating their contents.
  */
@@ -90,6 +92,7 @@ public final class ChainedWorkspaceReader
 
     public File findArtifact( Artifact artifact )
     {
+        requireNonNull( artifact, "artifact cannot be null" );
         File file = null;
 
         for ( WorkspaceReader reader : readers )
@@ -106,6 +109,7 @@ public final class ChainedWorkspaceReader
 
     public List<String> findVersions( Artifact artifact )
     {
+        requireNonNull( artifact, "artifact cannot be null" );
         Collection<String> versions = new LinkedHashSet<>();
 
         for ( WorkspaceReader reader : readers )
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ComponentAuthentication.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ComponentAuthentication.java
index 34f83f2..d73a0f5 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ComponentAuthentication.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ComponentAuthentication.java
@@ -50,11 +50,13 @@ final class ComponentAuthentication
 
     public void fill( AuthenticationContext context, String key, Map<String, String> data )
     {
+        requireNonNull( context, "context cannot be null" );
         context.put( this.key, value );
     }
 
     public void digest( AuthenticationDigest digest )
     {
+        requireNonNull( digest, "digest cannot be null" );
         if ( value != null )
         {
             digest.update( key, value.getClass().getName() );
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ConservativeAuthenticationSelector.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ConservativeAuthenticationSelector.java
index f1e22f2..04f60f8 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ConservativeAuthenticationSelector.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ConservativeAuthenticationSelector.java
@@ -48,6 +48,7 @@ public final class ConservativeAuthenticationSelector
 
     public Authentication getAuthentication( RemoteRepository repository )
     {
+        requireNonNull( repository, "repository cannot be null" );
         Authentication auth = repository.getAuthentication();
         if ( auth != null )
         {
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ConservativeProxySelector.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ConservativeProxySelector.java
index c71fe13..bc7eebd 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ConservativeProxySelector.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/ConservativeProxySelector.java
@@ -47,6 +47,7 @@ public final class ConservativeProxySelector
 
     public Proxy getProxy( RemoteRepository repository )
     {
+        requireNonNull( repository, "repository cannot be null" );
         Proxy proxy = repository.getProxy();
         if ( proxy != null )
         {
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/DefaultAuthenticationSelector.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/DefaultAuthenticationSelector.java
index c104be3..d631222 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/DefaultAuthenticationSelector.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/DefaultAuthenticationSelector.java
@@ -26,6 +26,8 @@ import org.eclipse.aether.repository.Authentication;
 import org.eclipse.aether.repository.AuthenticationSelector;
 import org.eclipse.aether.repository.RemoteRepository;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A simple authentication selector that selects authentication based on repository identifiers.
  */
@@ -58,6 +60,7 @@ public final class DefaultAuthenticationSelector
 
     public Authentication getAuthentication( RemoteRepository repository )
     {
+        requireNonNull( repository, "repository cannot be null" );
         return repos.get( repository.getId() );
     }
 
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/DefaultMirrorSelector.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/DefaultMirrorSelector.java
index 9dfa955..f6161c0 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/DefaultMirrorSelector.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/DefaultMirrorSelector.java
@@ -26,6 +26,8 @@ import java.util.List;
 import org.eclipse.aether.repository.MirrorSelector;
 import org.eclipse.aether.repository.RemoteRepository;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A simple mirror selector that selects mirrors based on repository identifiers.
  */
@@ -75,6 +77,7 @@ public final class DefaultMirrorSelector
 
     public RemoteRepository getMirror( RemoteRepository repository )
     {
+        requireNonNull( repository, "repository cannot be null" );
         MirrorDef mirror = findMirror( repository );
 
         if ( mirror == null )
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/DefaultProxySelector.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/DefaultProxySelector.java
index b94b3d2..09e0ce9 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/DefaultProxySelector.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/DefaultProxySelector.java
@@ -59,6 +59,7 @@ public final class DefaultProxySelector
 
     public Proxy getProxy( RemoteRepository repository )
     {
+        requireNonNull( repository, "repository cannot be null" );
         Map<String, ProxyDef> candidates = new HashMap<>();
 
         String host = repository.getHost();
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/JreProxySelector.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/JreProxySelector.java
index a09b435..69410fc 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/JreProxySelector.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/JreProxySelector.java
@@ -36,6 +36,8 @@ import org.eclipse.aether.repository.Proxy;
 import org.eclipse.aether.repository.ProxySelector;
 import org.eclipse.aether.repository.RemoteRepository;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A proxy selector that uses the {@link java.net.ProxySelector#getDefault() JRE's global proxy selector}. In
  * combination with the system property {@code java.net.useSystemProxies}, this proxy selector can be employed to pick
@@ -57,6 +59,7 @@ public final class JreProxySelector
 
     public Proxy getProxy( RemoteRepository repository )
     {
+        requireNonNull( repository, "repository cannot be null" );
         List<java.net.Proxy> proxies = null;
         try
         {
@@ -116,6 +119,7 @@ public final class JreProxySelector
 
         public void fill( AuthenticationContext context, String key, Map<String, String> data )
         {
+            requireNonNull( context, "digest cannot be null" );
             Proxy proxy = context.getProxy();
             if ( proxy == null )
             {
@@ -161,6 +165,7 @@ public final class JreProxySelector
 
         public void digest( AuthenticationDigest digest )
         {
+            requireNonNull( digest, "digest cannot be null" );
             // we don't know anything about the JRE's current authenticator, assume the worst (i.e. interactive)
             digest.update( UUID.randomUUID().toString() );
         }
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/SecretAuthentication.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/SecretAuthentication.java
index 57df653..bb7c5bc 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/SecretAuthentication.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/SecretAuthentication.java
@@ -110,6 +110,7 @@ final class SecretAuthentication
 
     public void fill( AuthenticationContext context, String key, Map<String, String> data )
     {
+        requireNonNull( context, "context cannot be null" );
         char[] secret = copy( value );
         xor( secret );
         context.put( this.key, secret );
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/SimpleArtifactDescriptorPolicy.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/SimpleArtifactDescriptorPolicy.java
index ccf1ba8..3f6831d 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/SimpleArtifactDescriptorPolicy.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/SimpleArtifactDescriptorPolicy.java
@@ -23,6 +23,8 @@ import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.resolution.ArtifactDescriptorPolicy;
 import org.eclipse.aether.resolution.ArtifactDescriptorPolicyRequest;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * An artifact descriptor error policy that allows to control error handling at a global level.
  */
@@ -55,6 +57,8 @@ public final class SimpleArtifactDescriptorPolicy
 
     public int getPolicy( RepositorySystemSession session, ArtifactDescriptorPolicyRequest request )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( request, "request cannot be null" );
         return policy;
     }
 
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/SimpleResolutionErrorPolicy.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/SimpleResolutionErrorPolicy.java
index 4fa9059..d56266e 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/SimpleResolutionErrorPolicy.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/SimpleResolutionErrorPolicy.java
@@ -25,6 +25,8 @@ import org.eclipse.aether.metadata.Metadata;
 import org.eclipse.aether.resolution.ResolutionErrorPolicy;
 import org.eclipse.aether.resolution.ResolutionErrorPolicyRequest;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A resolution error policy that allows to control caching for artifacts and metadata at a global level.
  */
@@ -71,11 +73,15 @@ public final class SimpleResolutionErrorPolicy
 
     public int getArtifactPolicy( RepositorySystemSession session, ResolutionErrorPolicyRequest<Artifact> request )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( request, "request cannot be null" );
         return artifactPolicy;
     }
 
     public int getMetadataPolicy( RepositorySystemSession session, ResolutionErrorPolicyRequest<Metadata> request )
     {
+        requireNonNull( session, "session cannot be null" );
+        requireNonNull( request, "request cannot be null" );
         return metadataPolicy;
     }
 
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/StringAuthentication.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/StringAuthentication.java
index 5012744..74edfb8 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/StringAuthentication.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/repository/StringAuthentication.java
@@ -51,11 +51,13 @@ final class StringAuthentication
 
     public void fill( AuthenticationContext context, String key, Map<String, String> data )
     {
+        requireNonNull( context, "context cannot be null" );
         context.put( this.key, value );
     }
 
     public void digest( AuthenticationDigest digest )
     {
+        requireNonNull( digest, "digest cannot be null" );
         digest.update( key, value );
     }
 
diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/version/GenericVersionScheme.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/version/GenericVersionScheme.java
index c191a90..9b87abd 100644
--- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/version/GenericVersionScheme.java
+++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/version/GenericVersionScheme.java
@@ -28,6 +28,8 @@ import org.eclipse.aether.version.VersionConstraint;
 import org.eclipse.aether.version.VersionRange;
 import org.eclipse.aether.version.VersionScheme;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A version scheme using a generic version syntax and common sense sorting.
  * <p>
@@ -67,18 +69,21 @@ public final class GenericVersionScheme
     public Version parseVersion( final String version )
         throws InvalidVersionSpecificationException
     {
+        requireNonNull( version, "version cannot be null" );
         return new GenericVersion( version );
     }
 
     public VersionRange parseVersionRange( final String range )
         throws InvalidVersionSpecificationException
     {
+        requireNonNull( range, "range cannot be null" );
         return new GenericVersionRange( range );
     }
 
     public VersionConstraint parseVersionConstraint( final String constraint )
         throws InvalidVersionSpecificationException
     {
+        requireNonNull( constraint, "constraint cannot be null" );
         Collection<VersionRange> ranges = new ArrayList<>();
 
         String process = constraint;
diff --git a/maven-resolver-util/src/test/java/org/eclipse/aether/util/filter/AbstractDependencyFilterTest.java b/maven-resolver-util/src/test/java/org/eclipse/aether/util/filter/AbstractDependencyFilterTest.java
index 835c1ce..f8bc5f4 100644
--- a/maven-resolver-util/src/test/java/org/eclipse/aether/util/filter/AbstractDependencyFilterTest.java
+++ b/maven-resolver-util/src/test/java/org/eclipse/aether/util/filter/AbstractDependencyFilterTest.java
@@ -24,6 +24,8 @@ import java.util.List;
 import org.eclipse.aether.graph.DependencyFilter;
 import org.eclipse.aether.graph.DependencyNode;
 
+import static java.util.Objects.requireNonNull;
+
 public abstract class AbstractDependencyFilterTest
 {
 
@@ -34,6 +36,8 @@ public abstract class AbstractDependencyFilterTest
 
             public boolean accept( DependencyNode node, List<DependencyNode> parents )
             {
+                requireNonNull( node, "node cannot be null" );
+                requireNonNull( parents, "parents cannot be null" );
                 return true;
             }
 
diff --git a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/selector/AndDependencySelectorTest.java b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/selector/AndDependencySelectorTest.java
index 3a6bb1b..f49456b 100644
--- a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/selector/AndDependencySelectorTest.java
+++ b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/selector/AndDependencySelectorTest.java
@@ -19,14 +19,19 @@ package org.eclipse.aether.util.graph.selector;
  * under the License.
  */
 
+import static java.util.Objects.requireNonNull;
 import static org.junit.Assert.*;
 
+import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.artifact.DefaultArtifact;
 import org.eclipse.aether.collection.DependencyCollectionContext;
 import org.eclipse.aether.collection.DependencySelector;
 import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.internal.test.util.TestUtils;
 import org.junit.Test;
 
+import java.util.Collections;
+
 public class AndDependencySelectorTest
 {
 
@@ -57,11 +62,13 @@ public class AndDependencySelectorTest
 
         public boolean selectDependency( Dependency dependency )
         {
+            requireNonNull( dependency, "dependency cannot be null" );
             return select;
         }
 
         public DependencySelector deriveChildSelector( DependencyCollectionContext context )
         {
+            requireNonNull( context, "context cannot be null" );
             return child;
         }
 
@@ -109,7 +116,11 @@ public class AndDependencySelectorTest
         DependencySelector other1 = new DummyDependencySelector( true );
         DependencySelector other2 = new DummyDependencySelector( false );
         DependencySelector selector = new AndDependencySelector( other1, other2 );
-        assertSame( selector, selector.deriveChildSelector( null ) );
+        RepositorySystemSession session = TestUtils.newSession();
+        DependencyCollectionContext context = TestUtils.newCollectionContext( session,
+                null,
+                Collections.emptyList() );
+        assertSame( selector, selector.deriveChildSelector( context ) );
     }
 
     @Test
@@ -118,7 +129,11 @@ public class AndDependencySelectorTest
         DependencySelector other1 = new DummyDependencySelector( true );
         DependencySelector other2 = new DummyDependencySelector( false, null );
         DependencySelector selector = new AndDependencySelector( other1, other2 );
-        assertSame( other1, selector.deriveChildSelector( null ) );
+        RepositorySystemSession session = TestUtils.newSession();
+        DependencyCollectionContext context = TestUtils.newCollectionContext( session,
+                null,
+                Collections.emptyList() );
+        assertSame( other1, selector.deriveChildSelector( context ) );
     }
 
     @Test
@@ -127,7 +142,11 @@ public class AndDependencySelectorTest
         DependencySelector other1 = new DummyDependencySelector( true, null );
         DependencySelector other2 = new DummyDependencySelector( false, null );
         DependencySelector selector = new AndDependencySelector( other1, other2 );
-        assertNull( selector.deriveChildSelector( null ) );
+        RepositorySystemSession session = TestUtils.newSession();
+        DependencyCollectionContext context = TestUtils.newCollectionContext( session,
+                null,
+                Collections.emptyList() );
+        assertNull( selector.deriveChildSelector( context ) );
     }
 
     @Test
diff --git a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/transformer/SimpleConflictMarker.java b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/transformer/SimpleConflictMarker.java
index 2c596e0..4a02f6f 100644
--- a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/transformer/SimpleConflictMarker.java
+++ b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/transformer/SimpleConflictMarker.java
@@ -21,6 +21,7 @@ package org.eclipse.aether.util.graph.transformer;
 
 import java.util.IdentityHashMap;
 import java.util.Map;
+import static java.util.Objects.requireNonNull;
 
 import org.eclipse.aether.RepositoryException;
 import org.eclipse.aether.artifact.Artifact;
@@ -39,6 +40,8 @@ class SimpleConflictMarker
     public DependencyNode transformGraph( DependencyNode node, DependencyGraphTransformationContext context )
         throws RepositoryException
     {
+        requireNonNull( node, "node cannot be null" );
+        requireNonNull( context, "context cannot be null" );
         @SuppressWarnings( "unchecked" )
         Map<DependencyNode, Object> conflictIds =
             (Map<DependencyNode, Object>) context.get( TransformationContextKeys.CONFLICT_IDS );
diff --git a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/traverser/AndDependencyTraverserTest.java b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/traverser/AndDependencyTraverserTest.java
index 74d744e..991807c 100644
--- a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/traverser/AndDependencyTraverserTest.java
+++ b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/traverser/AndDependencyTraverserTest.java
@@ -19,14 +19,22 @@ package org.eclipse.aether.util.graph.traverser;
  * under the License.
  */
 
+import static java.util.Objects.requireNonNull;
 import static org.junit.Assert.*;
 
+import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.artifact.DefaultArtifact;
 import org.eclipse.aether.collection.DependencyCollectionContext;
 import org.eclipse.aether.collection.DependencyTraverser;
 import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.internal.test.util.TestFileUtils;
+import org.eclipse.aether.internal.test.util.TestUtils;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 
+import java.util.Collections;
+
 public class AndDependencyTraverserTest
 {
 
@@ -57,16 +65,39 @@ public class AndDependencyTraverserTest
 
         public boolean traverseDependency( Dependency dependency )
         {
+            requireNonNull( dependency, "dependency cannot be null" );
             return traverse;
         }
 
         public DependencyTraverser deriveChildTraverser( DependencyCollectionContext context )
         {
+            requireNonNull( context, "context cannot be null" );
             return child;
         }
 
     }
 
+    private RepositorySystemSession session;
+    private DependencyCollectionContext context;
+
+    @Before
+    public void setup()
+    {
+        session = TestUtils.newSession();
+        context = TestUtils.newCollectionContext( session, null, Collections.emptyList() );
+    }
+
+    @After
+    public void teardown() throws Exception
+    {
+        if ( session.getLocalRepository() != null )
+        {
+            TestFileUtils.deleteFile( session.getLocalRepository().getBasedir() );
+        }
+        session = null;
+        context = null;
+    }
+
     @Test
     public void testNewInstance()
     {
@@ -105,7 +136,7 @@ public class AndDependencyTraverserTest
         DependencyTraverser other1 = new DummyDependencyTraverser( true );
         DependencyTraverser other2 = new DummyDependencyTraverser( false );
         DependencyTraverser traverser = new AndDependencyTraverser( other1, other2 );
-        assertSame( traverser, traverser.deriveChildTraverser( null ) );
+        assertSame( traverser, traverser.deriveChildTraverser( context ) );
     }
 
     @Test
@@ -114,7 +145,7 @@ public class AndDependencyTraverserTest
         DependencyTraverser other1 = new DummyDependencyTraverser( true );
         DependencyTraverser other2 = new DummyDependencyTraverser( false, null );
         DependencyTraverser traverser = new AndDependencyTraverser( other1, other2 );
-        assertSame( other1, traverser.deriveChildTraverser( null ) );
+        assertSame( other1, traverser.deriveChildTraverser( context ) );
     }
 
     @Test
@@ -123,7 +154,7 @@ public class AndDependencyTraverserTest
         DependencyTraverser other1 = new DummyDependencyTraverser( true, null );
         DependencyTraverser other2 = new DummyDependencyTraverser( false, null );
         DependencyTraverser traverser = new AndDependencyTraverser( other1, other2 );
-        assertNull( traverser.deriveChildTraverser( null ) );
+        assertNull( traverser.deriveChildTraverser( context ) );
     }
 
     @Test
diff --git a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/traverser/FatArtifactTraverserTest.java b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/traverser/FatArtifactTraverserTest.java
index 641e593..a7982e3 100644
--- a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/traverser/FatArtifactTraverserTest.java
+++ b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/traverser/FatArtifactTraverserTest.java
@@ -24,15 +24,42 @@ import static org.junit.Assert.*;
 import java.util.Collections;
 import java.util.Map;
 
+import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.artifact.ArtifactProperties;
 import org.eclipse.aether.artifact.DefaultArtifact;
+import org.eclipse.aether.collection.DependencyCollectionContext;
 import org.eclipse.aether.collection.DependencyTraverser;
 import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.internal.test.util.TestFileUtils;
+import org.eclipse.aether.internal.test.util.TestUtils;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 
 public class FatArtifactTraverserTest
 {
 
+    private RepositorySystemSession session;
+    private DependencyCollectionContext context;
+
+    @Before
+    public void setup()
+    {
+        session = TestUtils.newSession();
+        context = TestUtils.newCollectionContext( session, null, Collections.emptyList() );
+    }
+
+    @After
+    public void teardown() throws Exception
+    {
+        if ( session.getLocalRepository() != null )
+        {
+            TestFileUtils.deleteFile( session.getLocalRepository().getBasedir() );
+        }
+        session = null;
+        context = null;
+    }
+
     @Test
     public void testTraverseDependency()
     {
@@ -51,7 +78,7 @@ public class FatArtifactTraverserTest
     public void testDeriveChildTraverser()
     {
         DependencyTraverser traverser = new FatArtifactTraverser();
-        assertSame( traverser, traverser.deriveChildTraverser( null ) );
+        assertSame( traverser, traverser.deriveChildTraverser( context ) );
     }
 
     @Test
diff --git a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/traverser/StaticDependencyTraverserTest.java b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/traverser/StaticDependencyTraverserTest.java
index 0ac1d91..d47041c 100644
--- a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/traverser/StaticDependencyTraverserTest.java
+++ b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/traverser/StaticDependencyTraverserTest.java
@@ -21,14 +21,43 @@ package org.eclipse.aether.util.graph.traverser;
 
 import static org.junit.Assert.*;
 
+import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.artifact.DefaultArtifact;
+import org.eclipse.aether.collection.DependencyCollectionContext;
 import org.eclipse.aether.collection.DependencyTraverser;
 import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.internal.test.util.TestFileUtils;
+import org.eclipse.aether.internal.test.util.TestUtils;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 
+import java.util.Collections;
+
 public class StaticDependencyTraverserTest
 {
 
+    private RepositorySystemSession session;
+    private DependencyCollectionContext context;
+
+    @Before
+    public void setup()
+    {
+        session = TestUtils.newSession();
+        context = TestUtils.newCollectionContext( session, null, Collections.emptyList() );
+    }
+
+    @After
+    public void teardown() throws Exception
+    {
+        if ( session.getLocalRepository() != null )
+        {
+            TestFileUtils.deleteFile( session.getLocalRepository().getBasedir() );
+        }
+        session = null;
+        context = null;
+    }
+
     @Test
     public void testTraverseDependency()
     {
@@ -43,7 +72,7 @@ public class StaticDependencyTraverserTest
     public void testDeriveChildTraverser()
     {
         DependencyTraverser traverser = new StaticDependencyTraverser( true );
-        assertSame( traverser, traverser.deriveChildTraverser( null ) );
+        assertSame( traverser, traverser.deriveChildTraverser( context ) );
     }
 
     @Test
diff --git a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/visitor/FilteringDependencyVisitorTest.java b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/visitor/FilteringDependencyVisitorTest.java
index 65a02a8..4e6a543 100644
--- a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/visitor/FilteringDependencyVisitorTest.java
+++ b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/visitor/FilteringDependencyVisitorTest.java
@@ -19,6 +19,7 @@ package org.eclipse.aether.util.graph.visitor;
  * under the License.
  */
 
+import static java.util.Objects.requireNonNull;
 import static org.junit.Assert.*;
 
 import java.util.List;
@@ -48,6 +49,8 @@ public class FilteringDependencyVisitorTest
         {
             public boolean accept( DependencyNode node, List<DependencyNode> parents )
             {
+                requireNonNull( node, "node cannot be null" );
+                requireNonNull( parents, "parents cannot be null" );
                 for ( DependencyNode parent : parents )
                 {
                     buffer.append( parent.getDependency().getArtifact().getArtifactId() );
diff --git a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/visitor/PathRecordingDependencyVisitorTest.java b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/visitor/PathRecordingDependencyVisitorTest.java
index a759d88..efd4f6c 100644
--- a/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/visitor/PathRecordingDependencyVisitorTest.java
+++ b/maven-resolver-util/src/test/java/org/eclipse/aether/util/graph/visitor/PathRecordingDependencyVisitorTest.java
@@ -19,6 +19,7 @@ package org.eclipse.aether.util.graph.visitor;
  * under the License.
  */
 
+import static java.util.Objects.requireNonNull;
 import static org.junit.Assert.*;
 
 import java.util.List;
@@ -103,6 +104,8 @@ public class PathRecordingDependencyVisitorTest
         {
             public boolean accept( DependencyNode node, List<DependencyNode> parents )
             {
+                requireNonNull( node, "node cannot be null" );
+                requireNonNull( parents, "parents cannot be null" );
                 for ( DependencyNode parent : parents )
                 {
                     buffer.append( parent.getDependency().getArtifact().getArtifactId() );