diff --git a/Control/Timeout.hs b/Control/Timeout.hs
--- a/Control/Timeout.hs
+++ b/Control/Timeout.hs
@@ -104,7 +104,7 @@
               -> IO ()
 timeoutThread id targetTime = do
   currentTime <- getPOSIXTime
-  let deltausecs = truncate $ fromRational $ toRational ((currentTime - targetTime) * 1000000)
+  let deltausecs = truncate $ fromRational $ toRational ((targetTime - currentTime) * 1000000)
   when (deltausecs > 0) $ threadDelay deltausecs
   atomically (do
     (id', _) <- readTVar signal
@@ -121,7 +121,7 @@
            -> (IO ())  -- ^ the action to perform
            -> IO TimeoutTag
 addTimeout delta action =
-  addTimeoutAtomic delta action >>= atomically
+  addTimeoutAtomic delta >>= (\x -> atomically $ x action)
 
 -- | Similar in function to addTimeout above, this call splits the IO and STM
 --   parts of the process so that a timeout can be added atomically. Consider
@@ -138,13 +138,12 @@
 --  then we don't have the TimeoutTag to add to the bookkeeping structure and we
 --  would need another TVar, or some such, to fill in later.
 addTimeoutAtomic :: Float  -- ^ the number of seconds in the future to perform the action
-                 -> (IO ())  -- ^ the action to perform
-                 -> IO (STM TimeoutTag)  -- ^ an action to add the timeout and return the tag
-addTimeoutAtomic delta action = do
+                 -> IO (IO () -> STM TimeoutTag)  -- ^ an action to add the timeout and return the tag
+addTimeoutAtomic delta = do
   currentTime <- getPOSIXTime
   let future = currentTime + (fromRational $ toRational delta)
-      stmAction :: STM TimeoutTag
-      stmAction = do
+      stmAction :: IO () -> STM TimeoutTag
+      stmAction action = do
         m <- readTVar timeouts
         case Map.lookup future m of
              Nothing -> do writeTVar timeouts $ Map.insert future [(0, action)] m
@@ -215,5 +214,7 @@
   case mthid of
        Nothing -> return ()
        Just x -> killThread x
-  tid <- forkIO $ timeoutThread nextTag minTimeout
-  timeoutManagerThread tm signal minTimeout $ Just tid
+  tid <- case minTimeout of
+              0 -> return Nothing
+              x -> forkIO (timeoutThread nextTag minTimeout) >>= return . Just
+  timeoutManagerThread tm signal minTimeout tid
diff --git a/control-timeout.cabal b/control-timeout.cabal
--- a/control-timeout.cabal
+++ b/control-timeout.cabal
@@ -1,5 +1,5 @@
 name:            control-timeout
-version:         0.1.1
+version:         0.1.2
 license:         BSD3
 license-file:    LICENSE
 author:          Adam Langley <agl@imperialviolet.org>
