Index: trac/ticket/api.py
===================================================================
--- trac/ticket/api.py	(revision 4466)
+++ 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/web_ui.py
===================================================================
--- trac/ticket/web_ui.py	(revision 4466)
+++ trac/ticket/web_ui.py	(working copy)
@@ -69,6 +69,10 @@
         """Enable the display of all ticket changes in the timeline
         (''since 0.9'').""")
 
+    show_email_addresses = BoolOption('ticket', 'show_email_addresses', 'false',
+        """Show email addresses instead of usernames in RSS feeds
+        (''since 0.11'').""")
+
     # IContentConverter methods
 
     def get_supported_conversions(self):
@@ -603,6 +607,7 @@
             'ticket': ticket,
             'context': Context(self.env, req, 'ticket', ticket.id, db=db),
             'changes': changes,
+            'show_email_addresses': self.show_email_addresses
         }
 
         output = Chrome(self.env).render_template(req, 'ticket.rss', data,
Index: trac/ticket/report.py
===================================================================
--- trac/ticket/report.py	(revision 4466)
+++ trac/ticket/report.py	(working copy)
@@ -278,9 +278,12 @@
 
         # 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
+        show_email_addresses = self.config.getbool('ticket', 'show_email_addresses')
+        data['show_email_addresses'] = show_email_addresses
+        if show_email_addresses:
+            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
@@ -313,10 +316,13 @@
                     # Special casing based on column name
                     col = col.strip('_')
                     if col == 'reporter':
-                        if '@' in value:
+                        if show_email_addresses:
+                            if '@' in value:
+                                cell['author'] = value
+                            elif value in email_map:
+                                cell['author'] = email_map[value]
+                        else:
                             cell['author'] = value
-                        elif value in email_map:
-                            cell['author'] = email_map[value]
                     elif col == 'resource':
                         resource = value
                     cell_group.append(cell)
Index: trac/ticket/query.py
===================================================================
--- trac/ticket/query.py	(revision 4466)
+++ trac/ticket/query.py	(working copy)
@@ -684,9 +684,11 @@
         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'] = ''
+        show_email_addresses = self.config.getbool('ticket', 'show_email_addresses')
+        if show_email_addresses:
+            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,
@@ -695,6 +697,7 @@
         data = {
             'context': Context(self.env, req),
             'results': results,
+            'show_email_addresses': show_email_addresses,
             'query_href': query_href
             }
         output = Chrome(self.env).render_template(req, 'query.rss', data,
Index: trac/versioncontrol/web_ui/log.py
===================================================================
--- trac/versioncontrol/web_ui/log.py	(revision 4466)
+++ 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('ticket',
+                                                   '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]
@@ -207,6 +209,7 @@
             'path_links': path_links,
             'items': info, 'changes': changes,
             'email_map': email_map, 'extra_changes': extra_changes,
+            'show_email_addresses': show_email_addresses,
             'wiki_format_messages':
             self.config['changeset'].getbool('wiki_format_messages')
             }
Index: trac/timeline/web_ui.py
===================================================================
--- trac/timeline/web_ui.py	(revision 4466)
+++ trac/timeline/web_ui.py	(working copy)
@@ -138,11 +138,14 @@
 
         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
-            data['email_map'] = email_map
+            show_email_addresses = self.config.getbool('ticket', 'show_email_addresses')
+            if show_email_addresses:
+                email_map = {}
+                for username, name, email in self.env.get_known_users():
+                    if email:
+                        email_map[username] = email
+                data['email_map'] = email_map
+            data['show_email_addresses'] = show_email_addresses
             return 'timeline.rss', data, 'application/rss+xml'
 
         add_stylesheet(req, 'common/css/timeline.css')
Index: templates/report.rss
===================================================================
--- templates/report.rss	(revision 4466)
+++ templates/report.rss	(working copy)
@@ -1,5 +1,6 @@
 <?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/">
   <channel>
     <title>$project.name: $report.title</title>
     <link>${abs_href.report(report.id)}</link>
@@ -17,7 +18,12 @@
         <py:with vars="col = cell.header.col.strip('_')">
           <py:choose>
             <py:when test="col == 'reporter'">
-              <author py:if="cell.author">$cell.author</author>
+              <py:if test="cell.author">
+                <py:choose>
+                  <author py:when="show_email_addresses">$cell.author</author>
+                  <dc:creator py:otherwise="">$cell.author</cd:creator>
+                </py:choose>
+              </py:if>
             </py:when>
             <py:when test="col in ('time', 'changetime', 'created', 'modified')">
               <!-- FIXME: we end up with multiple pubDate -->
Index: templates/revisionlog.rss
===================================================================
--- templates/revisionlog.rss	(revision 4466)
+++ templates/revisionlog.rss	(working copy)
@@ -1,5 +1,6 @@
 <?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/">
   <channel py:with="log_href = abs_href.log(path, rev=rev)">
     <title>Revisions of $path</title>
     <link>$log_href</link>
@@ -13,7 +14,12 @@
     </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>
+      <py:if test="change.author">
+        <py:choose>
+          <author py:when="show_email_addresses" py:with="a = change.author">${a and '@' in a and a or email_map.get(a)}</author>
+          <dc:creator py:otherwise="">${change.author}</dc:creator>
+        </py:choose>
+      </py:if>
       <pubDate>${http_date(change.date)}</pubDate>
       <title>Revision $item.rev: ${shorten_line(change.message)}</title>
       <link>${abs_href.changeset(rev, path)}</link>
Index: templates/timeline.rss
===================================================================
--- templates/timeline.rss	(revision 4466)
+++ templates/timeline.rss	(working copy)
@@ -1,5 +1,6 @@
 <?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/">
   <channel>
     <title>${project.name}</title>
     <link>${abs_href.timeline()}</link>
@@ -14,9 +15,16 @@
 
     <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>
+      <py:choose>
+        <py:when test="show_email_addresses">
+          <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>
+        </py:when>
+        <py:otherwise>
+          <dc:creator py:if="event.author">$event.author</dc:creator>
+        </py:otherwise>
+      </py:choose>
       <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 4466)
+++ templates/ticket.rss	(working copy)
@@ -1,5 +1,6 @@
 <?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/">
   <channel py:with="abs_context = context(abs_urls=True)">
     <title>${project.name}: Ticket $title</title>
     <link>${abs_href.ticket(ticket.id)}</link>
@@ -13,7 +14,12 @@
     <generator>Trac $trac.version</generator>
 
     <item py:for="change in changes">
-      <author py:if="change.author">$change.author</author>
+      <py:if test="change.author">
+        <py:choose>
+          <author py:when="show_email_addresses">$change.author</author>
+          <dc:creator py:otherwise="">$change.author</dc:creator>
+        </py:choose>
+      </py:if>
       <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 +44,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/query.rss
===================================================================
--- templates/query.rss	(revision 4466)
+++ templates/query.rss	(working copy)
@@ -1,5 +1,6 @@
 <?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/">
   <channel>
     <title>$project.name: Ticket Query</title>
     <link>$query_href</link>
@@ -16,7 +17,12 @@
       <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>
+      <py:if test="result.reporter">
+        <py:choose>
+          <author py:when="show_email_addresses">$result.reporter</author>
+          <dc:creator py:otherwise="">$result.reporter</dc:creator>
+        </py:choose>
+      </py:if>
       <description>${unicode(context('ticket', result.id, abs_urls=True).wiki_to_html(result.description))}</description>
       <category>Results</category>
       <comments>$href#changelog</comments>

