diff --git a/talm_importer/importer.py b/talm_importer/importer.py
index f8565d1..7437477 100644
--- a/talm_importer/importer.py
+++ b/talm_importer/importer.py
@@ -13,9 +13,8 @@ import tempfile
 import time
 import unicodedata
 
-from trac.core import *
+from trac.core import Component, implements, TracError
 from trac.attachment import AttachmentModule
-from trac.core import Component
 from trac.config import Option
 from trac.perm import IPermissionRequestor
 from trac.ticket import TicketSystem
@@ -116,22 +115,27 @@ class ImportModule(Component):
         return str(self.config.get('importer', 'datetime_format', '%x')) # default is Locale's appropriate date representation
 
     def _do_preview(self, uploadedfile, sheet, req, encoding=None):
-        filereader = get_reader(uploadedfile, sheet, self._datetime_format(), encoding=encoding)
+        filereader = get_reader(uploadedfile, sheet, self._datetime_format(),
+                                encoding=encoding, tzinfo=req.tz)
         try:
-            return self._process(filereader, get_reporter_id(req), PreviewProcessor(self.env, req))
+            processor = PreviewProcessor(self.env, req)
+            return self._process(filereader, get_reporter_id(req), processor)
         finally:
             filereader.close()
 
     def _do_import(self, uploadedfile, sheet, req, uploadedfilename, tickettime, encoding=None):
-        filereader = get_reader(uploadedfile, sheet, self._datetime_format(), encoding=encoding)
+        filereader = get_reader(uploadedfile, sheet, self._datetime_format(),
+                                encoding=encoding, tzinfo=req.tz)
+        db = self.env.get_db_cnx()
         try:
             try:
-                return self._process(filereader, get_reporter_id(req), ImportProcessor(self.env, req, uploadedfilename, tickettime))
+                processor = ImportProcessor(self.env, req, uploadedfilename, tickettime)
+                return self._process(filereader, get_reporter_id(req), processor)
             finally:
                 filereader.close()
         except:
             # Unlock the database. This is not really tested, but seems reasonable. TODO: test or verify this
-            self.env.get_db_cnx().rollback()
+            db.rollback()
             raise
 
 
@@ -345,20 +349,24 @@ class ImportModule(Component):
 
             for column in importedfields:
                 cell = row[column]
-                
+                if cell == '--':
+                    cell = ''
+                column_lower = column.lower()
+
                 # collect the new lookup values
-                if column.lower() in existingvalues.keys():
-                    cell = cell.strip()
-                    if cell != '' and cell not in existingvalues[column.lower()] and cell not in newvalues[column.lower()]:
-                        newvalues[column.lower()] += [ cell ]
+                if column_lower in existingvalues:
+                    if isinstance(cell, basestring):
+                        cell = cell.strip()
+                    if cell and cell not in existingvalues[column_lower] and cell not in newvalues[column_lower]:
+                        newvalues[column_lower].append(cell)
 
                 # also collect the new user names
-                if (column.lower() == 'owner' or column.lower() == 'reporter'):
+                if column_lower in ('owner', 'reporter'):
                     if cell != '' and cell not in newusers and cell not in existingusers:
-                        newusers += [ cell ]
+                        newusers.append(cell)
 
                 # and proces the value.
-                if column.lower() != 'ticket' and column.lower() != 'id':
+                if column_lower not in ('ticket', 'id'):
                     processor.process_cell(column, cell)
                 
             if commentfield:
diff --git a/talm_importer/processors.py b/talm_importer/processors.py
index 389c347..5420b63 100644
--- a/talm_importer/processors.py
+++ b/talm_importer/processors.py
@@ -6,13 +6,29 @@
 
 import time
 
-from trac.ticket import Ticket, model
+from trac.ticket import model
 from trac.util import get_reporter_id
-from trac.util.datefmt import format_datetime
+from trac.util.datefmt import parse_date
 from trac.util.html import Markup
 from trac.util.text import to_unicode
 from trac.wiki import wiki_to_html
 
+try:
+    # ticket.time have microsecond resolution since 0.12.
+    # http://trac.edgewall.org/wiki/TracDev/ApiChanges/0.12#Timestampstorageindatabase
+    from trac.util.datefmt import to_utimestamp as to_timeint
+except ImportError:
+    try:
+        from trac.util.datefmt import to_timestamp as to_timeint
+    except ImportError:
+        to_timeint = lambda val: int(val)
+
+# 'when' is a datetime in 0.11, and an int in 0.10.
+# if we have trac.util.datefmt.to_datetime, we're likely with 0.11
+try:
+    from trac.util.datefmt import to_datetime
+except ImportError:
+    to_datetime = lambda val: val
 
 class ImportProcessor(object):
     def __init__(self, env, req, filename, tickettime):
@@ -52,14 +68,7 @@ class ImportProcessor(object):
         if ticket_id > 0:
             # existing ticket
             self.ticket = PatchedTicket(self.env, tkt_id=ticket_id, db=self.db)
-
-            # 'Ticket.time_changed' is a datetime in 0.11, and an int in 0.10.
-            # if we have trac.util.datefmt.to_datetime, we're likely with 0.11
-            try:
-                from trac.util.datefmt import to_timestamp
-                time_changed = to_timestamp(self.ticket.time_changed)
-            except ImportError:
-                time_changed = int(self.ticket.time_changed)
+            time_changed = to_timeint(self.ticket.time_changed)
                 
             if time_changed > self.tickettime:
                 # just in case, verify if it wouldn't be a ticket that has been modified in the future
@@ -75,24 +84,24 @@ class ImportProcessor(object):
         else:
             self.ticket = PatchedTicket(self.env, db=self.db)
         self.comment = ''
+        self.ticket_time_field = None
 
     def process_cell(self, column, cell):
-        cell = unicode(cell)
-        # this will ensure that the changes are logged, see model.py Ticket.__setitem__
-        self.ticket[column.lower()] = cell
+        column = column.lower()
+        if column == 'time':
+            # parse datetime string
+            self.ticket_time_field = to_timeint(parse_date(cell))
+        elif column != 'changetime':
+            # this will ensure that the changes are logged, see model.py
+            # Ticket.__setitem__
+            self.ticket[column] = cell
 
     def process_comment(self, comment):
         self.comment = comment
 
     def end_process_row(self):
-        try:
-            # 'when' is a datetime in 0.11, and an int in 0.10.
-            # if we have trac.util.datefmt.to_datetime, we're likely with 0.11
-            from trac.util.datefmt import to_datetime
-            tickettime = to_datetime(self.tickettime)
-        except ImportError:
-            tickettime = self.tickettime
-                
+        tickettime = to_datetime(self.ticket_time_field or self.tickettime)
+
         if self.ticket.id == None:
             for f in self.missingemptyfields:
                 if self.ticket.values.has_key(f) and self.ticket[f] == None:
@@ -234,7 +243,10 @@ class PreviewProcessor(object):
             
 
     def process_cell(self, column, cell):
-        if self.ticket and not (self.ticket.values.has_key(column.lower()) and self.ticket[column.lower()] == cell):
+        column_lower = column.lower()
+        if column_lower == 'changetime' or column_lower == 'time' and self.ticket:
+            self.cells.append( { 'col': column, 'unused': True, 'value': cell, 'style': None })
+        elif self.ticket and (column_lower not in self.ticket.values or self.ticket[column_lower] != cell):
             self.cells.append( { 'col': column, 'value': cell, 'style': 'modified-' + column })
             self.modified = True
         else:
diff --git a/talm_importer/readers.py b/talm_importer/readers.py
index 9c38f72..61cdc79 100644
--- a/talm_importer/readers.py
+++ b/talm_importer/readers.py
@@ -13,14 +13,15 @@ except ImportError:
     xlrd = None
 
 from trac.core import TracError
+from trac.util.datefmt import format_datetime, localtz
 
 
-def get_reader(filename, sheet_index, datetime_format, encoding='utf-8'):
+def get_reader(filename, sheet_index, datetime_format, encoding='utf-8', tzinfo=None):
     # NOTE THAT the sheet index is 1-based !
     # KISS - keep it simple: if it can be opened as XLS, do, otherwise try as CSV.
     if xlrd:
         try:
-            return XLSReader(filename, sheet_index, datetime_format)
+            return XLSReader(filename, sheet_index, datetime_format, tzinfo or localtz)
         except IndexError:
             raise TracError('The sheet index (%s) does not seem to correspond to an existing sheet in the spreadsheet'
                             % sheet_index)
@@ -78,11 +79,12 @@ class CSVReader(object):
         self.file.close()
 
 class XLSReader(object):
-    def __init__(self, filename, sheet_index, datetime_format):
+    def __init__(self, filename, sheet_index, datetime_format, tzinfo):
         self.book = xlrd.open_workbook(filename)
         self.sheetcount = self.book.nsheets
         self.sh = self.book.sheet_by_index(sheet_index - 1)
         self._datetime_format = datetime_format
+        self._tzinfo = tzinfo
 
     def get_sheet_count(self):
         return self.sheetcount
@@ -101,9 +103,16 @@ class XLSReader(object):
             row = {}
             i = 0
             for cx in range(self.sh.ncols):
-                row[header[i]] = self.sh.cell_value(rx, cx)
+                colname = header[i]
+                cell = self.sh.cell_value(rx, cx)
                 if self.sh.cell_type(rx, cx) == xlrd.XL_CELL_DATE:
-                    row[header[i]] = datetime.datetime(*xlrd.xldate_as_tuple(row[header[i]], self.book.datemode)).strftime(self._datetime_format)
+                    vals = xlrd.xldate_as_tuple(cell, self.book.datemode)
+                    dt = datetime.datetime(*(vals + (0, self._tzinfo)))
+                    if colname.lower() in ('time', 'changetime'):
+                        cell = format_datetime(dt, 'iso8601', tzinfo=self._tzinfo)
+                    else:
+                        cell = dt.strftime(self._datetime_format)
+                row[colname] = cell
 
                 i += 1
             data.append(row)
diff --git a/talm_importer/templates/import_preview.html b/talm_importer/templates/import_preview.html
index 16284d3..bcde959 100644
--- a/talm_importer/templates/import_preview.html
+++ b/talm_importer/templates/import_preview.html
@@ -42,23 +42,14 @@
                 class="${row.__idx__ % 2 and 'odd' or 'even'}"
                 style="TODO">
 -->
-              <tr py:for="row in rows"
-                  class="${row.style}">
+              <tr py:for="row in rows" class="${row.style}">
                 <py:for each="cell in row.cells">
                     <py:with vars="col = cell.col.strip('_'); ">
                       <py:choose>
-                        <!--! generic fields -->
-                        <py:when test="col == 'time'">
-                          <td class="$cell.style">${cell.value != 'None' and format_time(int(cell.value)) or '--'}</td>
-                        </py:when>
-
-                        <py:when test="col in ('date', 'created', 'modified')">
-                          <td class="$cell.style">${cell.value != 'None' and format_date(int(cell.value)) or '--'}</td>
+                        <py:when test="cell.unused">
+                          <td class="$cell.style">(unused)</td>
                         </py:when>
 
-                        <py:when test="col == 'datetime'">
-                          <td class="$cell.style">${cell.value != 'None' and format_datetime(int(cell.value)) or '--'}</td>
-                        </py:when>
 <!-- TODO: support wiki formatting...
                         <py:when test="col == 'description'">
                           <td class="$cell.style" xml:space="preserve">
diff --git a/talm_importer/test.py b/talm_importer/test.py
index f60631d..190deb4 100644
--- a/talm_importer/test.py
+++ b/talm_importer/test.py
@@ -37,6 +37,7 @@ class ImporterTestCase(unittest.TestCase):
 
     def _test_preview(self, env, filename):
         req = Request({'SERVER_PORT': 0, 'SERVER_NAME': 'any', 'wsgi.url_scheme': 'any', 'wsgi.input': 'any', 'REQUEST_METHOD': 'GET' }, lambda x, y: _printme)
+        req.callbacks['tz'] = lambda req: None
         try:
            from trac.test import MockPerm
            req.perm = MockPerm()
@@ -53,6 +54,7 @@ class ImporterTestCase(unittest.TestCase):
 
     def _test_import(self, env, filename, sheet = 1):
         req = Request({'SERVER_PORT': 0, 'SERVER_NAME': 'any', 'wsgi.url_scheme': 'any', 'wsgi.input': 'any', 'REQUEST_METHOD': 'GET' }, lambda x, y: _printme)
+        req.callbacks['tz'] = lambda req: None
         try:
            from trac.test import MockPerm
            req.perm = MockPerm()
