diff --git a/tracext/hg/backend.py b/tracext/hg/backend.py
--- a/tracext/hg/backend.py
+++ b/tracext/hg/backend.py
@@ -103,11 +103,18 @@
 
     def _render_property(self, name, mode, context, props):
         repos, revs = props[name]
+        
+        if name in ('Parents', 'Children'):
+            label = repos.display_rev
+        else:
+            label = lambda rev: rev
+        
         def link(rev):
             chgset = repos.get_changeset(rev)
-            return tag.a(rev, class_="changeset",
+            return tag.a(label(rev), class_="changeset",
                          title=shorten_line(chgset.message),
                          href=context.href.changeset(rev, repos.reponame))
+        
         if name == 'Parents' and len(revs) == 2: # merge
             new = context.resource.id
             parent_links = [
@@ -147,9 +154,9 @@
         if name == 'transplant_source':
             try:
                 chgset = MercurialChangeset(repos, value)
-                link = tag.a(chgset.rev, class_="changeset",
+                link = tag.a(repos.display_rev(chgset.rev), class_="changeset",
                              title=shorten_line(chgset.message),
-                             href=context.href.changeset(short(value),
+                             href=context.href.changeset(hex(value),
                                                          repos.reponame))
             except LookupError:
                 link = tag.a(hex(value), class_="missing changeset",
@@ -399,14 +406,14 @@
         self.repo = None
 
     def normalize_path(self, path):
-        """Remove leading "/", except for the root"""
+        """Remove leading "/", except for the root."""
         return path and path.strip('/') or ''
 
     def normalize_rev(self, rev):
-        """Return the changelog node for the specified rev"""
+        """Return the full hash for the specified rev."""
         if rev is not None: 
             rev = str(rev) 
-        return self.hg_display(self.hg_node(rev)) 
+        return hex(self.hg_node(rev))
 
     def short_rev(self, rev):
         """Return the revision number for the specified rev, in compact form.
@@ -422,6 +429,9 @@
                 return rev # it was already a short rev
         return self.repo.changelog.rev(self.hg_node(rev))
 
+    def display_rev(self, rev):
+        return self.hg_display(self.hg_node(rev))
+
     def get_quickjump_entries(self, rev):
         branches = {}
         closed_branches = {}
@@ -524,17 +534,17 @@
                              self.hg_node(rev))
 
     def get_oldest_rev(self):
-        return self.hg_display(nullid)
+        return hex(nullid)
 
     def get_youngest_rev(self):
-        return self.hg_display(self.repo.changelog.tip())
+        return hex(self.repo.changelog.tip())
 
     def previous_rev(self, rev, path=''): # FIXME: path ignored for now
         n = self.hg_node(rev)
         log = self.repo.changelog
         for p in log.parents(n):
             if p != nullid:
-                return self.hg_display(p) # always follow first parent
+                return hex(p) # always follow first parent
     
     def next_rev(self, rev, path=''):
         n = self.hg_node(rev)
@@ -542,13 +552,13 @@
             fc = filectx(self.repo, path, n)
             if fc: # it is a file
                 for child_fc in fc.children():
-                    return self.hg_display(child_fc.node())
+                    return hex(child_fc.node())
                 else:
                     return None
             # it might be a directory (not supported for now) FIXME
         log = self.repo.changelog
         for c in log.children(n):
-            return self.hg_display(c) # always follow first child
+            return hex(c) # always follow first child
     
     def rev_older_than(self, rev1, rev2):
         log = self.repo.changelog
@@ -704,9 +714,9 @@
                 self.entries = []
                 node = log.tip()
             else:
-                raise NoSuchNode(path, self.repos.hg_display(self.n))
+                raise NoSuchNode(path, hex(self.n))
         self.time = self.repos.hg_time(log.read(node)[2])
-        rev = self.repos.hg_display(node)
+        rev = hex(node)
         Node.__init__(self, self.repos, path, rev, kind)
         self.created_path = path
         self.created_rev = rev
@@ -800,7 +810,7 @@
             if entry:
                 count += 1
                 yield entry
-            entry = (path, self.repos.hg_display(ctx.node()), Changeset.EDIT)
+            entry = (path, hex(ctx.node()), Changeset.EDIT)
         if entry:
             if count < limit:
                 entry = entry[0:2] + (Changeset.ADD,)
@@ -832,7 +842,7 @@
                     count += 1
                     yield entry
                 n = repo.changelog.node(rev)
-                entry = (path, self.repos.hg_display(n), Changeset.EDIT)
+                entry = (path, hex(n), Changeset.EDIT)
         if entry:
             if count < limit:
                 entry = entry[0:2] + (Changeset.ADD,)
@@ -884,15 +894,14 @@
         if len(log_data) > 5: # extended changelog, since [hg 2f35961854fb]
             extra = log_data[5]
         time = repos.hg_time(timeinfo)
-        Changeset.__init__(self, repos, repos.hg_display(n), to_unicode(desc),
+        Changeset.__init__(self, repos, hex(n), to_unicode(desc),
                            to_unicode(user), time)
         self.repos = repos
         self.n = n
         self.manifest_n = manifest
         self.files = files
-        self.parents = [repos.hg_display(p) for p in log.parents(n) \
-                        if p != nullid]
-        self.children = [repos.hg_display(c) for c in log.children(n)]
+        self.parents = [hex(p) for p in log.parents(n) if p != nullid]
+        self.children = [hex(c) for c in log.children(n)]
         self.tags = [t for t in repos.repo.nodetags(n)]
         self.branch = extra.pop("branch", None) 
         self.extra = extra
@@ -958,7 +967,7 @@
                 if rename_info:
                     base_path, base_filenode = rename_info
                     base_ctx = repo.filectx(base_path, fileid=base_filenode)
-                    base_rev = self.repos.hg_display(base_ctx.node())
+                    base_rev = hex(base_ctx.node())
                     if base_path in deletions:
                         action = Changeset.MOVE
                         renames[base_path] = f

