diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -431,7 +431,7 @@ def branches(ui, repo, active=False):
     """
     hexfunc = ui.debugflag and hex or short
     activebranches = [util.tolocal(repo[n].branch())
-                            for n in repo.heads()]
+                            for n in repo.heads(closed=False)]
     branches = util.sort([(tag in activebranches, repo.changelog.rev(node), tag)
                           for tag, node in repo.branchtags().items()])
     branches.reverse()
@@ -441,9 +441,15 @@ def branches(ui, repo, active=False):
             if ui.quiet:
                 ui.write("%s\n" % tag)
             else:
+                hn = repo.lookup(node)
+                if isactive:
+                    notice = ''
+                elif hn not in repo.branchheads(tag, closed=False):
+                    notice = ' (closed)'
+                else:
+                    notice = ' (inactive)'
                 rev = str(node).rjust(31 - util.locallen(tag))
-                isinactive = ((not isactive) and " (inactive)") or ''
-                data = tag, rev, hexfunc(repo.lookup(node)), isinactive
+                data = tag, rev, hexfunc(hn), notice
                 ui.write("%s %s:%s%s\n" % data)
 
 def bundle(ui, repo, fname, dest=None, **opts):
@@ -1266,9 +1272,10 @@ def heads(ui, repo, *branchrevs, **opts)
         start = repo.lookup(opts['rev'])
     else:
         start = None
+    closed = not opts.get('active')
     if not branchrevs:
         # Assume we're looking repo-wide heads if no revs were specified.
-        heads = repo.heads(start)
+        heads = repo.heads(start, closed=closed)
     else:
         heads = []
         visitedset = util.set()
@@ -1277,7 +1284,7 @@ def heads(ui, repo, *branchrevs, **opts)
             if branch in visitedset:
                 continue
             visitedset.add(branch)
-            bheads = repo.branchheads(branch, start)
+            bheads = repo.branchheads(branch, start, closed=closed)
             if not bheads:
                 if branch != branchrev:
                     ui.warn(_("no changes on branch %s containing %s are "
@@ -3215,6 +3222,8 @@ table = {
     "heads":
         (heads,
          [('r', 'rev', '', _('show only heads which are descendants of rev')),
+          ('a', 'active', False,
+           _('show only the active heads from open branches')),
          ] + templateopts,
          _('[-r REV] [REV]...')),
     "help": (help_, [], _('[TOPIC]')),
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -398,8 +398,21 @@ class localrepository(repo.repository):
 
     def branchtags(self):
         '''return a dict where branch names map to the tipmost head of
-        the branch'''
-        return dict([(k, v[-1]) for (k, v) in self._branchheads().iteritems()])
+        the branch, open heads come before closed'''
+        bt = {}
+        for bn, heads in self._branchheads().iteritems():
+            head = None
+            for i in range(len(heads)-1, -1, -1):
+                h = heads[i]
+                if 'close' not in self.changelog.read(h)[5]:
+                    head = h
+                    break
+            # no open heads were found
+            if head is None:
+                head = heads[-1]
+            bt[bn] = head
+        return bt
+
 
     def _readbranchcache(self):
         partial = {}
@@ -1180,13 +1193,18 @@ class localrepository(repo.repository):
         finally:
             del wlock
 
-    def heads(self, start=None):
+    def heads(self, start=None, closed=True):
         heads = self.changelog.heads(start)
+        def display(head):
+            if closed:
+                return True
+            extras = self.changelog.read(head)[5]
+            return ('close' not in extras)
         # sort the output in rev descending order
-        heads = [(-self.changelog.rev(h), h) for h in heads]
+        heads = [(-self.changelog.rev(h), h) for h in heads if display(h)]
         return [n for (r, n) in util.sort(heads)]
 
-    def branchheads(self, branch=None, start=None):
+    def branchheads(self, branch=None, start=None, closed=True):
         if branch is None:
             branch = self[None].branch()
         branches = self._branchheads()
@@ -1198,6 +1216,9 @@ class localrepository(repo.repository):
         if start is not None:
             # filter out the heads that cannot be reached from startrev
             bheads = self.changelog.nodesbetween([start], bheads)[2]
+        if not closed:
+            bheads = [h for h in bheads if 
+                      ('close' not in self.changelog.read(h)[5])]
         return bheads
 
     def branches(self, nodes):