diff --git a/gnome-sudoku/src/lib/saver.py b/gnome-sudoku/src/lib/saver.py
index e68894f..79b3197 100644
--- a/gnome-sudoku/src/lib/saver.py
+++ b/gnome-sudoku/src/lib/saver.py
@@ -1,15 +1,12 @@
 # -*- coding: utf-8 -*-
-import gtk, pickle, types, os, errno
+import gtk, pickle, types, os, errno, time
 import defaults
 from gtk_goodies.dialog_extras import show_message
 from gettext import gettext as _
 
 SAVE_ATTRIBUTES = [('gsd.hints'),
                    ('gsd.impossible_hints'),
-                   ('gsd.auto_fills'),
-                   ('timer.__absolute_start_time__'),
-                   ('timer.active_time'),
-                   ('timer.total_time'),
+                   ('gsd.auto_fills')
                    ]
 
 def update_saved_attributes (jar):
@@ -22,11 +19,14 @@ def update_saved_attributes (jar):
     # special case for timing things
     if 'timer.tot_time' in jar: # tot_time was renamed to active_time
         jar['timer.active_time'] = jar['timer.tot_time']
-    if 'timer.tot_time_complete' in jar: # tot_time_complete renamed to total_time
-        jar['timer.total_time'] = jar['timer.tot_time_complete']
-    if not jar['timer.active_time']:
+    if 'timer.__absolute_start_time__' in jar: # renamed to start_time
+        jar['timer.start_time'] = jar['timer.__absolute_start_time__']
+    if not 'timer.active_time' in jar:
         # FIXME set to 1 in order to display well at game-selecting page
         jar['timer.active_time'] = 1
+    if not 'timer.start_time' in jar:
+        # set start time to now if we don't know it
+        jar['timer.start_time'] = time.time()
 
 def super_getattr (obj, attr):
     """getattr, following the dots."""
@@ -47,11 +47,11 @@ def super_setattr (obj, attr, val):
 
 def jar_game (ui):
     jar = {} # what we will pickle
-    ui.timer.finish_timing()
     jar['game'] = ui.gsd.grid.to_string()
     jar['trackers'] = ui.gsd.trackers
     jar['tracking'] = ui.gsd.__trackers_tracking__
     jar['notes'] = []
+    jar.update(ui.timer.jar())
     for e in ui.gsd.__entries__.values():
         top, bot = e.get_note_text()
         if top or bot:
@@ -81,6 +81,7 @@ def open_game (ui, jar):
     if jar.has_key('notes') and jar['notes']:
         for x, y, top, bot in jar['notes']:
             ui.gsd.__entries__[(x, y)].set_note_text(top, bot)
+    ui.timer.unjar(jar)
 
 def pickle_game (ui, target):
     close_me = False
diff --git a/gnome-sudoku/src/lib/timer.py b/gnome-sudoku/src/lib/timer.py
index dfaa4fa..933f81f 100644
--- a/gnome-sudoku/src/lib/timer.py
+++ b/gnome-sudoku/src/lib/timer.py
@@ -90,14 +90,12 @@ class ActiveTimer (gobject.GObject):
     def __init__ (self, window):
         gobject.GObject.__init__(self)
         self.window = window
-        # whether we have 'start_timing'; affects total_time
-        self.timer_running = False
         # whether the timer is running/paused; affects active_time
         self.is_timing = False
 
         self.active_time = 0
-        self.total_time = 0
-        self.__absolute_start_time__ = 0
+        self.start_time = 0
+        self.total_time = None
         self.interval_start = 0
 
         self.window.connect('focus-in-event',
@@ -108,7 +106,7 @@ class ActiveTimer (gobject.GObject):
     def resume_timing (self):
         '''start the interval of active time
         '''
-        if self.timer_running and not self.is_timing:
+        if not self.is_timing and self.total_time is None:
             self.is_timing = True
             self.interval_start = time.time()
             self.emit('timing-started')
@@ -116,24 +114,24 @@ class ActiveTimer (gobject.GObject):
     def pause_timing (self):
         '''end the interval of active time
         '''
-        if self.timer_running and self.is_timing:
+        if self.is_timing and self.total_time is None:
             self.is_timing = False
             interval_end = time.time()
             # active_time is composed of intervals between pausing and resuming
             self.active_time += (interval_end - self.interval_start)
-            self.total_time = time.time() - self.__absolute_start_time__
             self.emit('timing-stopped')
 
     def start_timing (self):
-        self.timer_running = True
         self.active_time = 0
-        self.total_time = 0
-        self.__absolute_start_time__ = time.time()
+        self.start_time = time.time()
+        self.total_time = None # This is set once, when we call finish_timing
         self.resume_timing()
 
     def finish_timing (self):
-        self.pause_timing()
-        self.timer_running = False
+        now = time.time()
+        if self.is_timing:
+            self.active_time += now - self.interval_start
+        self.total_time = now - self.start_time
         if self.active_time < 1:
             self.active_time = 1
         # dirty hack: never let total time be less than active time
@@ -144,7 +142,25 @@ class ActiveTimer (gobject.GObject):
         return format_time(self.active_time)
 
     def total_time_string (self):
+        if self.total_time is None:
+            return format_time(time.time() - self.start_time)
         return format_time(self.total_time)
+    
+    def jar(self):
+        now = time.time()
+        if self.is_timing and self.total_time is None:
+            self.active_time += (now - self.interval_start)
+            self.interval_start = now
+        return {"timer.start_time": self.start_time,
+                "timer.active_time": self.active_time}
+    
+    def unjar(self, jar):
+        now = time.time()
+        self.active_time = jar["timer.active_time"]
+        self.start_time = jar["timer.start_time"]
+        self.total_time = None
+        self.interval_start = now
+        
 
 if __name__ == '__main__':
     def report (timer):
