diff --git a/HsOpenSSL.cabal b/HsOpenSSL.cabal
--- a/HsOpenSSL.cabal
+++ b/HsOpenSSL.cabal
@@ -5,7 +5,7 @@
         can generate RSA and DSA keys, read and write PEM files,
         generate message digests, sign and verify messages, encrypt
         and decrypt messages.
-Version: 0.9.0.1
+Version: 0.10
 License: PublicDomain
 License-File: COPYING
 Author: Adam Langley <agl at imperialviolet dot org>,
@@ -15,7 +15,7 @@
 Stability: stable
 Homepage: http://cielonegro.org/HsOpenSSL.html
 Category: Cryptography
-Tested-With: GHC == 6.12.3
+Tested-With: GHC == 7.0.3
 Cabal-Version: >= 1.6
 Build-Type: Simple
 Extra-Source-Files:
diff --git a/NEWS b/NEWS
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,20 @@
 -*- coding: utf-8 -*-
 
+Changes from 0.9.0.1 to 0.10
+----------------------------
+
+* Applied a patch by Mikhail Vorozhtsov to support wrapping plain file
+  descriptors in SSL connections.
+
+  - New function:
+      fdConnection :: SSLContext -> Socket -> IO SSL
+      sslFd :: SSL -> Fd
+
+  - Function signature change:
+      sslSocket :: SSL -> Maybe Socket
+      (It was "SSL -> Socket" before.)
+
+
 Changes from 0.9 to 0.9.0.1
 ---------------------------
 * Applied a patch by Mikhail Vorozhtsov
diff --git a/OpenSSL/Session.hsc b/OpenSSL/Session.hsc
--- a/OpenSSL/Session.hsc
+++ b/OpenSSL/Session.hsc
@@ -22,6 +22,7 @@
     -- * SSL connections
   , SSL
   , connection
+  , fdConnection
   , accept
   , connect
   , read
@@ -33,6 +34,7 @@
   , getPeerCertificate
   , getVerifyResult
   , sslSocket
+  , sslFd
 
     -- * SSL Exceptions
   , SomeSSLException
@@ -251,26 +253,34 @@
 --   times. Thus multiple OS threads can be 'blocked' inside IO in the same SSL
 --   object at a time, because they aren't really in the SSL object, they are
 --   waiting for the RTS to wake the Haskell thread.
-newtype SSL = SSL (QSem, ForeignPtr SSL_, Fd, Socket)
+newtype SSL = SSL (QSem, ForeignPtr SSL_, Fd, Maybe Socket)
 
 foreign import ccall unsafe "SSL_new" _ssl_new :: Ptr SSLContext_ -> IO (Ptr SSL_)
 foreign import ccall unsafe "&SSL_free" _ssl_free :: FunPtr (Ptr SSL_ -> IO ())
 foreign import ccall unsafe "SSL_set_fd" _ssl_set_fd :: Ptr SSL_ -> CInt -> IO ()
 
+connection' :: SSLContext -> Fd -> Maybe Socket -> IO SSL
+connection' context fd@(Fd fdInt) sock = do
+  sem <- newQSem 1
+  ssl <- withContext context $ \ctx -> do
+    ssl <- _ssl_new ctx >>= failIfNull
+    _ssl_set_fd ssl fdInt
+    return ssl
+  fpssl <- newForeignPtr _ssl_free ssl
+  return $ SSL (sem, fpssl, fd, sock)
+
 -- | Wrap a Socket in an SSL connection. Reading and writing to the Socket
 --   after this will cause weird errors in the SSL code. The SSL object
 --   carries a handle to the Socket so you need not worry about the garbage
 --   collector closing the file descriptor out from under you.
 connection :: SSLContext -> Socket -> IO SSL
-connection context sock@(MkSocket fd _ _ _ _) = do
-  sem <- newQSem 1
-  ssl <- withContext context (\ctx -> do
-    ssl <- _ssl_new ctx >>= failIfNull
-    _ssl_set_fd ssl fd
-    return ssl)
-  fpssl <- newForeignPtr _ssl_free ssl
-  return $ SSL (sem, fpssl, Fd fd, sock)
+connection context sock@(MkSocket fd _ _ _ _) =
+  connection' context (Fd fd) (Just sock)
 
+-- | Wrap a socket Fd in an SSL connection.
+fdConnection :: SSLContext -> Fd -> IO SSL
+fdConnection context fd = connection' context fd Nothing
+
 withSSL :: SSL -> (Ptr SSL_ -> IO a) -> IO a
 withSSL (SSL (sem, ssl, _, _)) action = do
   waitQSem sem
@@ -466,9 +476,12 @@
     return $ r == (#const X509_V_OK)
 
 -- | Get the socket underlying an SSL connection
-sslSocket :: SSL -> Socket
+sslSocket :: SSL -> Maybe Socket
 sslSocket (SSL (_, _, _, socket)) = socket
 
+-- | Get the underlying socket Fd
+sslFd :: SSL -> Fd
+sslFd (SSL (_, _, fd, _)) = fd
 
 -- | The root exception type for all SSL exceptions.
 data SomeSSLException
