diff --git a/lib/spack/spack/cmd/graph.py b/lib/spack/spack/cmd/graph.py
index 13efab5fe5e32992cebea494571b14614702f2fe..58a411be718ecfab59c87322fb8b4110a4cd70f2 100644
--- a/lib/spack/spack/cmd/graph.py
+++ b/lib/spack/spack/cmd/graph.py
@@ -39,7 +39,7 @@ def setup_parser(subparser):
         '--dot', action='store_true',
         help="Generate graph in dot format and print to stdout.")
 
-    method.add_argument(
+    subparser.add_argument(
         '--concretize', action='store_true', help="Concretize specs before graphing.")
 
     subparser.add_argument(
diff --git a/lib/spack/spack/graph.py b/lib/spack/spack/graph.py
index 142c9c5c8fff419548aa5a52049ff9e0850bb2f9..08bd6f18bbbb002d771d3fb7c71a2dc09ae67275 100644
--- a/lib/spack/spack/graph.py
+++ b/lib/spack/spack/graph.py
@@ -46,6 +46,7 @@
 from llnl.util.tty.color import *
 
 import spack
+from spack.spec import Spec
 
 
 def topological_sort(spec, **kwargs):
@@ -455,23 +456,28 @@ def quote(string):
         return '"%s"' % string
 
     if not specs:
-        packages = spack.db.all_packages()
+        specs = [p.name for p in spack.db.all_packages()]
     else:
-        packages = []
-        for spec in specs:
-            packages.extend(s.package for s in spec.normalized().traverse())
+        roots = specs
+        specs = set()
+        for spec in roots:
+            specs.update(Spec(s.name) for s in spec.normalized().traverse())
 
     deps = []
-    for pkg in packages:
-        out.write('  %-30s [label="%s"]\n' % (quote(pkg.name), pkg.name))
+    for spec in specs:
+        out.write('  %-30s [label="%s"]\n' % (quote(spec.name), spec.name))
+
+        # Skip virtual specs (we'll find out about them from concrete ones.
+        if spec.virtual:
+            continue
 
         # Add edges for each depends_on in the package.
-        for dep_name, dep in pkg.dependencies.iteritems():
-            deps.append((pkg.name, dep_name))
+        for dep_name, dep in spec.package.dependencies.iteritems():
+            deps.append((spec.name, dep_name))
 
         # If the package provides something, add an edge for that.
-        for provider in set(p.name for p in pkg.provided):
-            deps.append((provider, pkg.name))
+        for provider in set(s.name for s in spec.package.provided):
+            deps.append((provider, spec.name))
 
     out.write('\n')