Index: htdocs/css/trac.css
===================================================================
--- htdocs/css/trac.css	(revision 2973)
+++ htdocs/css/trac.css	(working copy)
@@ -42,6 +42,19 @@
  color: inherit;
 }
 
+/* Heading anchors */
+.anchor:link, .anchor:visited {
+ border: none;
+ color: #d7d7d7;
+ font-size: .8em;
+ vertical-align: text-top;
+ visibility: hidden;
+}
+h1:hover .anchor, h2:hover .anchor, h3:hover .anchor,
+h4:hover .anchor, h5:hover .anchor, h6:hover .anchor {
+ visibility: visible;
+}
+
 @media screen {
  a.ext-link .icon {
   background: url(../extlink.gif) left center no-repeat;
Index: htdocs/css/wiki.css
===================================================================
--- htdocs/css/wiki.css	(revision 2973)
+++ htdocs/css/wiki.css	(working copy)
@@ -22,19 +22,6 @@
 #overview .ipnr { color: #999; font-size: 80% }
 #overview .comment { padding: 1em 0 0 }
 
-/* Heading anchors */
-.anchor:link, .anchor:visited {
- border: none;
- color: #d7d7d7;
- font-size: .8em;
- vertical-align: text-top;
- visibility: hidden;
-}
-h1:hover .anchor, h2:hover .anchor, h3:hover .anchor,
-h4:hover .anchor, h5:hover .anchor, h6:hover .anchor {
- visibility: visible;
-}
-
 /* Styles for the page history table
    (extends the styles for "table.listing") */
 #wikihist td { padding: 0 .5em }
Index: trac/ticket/api.py
===================================================================
--- trac/ticket/api.py	(revision 2974)
+++ trac/ticket/api.py	(working copy)
@@ -146,7 +146,8 @@
 
     def get_link_resolvers(self):
         return [('bug', self._format_link),
-                ('ticket', self._format_link)]
+                ('ticket', self._format_link),
+                ('comment', self._format_comment_link)]
 
     def get_wiki_syntax(self):
         yield (
@@ -174,6 +175,38 @@
             return '<a class="missing ticket" href="%s" rel="nofollow">%s</a>' \
                    % (formatter.href.ticket(target), label)
 
+    def _format_comment_link(self, formatter, ns, target, label):
+        href = None
+        if ':' in target:
+            elts = target.split(':')
+            if len(elts) == 3:
+                type, id, comment_number = elts
+                if type == 'ticket':
+                    href = formatter.href(type, id)
+        else:
+            # FIXME: the formatter should know which object the text being
+            #        formatter belongs to
+            type, id = 'wiki', 'WikiStart'
+            if formatter.req:
+                path_info = formatter.req.path_info.split('/', 2)
+                if len(path_info) > 1:
+                    type = path_info[1]
+                    # assume type == ticket
+                if len(path_info) > 2:
+                    id = path_info[2]
+            href = formatter.href.ticket(id)
+            comment_number = target
+        try:
+            comment_number = int(comment_number) - 1
+        except ValueError:
+            href = None
+        if href:
+            return ('<a href="%s#change_%s" title="Comment %s on %s:%s">'
+                    '%s</a>' % (href, comment_number, comment_number, type, id,
+                                label))
+        else:
+            return label
+
     
     # ISearchSource methods
 
Index: templates/ticket.cs
===================================================================
--- templates/ticket.cs	(revision 2973)
+++ templates/ticket.cs	(working copy)
@@ -99,9 +99,13 @@
 
 <?cs if:len(ticket.changes) ?><h2>Change History</h2>
 <div id="changelog"><?cs
- each:change = ticket.changes ?>
-  <h3 id="change_<?cs var:name(change) ?>" class="change"><?cs
-   var:change.date ?>: Modified by <?cs var:change.author ?></h3><?cs
+ each:change = ticket.changes ?><?cs
+  set number=name(change) ?>
+  <h3 id="change_<?cs var:number ?>" class="change"><?cs
+   var:change.date ?>: Modified by <?cs var:change.author ?>
+   <a href="#change_<?cs var:number ?>" class="anchor"
+      title="Permalink to comment:<?cs var:#number+1 ?>">
+    &para;</a></h3><?cs
   if:len(change.fields) ?>
    <ul class="changes"><?cs
    each:field = change.fields ?>

