Index: trac/ticket/api.py
===================================================================
--- trac/ticket/api.py	(revision 4476)
+++ trac/ticket/api.py	(working copy)
@@ -102,12 +102,12 @@
         field = {'name': 'owner', 'label': 'Owner'}
         if self.restrict_owner:
             field['type'] = 'select'
-            users = [''] # for clearing assignment
             perm = PermissionSystem(self.env)
-            for username, name, email in self.env.get_known_users(db):
-                if perm.get_user_permissions(username).get('TICKET_MODIFY'):
-                    users.append(username)
-            field['options'] = users
+            def valid_owner(username):
+                return perm.get_user_permissions(username).get('TICKET_MODIFY')
+            field['options'] = [username for username, name, email
+                                in self.env.get_known_users()
+                                if valid_owner(username)]
             field['optional'] = True
         else:
             field['type'] = 'text'
Index: trac/ticket/report.py
===================================================================
--- trac/ticket/report.py	(revision 4476)
+++ trac/ticket/report.py	(working copy)
@@ -276,12 +276,6 @@
                 header_groups.append([])
             header_group.append(header)
 
-        # Get the email addresses of all known users
-        email_map = {}
-        for username, name, email in self.env.get_known_users():
-            if email:
-                email_map[username] = email
-
         # Structure the rows and cells:
         #  - group rows according to __group__ value, if defined
         #  - group cells the same way headers are grouped
@@ -313,10 +307,7 @@
                     # Special casing based on column name
                     col = col.strip('_')
                     if col == 'reporter':
-                        if '@' in value:
-                            cell['author'] = value
-                        elif value in email_map:
-                            cell['author'] = email_map[value]
+                        cell['author'] = value
                     elif col == 'resource':
                         resource = value
                     cell_group.append(cell)
@@ -329,10 +320,18 @@
                 row_groups = [(None, row_group)]
             row_group.append(row)
 
+        # Get the email addresses of all known users
+        email_map = {}
+        if self.config.getbool('trac', 'show_email_addresses'):
+            for username, name, email in self.env.get_known_users():
+                if email:
+                    email_map[username] = email
+
         data.update({'header_groups': header_groups,
                      'row_groups': row_groups,
                      'numrows': len(results),
-                     'sorting_enabled': len(row_groups)==1})
+                     'sorting_enabled': len(row_groups)==1,
+                     'email_map': email_map})
 
         if id:
             self.add_alternate_links(req, args)
Index: trac/ticket/query.py
===================================================================
--- trac/ticket/query.py	(revision 4476)
+++ trac/ticket/query.py	(working copy)
@@ -684,9 +684,6 @@
         query.verbose = True
         db = self.env.get_db_cnx()
         results = query.execute(req, db)
-        for result in results:
-            if result['reporter'].find('@') == -1:
-                result['reporter'] = ''
         query_href = req.abs_href.query(group=query.group,
                                         groupdesc=query.groupdesc and 1 or None,
                                         verbose=query.verbose and 1 or None,
Index: trac/versioncontrol/web_ui/log.py
===================================================================
--- trac/versioncontrol/web_ui/log.py	(revision 4476)
+++ trac/versioncontrol/web_ui/log.py	(working copy)
@@ -179,12 +179,14 @@
         changes = get_changes(repos, revs)
         extra_changes = {}
         email_map = {}
+        show_email_addresses = self.config.getbool('trac',
+                                                   'show_email_addresses')
         if format == 'rss':
             # Get the email addresses of all known users
-            email_map = {}
-            for username,name,email in self.env.get_known_users():
-                if email:
-                    email_map[username] = email
+            if show_email_addresses:
+                for username,name,email in self.env.get_known_users():
+                    if email:
+                        email_map[username] = email
         elif format == 'changelog':
             for rev in revs:
                 changeset = changes[rev]
Index: trac/perm.py
===================================================================
--- trac/perm.py	(revision 4476)
+++ trac/perm.py	(working copy)
@@ -246,15 +246,17 @@
     # IPermissionRequestor methods
 
     def get_permission_actions(self):
-        """Implement the global `TRAC_ADMIN` meta permission."""
-        actions = []
+        """Implement the global `TRAC_ADMIN` meta permission and the
+        `EMAIL_VIEW` permission which allows for showing email addresses
+        when "show_email_addresses" is "false"."""
+        actions = ['EMAIL_VIEW']
         for requestor in [r for r in self.requestors if r is not self]:
             for action in requestor.get_permission_actions():
                 if isinstance(action, tuple):
                     actions.append(action[0])
                 else:
                     actions.append(action)
-        return [('TRAC_ADMIN', actions)]
+        return [('TRAC_ADMIN', actions), 'EMAIL_VIEW']
 
 
 class PermissionCache(object):
Index: trac/timeline/web_ui.py
===================================================================
--- trac/timeline/web_ui.py	(revision 4476)
+++ trac/timeline/web_ui.py	(working copy)
@@ -139,9 +139,10 @@
         if format == 'rss':
             # Get the email addresses of all known users
             email_map = {}
-            for username, name, email in self.env.get_known_users():
-                if email:
-                    email_map[username] = email
+            if self.config.getbool('trac', 'show_email_addresses'):
+                for username, name, email in self.env.get_known_users():
+                    if email:
+                        email_map[username] = email
             data['email_map'] = email_map
             return 'timeline.rss', data, 'application/rss+xml'
 
Index: trac/web/chrome.py
===================================================================
--- trac/web/chrome.py	(revision 4476)
+++ trac/web/chrome.py	(working copy)
@@ -34,8 +34,8 @@
                       get_module_path
 from trac.util.compat import partial, set
 from trac.util.html import plaintext
-from trac.util.text import pretty_size, shorten_line, unicode_quote_plus, \
-                           to_unicode
+from trac.util.text import pretty_size, obfuscate_email_address, \
+                           shorten_line, unicode_quote_plus, to_unicode
 from trac.util.datefmt import pretty_timedelta, format_datetime, format_date, \
                               format_time, http_date
 from trac.web.api import IRequestHandler, HTTPNotFound
@@ -194,6 +194,10 @@
     logo_height = IntOption('header_logo', 'height', -1,
         """Height of the header logo image in pixels.""")
 
+    show_email_addresses = BoolOption('trac', 'show_email_addresses', 'false',
+        """Show email addresses instead of usernames. If false, we obfuscate
+        email addresses (''since 0.11'').""")
+
     templates = None
 
     # A dictionary of default context data for templates
@@ -464,6 +468,8 @@
                 'logo': self.get_logo_data(self.env.abs_href),
             })
 
+        show_email_addresses = (self.show_email_addresses or not req or \
+                                'EMAIL_VIEW' in req.perm)
         tzinfo = None
         if req:
             tzinfo = req.tz
@@ -474,6 +480,8 @@
             'href': req and req.href,
             'perm': req and req.perm,
             'authname': req and req.authname or '<trac>',
+            'show_email_addresses': show_email_addresses,
+            'format_author': partial(self._format_author, req),
 
             # Date/time formatting
             'format_datetime': partial(format_datetime, tzinfo=tzinfo),
@@ -543,6 +551,14 @@
 
         return stream.render(method, doctype=doctype)
 
+    # Helpers
+
+    def _format_author(self, req, author):
+        if self.show_email_addresses or not req or 'EMAIL_VIEW' in req.perm:
+            return author
+        else:
+            return obfuscate_email_address(author)
+
     # Template filters
 
     def _add_form_token(self, token):
Index: trac/util/text.py
===================================================================
--- trac/util/text.py	(revision 4476)
+++ trac/util/text.py	(working copy)
@@ -170,6 +170,12 @@
     except ImportError:
         return t
 
+def obfuscate_email_address(address):
+    if address:
+        at = address.find('@')
+        if at != -1:
+            return address[:at] + "@..." + ((address[-1] == '>' and '>') or '')
+    return address
 
 # -- Conversion
 
Index: templates/ticket_view.html
===================================================================
--- templates/ticket_view.html	(revision 4476)
+++ templates/ticket_view.html	(working copy)
@@ -54,9 +54,9 @@
                py:with="fields = [f for f in fields if not f.skip]">
           <tr>
             <th id="h_reporter">Reported by:</th>
-            <td headers="h_reporter" class="searchable">${ticket.reporter}</td>
+            <td headers="h_reporter" class="searchable">${authorinfo(ticket.reporter)}</td>
             <th id="h_owner">Assigned to:</th>
-            <td headers="h_owner">${ticket.owner}
+            <td headers="h_owner">${authorinfo(ticket.owner)}
               <py:if test="ticket.status == 'assigned'">(accepted)</py:if>
             </td>
           </tr>
@@ -85,7 +85,7 @@
               Description
               <span py:if="description_change" class="lastmod"
                 title="$description_change.date">
-                (last modified by ${description_change.author})
+                (last modified by ${authorinfo(description_change.author)})
                 (<a href="${href.ticket(ticket.id, action='diff', version=description_change.cnum)}">diff</a>)
               </span>
             </h3>
@@ -127,7 +127,7 @@
                   </py:if>
                   &nbsp;
                 </span>
-                ${change.date} changed by ${change.author}
+                ${change.date} changed by ${authorinfo(change.author)}
               </h3>
               <ul py:if="change.fields" class="changes">
                 <li py:for="field_name, field in change.fields.items()"
Index: templates/report.rss
===================================================================
--- templates/report.rss	(revision 4476)
+++ templates/report.rss	(working copy)
@@ -1,5 +1,8 @@
 <?xml version="1.0"?>
-<rss version="2.0" xmlns:py="http://genshi.edgewall.org/">
+<rss version="2.0" xmlns:py="http://genshi.edgewall.org/"
+                   xmlns:dc="http://purl.org/dc/elements/1.1/"
+                   xmlns:xi="http://www.w3.org/2001/XInclude">
+  <xi:include href="macros.rss" />
   <channel>
     <title>$project.name: $report.title</title>
     <link>${abs_href.report(report.id)}</link>
@@ -17,7 +20,7 @@
         <py:with vars="col = cell.header.col.strip('_')">
           <py:choose>
             <py:when test="col == 'reporter'">
-              <author py:if="cell.author">$cell.author</author>
+              ${author_or_creator(cell.author, email_map)}
             </py:when>
             <py:when test="col in ('time', 'changetime', 'created', 'modified')">
               <!-- FIXME: we end up with multiple pubDate -->
Index: templates/browser.html
===================================================================
--- templates/browser.html	(revision 4476)
+++ templates/browser.html	(working copy)
@@ -98,7 +98,7 @@
                   </td>
                   <td class="age">${dateinfo(change.date)}</td>
                   <td class="change">
-                    <span class="author">$change.author:</span>
+                    <span class="author">${authorinfo(change.author)}:</span>
                     <span class="change" py:choose="">
                       <py:when test="wiki_format_messages">
                         ${context('changeset', change.rev).wiki_to_oneliner(change.message, shorten=True)}
@@ -117,7 +117,7 @@
         <tr py:if="file">
           <th scope="col">
             Revision <a href="${href.changeset(rev)}">$rev</a>, ${sizeinfo(file.size)}
-            (checked in by $file.changeset.author, ${dateinfo(file.changeset.date)} ago)
+            (checked in by ${authorinfo(file.changeset.author)}, ${dateinfo(file.changeset.date)} ago)
           </th>
         </tr>
         <tr py:if="file">
Index: templates/wiki_history.html
===================================================================
--- templates/wiki_history.html	(revision 4476)
+++ templates/wiki_history.html	(working copy)
@@ -47,7 +47,7 @@
                 <a href="${href.wiki(page.name, version=item.version)}" title="View this version">$item.version</a>
               </td>
               <td class="date">${format_datetime(item.date)}</td>
-              <td class="author" title="${item.ipnr and 'IP-Address: ' + item.ipnr or None">$item.author</td>
+              <td class="author" title="${item.ipnr and 'IP-Address: ' + item.ipnr or None">${authorinfo(item.author)}</td>
               <td class="comment">${context.wiki_to_oneliner(item.comment, shorten=True)}</td>
             </tr>
           </tbody>
Index: templates/macros.html
===================================================================
--- templates/macros.html	(revision 4476)
+++ templates/macros.html	(working copy)
@@ -25,6 +25,15 @@
       pretty_size(size)
   }</span></py:def>
 
+  <!--!  Display author information, eventually obfuscating the e-mail address
+  -
+  -      We take care to not insert any extra space.
+  -->
+  <py:def function="authorinfo(author, email_map=None)"><py:choose><py:when test="author"><py:with
+    vars="author = show_email_addresses and email_map and '@' not in author and email_map[author] or author">${
+      author and format_author(author) or 'anonymous'
+  }</py:with></py:when><py:otherwise>anonymous</py:otherwise></py:choose></py:def>
+
   <!--!  Display how many time elapsed since the given date.
   -
   -      Typically used in sentences like "changed ${dateinfo(date)} ago"
@@ -151,7 +160,7 @@
     <py:def function="show_one_attachment(attachment)">
       <a href="${context.href('attachment', context.resource, context.id, attachment.filename)}"
          title="View attachment">$attachment.filename</a>
-        (${sizeinfo(attachment.size)}) - added by <em>$attachment.author</em>
+       (${sizeinfo(attachment.size)}) - added by <em>${authorinfo(attachment.author)}</em>
         ${dateinfo(attachment.date)} ago.
     </py:def>
     <py:choose test="">
Index: templates/macros.rss
===================================================================
--- templates/macros.rss	(revision 0)
+++ templates/macros.rss	(revision 0)
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<rss version="2.0" xmlns:py="http://genshi.edgewall.org/"
+                   xmlns:dc="http://purl.org/dc/elements/1.1/" py:strip="">
+
+  <!--! Generate an <author> or a <dc:creator> tag, based on the presence
+  -     of an email or not in the author's information.
+  -
+  -     Assume 'show_email_addresses' to be available in the global data.
+  -->
+  <py:def function="author_or_creator(author, email_map=None)">
+    <py:if test="author">
+      <!--! Try our best to retrieve an email address if wanted and possible -->
+      <py:with vars="author = show_email_addresses and email_map and '@' not in author and email_map[author] or author">
+        <py:choose>
+          <author py:when="show_email_addresses and '@' in author">${format_author(author)}</author>
+          <dc:creator py:otherwise="">${format_author(author)}</dc:creator>
+        </py:choose>
+      </py:with>
+    </py:if>
+  </py:def>
+</rss>

Property changes on: templates\macros.rss
___________________________________________________________________
Name: svn:eol-style
   + native

Index: templates/revisionlog.html
===================================================================
--- templates/revisionlog.html	(revision 4476)
+++ templates/revisionlog.html	(working copy)
@@ -131,7 +131,7 @@
                       [$item.rev]</a>
                   </td>
                   <td class="date" py:content="format_datetime(change.date)"/>
-                  <td class="author">$change.author</td>
+                  <td class="author">${authorinfo(change.author)}</td>
                   <td class="summary" py:choose="">
                     <py:when test="verbose"></py:when>
                     <py:when test="wiki_format_messages">
Index: templates/revisionlog.rss
===================================================================
--- templates/revisionlog.rss	(revision 4476)
+++ templates/revisionlog.rss	(working copy)
@@ -1,5 +1,8 @@
 <?xml version="1.0"?>
-<rss version="2.0" xmlns:py="http://genshi.edgewall.org/">
+<rss version="2.0" xmlns:py="http://genshi.edgewall.org/"
+                   xmlns:dc="http://purl.org/dc/elements/1.1/"
+                   xmlns:xi="http://www.w3.org/2001/XInclude">
+  <xi:include href="macros.rss" />
   <channel py:with="log_href = abs_href.log(path, rev=rev)">
     <title>Revisions of $path</title>
     <link>$log_href</link>
@@ -13,7 +16,7 @@
     </image>
 
     <item py:for="item in items" py:with="change = changes[item.rev]; item_context = context('changeset', change.rev, abs_urls=True)">
-      <author py:if="change.author" py:with="a = change.author">${a and '@' in a and a or email_map.get(a)}</author>
+      ${author_or_creator(change.author, email_map)}
       <pubDate>${http_date(change.date)}</pubDate>
       <title>Revision $item.rev: ${shorten_line(change.message)}</title>
       <link>${abs_href.changeset(rev, path)}</link>
Index: templates/search.html
===================================================================
--- templates/search.html	(revision 4476)
+++ templates/search.html	(working copy)
@@ -5,6 +5,7 @@
       xmlns:py="http://genshi.edgewall.org/"
       xmlns:xi="http://www.w3.org/2001/XInclude">
   <xi:include href="layout.html" />
+  <xi:include href="macros.html" />
   <head>
     <title>Search<py:if test="query"> Results</py:if></title>
     <py:if test="results">
@@ -74,7 +75,7 @@
               <dt><a href="${result.href}" class="searchable">${result.title}</a></dt>
               <dd class="searchable">${result.excerpt}</dd>
               <dd>
-                <span class="author">By ${result.author}</span> &mdash;
+                <span class="author">By ${authorinfo(result.author)}</span> &mdash;
                 <span class="date">${result.date}</span>
                 <py:if test="result.keywords">
                   &mdash; <span class="keywords">Keywords: <em class="searchable">${result.keywords}</em></span>
Index: templates/timeline.html
===================================================================
--- templates/timeline.html	(revision 4476)
+++ templates/timeline.html	(working copy)
@@ -5,6 +5,7 @@
       xmlns:py="http://genshi.edgewall.org/"
       xmlns:xi="http://www.w3.org/2001/XInclude">
   <xi:include href="layout.html" />
+  <xi:include href="macros.html" />
   <head>
     <title>Timeline</title>
   </head>
@@ -38,7 +39,7 @@
           <py:for each="event in events">
             <dt class="${event.kind}"><a href="${event.href}">
               <span class="time">${format_time(event.date, str('%H:%M'))}</span> ${event.title}
-                <py:if test="event.author">by ${event.author}</py:if>
+                <py:if test="event.author">by ${authorinfo(event.author)}</py:if>
             </a></dt>
             <dd class="${event.kind}" py:with="wikify = event.use_oneliner and partial(event.context.wiki_to_oneliner, shorten=event.shorten_oneliner) or event.context.wiki_to_html">
               ${event.markup}
Index: templates/timeline.rss
===================================================================
--- templates/timeline.rss	(revision 4476)
+++ templates/timeline.rss	(working copy)
@@ -1,5 +1,8 @@
 <?xml version="1.0"?>
-<rss version="2.0" xmlns:py="http://genshi.edgewall.org/">
+<rss version="2.0" xmlns:py="http://genshi.edgewall.org/"
+                   xmlns:dc="http://purl.org/dc/elements/1.1/"
+                   xmlns:xi="http://www.w3.org/2001/XInclude">
+  <xi:include href="macros.rss" />
   <channel>
     <title>${project.name}</title>
     <link>${abs_href.timeline()}</link>
@@ -14,9 +17,7 @@
 
     <item py:for="event in events">
       <title>${plaintext(event.title, keeplinebreaks=False)}</title>
-      <py:with vars="author=event.author; author = author and '@' in author and author or email_map.get(author)">
-        <author py:if="author">$author</author>
-      </py:with>
+      ${author_or_creator(event.author, email_map)}
       <pubDate>${http_date(event.date)}</pubDate>
       <link>${event.abs_href}</link>
       <guid isPermaLink="false">${event.abs_href}/${event.dateuid()}</guid>
Index: templates/ticket.rss
===================================================================
--- templates/ticket.rss	(revision 4476)
+++ templates/ticket.rss	(working copy)
@@ -1,5 +1,8 @@
 <?xml version="1.0"?>
-<rss version="2.0" xmlns:py="http://genshi.edgewall.org/">
+<rss version="2.0" xmlns:py="http://genshi.edgewall.org/"
+                   xmlns:dc="http://purl.org/dc/elements/1.1/"
+                   xmlns:xi="http://www.w3.org/2001/XInclude">
+  <xi:include href="macros.rss" />
   <channel py:with="abs_context = context(abs_urls=True)">
     <title>${project.name}: Ticket $title</title>
     <link>${abs_href.ticket(ticket.id)}</link>
@@ -13,7 +16,7 @@
     <generator>Trac $trac.version</generator>
 
     <item py:for="change in changes">
-      <author py:if="change.author">$change.author</author>
+      ${author_or_creator(change.author)}
       <pubDate>${http_date(change.date)}</pubDate>
       <title>$change.title</title>
       <link>${abs_href.ticket(ticket.id)}<py:if test="change.cnum">#comment:$change.cnum</py:if></link>
@@ -38,7 +41,7 @@
           </py:for>
           &lt;/ul&gt;
         </py:if>
-        ${unicode(abs_context.wiki_to_html(change.comment, absurls=True))}
+        ${unicode(abs_context.wiki_to_html(change.comment))}
       </description>
       <category>Ticket</category>
     </item>
Index: templates/attachment.html
===================================================================
--- templates/attachment.html	(revision 4476)
+++ templates/attachment.html	(working copy)
@@ -78,7 +78,7 @@
             <tr>
               <th scope="col">
                 File $attachment.filename, ${sizeinfo(attachment.size)}
-                (added by $attachment.author,  ${dateinfo(attachment.date)} ago)
+                (added by ${authorinfo(attachment.author)},  ${dateinfo(attachment.date)} ago)
               </th>
             </tr>
             <tr>
Index: templates/wiki_diff.html
===================================================================
--- templates/wiki_diff.html	(revision 4476)
+++ templates/wiki_diff.html	(working copy)
@@ -46,7 +46,7 @@
         <dt class="property author">Author:</dt>
         <dd class="author" py:choose="">
           <em py:when="multi" class="multi">(multiple changes)</em>
-          <py:otherwise>$change.author <span py:if="change.ipnr" class="ipnr">(IP: $change.ipnr)</span></py:otherwise>
+          <py:otherwise>${authorinfo(change.author)} <span py:if="change.ipnr" class="ipnr">(IP: $change.ipnr)</span></py:otherwise>
         </dd>
         <dt class="property message">Comment:</dt>
         <dd class="message" py:choose="">
Index: templates/wiki_view.html
===================================================================
--- templates/wiki_view.html	(revision 4476)
+++ templates/wiki_view.html	(working copy)
@@ -41,7 +41,7 @@
         <table id="info" summary="Revision info">
           <tbody>
             <tr><th scope="row">
-              Version $page.version (modified by $page.author, ${dateinfo(page.time)} ago)
+                Version $page.version (modified by ${authorinfo(page.author)}, ${dateinfo(page.time)} ago)
             </th></tr>
             <tr><td class="message">
               ${context.wiki_to_html(page.comment or '--')}
Index: templates/changeset.html
===================================================================
--- templates/changeset.html	(revision 4476)
+++ templates/changeset.html	(working copy)
@@ -103,7 +103,7 @@
           <dt class="property time">Timestamp:</dt>
           <dd class="time">${format_datetime(changeset.date)} (${pretty_timedelta(changeset.date, None, 3600) or 'less than one hour'} ago)</dd>
           <dt class="property author">Author:</dt>
-          <dd class="author">${changeset.author or 'anonymous'}</dd>
+          <dd class="author">${authorinfo(changeset.author)}</dd>
           <py:for each="prop in changeset_properties">
             <dt class="property $prop.htmlclass">$prop.name:</dt>
             <dd class="$prop.htmlclass" py:choose="">
Index: templates/query_div.html
===================================================================
--- templates/query_div.html	(revision 4476)
+++ templates/query_div.html	(working copy)
@@ -50,6 +50,7 @@
                 <td py:otherwise="" class="$name" py:choose="">
                   <a py:when="name == 'summary'" href="$result.href" title="View ticket">$value</a>
                   <span py:when="isinstance(value, datetime)">${format_datetime(value)}</span>
+                  <span py:when="name in ('owner', 'reporter')">${authorinfo(value)}</span>
                   <span py:otherwise="">$value</span>
                 </td>
               </py:with>
Index: templates/query.rss
===================================================================
--- templates/query.rss	(revision 4476)
+++ templates/query.rss	(working copy)
@@ -1,5 +1,8 @@
 <?xml version="1.0"?>
-<rss version="2.0" xmlns:py="http://genshi.edgewall.org/">
+<rss version="2.0" xmlns:py="http://genshi.edgewall.org/"
+                   xmlns:dc="http://purl.org/dc/elements/1.1/"
+                   xmlns:xi="http://www.w3.org/2001/XInclude">
+  <xi:include href="macros.rss" />
   <channel>
     <title>$project.name: Ticket Query</title>
     <link>$query_href</link>
@@ -16,7 +19,7 @@
       <guid isPermaLink="false">$href</guid>
       <title>#$result.id: $result.summary</title>
       <pubDate py:if="result.time">${http_date(result.time)}</pubDate>
-      <author py:if="result.reporter">$result.reporter</author>
+      ${author_or_creator(result.reporter)}
       <description>${unicode(context('ticket', result.id, abs_urls=True).wiki_to_html(result.description))}</description>
       <category>Results</category>
       <comments>$href#changelog</comments>
Index: templates/revisionlog.txt
===================================================================
--- templates/revisionlog.txt	(revision 4476)
+++ templates/revisionlog.txt	(working copy)
@@ -6,13 +6,15 @@
  
 #for item in items
   #with change = changes[item.rev]; extra = extra_changes[item.rev]
-${http_date(change.date)} $change.author [$item.rev]
+${http_date(change.date)} ${format_author(change.author)} [$item.rev]
     #for idx, file in enumerate(extra.files)
 	* $file (${dict(edit='modified', add='added', delete='deleted',
                         copy='copied', move='moved')[extra.actions[idx]]})
     #end
+
 ${verbose and change.message or shorten_line(change.message)}
--- 
-## TODO: blank lines in text templates are no working yet...
+## TODO: add some wrapping to the above message
+
+
   #end
 #end
Index: templates/ticket_diff.html
===================================================================
--- templates/ticket_diff.html	(revision 4476)
+++ templates/ticket_diff.html	(working copy)
@@ -50,7 +50,7 @@
         <dt class="property author">Author:</dt>
         <dd class="author" py:choose="">
           <em py:when="multi" class="multi">(multiple changes)</em>
-          <py:otherwise>$change.author <span py:if="change.ipnr" class="ipnr">(IP: $change.ipnr)</span></py:otherwise>
+          <py:otherwise>${authorinfo(change.author)} <span py:if="change.ipnr" class="ipnr">(IP: $change.ipnr)</span></py:otherwise>
         </dd>
         <dt class="property message">Comment:</dt>
         <dd class="message" py:choose="">

