diff --git a/trunk/tracrpc/api.py b/trunk/tracrpc/api.py
--- a/trunk/tracrpc/api.py
+++ b/trunk/tracrpc/api.py
@@ -4,7 +4,7 @@
 import types
 import xmlrpclib
 import datetime
-from tracrpc.util import to_datetime
+
 try:
     set = set
 except:
@@ -87,10 +87,7 @@
         if result is None:
             result = 0
         elif isinstance(result, dict):
-            for key,val in result.iteritems():
-                if isinstance(val, datetime.datetime):
-                    result[key] = to_datetime(val)
-            #pass
+            pass
         elif not isinstance(result, basestring):
             # Try and convert result to a list
             try:
diff --git a/trunk/tracrpc/search.py b/trunk/tracrpc/search.py
--- a/trunk/tracrpc/search.py
+++ b/trunk/tracrpc/search.py
@@ -1,6 +1,5 @@
 from trac.core import *
 from tracrpc.api import IXMLRPCHandler
-from tracrpc.util import to_datetime
 from trac.search.api import ISearchSource
 from trac.search.web_ui import SearchModule
 
@@ -50,10 +49,8 @@
         self.env.log.debug("Searching with %s" % filters)
 
         results = []
-        converters = [unicode, unicode, to_datetime, unicode, unicode]         	
         for source in self.search_sources:
             for result in source.get_search_results(req, query, filters):
-                result = [f(v) for f,v in zip(converters, result)]
                 results.append(['/'.join(req.base_url.split('/')[0:3])
                                 + result[0]] + list(result[1:]))
         return results
diff --git a/trunk/tracrpc/ticket.py b/trunk/tracrpc/ticket.py
--- a/trunk/tracrpc/ticket.py
+++ b/trunk/tracrpc/ticket.py
@@ -1,22 +1,21 @@
 from trac.attachment import Attachment
 from trac.core import *
 from trac.perm import PermissionCache
-from tracrpc.api import IXMLRPCHandler, expose_rpc
-from tracrpc.util import to_datetime
 import trac.ticket.model as model
 import trac.ticket.query as query
 from trac.ticket.api import TicketSystem
 from trac.ticket.notification import TicketNotifyEmail
 from trac.ticket.web_ui import TicketModule
-from trac.util.datefmt import to_timestamp, utc
+from trac.util.datefmt import to_datetime, to_timestamp, utc
 
 import genshi
 
-from datetime import datetime
 import inspect
 import xmlrpclib
 from StringIO import StringIO
 
+from tracrpc.api import IXMLRPCHandler, expose_rpc
+
 class TicketRPC(Component):
     """ An interface to Trac's ticketing system. """
 
@@ -116,15 +115,14 @@
     def get(self, req, id):
         """ Fetch a ticket. Returns [id, time_created, time_changed, attributes]. """
         t = model.Ticket(self.env, id)
-        return (t.id, to_datetime(t.time_created), 
-                to_datetime(t.time_changed), t.values)
+        return (t.id, t.time_created, t.time_changed, t.values)
 
     def create(self, req, summary, description, attributes = {}, notify=False):
         """ Create a new ticket, returning the ticket ID. """
         t = model.Ticket(self.env)
         t['summary'] = summary
         t['description'] = description
-        t['reporter'] = req.authname or 'anonymous'
+        t['reporter'] = req.authname
         for k, v in attributes.iteritems():
             t[k] = v
         t['status'] = 'new'
@@ -146,7 +144,7 @@
     def update(self, req, id, comment, attributes = {}, notify=False):
         """ Update a ticket, returning the new ticket in the same form as
         getTicket(). Requires a valid 'action' in attributes to support workflow. """
-        now = datetime.now(utc)
+        now = to_datetime(None, utc)
         t = model.Ticket(self.env, id)
         if not 'action' in attributes:
             # FIXME: Old, non-restricted update - remove soon!
@@ -211,7 +209,7 @@
     def changeLog(self, req, id, when=0):
         t = model.Ticket(self.env, id)
         for date, author, field, old, new, permanent in t.get_changelog(when):
-            yield (to_datetime(date), author, field, old, new, permanent)
+            yield (date, author, field, old, new, permanent)
     # Use existing documentation from Ticket model
     changeLog.__doc__ = inspect.getdoc(model.Ticket.get_changelog)
 
@@ -219,8 +217,8 @@
         """ Lists attachments for a given ticket. Returns (filename,
         description, size, time, author) for each attachment."""
         for t in Attachment.select(self.env, 'ticket', ticket):
-            yield (t.filename, t.description or '', t.size, 
-                   to_datetime(t.date), t.author)
+            yield (t.filename, t.description, t.size, 
+                   t.date, t.author)
 
     def getAttachment(self, req, ticket, filename):
         """ returns the content of an attachment. """
@@ -239,7 +237,7 @@
             except TracError:
                 pass
         attachment = Attachment(self.env, 'ticket', ticket)
-        attachment.author = req.authname or 'anonymous'
+        attachment.author = req.authname
         attachment.description = description
         attachment.insert(filename, StringIO(data.data), len(data.data))
         return attachment.filename
diff --git a/trunk/tracrpc/util.py b/trunk/tracrpc/util.py
--- a/trunk/tracrpc/util.py
+++ b/trunk/tracrpc/util.py
@@ -4,11 +4,11 @@
 
 from trac.util.datefmt import utc
 
-def datetime_to_xmlrpc_timestamp(datetime):
+def timestamp_to_xmlrpc_timestamp(datetime):
     """ Convert xmlrpclib.DateTime string representation to UNIX timestamp. """
     return time.mktime(time.strptime('%s UTC' % datetime.value, '%Y%m%dT%H:%M:%S %Z')) - time.timezone
 
-def to_datetime(dt):
+def to_xmlrpc_datetime(dt):
     """ Convert a datetime.datetime object to a xmlrpclib DateTime object """
     return xmlrpclib.DateTime(dt.utctimetuple())
 
diff --git a/trunk/tracrpc/web_ui.py b/trunk/tracrpc/web_ui.py
--- a/trunk/tracrpc/web_ui.py
+++ b/trunk/tracrpc/web_ui.py
@@ -1,5 +1,6 @@
 import re
 import xmlrpclib
+import datetime
 from pkg_resources import resource_filename
 
 from trac.core import *
@@ -8,7 +9,7 @@
 from trac.wiki.formatter import wiki_to_oneliner
 
 from tracrpc.api import IXMLRPCHandler, XMLRPCSystem
-from tracrpc.util import from_xmlrpc_datetime
+from tracrpc.util import from_xmlrpc_datetime, to_xmlrpc_datetime
 
 class XMLRPCWeb(Component):
     """ Handle XML-RPC calls from HTTP clients, as well as presenting a list of
@@ -64,6 +65,8 @@
         args = self._normalize_input(args)
         try:
             result = XMLRPCSystem(self.env).get_method(method)(req, args)
+            self.env.log.debug("RPC(xml) '%s' result: %s" % (method, repr(result)))
+            result = tuple(self._normalize_output(result))
             self._send_response(req, xmlrpclib.dumps(result, methodresponse=True), content_type)
         except xmlrpclib.Fault, e:
             self.log.error(e)
@@ -96,6 +99,27 @@
                 new_args.append(arg)
         return new_args
 
+    def _normalize_output(self, result):
+        """ Normalizes and converts output (traversing it):
+        1. None => ''
+        2. datetime => xmlrpclib.DateTime
+        """
+        new_result = []
+        for res in result:
+            if isinstance(res, datetime.datetime):
+                new_result.append(to_xmlrpc_datetime(res))
+            elif res == None:
+                new_result.append('')
+            elif isinstance(res, dict):
+                for key in res.keys():
+                    res[key] = self._normalize_output([res[key]])[0]
+                new_result.append(res)
+            elif isinstance(res, list) or isinstance(res, tuple):
+                new_result.append(self._normalize_output(res))
+            else:
+                new_result.append(res)
+        return new_result
+
     # ITemplateProvider
     def get_htdocs_dirs(self):
         return []
diff --git a/trunk/tracrpc/wiki.py b/trunk/tracrpc/wiki.py
--- a/trunk/tracrpc/wiki.py
+++ b/trunk/tracrpc/wiki.py
@@ -4,18 +4,16 @@
     from StringIO import StringIO
 import xmlrpclib
 import posixpath
-import time
 
 from trac.core import *
 from trac.perm import IPermissionRequestor
-from trac.util.datefmt import to_timestamp
+from trac.util.datefmt import to_timestamp, to_datetime, utc
 from trac.wiki.api import WikiSystem
 from trac.wiki.model import WikiPage
 from trac.wiki.formatter import wiki_to_html
 from trac.attachment import Attachment
 
 from tracrpc.api import IXMLRPCHandler, expose_rpc
-from tracrpc.util import to_datetime
 
 class WikiRPC(Component):
     """Superset of the
@@ -51,9 +49,9 @@
         yield ('WIKI_VIEW', ((list, str),), self.listLinks)
         yield ('WIKI_VIEW', ((str, str),), self.wikiToHtml)
 
-    def _page_info(self, name, time, author, version, comment):
-        return dict(name=name, lastModified=xmlrpclib.DateTime(int(time)),
-                    author=author, version=int(version), comment=comment or '')
+    def _page_info(self, name, when, author, version, comment):
+        return dict(name=name, lastModified=to_datetime(when, utc),
+                    author=author, version=int(version), comment=comment)
 
     def getRecentChanges(self, req, since):
         """ Get list of changed pages since timestamp """
@@ -63,8 +61,8 @@
         cursor.execute('SELECT name, max(time), author, version, comment FROM wiki'
                        ' WHERE time >= %s GROUP BY name ORDER BY max(time) DESC', (since,))
         result = []
-        for name, time, author, version, comment in cursor:
-            result.append(self._page_info(name, time, author, version, comment))
+        for name, when, author, version, comment in cursor:
+            result.append(self._page_info(name, when, author, version, comment))
         return result
 
     def getRPCVersionSupported(self, req):
@@ -97,8 +95,7 @@
         page = WikiPage(self.env, pagename, version)
         if page.exists:
             last_update = page.get_history().next()
-            return self._page_info(page.name,
-                                   time.mktime(last_update[1].utctimetuple()),
+            return self._page_info(page.name, last_update[1],
                                    last_update[2], page.version, page.comment)
 
     def putPage(self, req, pagename, content, attributes):
@@ -164,7 +161,7 @@
             except TracError:
                 pass
         attachment = Attachment(self.env, 'wiki', pagename)
-        attachment.author = req.authname or 'anonymous'
+        attachment.author = req.authname
         attachment.description = description
         attachment.insert(filename, StringIO(data.data), len(data.data))
         return attachment.filename
