diff --git a/Lambdabot/Process.hs b/Lambdabot/Process.hs
--- a/Lambdabot/Process.hs
+++ b/Lambdabot/Process.hs
@@ -7,9 +7,9 @@
 import System.Exit
 import System.IO
 import System.Process
-import Control.Concurrent       (forkIO, newEmptyMVar, putMVar, takeMVar)
-
-import qualified Control.Exception
+import Control.Concurrent       (forkIO, newEmptyMVar, putMVar, takeMVar, killThread)
+import Control.Monad
+import qualified Control.Exception as E
 
 run :: FilePath -> String -> (String -> String) -> IO String
 run binary src scrub = do
@@ -22,30 +22,24 @@
         | otherwise        -> o
     }
 
---
--- Ignoring exit status for now.
---
--- You have to ignore SIGPIPE, otherwise popening a non-existing executable
--- will result in an attempt to write to a closed pipe and crash the wholw
--- program.
---
--- XXX there are still issues. Large amounts of output can cause what
--- seems to be a dead lock on the pipe write from runplugs, for example.
--- Posix.popen doesn't have this problem, so maybe we can reproduce its
--- pipe handling somehow.
 -- | popen lets you run a binary with specified arguments. This bypasses the shell.
+-- | It'll also terminate (SIGTERM) the spawned process in case of
+-- | exception, this is very important if the timeout for a Plugin
+-- | expires while it is waiting for the result of a looping process.
+-- | It's fundamental to link the final executable with -threaded.
 popen :: FilePath -- ^ The binary to execute
       -> [String] -- ^ A list of arguments to pass to the binary. No need to
                  -- space separate them
       -> Maybe String -- ^ stdin
       -> IO (String,String,ExitCode)
 popen file args minput =
-    Control.Exception.handle (\e -> return ([],show e,error (show e))) $ do
-
-    (inp,out,err,pid) <- runInteractiveProcess file args Nothing Nothing
+  E.handle (\(E.SomeException e) -> return ([],show e,error (show e))) $ 
+   E.bracketOnError (runInteractiveProcess file args Nothing Nothing) (\(_,_,_,pid) -> terminateProcess pid) $
+     \(inp,out,err,pid) -> do
 
     case minput of
-        Just input -> hPutStr inp input >> hClose inp -- importante!
+        Just input -> hPutStr inp input >> E.catch (hClose inp)
+                                                   (\(E.SomeException e) -> return ())
         Nothing    -> return ()
 
     -- Now, grab the input
@@ -65,15 +59,14 @@
     outMVar <- newEmptyMVar
     errMVar <- newEmptyMVar
 
-    forkIO (Control.Exception.evaluate (length output) >> putMVar outMVar ())
-    forkIO (Control.Exception.evaluate (length errput) >> putMVar errMVar ())
-
-    takeMVar outMVar
-    takeMVar errMVar
+    E.bracketOnError (do t1 <- forkIO (E.evaluate (length output) >> putMVar outMVar ())
+                         t2 <- forkIO (E.evaluate (length errput) >> putMVar errMVar ())
+                         return (t1,t2))
+                     (\(t1,t2) -> killThread t1    >> killThread t2   )
+                     (\_ ->       takeMVar outMVar >> takeMVar errMVar)
 
     -- And now we wait. We must wait after we read, unsurprisingly.
     -- blocks without -threaded, you're warned.
     -- and maybe the process has already completed..
-    e <- Control.Exception.catch (waitForProcess pid) (\_ -> return ExitSuccess)
-
+    e <- waitForProcess pid 
     return (output,errput,e)
diff --git a/Lambdabot/Signals.hs b/Lambdabot/Signals.hs
--- a/Lambdabot/Signals.hs
+++ b/Lambdabot/Signals.hs
@@ -30,7 +30,7 @@
 import Data.Typeable
 
 import Control.Concurrent (myThreadId, newEmptyMVar, putMVar, MVar, ThreadId)
-import Control.Exception
+import Control.OldException (throwDynTo)
 import Control.Monad.Error
 
 import System.IO.Unsafe
diff --git a/Lambdabot/Url.hs b/Lambdabot/Url.hs
--- a/Lambdabot/Url.hs
+++ b/Lambdabot/Url.hs
@@ -16,7 +16,6 @@
 import Lambdabot.MiniHTTP
 
 import Control.Monad.Reader
-import Text.HTML.TagSoup.Parser
 import Text.HTML.TagSoup.Match
 import Text.HTML.TagSoup
 import Codec.Binary.UTF8.String
diff --git a/lambdabot-utils.cabal b/lambdabot-utils.cabal
--- a/lambdabot-utils.cabal
+++ b/lambdabot-utils.cabal
@@ -1,5 +1,5 @@
 Name:                lambdabot-utils
-Version:             4.2
+Version:             4.2.1
 License:             GPL
 License-file:        LICENSE
 Author:              Don Stewart
@@ -25,8 +25,8 @@
 Homepage:            http://haskell.org/haskellwiki/Lambdabot
 build-type:          Simple
 
-Build-depends:   base, haskell-src, containers, zlib, bytestring, mtl,
-                 regex-compat, regex-posix, process, network, old-time, binary, unix, random, tagsoup, utf8-string
+Build-depends:   base >= 4 && < 5, haskell-src, containers, zlib, bytestring, mtl, syb,
+                 regex-compat, regex-posix, process, network, old-time, binary, unix, random, tagsoup>0.6, utf8-string
 Exposed-modules: Lambdabot.FixPrecedence, Lambdabot.Serial,
                  Lambdabot.Error, Lambdabot.Url, Lambdabot.Process,
                  Lambdabot.Regex, Lambdabot.MiniHTTP, Lambdabot.AltTime,
