diff --git a/src/it/reactor/verify.bsh b/src/it/reactor/verify.bsh
index 17c1e47..cffa5c5 100644
--- a/src/it/reactor/verify.bsh
+++ b/src/it/reactor/verify.bsh
@@ -36,7 +36,7 @@
 
 String resolved = FileUtils.fileRead( new File( basedir, "resolved-module-z-deps-y.txt" ) );
 
-if ( !"Could not resolve the following dependencies: [org.apache.maven.its.dependency-tree:module-y-deps-x:jar:1.0-SNAPSHOT (compile), org.apache.maven.its.dependency-tree:module-x:jar:1.0-SNAPSHOT (compile)]".equals( resolved ) )
+if ( !"Could not resolve following dependencies: [org.apache.maven.its.dependency-tree:module-y-deps-x:jar:1.0-SNAPSHOT (compile), org.apache.maven.its.dependency-tree:module-x:jar:1.0-SNAPSHOT (compile)]".equals( resolved ) )
 {
     throw new Exception( "unexpected content in resolved-module-z-deps-y.txt written by ResolveDependenciesLifecycleParticipant" );
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java
index c17c904..c5100ce 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java
@@ -46,14 +46,14 @@
     /**
      * Build the dependency graph, with a hack to include dependencies contained in the reactor projects
      * but that are not yet compiled, which is the minimum prerequisite for Maven core's
-     * ReactorReader to find them. Notice that this hack doesn't work for Maven 2.
+     * ReactorReader to find them. Notice that this hack hasn't been done for Maven 2.
      * <p>Notice: If Maven core did collect instead of resolving dependencies (ie did not try to get the
      * artifacts but only the poms), probably this hack wouldn't be necessary even for people requiring
      * the dependency graph before compiling. TODO: for Maven 3, use Aether to collect dependencies.</p>
      *
      * @param project the project
      * @param filter artifact filter (can be <code>null</code>)
-     * @param reactorProjects Collection of those projects contained in the reactor.
+     * @param reactorProjects Collection of those projects contained in the reactor (can be <code>null</code>).
      * @return the dependency graph
      * @throws DependencyGraphBuilderException if some of the dependencies could not be resolved.
      */
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java
index 85bea70..122d624 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java
@@ -63,7 +63,7 @@
     public DependencyNode buildDependencyGraph( MavenProject project, ArtifactFilter filter )
         throws DependencyGraphBuilderException
     {
-        return buildDependencyGraph( project, filter, Collections.<MavenProject>emptyList() );
+        return buildDependencyGraph( project, filter, null );
     }
 
     /**
@@ -71,7 +71,7 @@
      *
      * @param project the project
      * @param filter artifact filter (can be <code>null</code>)
-     * @param reactorProjects Collection of those projects contained in the reactor.
+     * @param reactorProjects Collection of those projects contained in the reactor (can be <code>null</code>)
      * @return DependencyNode containing the dependency graph.
      * @throws DependencyGraphBuilderException if some of the dependencies could not be resolved.
      */
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java
index 6386860..bb0fbca 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java
@@ -73,12 +73,13 @@
 
     /**
      * Builds the dependency graph for Maven 2.
-     *
-     * NB the reactor projects are ignored as Maven 2 is not able to resolve projects from the reactor.
-     *
-     * @param project           the project
-     * @param filter            artifact filter (can be <code>null</code>)
-     * @param reactorProjects   Ignored.
+     * <p>
+     * notice: the reactor projects are ignored as no work has been done to try to do the same hack as with Maven 3.
+     * </p>
+     * 
+     * @param project the project
+     * @param filter artifact filter (can be <code>null</code>)
+     * @param reactorProjects Ignored.
      * @return DependencyNode containing the dependency graph.
      * @throws DependencyGraphBuilderException if some of the dependencies could not be resolved.
      */
@@ -86,7 +87,11 @@
                                                 Collection<MavenProject> reactorProjects )
         throws DependencyGraphBuilderException
     {
-        getLogger().warn( "Reactor projects ignored - reactor dependencies cannot be resolved in Maven2" );
+        if ( reactorProjects != null )
+        {
+            getLogger().warn( "Reactor projects ignored - reactor project collection not implemented" );
+        }
+
         return buildDependencyGraph( project, filter );
     }
 
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java
index 9687a71..4256816 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java
@@ -76,15 +76,16 @@
     public DependencyNode buildDependencyGraph( MavenProject project, ArtifactFilter filter )
         throws DependencyGraphBuilderException
     {
-        return buildDependencyGraph( project, filter, Collections.<MavenProject>emptyList() );
+        return buildDependencyGraph( project, filter, null );
     }
 
     /**
-     * Builds the dependency graph for Maven 3.1+ including any dependencies from any projects in the reactor.
+     * Builds the dependency graph for Maven 3.1+, eventually hacking for collecting projects from
+     * reactor not yet built.
      *
      * @param project the project
      * @param filter artifact filter (can be <code>null</code>)
-     * @param reactorProjects Collection of those projects contained in the reactor.
+     * @param reactorProjects Collection of those projects contained in the reactor (can be <code>null</code>).
      * @return DependencyNode containing the dependency graph.
      * @throws DependencyGraphBuilderException if some of the dependencies could not be resolved.
      */
@@ -127,51 +128,51 @@
         }
         catch ( DependencyResolutionException e )
         {
-            // Ignore any resolution failure for deps that are part of the reactor but have not yet been built.
-            // NB Typing has been removed because DependencyResolutionResult returns Sonatype Aether in 3.0.4 and
-            // Eclipse Aether in 3.1.1 and while dep-tree is a single module we can only compile against one of them.
-            //
-            // NB While applying this code to Maven3DependencyGraphBuilder is trivial it won't work because
-            // in Maven 3, MavenProject.getProjectReferences isn't populated. So we would need to have the reactor
-            // modules passed in separately which would change the API for DependencyGraphBuilder. If
-            // MavenProject.getProjectReferences were populated (like it should be) then this would work for Maven3 too.
-            //
-            // NB There doesn't seem to be any way to apply this to Maven2DependencyGraphBuilder as there is no
-            // concept of partial resolution like there is is 3 and 3.1
-            final DependencyResolutionResult result = e.getResult();
-
-            final List<Dependency> reactorDeps =
-                getReactorDependencies( reactorProjects, result.getUnresolvedDependencies() );
-            result.getUnresolvedDependencies().removeAll( reactorDeps );
-            Invoker.invoke( result.getResolvedDependencies(), "addAll", Collection.class, reactorDeps );
-
-            if ( !result.getUnresolvedDependencies().isEmpty() )
+            if ( reactorProjects == null )
             {
-                throw new DependencyGraphBuilderException( "Could not resolve the following dependencies: "
-                    + result.getUnresolvedDependencies(), e );
+                throw new DependencyGraphBuilderException( "Could not resolve following dependencies: "
+                    + e.getResult().getUnresolvedDependencies(), e );
             }
 
-            getLogger().debug( "Resolved dependencies after ignoring reactor dependencies: " + reactorDeps );
-
-            return result;
+            // try collecting from reactor
+            return collectDependenciesFromReactor( e, reactorProjects );
         }
     }
 
+    private DependencyResolutionResult collectDependenciesFromReactor( DependencyResolutionException e,
+                                                                       Collection<MavenProject> reactorProjects )
+        throws DependencyGraphBuilderException
+    {
+        DependencyResolutionResult result = e.getResult();
+
+        List<Dependency> reactorDeps = getReactorDependencies( reactorProjects, result.getUnresolvedDependencies() );
+        result.getUnresolvedDependencies().removeAll( reactorDeps );
+        Invoker.invoke( result.getResolvedDependencies(), "addAll", Collection.class, reactorDeps );
+
+        if ( !result.getUnresolvedDependencies().isEmpty() )
+        {
+            throw new DependencyGraphBuilderException( "Could not resolve nor collect following dependencies: "
+                + result.getUnresolvedDependencies(), e );
+        }
+
+        return result;
+    }
+
     private List<Dependency> getReactorDependencies( Collection<MavenProject> reactorProjects, List<?> dependencies )
     {
-        final Set<ArtifactKey> reactorProjectsIds = new HashSet<ArtifactKey>();
-        for ( final MavenProject project : reactorProjects )
+        Set<ArtifactKey> reactorProjectsIds = new HashSet<ArtifactKey>();
+        for ( MavenProject project : reactorProjects )
         {
             reactorProjectsIds.add( new ArtifactKey( project ) );
         }
 
-        final List<Dependency> reactorDeps = new ArrayList<Dependency>();
-        for ( final Object untypedDependency : dependencies )
+        List<Dependency> reactorDeps = new ArrayList<Dependency>();
+        for ( Object untypedDependency : dependencies )
         {
-            final Dependency dependency = (Dependency) untypedDependency;
-            final org.eclipse.aether.artifact.Artifact depArtifact = dependency.getArtifact();
+            Dependency dependency = (Dependency) untypedDependency;
+            org.eclipse.aether.artifact.Artifact depArtifact = dependency.getArtifact();
 
-            final ArtifactKey key =
+            ArtifactKey key =
                 new ArtifactKey( depArtifact.getGroupId(), depArtifact.getArtifactId(), depArtifact.getVersion() );
 
             if ( reactorProjectsIds.contains( key ) )
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java
index 7718057..f47363a 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java
@@ -75,15 +75,16 @@
     public DependencyNode buildDependencyGraph( MavenProject project, ArtifactFilter filter )
         throws DependencyGraphBuilderException
     {
-        return buildDependencyGraph( project, filter, Collections.<MavenProject>emptyList() );
+        return buildDependencyGraph( project, filter, null );
     }
 
     /**
-     * Builds the dependency graph for Maven 3 including any dependencies from any projects in the reactor.
+     * Builds the dependency graph for Maven 3, eventually hacking for collecting projects from
+     * reactor not yet built.
      *
      * @param project the project
      * @param filter artifact filter (can be <code>null</code>)
-     * @param reactorProjects Collection of those projects contained in the reactor.
+     * @param reactorProjects Collection of those projects contained in the reactor (can be <code>null</code>).
      * @return DependencyNode containing the dependency graph.
      * @throws DependencyGraphBuilderException if some of the dependencies could not be resolved.
      */
@@ -97,7 +98,7 @@
         DependencyResolutionRequest request =
             new DefaultDependencyResolutionRequest( project, projectBuildingRequest.getRepositorySession() );
 
-        final DependencyResolutionResult result = resolveDependencies( request, reactorProjects );
+        DependencyResolutionResult result = resolveDependencies( request, reactorProjects );
 
         return buildDependencyNode( null, result.getDependencyGraph(), project.getArtifact(), filter );
     }
@@ -112,52 +113,53 @@
         }
         catch ( DependencyResolutionException e )
         {
-            // Ignore any resolution failure for deps that are part of the reactor but have not yet been built.
-            // NB Typing has been removed because DependencyResolutionResult returns Sonatype aether in 3.0.4 and
-            // Eclipse aether in 3.1.1 and while dep-tree is a single module we can only compile against one of them.
-            //
-            // NB While applying this code to Maven3DependencyGraphBuilder is trivial it won't work because
-            // in Maven 3, MavenProject.getProjectReferences isn't populated. So we would need to have the reactor
-            // modules passed in separately which would change the API for DependencyGraphBuilder. If
-            // MavenProject.getProjectReferences were populated (like it should be) then this would work for Maven3 too.
-            //
-            // NB There doesn't seem to be any way to apply this to Maven2DependencyGraphBuilder as there is no
-            // concept of partial resolution like there is is 3 and 3.1
-            final DependencyResolutionResult result = e.getResult();
-
-            final List<Dependency> reactorDeps =
-                getReactorDependencies( reactorProjects, result.getUnresolvedDependencies() );
-            result.getUnresolvedDependencies().removeAll( reactorDeps );
-            Invoker.invoke( result.getResolvedDependencies(), "addAll", Collection.class, reactorDeps );
-
-            if ( !result.getUnresolvedDependencies().isEmpty() )
+            if ( reactorProjects == null )
             {
-                throw new DependencyGraphBuilderException( "Could not resolve the following dependencies: "
-                    + result.getUnresolvedDependencies(), e );
+                throw new DependencyGraphBuilderException( "Could not resolve following dependencies: "
+                    + e.getResult().getUnresolvedDependencies(), e );
             }
 
-            getLogger().debug( "Resolved dependencies after ignoring reactor dependencies: " + reactorDeps );
-
-            return result;
+            // try collecting from reactor
+            return collectDependenciesFromReactor( e, reactorProjects );
         }
     }
 
+    private DependencyResolutionResult collectDependenciesFromReactor( DependencyResolutionException e,
+                                                                       Collection<MavenProject> reactorProjects )
+        throws DependencyGraphBuilderException
+    {
+        DependencyResolutionResult result = e.getResult();
+
+        List<Dependency> reactorDeps = getReactorDependencies( reactorProjects, result.getUnresolvedDependencies() );
+
+        result.getUnresolvedDependencies().removeAll( reactorDeps );
+        Invoker.invoke( result.getResolvedDependencies(), "addAll", Collection.class, reactorDeps );
+
+        if ( !result.getUnresolvedDependencies().isEmpty() )
+        {
+            throw new DependencyGraphBuilderException( "Could not resolve nor collect following dependencies: "
+                + result.getUnresolvedDependencies(), e );
+        }
+
+        return result;
+    }
+
     private List<org.sonatype.aether.graph.Dependency> getReactorDependencies( Collection<MavenProject> reactorProjects,
                                                                                List<?> dependencies )
     {
-        final Set<ArtifactKey> reactorProjectsIds = new HashSet<ArtifactKey>();
-        for ( final MavenProject project : reactorProjects )
+        Set<ArtifactKey> reactorProjectsIds = new HashSet<ArtifactKey>();
+        for ( MavenProject project : reactorProjects )
         {
             reactorProjectsIds.add( new ArtifactKey( project ) );
         }
 
-        final List<Dependency> reactorDeps = new ArrayList<Dependency>();
-        for ( final Object untypedDependency : dependencies )
+        List<Dependency> reactorDeps = new ArrayList<Dependency>();
+        for ( Object untypedDependency : dependencies )
         {
-            final Dependency dependency = (Dependency) untypedDependency;
-            final org.sonatype.aether.artifact.Artifact depArtifact = dependency.getArtifact();
+            Dependency dependency = (Dependency) untypedDependency;
+            org.sonatype.aether.artifact.Artifact depArtifact = dependency.getArtifact();
 
-            final ArtifactKey key =
+            ArtifactKey key =
                 new ArtifactKey( depArtifact.getGroupId(), depArtifact.getArtifactId(), depArtifact.getVersion() );
 
             if ( reactorProjectsIds.contains( key ) )
