diff --git a/src/Step3.hs b/src/Step3.hs
--- a/src/Step3.hs
+++ b/src/Step3.hs
@@ -7,7 +7,7 @@
 data GUIContext = GUICtx { guiWin    :: Frame (),
                            guiEditor :: TextCtrl (),
                            guiFile   :: Var (Maybe FilePath),
-                           guiTimer  :: Var (TimerEx ()), -- ^ A timer to detect user actions
+                           guiTimer  :: TimerEx (),       -- ^ A timer to detect user actions
                            guiPast   :: Var [String],     -- ^ For Undo history
                            guiFuture :: Var [String]      -- ^ For Redo history
                            }
@@ -43,15 +43,16 @@
 
         -- We create a timer to detect user actions.  This way we'll not undo/redo
         -- every character
-        refreshTimer <- timer win [interval   := 1000000,   -- 1000 secs. means a *lot* of time
-                                   on command := return ()] -- just start over
-        varTimer <- varCreate refreshTimer
-
+        refreshTimer <- timer win []
+        
         -- We define the context to use it on every event handling function
         past <- varCreate []
         future <- varCreate []
-        let guiCtx = GUICtx win editor filePath varTimer past future
+        let guiCtx = GUICtx win editor filePath refreshTimer past future
         
+        -- We set the command associated to the timer (but we didn't start it yet)
+        timerOnCommand refreshTimer $ updatePast guiCtx 
+        
         -- We associate the events on the editor with commands that populate undo/redo history
         set editor [on keyboard := \_ -> restartTimer guiCtx >> propagateEvent]
         -- and we start populating the history because there's text on the editor...
@@ -185,27 +186,19 @@
         varSet past []
         varSet future []
 
-restartTimer guiCtx@GUICtx{guiWin = win, guiTimer = varTimer} =
-    do
-        -- The user did something, we start a 1sec timer that will modify history
+restartTimer guiCtx@GUICtx{guiWin = win, guiTimer = refreshTimer} =
+        -- The user did something, we start our timer with a 1sec interval and
+        -- a one-shot type so it will run just once and then it will modify history
         -- if the user doesn't do anything in that sec.  If the user does another
         -- thing, then the timer will be restarted again and so on so far until
         -- the first sec of inactivity
-        -- Note by FernandoBenavides:
-        -- I really don't know if this can't be done with just one timer
-        -- I didn't find something like "timerRestart ..."
-        newRefreshTimer <- timer win [interval := 1000,
-                                      on command := updatePast guiCtx]
-        refreshTimer <- varSwap varTimer newRefreshTimer
-        timerOnCommand refreshTimer $ return ()
-
-killTimer GUICtx{guiWin = win, guiTimer = varTimer} =
     do
-        -- We kill the timer till there's new notices
-        -- Note by FernandoBenavides:
-        -- I really don't know if this can't be done with just one timer
-        -- I didn't find something like "timerRestart ..."
-        newRefreshTimer <- timer win [interval := 1000000,
-                                      on command := return ()]
-        refreshTimer <- varSwap varTimer newRefreshTimer
-        timerOnCommand refreshTimer $ return ()
+        started <- timerStart refreshTimer 1000 True
+        if started
+            then return ()
+            else do
+                    errorDialog win "Error" "Can't start more timers"
+                    wxcAppExit
+
+-- We kill the timer till there's new notices
+killTimer GUICtx{guiTimer = refreshTimer} = timerStop refreshTimer
diff --git a/src/Step4.hs b/src/Step4.hs
--- a/src/Step4.hs
+++ b/src/Step4.hs
@@ -7,7 +7,7 @@
 data GUIContext = GUICtx { guiWin    :: Frame (),
                            guiEditor :: TextCtrl (),
                            guiFile   :: Var (Maybe FilePath),
-                           guiTimer  :: Var (TimerEx ()),
+                           guiTimer  :: TimerEx (),
                            guiPast   :: Var [String],
                            guiFuture :: Var [String]
                            }
@@ -30,14 +30,13 @@
                                         "Besides, we need to adapt our Undo/Redo " ++
                                         "implementation to these functions.\n"]
         filePath <- varCreate Nothing
-        refreshTimer <- timer win [interval   := 1000000,
-                                   on command := return ()]
-        varTimer <- varCreate refreshTimer
+        refreshTimer <- timer win []
         past <- varCreate []
         future <- varCreate []
-        let guiCtx = GUICtx win editor filePath varTimer past future
+        let guiCtx = GUICtx win editor filePath refreshTimer past future
         
         set editor [on keyboard := \_ -> restartTimer guiCtx >> propagateEvent]
+        timerOnCommand refreshTimer $ updatePast guiCtx
         updatePast guiCtx
         
         -- We create a menu for the window with the same items from steps 2 & 3
@@ -163,19 +162,16 @@
         varSet past []
         varSet future []
 
-restartTimer guiCtx@GUICtx{guiWin = win, guiTimer = varTimer} =
+restartTimer guiCtx@GUICtx{guiWin = win, guiTimer = refreshTimer} =
     do
-        newRefreshTimer <- timer win [interval := 1000,
-                                      on command := updatePast guiCtx]
-        refreshTimer <- varSwap varTimer newRefreshTimer
-        timerOnCommand refreshTimer $ return ()
+        started <- timerStart refreshTimer 1000 True
+        if started
+            then return ()
+            else do
+                    errorDialog win "Error" "Can't start more timers"
+                    wxcAppExit
 
-killTimer GUICtx{guiWin = win, guiTimer = varTimer} =
-    do
-        newRefreshTimer <- timer win [interval := 1000000,
-                                      on command := return ()]
-        refreshTimer <- varSwap varTimer newRefreshTimer
-        timerOnCommand refreshTimer $ return ()
+killTimer GUICtx{guiTimer = refreshTimer} = timerStop refreshTimer
 
 -- We just copy the selected text
 copy GUICtx{guiEditor = editor} = textCtrlCopy editor
diff --git a/src/Step5.hs b/src/Step5.hs
--- a/src/Step5.hs
+++ b/src/Step5.hs
@@ -18,7 +18,7 @@
 data GUIContext = GUICtx { guiWin    :: Frame (),
                            guiEditor :: TextCtrl (),
                            guiFile   :: Var (Maybe FilePath),
-                           guiTimer  :: Var (TimerEx ()),
+                           guiTimer  :: TimerEx (),
                            guiPast   :: Var [String],
                            guiFuture :: Var [String],
                            guiSearch :: FindReplaceData () -- ^ Needed to hold the what the user is looking for
@@ -50,17 +50,17 @@
                                         "If you find it, please post it on the " ++
                                         "wxhaskell-users mailing list :)"]
         filePath <- varCreate Nothing
-        refreshTimer <- timer win [interval   := 1000000,
-                                   on command := return ()]
-        varTimer <- varCreate refreshTimer
+        refreshTimer <- timer win []
+        
         past <- varCreate []
         future <- varCreate []
         -- We create a FindReplaceData that will hold the information about the
         -- last search
         search <- findReplaceDataCreate wxFR_DOWN
-        let guiCtx = GUICtx win editor filePath varTimer past future search
+        let guiCtx = GUICtx win editor filePath refreshTimer past future search
         
         set editor [on keyboard := \_ -> restartTimer guiCtx >> propagateEvent]
+        timerOnCommand refreshTimer $ updatePast guiCtx
         updatePast guiCtx
         
         -- We create a menu for the window with the same items from previous steps
@@ -196,19 +196,16 @@
         varSet past []
         varSet future []
 
-restartTimer guiCtx@GUICtx{guiWin = win, guiTimer = varTimer} =
+restartTimer guiCtx@GUICtx{guiWin = win, guiTimer = refreshTimer} =
     do
-        newRefreshTimer <- timer win [interval := 1000,
-                                      on command := updatePast guiCtx]
-        refreshTimer <- varSwap varTimer newRefreshTimer
-        timerOnCommand refreshTimer $ return ()
+        started <- timerStart refreshTimer 1000 True
+        if started
+            then return ()
+            else do
+                    errorDialog win "Error" "Can't start more timers"
+                    wxcAppExit
 
-killTimer GUICtx{guiWin = win, guiTimer = varTimer} =
-    do
-        newRefreshTimer <- timer win [interval := 1000000,
-                                      on command := return ()]
-        refreshTimer <- varSwap varTimer newRefreshTimer
-        timerOnCommand refreshTimer $ return ()
+killTimer GUICtx{guiTimer = refreshTimer} = timerStop refreshTimer
 
 copy GUICtx{guiEditor = editor} = textCtrlCopy editor
 
diff --git a/src/Step6.hs b/src/Step6.hs
--- a/src/Step6.hs
+++ b/src/Step6.hs
@@ -18,7 +18,7 @@
 data GUIContext = GUICtx { guiWin    :: Frame (),
                            guiEditor :: TextCtrl (),
                            guiFile   :: Var (Maybe FilePath),
-                           guiTimer  :: Var (TimerEx ()),
+                           guiTimer  :: TimerEx (),
                            guiPast   :: Var [String],
                            guiFuture :: Var [String],
                            guiSearch :: FindReplaceData (),
@@ -57,9 +57,7 @@
                                         "your homework is to add smart things to " ++
                                         "it, like a Line/Coulmn position marker."]
         filePath <- varCreate Nothing
-        refreshTimer <- timer win [interval   := 1000000,
-                                   on command := return ()]
-        varTimer <- varCreate refreshTimer
+        refreshTimer <- timer win []
         past <- varCreate []
         future <- varCreate []
         search <- findReplaceDataCreate wxFR_DOWN
@@ -69,7 +67,7 @@
         -- The window statusbar is a list of status fields, we use just one
         set win [statusBar := [status]]
         
-        let guiCtx = GUICtx win editor filePath varTimer past future search status
+        let guiCtx = GUICtx win editor filePath refreshTimer past future search status
         
         set editor [on keyboard := \_ -> restartTimer guiCtx >> propagateEvent,
                     -- We associate the right click on the editor to a context menu launcher
@@ -77,6 +75,7 @@
                                             MouseRightDown _ _ -> contextMenu guiCtx
                                             _ -> propagateEvent]
 
+        timerOnCommand refreshTimer $ updatePast guiCtx
         updatePast guiCtx
         
         mnuFile <- menuPane [text := "File"]
@@ -270,20 +269,16 @@
         varSet past []
         varSet future []
 
-restartTimer guiCtx@GUICtx{guiWin = win, guiTimer = varTimer, guiStatus = status} =
+restartTimer guiCtx@GUICtx{guiWin = win, guiTimer = refreshTimer} =
     do
-        newRefreshTimer <- timer win [interval := 1000,
-                                      on command := updatePast guiCtx]
-        refreshTimer <- varSwap varTimer newRefreshTimer
-        timerOnCommand refreshTimer $ return ()
-        set status [text := ""]
+        started <- timerStart refreshTimer 1000 True
+        if started
+            then return ()
+            else do
+                    errorDialog win "Error" "Can't start more timers"
+                    wxcAppExit
 
-killTimer GUICtx{guiWin = win, guiTimer = varTimer} =
-    do
-        newRefreshTimer <- timer win [interval := 1000000,
-                                      on command := return ()]
-        refreshTimer <- varSwap varTimer newRefreshTimer
-        timerOnCommand refreshTimer $ return ()
+killTimer GUICtx{guiTimer = refreshTimer} = timerStop refreshTimer
 
 copy GUICtx{guiEditor = editor} = textCtrlCopy editor
 
diff --git a/wxhnotepad.cabal b/wxhnotepad.cabal
--- a/wxhnotepad.cabal
+++ b/wxhnotepad.cabal
@@ -1,5 +1,5 @@
 name: wxhnotepad
-version: 1.0.0
+version: 1.1.0
 cabal-version: >=1.6
 build-type: Custom
 license: BSD3
