diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,9 @@
 # Changelog for Hedis
 
+## 0.9.12
+
+* PR #98. Added `connectTimeout` option
+
 ## 0.9.11
 
 * PR #94. Refactor fix for issue #92 - (Connection to Unix sockets is broken)
@@ -20,6 +24,10 @@
 ## 0.9.7
 
 * Expose returnDecode method of RedisCtx (see issue #83)
+
+## 0.9.6
+
+* Export Condition constructors (see PR #86)
 
 ## 0.9.2
 
diff --git a/hedis.cabal b/hedis.cabal
--- a/hedis.cabal
+++ b/hedis.cabal
@@ -1,5 +1,5 @@
 name:               hedis
-version:            0.9.11
+version:            0.9.12
 synopsis:
     Client library for the Redis datastore: supports full command set,
     pipelining.
diff --git a/src/Database/Redis/Core.hs b/src/Database/Redis/Core.hs
--- a/src/Database/Redis/Core.hs
+++ b/src/Database/Redis/Core.hs
@@ -166,6 +166,10 @@
     --   smallest acceptable value is 0.5 seconds. If the @timeout@ value in
     --   your redis.conf file is non-zero, it should be larger than
     --   'connectMaxIdleTime'.
+    , connectTimeout        :: Maybe NominalDiffTime
+    -- ^ Optional timeout until connection to Redis gets
+    --   established. 'ConnectTimeoutException' gets thrown if no socket
+    --   get connected in this interval of time.
     } deriving Show
 
 -- |Default information for connecting:
@@ -187,6 +191,7 @@
     , connectDatabase       = 0
     , connectMaxConnections = 50
     , connectMaxIdleTime    = 30
+    , connectTimeout        = Nothing
     }
 
 -- |Constructs a 'Connection' pool to a Redis server designated by the 
@@ -197,7 +202,9 @@
     createPool create destroy 1 connectMaxIdleTime connectMaxConnections
   where
     create = do
-        conn <- PP.connect connectHost connectPort
+        let timeoutOptUs =
+              round . (1000000 *) <$> connectTimeout
+        conn <- PP.connect connectHost connectPort timeoutOptUs
         runRedisInternal conn $ do
             -- AUTH
             case connectAuth of
diff --git a/src/Database/Redis/ProtocolPipelining.hs b/src/Database/Redis/ProtocolPipelining.hs
--- a/src/Database/Redis/ProtocolPipelining.hs
+++ b/src/Database/Redis/ProtocolPipelining.hs
@@ -21,6 +21,9 @@
 ) where
 
 import           Prelude
+import           Control.Concurrent (threadDelay)
+import           Control.Concurrent.Async (race)
+import           Control.Concurrent.MVar
 import           Control.Exception
 import           Control.Monad
 import qualified Scanner
@@ -54,9 +57,20 @@
 
 instance Exception ConnectionLostException
 
-connect :: HostName -> PortID -> IO Connection
-connect hostName portID =
-  bracketOnError (hConnect portID) hClose $ \connHandle -> do
+data ConnectPhase
+  = PhaseUnknown
+  | PhaseResolve
+  | PhaseOpenSocket
+  deriving (Show)
+
+data ConnectTimeout = ConnectTimeout ConnectPhase
+  deriving (Show, Typeable)
+
+instance Exception ConnectTimeout
+
+connect :: HostName -> PortID -> Maybe Int -> IO Connection
+connect hostName portID timeoutOpt =
+  bracketOnError hConnect hClose $ \connHandle -> do
     hSetBinaryMode connHandle True
     connReplies <- newIORef []
     connPending <- newIORef []
@@ -66,13 +80,28 @@
     writeIORef connReplies rs
     writeIORef connPending rs
     return conn
-  where hConnect (PortNumber port) =
+  where
+        hConnect = do
+          phaseMVar <- newMVar PhaseUnknown
+          let doConnect = hConnect' portID phaseMVar
+          case timeoutOpt of
+            Nothing -> doConnect
+            Just micros -> do
+              result <- race doConnect (threadDelay micros)
+              case result of
+                Left h -> return h
+                Right () -> do
+                  phase <- readMVar phaseMVar
+                  errConnectTimeout phase
+        hConnect' (PortNumber port) mvar =
           bracketOnError mkSocket NS.close $ \sock -> do
             NS.setSocketOption sock NS.KeepAlive 1
+            void $ swapMVar mvar PhaseResolve
             host <- BSD.getHostByName hostName
+            void $ swapMVar mvar PhaseOpenSocket
             NS.connect sock $ NS.SockAddrInet port (BSD.hostAddress host)
             NS.socketToHandle sock ReadWriteMode
-        hConnect _ = connectTo hostName portID
+        hConnect' _ _ = connectTo hostName portID
         mkSocket   = NS.socket NS.AF_INET NS.Stream 0
 
 disconnect :: Connection -> IO ()
@@ -157,3 +186,6 @@
 
 errConnClosed :: IO a
 errConnClosed = throwIO ConnectionLost
+
+errConnectTimeout :: ConnectPhase -> IO a
+errConnectTimeout phase = throwIO $ ConnectTimeout phase
