diff --git a/examples/Relay.lhs b/examples/Relay.lhs
--- a/examples/Relay.lhs
+++ b/examples/Relay.lhs
@@ -60,7 +60,7 @@
 connections to the 'newConnection' function.
 
 >     withinSession (publicPort, privatePort) controlSock = do
->       onion <- Tor.accept controlSock publicPort (newConnection privatePort)
+>       onion <- Tor.accept controlSock publicPort Nothing (newConnection privatePort)
 >       putStrLn ("hidden service descriptor: " ++ show onion)
 
 If we would leave this function at this point, our connection with the Tor
diff --git a/network-anonymous-tor.cabal b/network-anonymous-tor.cabal
--- a/network-anonymous-tor.cabal
+++ b/network-anonymous-tor.cabal
@@ -1,6 +1,6 @@
 name: network-anonymous-tor
 category: Network
-version: 0.10.0
+version: 0.11.0
 license: MIT
 license-file: LICENSE
 copyright: (c) 2014 Leon Mergen
diff --git a/src/Network/Anonymous/Tor.hs b/src/Network/Anonymous/Tor.hs
--- a/src/Network/Anonymous/Tor.hs
+++ b/src/Network/Anonymous/Tor.hs
@@ -34,6 +34,7 @@
 import           Control.Monad.IO.Class
 
 import qualified Data.Base32String.Default                 as B32
+import qualified Data.ByteString                           as BS
 
 import qualified Network.Simple.TCP                        as NST
 import qualified Network.Socket                          as Network
@@ -162,12 +163,13 @@
 --   connections for it. Note that this creates a new local server at the same
 --   port as the public port, so ensure that the port is not yet in use.
 accept :: MonadIO m
-       => Network.Socket            -- ^ Connection with Tor control server
-       -> Integer                   -- ^ Port to listen at
-       -> (Network.Socket -> IO ()) -- ^ Callback function called for each incoming connection
-       -> m B32.Base32String        -- ^ Returns the hidden service descriptor created
-                                    --   without the '.onion' part.
-accept sock port callback = do
+       => Network.Socket                      -- ^ Connection with Tor control server
+       -> Integer                             -- ^ Port to listen at
+       -> Maybe BS.ByteString                 -- ^ Optional private key to use to set up the hidden service
+       -> (Network.Socket -> IO ())           -- ^ Callback function called for each incoming connection
+       -> m B32.Base32String -- ^ Returns the hidden service descriptor created without
+                                              --   the '.onion' part
+accept sock port pkey callback = do
   -- First create local service
   _ <- liftIO $ forkIO $
        NST.listen "*" (show port) (\(lsock, _) ->
@@ -176,4 +178,5 @@
                                                                threadDelay 1000000
                                                                return ()))
 
-  P.mapOnion sock port port
+  -- Do the onion mapping after that
+  P.mapOnion sock port port False pkey
diff --git a/src/Network/Anonymous/Tor/Protocol.hs b/src/Network/Anonymous/Tor/Protocol.hs
--- a/src/Network/Anonymous/Tor/Protocol.hs
+++ b/src/Network/Anonymous/Tor/Protocol.hs
@@ -20,7 +20,7 @@
 
 import           Control.Concurrent.MVar
 
-import           Control.Monad                             (unless, void, when)
+import           Control.Monad                             (unless, void)
 import           Control.Monad.Catch                       ( handle
                                                            , handleIOError )
 import           Control.Monad.IO.Class
@@ -235,13 +235,24 @@
 
 -- | Creates a new hidden service and maps a public port to a local port. Useful
 --   for bridging a local service (e.g. a webserver or irc daemon) as a Tor
---   hidden service.
+--   hidden service. If a private key is supplied, it is used to instantiate the
+--   service.
 mapOnion :: MonadIO m
-         => Network.Socket     -- ^ Connection with tor Control port
-         -> Integer            -- ^ Remote point of hidden service to listen at
-         -> Integer            -- ^ Local port to map onion service to
-         -> m B32.Base32String -- ^ The address/service id of the Onion without the .onion aprt
-mapOnion s rport lport = do
-  reply <- sendCommand s (BS8.concat ["ADD_ONION NEW:BEST Port=", BS8.pack (show rport), ",127.0.0.1:", BS8.pack(show lport), "\n"])
+         => Network.Socket      -- ^ Connection with tor Control port
+         -> Integer             -- ^ Remote point of hidden service to listen at
+         -> Integer             -- ^ Local port to map onion service to
+         -> Bool                -- ^ Wether to detach the hidden service from the current session
+         -> Maybe BS.ByteString -- ^ Optional private key to use to set up the hidden service
+         -> m B32.Base32String  -- ^ The address/service id of the Onion without the .onion part
+mapOnion s rport lport detach pkey = do
+  reply <- sendCommand s $ BS8.concat
+                            [ "ADD_ONION "
+                            , maybe "NEW:BEST" (\pk -> "RSA1024:" `BS.append` pk) pkey
+                            , if detach then " Flags=Detach " else " "
+                            , "Port="
+                            , BS8.pack (show rport)
+                            , ",127.0.0.1:"
+                            , BS8.pack(show lport)
+                            , "\n"]
 
   return . B32.b32String' . fromJust . Ast.tokenValue . head . Ast.lineMessage . fromJust $ Ast.line (BS8.pack "ServiceID") reply
