diff --git a/trac/htdocs/css/report.css b/trac/htdocs/css/report.css
--- a/trac/htdocs/css/report.css
+++ b/trac/htdocs/css/report.css
@@ -50,8 +50,6 @@
 /* Styles for the report list and the report results table
    (extends the styles for "table.listing") */
 .reports td.title { width: 100% }
-.reports tbody td :link, .reports tbody td :visited,
-.tickets tbody td :link, .tickets tbody td :visited { display: block }
 .tickets { border-bottom: none }
 .tickets thead th { text-transform: capitalize; white-space: nowrap; }
 .tickets tbody td, .reports tbody td { padding: .1em .5em !important }
diff --git a/trac/htdocs/css/ticket.css b/trac/htdocs/css/ticket.css
--- a/trac/htdocs/css/ticket.css
+++ b/trac/htdocs/css/ticket.css
@@ -56,6 +56,8 @@
  width: 20%;
 }
 #ticket table.properties td { width: 30% }
+#ticket table.properties td p:first-child { margin-top: 0 }
+#ticket table.properties td p:last-child { margin-bottom: 0 }
 #ticket table.properties .description { border-top: 1px solid #dd9 }
 
 #ticket .description h3 {
diff --git a/trac/ticket/api.py b/trac/ticket/api.py
--- a/trac/ticket/api.py
+++ b/trac/ticket/api.py
@@ -271,7 +271,10 @@
                 if '' in field['options']:
                     field['optional'] = True
                     field['options'].remove('')
+            elif field['type'] == 'text':
+                field['format'] = config.get(name + '.format', 'plain')
             elif field['type'] == 'textarea':
+                field['format'] = config.get(name + '.format', 'plain')
                 field['width'] = config.getint(name + '.cols')
                 field['height'] = config.getint(name + '.rows')
             fields.append(field)
diff --git a/trac/ticket/query.py b/trac/ticket/query.py
--- a/trac/ticket/query.py
+++ b/trac/ticket/query.py
@@ -573,6 +573,7 @@
 
         cols = self.get_columns()
         labels = dict([(f['name'], f['label']) for f in self.fields])
+        wikify = dict((f['name'], f['type'] == 'text' and f.get('format') == 'wiki') for f in self.fields)
 
         # TODO: remove after adding time/changetime to the api.py
         labels['changetime'] = _('Modified')
@@ -580,6 +581,7 @@
 
         headers = [{
             'name': col, 'label': labels.get(col, _('Ticket')),
+            'wikify': wikify.get(col, False),
             'href': self.get_href(context.href, order=col,
                                   desc=(col == self.order and not self.desc))
         } for col in cols]
diff --git a/trac/ticket/templates/query_results.html b/trac/ticket/templates/query_results.html
--- a/trac/ticket/templates/query_results.html
+++ b/trac/ticket/templates/query_results.html
@@ -62,6 +62,7 @@
                       <py:when test="name == 'reporter'">${authorinfo(value)}</py:when>
                       <py:when test="name == 'cc'">${format_emails(ticket_context, value)}</py:when>
                       <py:when test="name == 'owner' and value">${authorinfo(value)}</py:when>
+                      <py:when test="header.wikify">${wiki_to_oneliner(ticket_context, value)}</py:when>
                       <py:otherwise>$value</py:otherwise>
                     </td>
                   </py:with>
diff --git a/trac/ticket/templates/ticket.html b/trac/ticket/templates/ticket.html
--- a/trac/ticket/templates/ticket.html
+++ b/trac/ticket/templates/ticket.html
@@ -324,6 +324,7 @@
                     </select>
                     <textarea py:when="'textarea'" id="field-${field.name}" name="field_${field.name}"
                               cols="${field.width}" rows="${field.height}"
+                              class="${field.format == 'wiki' and 'wikitext' or None}"
                               py:content="value"></textarea>
                     <span py:when="'checkbox'">
                       <input type="checkbox" id="field-${field.name}" name="field_${field.name}"
diff --git a/trac/ticket/tests/api.py b/trac/ticket/tests/api.py
--- a/trac/ticket/tests/api.py
+++ b/trac/ticket/tests/api.py
@@ -24,9 +24,10 @@
         self.env.config.set('ticket-custom', 'test', 'text')
         self.env.config.set('ticket-custom', 'test.label', 'Test')
         self.env.config.set('ticket-custom', 'test.value', 'Foo bar')
+        self.env.config.set('ticket-custom', 'test.format', 'wiki')
         fields = TicketSystem(self.env).get_custom_fields()
         self.assertEqual({'name': 'test', 'type': 'text', 'label': 'Test',
-                          'value': 'Foo bar', 'order': 0},
+                          'value': 'Foo bar', 'order': 0, 'format': 'wiki'},
                          fields[0])
 
     def test_custom_field_select(self):
@@ -57,10 +58,11 @@
         self.env.config.set('ticket-custom', 'test.value', 'Foo bar')
         self.env.config.set('ticket-custom', 'test.cols', '60')
         self.env.config.set('ticket-custom', 'test.rows', '4')
+        self.env.config.set('ticket-custom', 'test.format', 'wiki')
         fields = TicketSystem(self.env).get_custom_fields()
         self.assertEqual({'name': 'test', 'type': 'textarea', 'label': 'Test',
                           'value': 'Foo bar', 'width': 60, 'height': 4,
-                          'order': 0},
+                          'order': 0, 'format': 'wiki'},
                          fields[0])
 
     def test_custom_field_order(self):
diff --git a/trac/ticket/web_ui.py b/trac/ticket/web_ui.py
--- a/trac/ticket/web_ui.py
+++ b/trac/ticket/web_ui.py
@@ -48,7 +48,7 @@
 from trac.web.chrome import add_link, add_script, add_stylesheet, \
                             add_warning, add_ctxtnav, prevnext_nav, Chrome, \
                             INavigationContributor, ITemplateProvider
-from trac.wiki.formatter import format_to
+from trac.wiki.formatter import format_to, format_to_html, format_to_oneliner
 
 class InvalidTicket(TracError):
     """Exception raised when a ticket fails validation."""
@@ -580,15 +580,17 @@
 
         return 'ticket.html', data, None
 
-    def _prepare_data(self, req, ticket, absurls=False):
+    def _get_preserve_newlines(self):
         preserve_newlines = self.preserve_newlines
         if preserve_newlines == 'default':
             preserve_newlines = self.env.get_version(initial=True) >= 21 # 0.11
-        preserve_newlines = preserve_newlines in _TRUE_VALUES
+        return preserve_newlines in _TRUE_VALUES
+        
+    def _prepare_data(self, req, ticket, absurls=False):
         return {'ticket': ticket,
                 'context': Context.from_request(req, ticket.resource,
                                                 absurls=absurls),
-                'preserve_newlines': preserve_newlines}
+                'preserve_newlines': self._get_preserve_newlines()}
 
     def _toggle_cc(self, req, cc):
         """Return an (action, recipient) tuple corresponding to a change
@@ -1149,7 +1151,16 @@
                 value = ticket.values.get(name)
                 if value in ('1', '0'):
                     field['rendered'] = value == '1' and _('yes') or _('no')
-                  
+            elif type_ == 'text':
+                if field.get('format') == 'wiki':
+                    field['rendered'] = format_to_oneliner(self.env, context,
+                                                           ticket[name])
+            elif type_ == 'textarea':
+                if field.get('format') == 'wiki':
+                    field['rendered'] = \
+                        format_to_html(self.env, context, ticket[name],
+                                escape_newlines=self._get_preserve_newlines())
+            
             # ensure sane defaults
             field.setdefault('optional', False)
             field.setdefault('options', [])

