diff --git a/Data/Conduit/Network.hs b/Data/Conduit/Network.hs
--- a/Data/Conduit/Network.hs
+++ b/Data/Conduit/Network.hs
@@ -17,10 +17,12 @@
     , serverSettings
     , SN.runTCPServer
     , SN.runTCPServerWithHandle
+    , runGeneralTCPServer
       -- ** Client
     , SN.ClientSettings
     , clientSettings
     , SN.runTCPClient
+    , runGeneralTCPClient
       -- ** Getters
     , SN.getPort
     , SN.getHost
@@ -46,8 +48,8 @@
 import qualified Data.ByteString.Char8 as S8
 import Control.Monad.IO.Class (MonadIO (liftIO))
 import Control.Exception (throwIO, SomeException, try, finally, bracket, IOException, catch)
-import Control.Monad (forever, unless)
-import Control.Monad.Trans.Control (MonadBaseControl, control)
+import Control.Monad (forever, unless, void)
+import Control.Monad.Trans.Control (MonadBaseControl, control, liftBaseWith)
 import Control.Monad.Trans.Class (lift)
 import Control.Concurrent (forkIO, threadDelay, newEmptyMVar, putMVar, takeMVar)
 import qualified Data.Streaming.Network as SN
@@ -94,3 +96,33 @@
 
 appSink :: (SN.HasReadWrite ad, MonadIO m) => ad -> Consumer ByteString m ()
 appSink ad = awaitForever $ \d -> liftIO $ SN.appWrite ad d >> Conc.yield
+
+-- | Run a general TCP server
+--
+-- Same as 'SN.runTCPServer', except monad can be any instance of
+-- 'MonadBaseControl' 'IO'.
+--
+-- Note that any changes to the monadic state performed by individual
+-- client handlers will be discarded. If you have mutable state you want
+-- to share among multiple handlers, you need to use some kind of mutable
+-- variables.
+--
+-- Since 1.1.3
+runGeneralTCPServer :: MonadBaseControl IO m
+                    => SN.ServerSettings
+                    -> (SN.AppData -> m ())
+                    -> m ()
+runGeneralTCPServer set f = liftBaseWith $ \run ->
+    SN.runTCPServer set $ void . run . f
+
+-- | Run a general TCP client
+--
+-- Same as 'SN.runTCPClient', except monad can be any instance of 'MonadBaseControl' 'IO'.
+--
+-- Since 1.1.3
+runGeneralTCPClient :: MonadBaseControl IO m
+                    => SN.ClientSettings
+                    -> (SN.AppData -> m a)
+                    -> m a
+runGeneralTCPClient set f = control $ \run ->
+    SN.runTCPClient set $ run . f
diff --git a/conduit-extra.cabal b/conduit-extra.cabal
--- a/conduit-extra.cabal
+++ b/conduit-extra.cabal
@@ -1,5 +1,5 @@
 Name:                conduit-extra
-Version:             1.1.2
+Version:             1.1.3
 Synopsis:            Batteries included conduit: adapters for common libraries.
 Description:
     The conduit package itself maintains relative small dependencies. The purpose of this package is to collect commonly used utility functions wrapping other library dependencies, without depending on heavier-weight dependencies. The basic idea is that this package should only depend on haskell-platform packages and conduit.
