diff --git a/HaskellNet-SSL.cabal b/HaskellNet-SSL.cabal
--- a/HaskellNet-SSL.cabal
+++ b/HaskellNet-SSL.cabal
@@ -1,6 +1,6 @@
 name:                HaskellNet-SSL
 synopsis:            Helpers to connect to SSL/TLS mail servers with HaskellNet
-version:             0.3.4.1
+version:             0.3.4.4
 description:         This package ties together the HaskellNet and connection
                      packages to make it easy to open IMAP and SMTP connections
                      over SSL.
@@ -12,12 +12,12 @@
 copyright:           (c) 2013 Daniel P. Wright
 category:            Network
 build-type:          Simple
-cabal-version:       >=1.8
+cabal-version:       >=1.10
 data-files:          README.md
 
-Flag NoUpperBounds
-  Description: Removes upper bounds from all packages
-  Default: False
+flag network-bsd
+   description: Get Network.BSD from the network-bsd package
+   default: True
 
 source-repository head
   type:     git
@@ -26,24 +26,19 @@
 library
   hs-source-dirs:      src
   ghc-options:         -Wall
+  default-language:    Haskell2010
   exposed-modules:     Network.HaskellNet.IMAP.SSL
                        Network.HaskellNet.POP3.SSL
                        Network.HaskellNet.SMTP.SSL
                        Network.HaskellNet.SSL
   other-modules:       Network.HaskellNet.SSL.Internal
-  if flag(NoUpperBounds)
-    build-depends:     base >= 4,
-                       HaskellNet >= 0.3,
-                       tls >= 1.2,
-                       connection >= 0.2.7,
-                       network >= 2.4,
-                       bytestring,
-                       data-default
+  build-depends:       base >= 4 && < 5,
+                       HaskellNet >= 0.3 && < 0.7,
+                       connection >= 0.2.7 && < 0.4,
+                       bytestring >= 0.9 && < 0.12,
+                       data-default >= 0.2 && < 0.8
+  if flag(network-bsd)
+    build-depends:     network >= 3.0 && < 3.2,
+                       network-bsd >= 2.7 && < 2.9
   else
-    build-depends:     base >= 4 && < 5,
-                       HaskellNet >= 0.3 && < 0.6,
-                       tls >= 1.2 && < 1.5,
-                       connection >= 0.2.7 && < 0.3,
-                       network >= 2.4 && < 2.9,
-                       bytestring,
-                       data-default
+    build-depends:     network >= 2.4 && < 3.0
diff --git a/src/Network/HaskellNet/IMAP/SSL.hs b/src/Network/HaskellNet/IMAP/SSL.hs
--- a/src/Network/HaskellNet/IMAP/SSL.hs
+++ b/src/Network/HaskellNet/IMAP/SSL.hs
@@ -1,3 +1,4 @@
+-- | IMAP SSL Connections
 module Network.HaskellNet.IMAP.SSL
     ( -- * Establishing connection
       connectIMAPSSL
@@ -15,11 +16,14 @@
 
 import Network.HaskellNet.SSL.Internal
 
+-- | Create IMAP connection with default settings
 connectIMAPSSL :: String -> IO IMAPConnection
 connectIMAPSSL hostname = connectIMAPSSLWithSettings hostname defaultSettingsIMAPSSL
 
+-- | Create IMAP connection with given settings
 connectIMAPSSLWithSettings :: String -> Settings -> IO IMAPConnection
 connectIMAPSSLWithSettings hostname cfg = connectSSL hostname cfg >>= connectStream
 
+-- | Default IMAP SSL settings, port 993
 defaultSettingsIMAPSSL :: Settings
 defaultSettingsIMAPSSL = defaultSettingsWithPort 993
diff --git a/src/Network/HaskellNet/SMTP/SSL.hs b/src/Network/HaskellNet/SMTP/SSL.hs
--- a/src/Network/HaskellNet/SMTP/SSL.hs
+++ b/src/Network/HaskellNet/SMTP/SSL.hs
@@ -48,11 +48,13 @@
     (bs, startTLS) <- connectPlain hostname cfg
 
     greeting <- bsGetLine bs
-    failIfNot bs 220 $ parseResponse greeting
+    failIfNot bs 220 $ parse $ B.unpack greeting
 
     hn <- getHostName
     bsPut bs $ B.pack ("HELO " ++ hn ++ "\r\n")
     getResponse bs >>= failIfNot bs 250
+    bsPut bs $ B.pack ("EHLO " ++ hn ++ "\r\n")
+    getResponse bs >>= failIfNot bs 250
     bsPut bs $ B.pack "STARTTLS\r\n"
     getResponse bs >>= failIfNot bs 220
 
@@ -60,10 +62,12 @@
 
     prefixRef <- newIORef [greeting]
     return $ bs {bsGetLine = prefixedGetLine prefixRef (bsGetLine bs)}
-  where parseResponse = parse . B.unpack
-        parse s = (getCode  s, s)
+  where getFinalResponse bs = do
+            line <- fmap B.unpack $ bsGetLine bs
+            if (line !! 3) == '-' then getFinalResponse bs else return line
+        parse s = (getCode s, s)
         getCode = read . head . words
-        getResponse bs = liftM parseResponse $ bsGetLine bs
+        getResponse bs = liftM parse $ getFinalResponse bs
 
 failIfNot :: BSStream -> Integer -> (Integer, String) -> IO ()
 failIfNot bs code (rc, rs) = when (code /= rc) closeAndFail
diff --git a/src/Network/HaskellNet/SSL.hs b/src/Network/HaskellNet/SSL.hs
--- a/src/Network/HaskellNet/SSL.hs
+++ b/src/Network/HaskellNet/SSL.hs
@@ -1,17 +1,24 @@
+{-# LANGUAGE CPP #-}
 module Network.HaskellNet.SSL
   ( Settings (..)
   , defaultSettingsWithPort
   ) where
 
+#if MIN_VERSION_network(3,0,0)
+import Network.Socket (PortNumber)
+#else
 import Network.Socket.Internal (PortNumber)
+#endif
 
+-- | Settings for configuring HaskellNet connections
 data Settings = Settings
-              { sslPort                        :: PortNumber
-              , sslMaxLineLength               :: Int
-              , sslLogToConsole                :: Bool
-              , sslDisableCertificateValidation :: Bool
+              { sslPort                        :: PortNumber -- ^ Port number to connect to
+              , sslMaxLineLength               :: Int -- ^ Max line lengths
+              , sslLogToConsole                :: Bool -- ^ Log info to console
+              , sslDisableCertificateValidation :: Bool -- ^ Disable certificate validation
               } deriving(Eq, Ord, Show)
 
+-- | Construct default settings for a port
 defaultSettingsWithPort :: PortNumber -> Settings
 defaultSettingsWithPort p = Settings
   { sslPort = p
