diff --git a/hasbolt.cabal b/hasbolt.cabal
--- a/hasbolt.cabal
+++ b/hasbolt.cabal
@@ -1,5 +1,5 @@
 name: hasbolt
-version: 0.1.2.0
+version: 0.1.2.1
 cabal-version: >=1.10
 build-type: Simple
 license: BSD3
@@ -42,7 +42,6 @@
         data-binary-ieee754 >=0.4.4 && <0.5,
         transformers >=0.5.2.0 && <0.6,
         network >=2.6.3.1 && <2.7,
-        network-simple >=0.4.0.5 && <0.5,
         data-default >=0.7.1.1 && <0.8,
         hex >=0.1.2 && <0.2
     default-language: Haskell2010
@@ -52,6 +51,7 @@
         Database.Bolt.Value.Helpers
         Database.Bolt.Value.Instances
         Database.Bolt.Value.Structure
+        Database.Bolt.Connection.Socket
         Database.Bolt.Connection.Type
         Database.Bolt.Connection.Instances
         Database.Bolt.Connection.Pipe
@@ -64,7 +64,7 @@
     main-is: Spec.hs
     build-depends:
         base >=4.8 && <5,
-        hasbolt >=0.1.2.0 && <0.2,
+        hasbolt >=0.1.2.1 && <0.2,
         hspec >=2.4.1 && <2.5,
         QuickCheck >=2.9 && <2.11,
         hex >=0.1.2 && <0.2,
diff --git a/src/Database/Bolt.hs b/src/Database/Bolt.hs
--- a/src/Database/Bolt.hs
+++ b/src/Database/Bolt.hs
@@ -20,8 +20,10 @@
 import           Data.Map.Strict               (Map)
 import           Control.Monad.IO.Class        (MonadIO)
 
+-- |Runs Cypher query and returns list of obtained 'Record's. Strict version
 query :: MonadIO m => Text -> BoltActionT m [Record]
 query = query'
 
+-- |Runs Cypher query with parameters and returns list of obtained 'Record's. Strict version
 queryP :: MonadIO m => Text -> Map Text Value -> BoltActionT m [Record]
 queryP = queryP'
diff --git a/src/Database/Bolt/Connection.hs b/src/Database/Bolt/Connection.hs
--- a/src/Database/Bolt/Connection.hs
+++ b/src/Database/Bolt/Connection.hs
@@ -26,11 +26,11 @@
 run :: Pipe -> BoltActionT m a -> m a
 run = flip runReaderT
 
--- |Runs Cypher query with parameters and returns list of obtained 'Record's
+-- |Runs Cypher query with parameters and returns list of obtained 'Record's. Lazy version
 queryP :: MonadIO m => Text -> Map Text Value -> BoltActionT m [Record]
 queryP = querySL False
 
--- |Runs Cypher query and returns list of obtained 'Record's
+-- |Runs Cypher query and returns list of obtained 'Record's. Lazy version
 query :: MonadIO m => Text -> BoltActionT m [Record]
 query cypher = queryP cypher empty
 
diff --git a/src/Database/Bolt/Connection/Pipe.hs b/src/Database/Bolt/Connection/Pipe.hs
--- a/src/Database/Bolt/Connection/Pipe.hs
+++ b/src/Database/Bolt/Connection/Pipe.hs
@@ -5,15 +5,16 @@
 import           Database.Bolt.Value.Instances
 import           Database.Bolt.Value.Type
 
+import           Database.Bolt.Connection.Socket    (Socket, closeSock,
+                                                     connectSock, recv, send,
+                                                     sendMany)
+
 import           Control.Monad                      (forM_, unless, void, when)
 import           Control.Monad.IO.Class             (MonadIO (..))
 import           Data.ByteString                    (ByteString)
 import qualified Data.ByteString                    as B (concat, length, null,
                                                           splitAt)
 import           Data.Word                          (Word16)
-import           Network.Simple.TCP                 (Socket, closeSock,
-                                                     connectSock, recv, send,
-                                                     sendMany)
 
 -- |Creates new 'Pipe' instance to use all requests through
 connect :: MonadIO m => BoltCfg -> m Pipe
diff --git a/src/Database/Bolt/Connection/Socket.hs b/src/Database/Bolt/Connection/Socket.hs
new file mode 100644
--- /dev/null
+++ b/src/Database/Bolt/Connection/Socket.hs
@@ -0,0 +1,46 @@
+module Database.Bolt.Connection.Socket
+  ( Socket
+  , connectSock, closeSock
+  , recv, send, sendMany
+  ) where
+
+import           Control.Exception         (bracketOnError)
+import           Control.Monad.IO.Class    (MonadIO (..))
+import           Data.ByteString           (ByteString, null)
+import           Network.Socket            (AddrInfoFlag (..), HostName,
+                                            ServiceName, SockAddr, Socket,
+                                            SocketType (..), addrAddress,
+                                            addrFamily, addrFlags, addrProtocol,
+                                            addrSocketType, defaultHints,
+                                            getAddrInfo, socket, close, connect)
+import qualified Network.Socket.ByteString as NSB (recv, sendAll, sendMany)
+import           Prelude                   hiding (null)
+
+connectSock :: MonadIO m => HostName -> ServiceName -> m (Socket, SockAddr)
+connectSock host port = liftIO $ bracketOnError (createSock host port) (closeSock . fst) $
+                          \(sock, addr) -> liftIO (connect sock addr) >> pure (sock, addr)
+
+createSock :: MonadIO m => HostName -> ServiceName -> m (Socket, SockAddr)
+createSock host port = liftIO $ do (addr:_) <- getAddrInfo (Just hints) (Just host) (Just port)
+                                   let family'   = addrFamily addr
+                                   let type'     = addrSocketType addr
+                                   let protocol' = addrProtocol addr
+                                   sock <- socket family' type' protocol'
+                                   pure (sock, addrAddress addr)
+  where hints = defaultHints { addrFlags = [AI_ADDRCONFIG]
+                             , addrSocketType = Stream
+                             }
+
+closeSock :: MonadIO m => Socket -> m ()
+closeSock = liftIO . close
+
+recv :: MonadIO m => Socket -> Int -> m (Maybe ByteString)
+recv sock nbytes = liftIO $ do bs <- NSB.recv sock nbytes
+                               if null bs then pure Nothing
+                                            else pure (Just bs)
+
+send :: MonadIO m => Socket -> ByteString -> m ()
+send sock = liftIO . NSB.sendAll sock
+
+sendMany :: MonadIO m => Socket -> [ByteString] -> m ()
+sendMany sock = liftIO . NSB.sendMany sock
diff --git a/src/Database/Bolt/Connection/Type.hs b/src/Database/Bolt/Connection/Type.hs
--- a/src/Database/Bolt/Connection/Type.hs
+++ b/src/Database/Bolt/Connection/Type.hs
@@ -4,11 +4,12 @@
 
 import           Database.Bolt.Value.Type
 
-import           Data.Default              (Default (..))
-import           Data.Map.Strict           (Map)
-import           Data.Text                 (Text)
-import           Data.Word                 (Word16, Word32)
-import           Network.Simple.TCP        (Socket)
+import           Database.Bolt.Connection.Socket (Socket)
+
+import           Data.Default                    (Default (..))
+import           Data.Map.Strict                 (Map)
+import           Data.Text                       (Text)
+import           Data.Word                       (Word16, Word32)
 
 -- |Configuration of driver connection
 data BoltCfg = BoltCfg { magic         :: Word32  -- ^'6060B017' value
