Re-enable and fix integration tests
diff --git a/pom.xml b/pom.xml
index 40ffc3b..a99ae47 100644
--- a/pom.xml
+++ b/pom.xml
@@ -116,14 +116,6 @@
         </executions>
       </plugin>
       <plugin>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/DefaultDependencyTreeBuilderTest*</exclude><!-- FIXME: conflict on DefaultArtifactFactory between maven-core 3.x and maven-artifact 2.x -->
-          </excludes>
-        </configuration>
-      </plugin>
-      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-invoker-plugin</artifactId>
         <configuration>
@@ -134,18 +126,6 @@
           <postBuildHookScript>verify</postBuildHookScript>
           <localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath>
           <settingsFile>src/it/settings.xml</settingsFile>
-          <setupIncludes>
-            <setupInclude>reactor/resolve-extension/pom.xml</setupInclude>
-          </setupIncludes>
-          <pomIncludes>
-            <pomInclude>*/pom.xml</pomInclude>
-          </pomIncludes>
-          <pomExcludes> <!-- Tree ITs, must be transformed to graph ITs -->
-            <pomExclude>maven-version/pom.xml</pomExclude>
-            <pomExclude>mshared-167/pom.xml</pomExclude>
-            <pomExclude>reactor/pom.xml</pomExclude>
-            <pomExclude>verbose/pom.xml</pomExclude>
-          </pomExcludes>
           <properties>
             <maven.compiler.source>${maven.compiler.source}</maven.compiler.source>
             <maven.compiler.target>${maven.compiler.target}</maven.compiler.target>
diff --git a/src/it/maven-version/invoker.properties b/src/it/maven-version/invoker.properties
index 6e1a8cd..38ca093 100644
--- a/src/it/maven-version/invoker.properties
+++ b/src/it/maven-version/invoker.properties
@@ -15,4 +15,4 @@
 # specific language governing permissions and limitations
 # under the License.
 
-invoker.goals = clean dependency:tree
+invoker.goals = org.apache.maven.its.dependency-tree:graph-maven-plugin:graph
diff --git a/src/it/maven-version/pom.xml b/src/it/maven-version/pom.xml
index 289994a..2396604 100644
--- a/src/it/maven-version/pom.xml
+++ b/src/it/maven-version/pom.xml
@@ -70,19 +70,12 @@
     <pluginManagement>
       <plugins>
         <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-dependency-plugin</artifactId>
-          <version>2.8</version>
+          <groupId>org.apache.maven.its.dependency-tree</groupId>
+          <artifactId>graph-maven-plugin</artifactId>
+          <version>1.0-SNAPSHOT</version>
           <configuration>
             <outputFile>target/tree.txt</outputFile>
           </configuration>
-          <dependencies>
-            <dependency>
-              <groupId>@project.groupId@</groupId>
-              <artifactId>@project.artifactId@</artifactId>
-              <version>@project.version@</version>
-            </dependency>
-          </dependencies>
         </plugin>
       </plugins>
     </pluginManagement>
diff --git a/src/it/mshared-167/expected-M2.txt b/src/it/mshared-167/expected-M2.txt
deleted file mode 100644
index da04271..0000000
--- a/src/it/mshared-167/expected-M2.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-org.apache.maven.its.dependency-tree:mshared-167:jar:1.0-SNAPSHOT
-\- org.apache.xmlgraphics:batik-swing:jar:1.7:compile
-   +- org.apache.xmlgraphics:batik-awt-util:jar:1.7:compile
-   +- org.apache.xmlgraphics:batik-bridge:jar:1.7:compile
-   |  +- org.apache.xmlgraphics:batik-anim:jar:1.7:compile
-   |  +- org.apache.xmlgraphics:batik-parser:jar:1.7:compile
-   |  +- org.apache.xmlgraphics:batik-script:jar:1.7:compile
-   |  +- org.apache.xmlgraphics:batik-xml:jar:1.7:compile
-   |  \- xalan:xalan:jar:2.6.0:compile
-   +- org.apache.xmlgraphics:batik-css:jar:1.7:compile
-   +- org.apache.xmlgraphics:batik-dom:jar:1.7:compile
-   +- org.apache.xmlgraphics:batik-ext:jar:1.7:compile
-   +- org.apache.xmlgraphics:batik-gui-util:jar:1.7:compile
-   +- org.apache.xmlgraphics:batik-gvt:jar:1.7:compile
-   +- org.apache.xmlgraphics:batik-svg-dom:jar:1.7:compile
-   +- org.apache.xmlgraphics:batik-util:jar:1.7:compile
-   +- xml-apis:xml-apis:jar:1.3.04:compile
-   \- xml-apis:xml-apis-ext:jar:1.3.04:compile
diff --git a/src/it/mshared-167/expected-M3.txt b/src/it/mshared-167/expected.txt
similarity index 100%
rename from src/it/mshared-167/expected-M3.txt
rename to src/it/mshared-167/expected.txt
diff --git a/src/it/mshared-167/invoker.properties b/src/it/mshared-167/invoker.properties
index 6e1a8cd..38ca093 100644
--- a/src/it/mshared-167/invoker.properties
+++ b/src/it/mshared-167/invoker.properties
@@ -15,4 +15,4 @@
 # specific language governing permissions and limitations
 # under the License.
 
-invoker.goals = clean dependency:tree
+invoker.goals = org.apache.maven.its.dependency-tree:graph-maven-plugin:graph
diff --git a/src/it/mshared-167/pom.xml b/src/it/mshared-167/pom.xml
index 132e479..9f641f8 100644
--- a/src/it/mshared-167/pom.xml
+++ b/src/it/mshared-167/pom.xml
@@ -35,7 +35,6 @@
 
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <outputFile>target/tree-M2.txt</outputFile>
   </properties>
 
   <dependencies>
@@ -50,36 +49,14 @@
     <pluginManagement>
       <plugins>
         <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-dependency-plugin</artifactId>
-          <version>2.8</version>
+          <groupId>org.apache.maven.its.dependency-tree</groupId>
+          <artifactId>graph-maven-plugin</artifactId>
+          <version>1.0-SNAPSHOT</version>
           <configuration>
-            <outputFile>${outputFile}</outputFile>
+            <outputFile>target/tree.txt</outputFile>
           </configuration>
-          <dependencies>
-            <dependency>
-              <groupId>@project.groupId@</groupId>
-              <artifactId>@project.artifactId@</artifactId>
-              <version>@project.version@</version>
-            </dependency>
-          </dependencies>
         </plugin>
       </plugins>
     </pluginManagement>
   </build>
-
-  <profiles>
-    <profile>
-      <id>maven-3</id>
-      <activation>
-        <file>
-          <!--  This employs that the basedir expression is only recognized by Maven 3.x (see MNG-2363) -->
-          <exists>${basedir}</exists>
-         </file>
-      </activation>
-      <properties>
-        <outputFile>target/tree-M3.txt</outputFile>
-      </properties>
-    </profile>    
-  </profiles>
 </project>
diff --git a/src/it/mshared-167/verify.bsh b/src/it/mshared-167/verify.bsh
index c5f7249..958b237 100644
--- a/src/it/mshared-167/verify.bsh
+++ b/src/it/mshared-167/verify.bsh
@@ -21,13 +21,8 @@
 
 import org.codehaus.plexus.util.*;
 
-File outputFile = new File( basedir, "target/tree-M2.txt" );
-File expectedFile = new File( basedir, "expected-M2.txt" );
-if ( ! outputFile.exists() )
-{
-  outputFile = new File( basedir, "target/tree-M3.txt" );
-  expectedFile = new File( basedir, "expected-M3.txt" );
-}
+File outputFile = new File( basedir, "target/tree.txt" );
+File expectedFile = new File( basedir, "expected.txt" );
 
 String actual = FileUtils.fileRead( outputFile );
 String expected = FileUtils.fileRead( expectedFile );
diff --git a/src/it/reactor/module-z-deps-y/pom.xml b/src/it/reactor/module-z-deps-y/pom.xml
index f6788fc..9279585 100644
--- a/src/it/reactor/module-z-deps-y/pom.xml
+++ b/src/it/reactor/module-z-deps-y/pom.xml
@@ -51,16 +51,9 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <version>2.8</version>
-        <dependencies>
-          <dependency>
-            <groupId>@project.groupId@</groupId>
-            <artifactId>@project.artifactId@</artifactId>
-            <version>@project.version@</version>
-          </dependency>
-        </dependencies>
+        <groupId>org.apache.maven.its.dependency-tree</groupId>
+        <artifactId>graph-maven-plugin</artifactId>
+        <version>1.0-SNAPSHOT</version>
         <executions>
           <execution>
             <id>default</id>
@@ -69,7 +62,7 @@
               <outputFile>target/tree.txt</outputFile>
             </configuration>
             <goals>
-              <goal>tree</goal>
+              <goal>graph</goal>
             </goals>
           </execution>
         </executions>
diff --git a/src/it/reactor/verify.bsh b/src/it/reactor/verify.bsh
index cffa5c5..845be14 100644
--- a/src/it/reactor/verify.bsh
+++ b/src/it/reactor/verify.bsh
@@ -34,11 +34,6 @@
     throw new Exception( "Unexpected dependency tree" );
 }
 
-String resolved = FileUtils.fileRead( new File( basedir, "resolved-module-z-deps-y.txt" ) );
+File resolved = new File( basedir, "resolved-module-z-deps-y.txt" );
 
-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" );
-}
-
-return true;
+return !resolved.exists();
diff --git a/src/it/reactor/resolve-extension/invoker.properties b/src/it/setup-extension/invoker.properties
similarity index 100%
rename from src/it/reactor/resolve-extension/invoker.properties
rename to src/it/setup-extension/invoker.properties
diff --git a/src/it/reactor/resolve-extension/pom.xml b/src/it/setup-extension/pom.xml
similarity index 100%
rename from src/it/reactor/resolve-extension/pom.xml
rename to src/it/setup-extension/pom.xml
diff --git a/src/it/reactor/resolve-extension/src/main/java/org/apache/maven/its/deptree/ResolveDependenciesLifecycleParticipant.java b/src/it/setup-extension/src/main/java/org/apache/maven/its/deptree/ResolveDependenciesLifecycleParticipant.java
similarity index 87%
rename from src/it/reactor/resolve-extension/src/main/java/org/apache/maven/its/deptree/ResolveDependenciesLifecycleParticipant.java
rename to src/it/setup-extension/src/main/java/org/apache/maven/its/deptree/ResolveDependenciesLifecycleParticipant.java
index fba7dfa..8ae9c42 100644
--- a/src/it/reactor/resolve-extension/src/main/java/org/apache/maven/its/deptree/ResolveDependenciesLifecycleParticipant.java
+++ b/src/it/setup-extension/src/main/java/org/apache/maven/its/deptree/ResolveDependenciesLifecycleParticipant.java
@@ -76,16 +76,6 @@
             log.info( "building dependency graph for project " + project.getArtifact() );
 
             File resolved = new File( basedir, "resolved-" + project.getArtifactId() + ".txt" );
-            try
-            {
-                log.info( "building with reactor projects" );
-                // No need to filter our search. We want to resolve all artifacts.
-                dependencyGraphBuilder.buildDependencyGraph( buildingRequest, null, projects );
-            }
-            catch ( DependencyGraphBuilderException e )
-            {
-                throw new MavenExecutionException( "Could not resolve dependencies for project: " + project, e );
-            }
 
             try
             {
@@ -95,7 +85,7 @@
             }
             catch ( DependencyGraphBuilderException e )
             {
-                log.info( "expected resolution failure: " + e.getMessage() );
+                log.info( "unexpected resolution failure: " + e.getMessage() );
 
                 try
                 {
diff --git a/src/it/setup-plugin/invoker.properties b/src/it/setup-plugin/invoker.properties
new file mode 100644
index 0000000..d5d6ca5
--- /dev/null
+++ b/src/it/setup-plugin/invoker.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this 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
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+invoker.goals = install
diff --git a/src/it/setup-plugin/pom.xml b/src/it/setup-plugin/pom.xml
new file mode 100644
index 0000000..1a0098a
--- /dev/null
+++ b/src/it/setup-plugin/pom.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this 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
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.maven.its.dependency-tree</groupId>
+  <artifactId>graph-maven-plugin</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <packaging>maven-plugin</packaging>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-plugin-plugin</artifactId>
+        <version>3.6.1</version>
+        <executions>
+          <execution>
+            <id>default-descriptor</id>
+            <phase>process-classes</phase>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.shared</groupId>
+      <artifactId>maven-dependency-tree</artifactId>
+      <version>@project.version@</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.plugin-tools</groupId>
+      <artifactId>maven-plugin-annotations</artifactId>
+      <version>3.5.2</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-core</artifactId>
+      <version>3.0.5</version>
+      <scope>provided</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/src/it/setup-plugin/src/main/java/graph/GraphMojo.java b/src/it/setup-plugin/src/main/java/graph/GraphMojo.java
new file mode 100644
index 0000000..6cdc0a2
--- /dev/null
+++ b/src/it/setup-plugin/src/main/java/graph/GraphMojo.java
@@ -0,0 +1,105 @@
+package graph;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.Writer;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this 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
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugins.annotations.Component;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.project.DefaultProjectBuildingRequest;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.ProjectBuildingRequest;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.shared.dependency.graph.DependencyCollectorBuilder;
+import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
+import org.apache.maven.shared.dependency.graph.DependencyNode;
+import org.apache.maven.shared.dependency.graph.traversal.SerializingDependencyNodeVisitor;
+
+@Mojo( name = "graph" )
+public class GraphMojo
+    extends AbstractMojo
+{
+
+    @Parameter( defaultValue = "${session}", readonly = true, required = true )
+    private MavenSession session;
+
+    @Parameter( defaultValue = "${project}", readonly = true, required = true )
+    private MavenProject project;
+    
+    @Parameter
+    private ArtifactFilter artifactFilter;
+    
+    @Parameter
+    private File outputFile;
+    
+    @Parameter
+    private boolean verbose;
+
+    @Component
+    private DependencyGraphBuilder graphBuilder;
+
+    @Component
+    private DependencyCollectorBuilder collectorBuilder;
+    
+    @Override
+    public void execute() throws MojoExecutionException
+    {
+        // Code currently assumes project has been set...
+        ProjectBuildingRequest buildingRequest = new DefaultProjectBuildingRequest( session.getProjectBuildingRequest() );
+        buildingRequest.setProject( project );
+        
+        try
+        {
+            DependencyNode node;
+            if ( verbose )
+            {
+                node = collectorBuilder.collectDependencyGraph( buildingRequest, artifactFilter );
+            }
+            else
+            {
+                node = graphBuilder.buildDependencyGraph( buildingRequest, artifactFilter );
+            }
+            
+            if ( outputFile != null )
+            {
+                outputFile.getParentFile().mkdirs();
+
+                try ( Writer writer = new FileWriter( outputFile ) )
+                {
+                    node.accept( new SerializingDependencyNodeVisitor( writer,
+                                                                       SerializingDependencyNodeVisitor.STANDARD_TOKENS ) );
+                }
+            }
+        }
+        catch ( Exception e ) // Catch all is good enough for IT
+        {
+            throw new MojoExecutionException( "Failed to build dependency graph", e );
+        }
+    }
+
+    
+    
+}
\ No newline at end of file
diff --git a/src/it/verbose/expected-verbose.txt b/src/it/verbose/expected-verbose.txt
index a4453e5..2e51ea7 100644
--- a/src/it/verbose/expected-verbose.txt
+++ b/src/it/verbose/expected-verbose.txt
@@ -1,15 +1,16 @@
 org.apache.maven.its.dependency-tree:verbose:jar:1.0-SNAPSHOT
 +- org.apache.maven:maven-project:jar:2.0.6:compile
 |  +- org.apache.maven:maven-settings:jar:2.0.6:compile
-|  |  +- (org.apache.maven:maven-model:jar:2.0.5:test - version managed from 2.0.6; scope managed from compile; omitted for duplicate)
+|  |  +- (org.apache.maven:maven-model:jar:2.0.5:test - version managed from 2.0.6; scope managed from compile; omitted for conflict with 2.0.7)
 |  |  +- (org.codehaus.plexus:plexus-utils:jar:1.4.1:compile - omitted for duplicate)
 |  |  \- (org.codehaus.plexus:plexus-container-default:jar:1.0-alpha-9-stable-1:compile - omitted for duplicate)
 |  +- (org.apache.maven:maven-profile:jar:2.0.6:compile - omitted for conflict with 2.0.4)
-|  +- (org.apache.maven:maven-model:jar:2.0.5:test - version managed from 2.0.4; scope managed from compile; omitted for conflict with 2.0.7)
+|  +- (org.apache.maven:maven-model:jar:2.0.5:test - version managed from 2.0.6; scope managed from compile; omitted for conflict with 2.0.7)
 |  +- org.apache.maven:maven-artifact-manager:jar:2.0.6:compile
 |  |  +- org.apache.maven:maven-repository-metadata:jar:2.0.6:compile
 |  |  |  \- (org.codehaus.plexus:plexus-utils:jar:1.4.1:compile - omitted for duplicate)
 |  |  +- (org.codehaus.plexus:plexus-utils:jar:1.4.1:compile - omitted for duplicate)
+|  |  +- (org.apache.maven:maven-artifact:jar:2.0.6:compile - omitted for exclusion by org.apache.maven:maven-project)
 |  |  +- (org.codehaus.plexus:plexus-container-default:jar:1.0-alpha-9-stable-1:compile - omitted for duplicate)
 |  |  \- org.apache.maven.wagon:wagon-provider-api:jar:1.0-beta-2:compile
 |  |     \- (org.codehaus.plexus:plexus-utils:jar:1.0.4:compile - omitted for conflict with 1.4.1)
@@ -17,12 +18,13 @@
 |  |  +- (org.codehaus.plexus:plexus-utils:jar:1.4.1:compile - omitted for duplicate)
 |  |  \- (org.codehaus.plexus:plexus-container-default:jar:1.0-alpha-9-stable-1:compile - omitted for duplicate)
 |  +- org.codehaus.plexus:plexus-utils:jar:1.4.1:compile
+|  +- (org.apache.maven:maven-artifact:jar:2.0.6:compile - omitted for exclusion by org.apache.maven:maven-project)
 |  \- org.codehaus.plexus:plexus-container-default:jar:1.0-alpha-9-stable-1:compile
 |     +- junit:junit:jar:3.8.1:compile
 |     +- (org.codehaus.plexus:plexus-utils:jar:1.0.4:compile - omitted for conflict with 1.4.1)
 |     \- classworlds:classworlds:jar:1.1-alpha-2:compile
 +- org.apache.maven:maven-profile:jar:2.0.4:test (scope not updated to compile)
-|  +- (org.apache.maven:maven-model:jar:2.0.5:test - version managed from 2.0.4; scope managed from compile; omitted for duplicate)
+|  +- (org.apache.maven:maven-model:jar:2.0.5:test - version managed from 2.0.4; scope managed from compile; omitted for conflict with 2.0.7)
 |  +- (org.codehaus.plexus:plexus-utils:jar:1.1:test - omitted for conflict with 1.4.1)
 |  \- (org.codehaus.plexus:plexus-container-default:jar:1.0-alpha-9:test - omitted for conflict with 1.0-alpha-9-stable-1)
 +- org.apache.maven:maven-model:jar:2.0.7:runtime
@@ -33,7 +35,6 @@
    |  +- (org.apache.xmlgraphics:batik-dom:jar:1.7:compile - omitted for duplicate)
    |  +- (org.apache.xmlgraphics:batik-ext:jar:1.7:compile - omitted for duplicate)
    |  +- (org.apache.xmlgraphics:batik-parser:jar:1.7:compile - omitted for duplicate)
-   |  +- (org.apache.xmlgraphics:batik-anim:jar:1.7:compile - omitted for cycle)
    |  +- (org.apache.xmlgraphics:batik-svg-dom:jar:1.7:compile - omitted for duplicate)
    |  +- (org.apache.xmlgraphics:batik-util:jar:1.7:compile - omitted for duplicate)
    |  +- (xml-apis:xml-apis:jar:1.3.04:compile - omitted for duplicate)
@@ -55,17 +56,25 @@
    |  \- (xml-apis:xml-apis-ext:jar:1.3.04:compile - omitted for duplicate)
    +- org.apache.xmlgraphics:batik-ext:jar:1.7:compile
    |  \- (xml-apis:xml-apis:jar:1.3.04:compile - omitted for duplicate)
-   +- (org.apache.xmlgraphics:batik-bridge:jar:1.7:compile - omitted for cycle)
    +- org.apache.xmlgraphics:batik-gvt:jar:1.7:compile
-   |  \- (org.apache.xmlgraphics:batik-awt-util:jar:1.7:compile - omitted for duplicate)
+   |  +- (org.apache.xmlgraphics:batik-awt-util:jar:1.7:compile - omitted for duplicate)
+   |  +- (org.apache.xmlgraphics:batik-bridge:jar:1.7:compile - omitted for cycle)
+   |  +- (org.apache.xmlgraphics:batik-util:jar:1.7:compile - omitted for duplicate)
+   |  \- (xml-apis:xml-apis:jar:1.3.04:compile - omitted for duplicate)
    +- org.apache.xmlgraphics:batik-parser:jar:1.7:compile
    |  +- (org.apache.xmlgraphics:batik-awt-util:jar:1.7:compile - omitted for duplicate)
    |  +- (org.apache.xmlgraphics:batik-util:jar:1.7:compile - omitted for duplicate)
    |  \- (org.apache.xmlgraphics:batik-xml:jar:1.7:compile - omitted for duplicate)
-   +- (org.apache.xmlgraphics:batik-bridge:jar:1.7:compile - omitted for cycle)
    +- org.apache.xmlgraphics:batik-script:jar:1.7:compile
+   |  +- (org.apache.xmlgraphics:batik-bridge:jar:1.7:compile - omitted for cycle)
+   |  +- (org.apache.xmlgraphics:batik-dom:jar:1.7:compile - omitted for duplicate)
+   |  +- (org.apache.xmlgraphics:batik-ext:jar:1.7:compile - omitted for duplicate)
+   |  +- (org.apache.xmlgraphics:batik-svg-dom:jar:1.7:compile - omitted for duplicate)
+   |  +- (org.apache.xmlgraphics:batik-util:jar:1.7:compile - omitted for duplicate)
+   |  +- org.apache.xmlgraphics:batik-js:jar:1.7:compile
+   |  |  \- (xml-apis:xml-apis:jar:1.3.04:compile - omitted for duplicate)
+   |  \- (xml-apis:xml-apis:jar:1.3.04:compile - omitted for duplicate)
    +- org.apache.xmlgraphics:batik-svg-dom:jar:1.7:compile
-   |  +- (org.apache.xmlgraphics:batik-svg-dom:jar:1.7:compile - omitted for cycle)
    |  +- (org.apache.xmlgraphics:batik-anim:jar:1.7:compile - omitted for duplicate)
    |  +- (org.apache.xmlgraphics:batik-awt-util:jar:1.7:compile - omitted for duplicate)
    |  +- (org.apache.xmlgraphics:batik-css:jar:1.7:compile - omitted for duplicate)
diff --git a/src/it/verbose/pom.xml b/src/it/verbose/pom.xml
index c57704f..26a918a 100644
--- a/src/it/verbose/pom.xml
+++ b/src/it/verbose/pom.xml
@@ -81,16 +81,9 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <version>2.8</version>
-        <dependencies>
-          <dependency>
-            <groupId>@project.groupId@</groupId>
-            <artifactId>@project.artifactId@</artifactId>
-            <version>@project.version@</version>
-          </dependency>
-        </dependencies>
+        <groupId>org.apache.maven.its.dependency-tree</groupId>
+        <artifactId>graph-maven-plugin</artifactId>
+        <version>1.0-SNAPSHOT</version>
         <executions>
           <execution>
             <id>verbose</id>
@@ -100,7 +93,7 @@
               <verbose>true</verbose>
             </configuration>
             <goals>
-              <goal>tree</goal>
+              <goal>graph</goal>
             </goals>
           </execution>
           <execution>
@@ -110,7 +103,7 @@
               <outputFile>target/tree-default.txt</outputFile>
             </configuration>
             <goals>
-              <goal>tree</goal>
+              <goal>graph</goal>
             </goals>
           </execution>
         </executions>
diff --git a/src/it/verbose/verify.bsh b/src/it/verbose/verify.bsh
deleted file mode 100644
index 22d600c..0000000
--- a/src/it/verbose/verify.bsh
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this 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
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.io.*;
-
-import org.codehaus.plexus.util.*;
-
-String actual = FileUtils.fileRead( new File( basedir, "target/tree-verbose.txt" ) );
-String expected = FileUtils.fileRead( new File( basedir, "expected-verbose.txt" ) );
-
-actual = actual.replaceAll( "[\n\r]+", "\n" );
-expected = expected.replaceAll( "[\n\r]+", "\n" );
-
-System.out.println( "Checking verbose dependency tree..." );
-
-if ( !actual.equals( expected ) )
-{
-    throw new Exception( "Unexpected verbose dependency tree" );
-}
-
-actual = FileUtils.fileRead( new File( basedir, "target/tree-default.txt" ) );
-expected = FileUtils.fileRead( new File( basedir, "expected-default.txt" ) );
-
-actual = actual.replaceAll( "[\n\r]+", "\n" );
-expected = expected.replaceAll( "[\n\r]+", "\n" );
-
-System.out.println( "Checking default dependency tree..." );
-
-if ( !actual.equals( expected ) )
-{
-    throw new Exception( "Unexpected default dependency tree" );
-}
-
-return true;
diff --git a/src/it/verbose/verify.groovy b/src/it/verbose/verify.groovy
new file mode 100644
index 0000000..2065d47
--- /dev/null
+++ b/src/it/verbose/verify.groovy
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this 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
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+def actual = new File( basedir, "target/tree-verbose.txt" ).readLines()
+// omitted for cycle not supported anymore, but should probably return
+// omitted for exclusion is not supported yet
+def expected = new File( basedir, "expected-verbose.txt" ).readLines().findAll{!((it.contains('omitted for cycle')||it.contains('omitted for exclusion')))}
+
+assert actual.equals( expected )
+
+actual = new File( basedir, "target/tree-default.txt" ).readLines()
+expected = new File( basedir, "expected-default.txt" ).readLines()
+
+assert actual.equals( expected )
\ No newline at end of file
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorBuilder.java
index 43cfb40..516a6f6 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorBuilder.java
@@ -19,7 +19,6 @@
  * under the License.
  */
 
-import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
 import org.apache.maven.project.ProjectBuildingRequest;
 
@@ -43,8 +42,7 @@
      * @return the raw dependency tree
      * @throws DependencyGraphBuilderException if some of the dependencies could not be collected.
      */
-    DependencyNode collectDependencyGraph( ArtifactRepository localRepository, ProjectBuildingRequest buildingRequest,
-                                         ArtifactFilter filter )
+    DependencyNode collectDependencyGraph( ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
         throws DependencyCollectorBuilderException;
 
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/ArtifactKey.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/ArtifactKey.java
index 885796f..40f9f3c 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/ArtifactKey.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/ArtifactKey.java
@@ -19,6 +19,8 @@
  * under the License.
  */
 
+import java.util.Objects;
+
 import org.apache.maven.project.MavenProject;
 
 /**
@@ -26,17 +28,17 @@
  */
 final class ArtifactKey
 {
-    private static final int HASH_PRIME = 31;
-
     private final String groupId;
     private final String artifactId;
     private final String version;
+    private final int hashCode;
 
     ArtifactKey( String groupId, String artifactId, String version )
     {
         this.groupId = groupId;
         this.artifactId = artifactId;
         this.version = version;
+        this.hashCode = Objects.hash( groupId, artifactId, version );
     }
 
     ArtifactKey( MavenProject project )
@@ -65,9 +67,6 @@
     @Override
     public int hashCode()
     {
-        int result = groupId.hashCode();
-        result = HASH_PRIME * result + artifactId.hashCode();
-        result = HASH_PRIME * result + version.hashCode();
-        return result;
+        return hashCode;
     }
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/ConflictData.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/ConflictData.java
new file mode 100644
index 0000000..9393c66
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/ConflictData.java
@@ -0,0 +1,73 @@
+package org.apache.maven.shared.dependency.graph.internal;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this 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
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Excplicit subset of Aethers DependencyNode.getData()
+ * 
+ * @author Robert Scholte
+ *
+ */
+public class ConflictData
+{
+    private String winnerVersion;
+
+    private String originalScope;
+    
+    private String ignoredScope;
+    
+    private Boolean originaOptionality;
+    
+    public ConflictData( String winnerVersion, String ignoredScope )
+    {
+        this.winnerVersion = winnerVersion;
+        this.ignoredScope = ignoredScope;
+    }
+    
+    public String getWinnerVersion()
+    {
+        return winnerVersion;
+    }
+    
+    public String getOriginalScope()
+    {
+        return originalScope;
+    }
+
+    public void setOriginalScope( String originalScope )
+    {
+        this.originalScope = originalScope;
+    }
+
+    public Boolean getOriginaOptionality()
+    {
+        return originaOptionality;
+    }
+
+    public void setOriginaOptionality( Boolean originaOptionality )
+    {
+        this.originaOptionality = originaOptionality;
+    }
+
+    public String getIgnoredScope()
+    {
+        return ignoredScope;
+    }
+}
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyCollectorBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyCollectorBuilder.java
index e29cc9d..13b3a51 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyCollectorBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyCollectorBuilder.java
@@ -19,7 +19,6 @@
  * under the License.
  */
 
-import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.ProjectBuildingRequest;
@@ -50,8 +49,7 @@
     protected PlexusContainer container;
 
     @Override
-    public DependencyNode collectDependencyGraph( ArtifactRepository localRepository,
-                                                ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
+    public DependencyNode collectDependencyGraph( ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
         throws DependencyCollectorBuilderException
     {
         try
@@ -70,7 +68,7 @@
                     + effectiveGraphBuilder.getClass().getSimpleName() );
             }
 
-            return effectiveGraphBuilder.collectDependencyGraph( localRepository, buildingRequest, filter );
+            return effectiveGraphBuilder.collectDependencyGraph( buildingRequest, filter );
         }
         catch ( ComponentLookupException e )
         {
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyNode.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyNode.java
index 440eaea..a171484 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyNode.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyNode.java
@@ -78,6 +78,16 @@
         this.optional = optional;
         this.exclusions = exclusions;
     }
+    
+    // user to refer to winner
+    public DefaultDependencyNode( Artifact artifact )
+    {
+        this.artifact = artifact;
+        this.parent = null;
+        this.premanagedScope = null;
+        this.premanagedVersion = null;
+        this.versionConstraint = null;
+    }
 
     /**
      * Applies the specified dependency node visitor to this dependency node and its children.
@@ -179,82 +189,6 @@
 
         buffer.append( artifact );
 
-        ItemAppender appender = new ItemAppender( buffer, " (", "; ", ")" );
-
-        if ( getPremanagedVersion() != null )
-        {
-            appender.append( "version managed from ", getPremanagedVersion() );
-        }
-
-        if ( getPremanagedScope() != null )
-        {
-            appender.append( "scope managed from ", getPremanagedScope() );
-        }
-
-        if ( getVersionConstraint() != null )
-        {
-            appender.append( "version selected from constraint ", getVersionConstraint() );
-        }
-
-
-        appender.flush();
-        if ( optional != null && optional )
-        {
-            buffer.append( " (optional) " );
-        }
-
         return buffer.toString();
     }
-
-    /**
-     * Utility class to concatenate a number of parameters with separator tokens.
-     */
-    private static class ItemAppender
-    {
-        private StringBuilder buffer;
-
-        private String startToken;
-
-        private String separatorToken;
-
-        private String endToken;
-
-        private boolean appended;
-
-        ItemAppender( StringBuilder buffer, String startToken, String separatorToken, String endToken )
-        {
-            this.buffer = buffer;
-            this.startToken = startToken;
-            this.separatorToken = separatorToken;
-            this.endToken = endToken;
-
-            appended = false;
-        }
-
-        public ItemAppender append( String item1, String item2 )
-        {
-            appendToken();
-
-            buffer.append( item1 ).append( item2 );
-
-            return this;
-        }
-
-        public void flush()
-        {
-            if ( appended )
-            {
-                buffer.append( endToken );
-
-                appended = false;
-            }
-        }
-
-        private void appendToken()
-        {
-            buffer.append( appended ? separatorToken : startToken );
-
-            appended = true;
-        }
-    }
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyCollectorBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyCollectorBuilder.java
index 15c173d..927c389 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyCollectorBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyCollectorBuilder.java
@@ -34,6 +34,7 @@
 import org.apache.maven.shared.dependency.graph.DependencyCollectorBuilderException;
 import org.apache.maven.shared.dependency.graph.DependencyNode;
 import org.apache.maven.shared.dependency.graph.internal.maven31.Maven31DirectScopeDependencySelector;
+import org.apache.maven.shared.dependency.graph.internal.maven31.VerboseJavaScopeSelector;
 import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
@@ -54,7 +55,6 @@
 import org.eclipse.aether.util.graph.selector.OptionalDependencySelector;
 import org.eclipse.aether.util.graph.transformer.ConflictResolver;
 import org.eclipse.aether.util.graph.transformer.JavaScopeDeriver;
-import org.eclipse.aether.util.graph.transformer.JavaScopeSelector;
 import org.eclipse.aether.util.graph.transformer.NearestVersionSelector;
 import org.eclipse.aether.util.graph.transformer.SimpleOptionalitySelector;
 import org.eclipse.aether.util.graph.visitor.TreeDependencyVisitor;
@@ -89,8 +89,7 @@
     }
 
     @Override
-    public DependencyNode collectDependencyGraph( ArtifactRepository localRepository,
-                                                  ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
+    public DependencyNode collectDependencyGraph( ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
         throws DependencyCollectorBuilderException
     {
         DefaultRepositorySystemSession session = null;
@@ -108,7 +107,7 @@
             session = new DefaultRepositorySystemSession( repositorySession );
 
             DependencyGraphTransformer transformer =
-                new ConflictResolver( new NearestVersionSelector(), new JavaScopeSelector(),
+                new ConflictResolver( new NearestVersionSelector(), new VerboseJavaScopeSelector(),
                                       new SimpleOptionalitySelector(), new JavaScopeDeriver() );
             session.setDependencyGraphTransformer( transformer );
 
@@ -276,10 +275,25 @@
             }
         }
 
-        DefaultDependencyNode current =
-            new DefaultDependencyNode( parent, artifact, premanagedVersion, premanagedScope,
+        org.eclipse.aether.graph.DependencyNode winner =
+            (org.eclipse.aether.graph.DependencyNode) node.getData().get( ConflictResolver.NODE_DATA_WINNER );
+        String winnerVersion = null;
+        String ignoredScope = null;
+        if ( winner != null )
+        {
+            winnerVersion = winner.getArtifact().getBaseVersion();
+        }
+        else
+        {
+            ignoredScope = (String) node.getData().get( VerboseJavaScopeSelector.REDUCED_SCOPE );
+        }
+        
+        ConflictData data = new ConflictData( winnerVersion, ignoredScope );
+        
+        VerboseDependencyNode current =
+            new VerboseDependencyNode( parent, artifact, premanagedVersion, premanagedScope,
                                        getVersionSelectedFromRange( node.getVersionConstraint() ), optional,
-                                       exclusions );
+                                       exclusions, data );
 
         List<DependencyNode> nodes = new ArrayList<DependencyNode>( node.getChildren().size() );
         for ( org.eclipse.aether.graph.DependencyNode child : node.getChildren() )
@@ -306,5 +320,4 @@
 
         return constraint.getRange().toString();
     }
-
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyCollectorBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyCollectorBuilder.java
index 24c0d65..272fa08 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyCollectorBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyCollectorBuilder.java
@@ -89,8 +89,7 @@
     }
 
     @Override
-    public DependencyNode collectDependencyGraph( ArtifactRepository localRepository,
-                                                ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
+    public DependencyNode collectDependencyGraph( ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
         throws DependencyCollectorBuilderException
     {
         try
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/VerboseDependencyNode.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/VerboseDependencyNode.java
new file mode 100644
index 0000000..d13b623
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/VerboseDependencyNode.java
@@ -0,0 +1,168 @@
+package org.apache.maven.shared.dependency.graph.internal;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this 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
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.util.List;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.model.Exclusion;
+import org.apache.maven.shared.dependency.graph.DependencyNode;
+
+class VerboseDependencyNode
+    extends DefaultDependencyNode
+{
+
+    private final ConflictData data;
+    
+    VerboseDependencyNode( DependencyNode parent, Artifact artifact, String premanagedVersion,
+                                  String premanagedScope, String versionConstraint, Boolean optional,
+                                  List<Exclusion> exclusions, ConflictData data )
+    {
+        super( parent, artifact, premanagedVersion, premanagedScope, versionConstraint, optional, exclusions );
+
+        this.data = data;
+    }
+    
+    @Override
+    public String toNodeString()
+    {
+        StringBuilder buffer = new StringBuilder();
+
+        boolean included = ( data.getWinnerVersion() == null );
+
+        if ( !included )
+        {
+            buffer.append( '(' );
+        }
+
+        buffer.append( getArtifact() );
+
+        ItemAppender appender = new ItemAppender( buffer, included ? " (" : " - ", "; ", included ? ")" : "" );
+
+        if ( getPremanagedVersion() != null )
+        {
+            appender.append( "version managed from ", getPremanagedVersion() );
+        }
+
+        if ( getPremanagedScope() != null )
+        {
+            appender.append( "scope managed from ", getPremanagedScope() );
+        }
+
+        if ( data.getOriginalScope() != null )
+        {
+            appender.append( "scope updated from ", data.getOriginalScope() );
+        }
+
+        if ( data.getIgnoredScope() != null )
+        {
+            appender.append( "scope not updated to ", data.getIgnoredScope() );
+        }
+
+//        if ( getVersionSelectedFromRange() != null )
+//        {
+//            appender.append( "version selected from range ", getVersionSelectedFromRange().toString() );
+//            appender.append( "available versions ", getAvailableVersions().toString() );
+//        }
+
+        if ( !included )
+        {
+            String winnerVersion = data.getWinnerVersion(); 
+            if ( winnerVersion.equals( getArtifact().getVersion() ) )
+            {
+              appender.append( "omitted for duplicate" );
+            }
+            else
+            {
+              appender.append( "omitted for conflict with ", winnerVersion );
+            }
+        }
+
+        appender.flush();
+
+        if ( !included )
+        {
+            buffer.append( ')' );
+        }
+
+        return buffer.toString();
+    }
+
+    /**
+     * Utility class to concatenate a number of parameters with separator tokens.
+     */
+    private static class ItemAppender
+    {
+        private StringBuilder buffer;
+
+        private String startToken;
+
+        private String separatorToken;
+
+        private String endToken;
+
+        private boolean appended;
+
+        ItemAppender( StringBuilder buffer, String startToken, String separatorToken, String endToken )
+        {
+            this.buffer = buffer;
+            this.startToken = startToken;
+            this.separatorToken = separatorToken;
+            this.endToken = endToken;
+
+            appended = false;
+        }
+
+        public ItemAppender append( String item1 )
+        {
+            appendToken();
+
+            buffer.append( item1 );
+
+            return this;
+        }
+
+        public ItemAppender append( String item1, String item2 )
+        {
+            appendToken();
+
+            buffer.append( item1 ).append( item2 );
+
+            return this;
+        }
+
+        public void flush()
+        {
+            if ( appended )
+            {
+                buffer.append( endToken );
+
+                appended = false;
+            }
+        }
+
+        private void appendToken()
+        {
+            buffer.append( appended ? separatorToken : startToken );
+
+            appended = true;
+        }
+    }
+}
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven31/VerboseJavaScopeSelector.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven31/VerboseJavaScopeSelector.java
new file mode 100644
index 0000000..bcc9c66
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven31/VerboseJavaScopeSelector.java
@@ -0,0 +1,65 @@
+package org.apache.maven.shared.dependency.graph.internal.maven31;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this 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
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.eclipse.aether.RepositoryException;
+import org.eclipse.aether.util.graph.transformer.ConflictResolver.ConflictContext;
+import org.eclipse.aether.util.graph.transformer.ConflictResolver.ScopeSelector;
+import org.eclipse.aether.util.graph.transformer.JavaScopeSelector;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * A JavaScopeSelector that keeps track of reduced scopes
+ * 
+ */
+public class VerboseJavaScopeSelector extends ScopeSelector
+{
+    public static final String REDUCED_SCOPE = "REDUCED_SCOPE";
+    
+    private final ScopeSelector scopeSelector = new JavaScopeSelector();
+
+    @Override
+    public void selectScope( ConflictContext context )
+        throws RepositoryException
+    {
+        scopeSelector.selectScope( context );
+        
+        context.getItems().stream()
+            .flatMap( i -> i.getScopes().stream() )
+            .distinct()
+            .max( new ScopeComparator() )
+            .filter( s -> s != context.getScope() )
+            .ifPresent( s -> context.getWinner().getNode().setData( REDUCED_SCOPE, s ) );
+    }
+    
+    static class ScopeComparator implements Comparator<String>
+    {
+        List<String> orderedScopes = Arrays.asList( "compile", "runtime", "provided", "test" );
+
+        @Override
+        public int compare( String lhs, String rhs )
+        {
+            return orderedScopes.indexOf( rhs ) - orderedScopes.indexOf( lhs );
+        }
+    }    
+}