diff --git a/Control/Event.hs b/Control/Event.hs
--- a/Control/Event.hs
+++ b/Control/Event.hs
@@ -74,11 +74,10 @@
 -- Asynchronous 'TimerReset' exceptions might occur to indicate a new, 
 -- earlier, alarm time.
 expireEvents :: EventSystem -> IO ()
-expireEvents es = do
-        block (do
-                tid <- myThreadId
-                forever $ catch (unblock (setTID (Just tid) es >> expireEvents' es))
-                                (\TimerReset -> return ()) )
+expireEvents es = mask $ \restore -> do
+     tid <- myThreadId
+     forever $ catch (restore (setTID (Just tid) es >> expireEvents' es))
+                     (\TimerReset -> return ())
   where
   setTID i es = atomically (writeTVar (esThread es) i)
 
@@ -194,7 +193,7 @@
 evtSystemSize :: EventSystem -> STM Int
 evtSystemSize sys = do
     evts <- readTVar (esEvents sys)
-    return $ fold (\(_,m) n -> n + size m) 0 evts
+    return $ foldr (\(_,m) n -> n + size m) 0 evts
 
 -- |Tracks the alarm time and the earliest event.  If an earlier event is added
 -- the alarm time is updated and TimerReset is thrown to the expireEvent thread
diff --git a/Control/Event/Relative.hs b/Control/Event/Relative.hs
--- a/Control/Event/Relative.hs
+++ b/Control/Event/Relative.hs
@@ -2,10 +2,10 @@
 -- event system that should perform better than the Control.Event module
 -- but does not provide features such as STM action scheduling.
 module Control.Event.Relative
-	( EventId
-	, addEvent
-	, delEvent
-	) where
+        ( EventId
+        , addEvent
+        , delEvent
+        ) where
 
 import Prelude hiding (catch)
 import Control.Concurrent
@@ -20,14 +20,14 @@
 -- is returned, allowing the event to be canceled.
 addEvent :: Int -> IO () -> IO EventId
 addEvent delay event = do
-	m <- newMVar False
-	t <- forkIO (eventThread m)
-	return (t,m)
+        m <- newMVar False
+        t <- forkIO (eventThread m)
+        return (t,m)
   where
     eventThread m = do
         threadDelay delay
         forkIO $ runThread m
-	return ()
+        return ()
     runThread m = do
         b <- swapMVar m True
         when (not b) event
diff --git a/Test/Event.hs b/Test/Event.hs
--- a/Test/Event.hs
+++ b/Test/Event.hs
@@ -42,7 +42,7 @@
   decAndPrint a =
      atomically (do
           n <- readTVar a
-	  writeTVar a (n - 1) )
+          writeTVar a (n - 1) )
 
 setAndCancelTimeout :: Int -> NominalDiffTime -> IO ()
 setAndCancelTimeout n secs = do
diff --git a/control-event.cabal b/control-event.cabal
--- a/control-event.cabal
+++ b/control-event.cabal
@@ -1,5 +1,5 @@
 name:                control-event
-version:             1.2.1.1
+version:             1.3
 synopsis:            Event scheduling system.
 description:         Allows scheduling and canceling of IO actions to be
                      executed at a specified future time.
@@ -9,7 +9,7 @@
 author:              Thomas DuBuisson
 maintainer:          Thomas.DuBuisson@gmail.com
 build-type:          Simple
-Cabal-Version:       >= 1.2.3
+Cabal-Version:       >= 2.0
 stability:           beta
 tested-with:         GHC == 6.10.3
 extra-source-files:  Test/Event.hs Test/Timeout.hs
@@ -19,5 +19,31 @@
                        time >= 1.1,
                        containers >= 0.1,
                        stm >= 2.1
-  extensions:          DeriveDataTypeable
   exposed-modules:     Control.Event, Control.Event.Timeout, Control.Event.Relative
+  default-language:    Haskell2010
+
+test-suite control-event-test-absolute
+    default-language: Haskell2010
+    type: exitcode-stdio-1.0
+    hs-source-dirs: Test
+    main-is: Event.hs
+    ghc-options:
+    build-depends:
+        base,
+        control-event,
+        stm,
+        containers,
+        time
+
+test-suite control-event-test-relative
+    default-language: Haskell2010
+    type: exitcode-stdio-1.0
+    hs-source-dirs: Test
+    main-is: Timeout.hs
+    ghc-options:
+    build-depends:
+        base,
+        control-event,
+        stm,
+        containers,
+        time
