diff --git a/Control/Event/Relative.hs b/Control/Event/Relative.hs
--- a/Control/Event/Relative.hs
+++ b/Control/Event/Relative.hs
@@ -10,9 +10,10 @@
 import Prelude hiding (catch)
 import Control.Concurrent
 import Control.Exception
+import Control.Monad (when)
 import Control.Concurrent.MVar
 
-type EventId = (ThreadId, MVar ())
+type EventId = (ThreadId, MVar Bool)
 
 -- |'addEvent delay action' will delay
 -- for 'delay' microseconds then execute 'action'. An EventId
@@ -24,17 +25,19 @@
 	return (t,m)
   where
     eventThread m = do
-	threadDelay delay
-	forkIO event
-	putMVar m ()
+        threadDelay delay
+        forkIO $ runThread m
+	return ()
+    runThread m = do
+        b <- swapMVar m True
+        when (not b) event
 
+
 -- |'delEvent eid' deletes the event and returns
 -- 'True' if the event was _probably_ deleted*.  If 'False' is returned
 -- then the time definately elapsed and the action was forked off.
---
--- * There is a small possibility the delEvent occured after the forkIO
--- but before the signalling MVar was filled, thus causing this uncertainty.
 delEvent :: EventId -> IO Bool
-delEvent (t,m) =
-	killThread t >>
-	isEmptyMVar m
+delEvent (t,m) = do
+    killThread t
+    b <- swapMVar m True
+    return (not b)
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.0.0.1
+version:             1.1.0.0
 synopsis:            Event scheduling system.
 description:         Allows scheduling and canceling of IO actions to be
                      executed at a specified future time.
