diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Revision history for network-run
 
+## 0.5.0
+
+* Fixing a bug that TimeoutServer is not killed.
+* Breaking change: the signatures of Timeout.runTCPServer and 
+  Timeout.runTCPServerWithSocket are changed.
+
 ## 0.4.3
 
 * Using time-manager >= 0.2.
diff --git a/Network/Run/TCP/Timeout.hs b/Network/Run/TCP/Timeout.hs
--- a/Network/Run/TCP/Timeout.hs
+++ b/Network/Run/TCP/Timeout.hs
@@ -37,8 +37,8 @@
     -- ^ Timeout in second.
     -> Maybe HostName
     -> ServiceName
-    -> TimeoutServer a
-    -> IO a
+    -> TimeoutServer ()
+    -> IO ()
 runTCPServer tm mhost port server = do
     addr <- resolve Stream mhost port [AI_PASSIVE] NE.head
     E.bracket (openTCPServerSocket addr) close $ \sock ->
@@ -50,13 +50,13 @@
     :: Int
     -- ^ Timeout in second.
     -> Socket
-    -> TimeoutServer a
-    -> IO a
+    -> TimeoutServer ()
+    -> IO ()
 runTCPServerWithSocket tm sock server = do
     T.withManager (tm * 1000000) $ \mgr -> forever $
         E.bracketOnError (accept sock) (close . fst) $ \(conn, _peer) ->
-            void $ forkFinally (server' mgr conn) (const $ gclose conn)
+            void $ forkFinally (runServer mgr conn) (const $ gclose conn)
   where
-    server' mgr conn = do
+    runServer mgr conn = do
         labelMe "TCP timeout server"
-        T.withHandle mgr (return ()) $ \th -> server mgr th conn
+        T.withHandleKillThread mgr (return ()) $ \th -> server mgr th conn
diff --git a/network-run.cabal b/network-run.cabal
--- a/network-run.cabal
+++ b/network-run.cabal
@@ -1,6 +1,6 @@
 cabal-version:      >=1.10
 name:               network-run
-version:            0.4.4
+version:            0.5.0
 license:            BSD3
 license-file:       LICENSE
 maintainer:         kazu@iij.ad.jp
@@ -27,4 +27,4 @@
         base >=4 && <5,
         bytestring,
         network >=3.2.4,
-        time-manager >=0.2 && <0.3
+        time-manager >=0.2 && <0.4
