diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyNode.java b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyNode.java
index 9b6b4a3..bf16f3a 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyNode.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyNode.java
@@ -32,9 +32,9 @@
  */
 public interface DependencyNode
 {
-    public Artifact getArtifact();
+    Artifact getArtifact();
 
-    public List<DependencyNode> getChildren();
+    List<DependencyNode> getChildren();
 
     /**
      * Applies the specified dependency node visitor to this dependency node and its children.
@@ -44,12 +44,41 @@
      * @return the visitor result of ending the visit to this node
      * @since 1.1
      */
-    public boolean accept( DependencyNodeVisitor visitor );
+    boolean accept( DependencyNodeVisitor visitor );
 
     /**
      * Gets the parent dependency node of this dependency node.
      * 
      * @return the parent dependency node
      */
-    public DependencyNode getParent();
+    DependencyNode getParent();
+
+    /**
+     * Gets the version or version range for the dependency before dependency management was applied (if any).
+     * 
+     * @return The dependency version before dependency management or {@code null} if the version was not managed.
+     */
+    String getPremanagedVersion();
+
+    /**
+     * Gets the scope for the dependency before dependency management was applied (if any).
+     * 
+     * @return The dependency scope before dependency management or {@code null} if the scope was not managed.
+     */
+    String getPremanagedScope();
+
+    /**
+     * A constraint on versions for a dependency. A constraint can either consist of one or more version ranges or a single
+     * version.
+     * 
+     * @return The constraint on the dependency.
+     */
+    String getVersionConstraint();
+
+    /**
+     * Returns a string representation of this dependency node.
+     * 
+     * @return the string representation
+     */
+    String toNodeString();
 }
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 7cd1fd2..810099b 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
@@ -13,12 +13,22 @@
 
     private final DependencyNode parent;
 
+    private final String premanagedVersion;
+
+    private final String premanagedScope;
+
+    private final String versionConstraint;
+
     private List<DependencyNode> children;
 
-    public DefaultDependencyNode( DependencyNode parent, Artifact artifact )
+    public DefaultDependencyNode( DependencyNode parent, Artifact artifact, String premanagedVersion,
+                                  String premanagedScope, String versionConstraint )
     {
         this.parent = parent;
         this.artifact = artifact;
+        this.premanagedVersion = premanagedVersion;
+        this.premanagedScope = premanagedScope;
+        this.versionConstraint = versionConstraint;
     }
 
     /**
@@ -64,4 +74,99 @@
     {
         return parent;
     }
+
+    public String getPremanagedVersion()
+    {
+        return premanagedVersion;
+    }
+
+    public String getPremanagedScope()
+    {
+        return premanagedScope;
+    }
+
+    public String getVersionConstraint()
+    {
+        return versionConstraint;
+    }
+
+    public String toNodeString()
+    {
+        StringBuffer buffer = new StringBuffer();
+
+        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();
+
+        return buffer.toString();
+    }
+
+    /**
+     * Utility class to concatenate a number of parameters with separator tokens.   
+     */
+    private static class ItemAppender
+    {
+        private StringBuffer buffer;
+        
+        private String startToken;
+        
+        private String separatorToken;
+        
+        private String endToken;
+        
+        private boolean appended;
+        
+        public ItemAppender( StringBuffer 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/Maven2DependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java
index d40b56d..3787f9a 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
@@ -64,7 +64,15 @@
                                                 org.apache.maven.shared.dependency.tree.DependencyNode node,
                                                 ArtifactFilter filter )
     {
-        DefaultDependencyNode current = new DefaultDependencyNode( parent, node.getArtifact() );
+        String versionSelectedFromRange = null;
+        if ( node.getVersionSelectedFromRange() != null )
+        {
+            versionSelectedFromRange = node.getVersionSelectedFromRange().toString();
+        }
+
+        DefaultDependencyNode current =
+            new DefaultDependencyNode( parent, node.getArtifact(), node.getPremanagedVersion(),
+                                       node.getPremanagedScope(), versionSelectedFromRange );
 
         List<DependencyNode> nodes = new ArrayList<DependencyNode>( node.getChildren().size() );
         for ( org.apache.maven.shared.dependency.tree.DependencyNode child : node.getChildren() )
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 315fa85..30219f0 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
@@ -41,6 +41,7 @@
 import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.component.annotations.Requirement;
 import org.sonatype.aether.graph.Dependency;
+import org.sonatype.aether.version.VersionConstraint;
 
 /**
  * Wrapper around Maven 3 dependency resolver.
@@ -111,7 +112,9 @@
     private DependencyNode buildDependencyNode( DependencyNode parent, org.sonatype.aether.graph.DependencyNode node,
                                                 Artifact artifact, ArtifactFilter filter )
     {
-        DefaultDependencyNode current = new DefaultDependencyNode( parent, artifact );
+        DefaultDependencyNode current =
+            new DefaultDependencyNode( parent, artifact, node.getPremanagedVersion(), node.getPremanagedScope(),
+                                       getVersionSelectedFromRange( node.getVersionConstraint() ) );
 
         List<DependencyNode> nodes = new ArrayList<DependencyNode>( node.getChildren().size() );
         for ( org.sonatype.aether.graph.DependencyNode child : node.getChildren() )
@@ -128,4 +131,29 @@
 
         return current;
     }
+
+    private String getVersionSelectedFromRange( VersionConstraint constraint )
+    {
+        if ( constraint == null )
+        {
+            return null;
+        }
+
+        if ( constraint.getVersion() != null )
+        {
+            return constraint.getVersion().toString();
+        }
+
+        StringBuilder sb = new StringBuilder();
+        for ( org.sonatype.aether.version.VersionRange range : constraint.getRanges() )
+        {
+            if ( sb.length() > 0 )
+            {
+                sb.append( ',' );
+            }
+            sb.append( range );
+        }
+
+        return sb.toString();
+    }
 }
