diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2009 Dan Knapp
+Copyright (c) 2012 Irene Knapp
 
 Permission is hereby granted, free of charge, to any person
 obtaining a copy of this software and associated documentation
diff --git a/System/Daemonize.hs b/System/Daemonize.hs
--- a/System/Daemonize.hs
+++ b/System/Daemonize.hs
@@ -9,15 +9,17 @@
 import qualified Control.Exception as Exception
 import Foreign
 import Foreign.C
+import System.Exit
 import System.IO
 import qualified System.Posix as POSIX
 
+import Control.Concurrent
 
+
 data DaemonOptions = DaemonOptions {
     daemonShouldChangeDirectory :: Bool,
     daemonShouldRedirectStandardStreams :: Bool,
-    daemonShouldCloseAllStreams :: Bool,
-    daemonFileDescriptorsToLeaveOpen :: [POSIX.Fd],
+    daemonShouldCloseStandardStreams :: Bool,
     daemonShouldIgnoreSignals :: Bool,
     daemonUserToChangeTo :: Maybe String,
     daemonGroupToChangeTo :: Maybe String
@@ -28,8 +30,7 @@
 defaultDaemonOptions = DaemonOptions {
                          daemonShouldChangeDirectory = True,
                          daemonShouldRedirectStandardStreams = False,
-                         daemonShouldCloseAllStreams = True,
-                         daemonFileDescriptorsToLeaveOpen = [],
+                         daemonShouldCloseStandardStreams = True,
                          daemonShouldIgnoreSignals = True,
                          daemonUserToChangeTo = Nothing,
                          daemonGroupToChangeTo = Nothing
@@ -39,8 +40,8 @@
 foreign import ccall "daemon" c_daemon :: CInt -> CInt -> IO CInt
 
 
-daemonize :: DaemonOptions -> IO ()
-daemonize options = do
+daemonize :: DaemonOptions -> IO () -> IO ()
+daemonize options action = do
   case daemonGroupToChangeTo options of
     Nothing -> return ()
     Just groupName -> do
@@ -51,6 +52,12 @@
     Just userName -> do
       userEntry <- POSIX.getUserEntryForName userName
       POSIX.setUserID $ POSIX.userID userEntry
+  _ <- POSIX.forkProcess $ daemonize' options action
+  POSIX.exitImmediately ExitSuccess
+
+
+daemonize' :: DaemonOptions -> IO () -> IO ()
+daemonize' options action = do
   let c_shouldChangeDirectory
         = if daemonShouldChangeDirectory options
             then 0
@@ -69,18 +76,7 @@
       POSIX.installHandler POSIX.sigTSTP POSIX.Ignore Nothing
       return ()
     else return ()
-  if daemonShouldCloseAllStreams options
-    then do
-      mapM hClose [stdin, stdout, stderr]
-      let closeLoop i | i == 65536 = return ()
-                      | otherwise = do
-                          if not $ elem (POSIX.Fd i)
-                                        $ daemonFileDescriptorsToLeaveOpen options
-                            then Exception.catch (POSIX.closeFd $ POSIX.Fd i)
-                                   (\e -> do
-                                      return (e :: Exception.SomeException)
-                                      return ())
-                            else return ()
-                          closeLoop $ i + 1
-      closeLoop 0
+  if daemonShouldCloseStandardStreams options
+    then mapM_ hClose [stdin, stdout, stderr]
     else return ()
+  action
diff --git a/direct-daemonize.cabal b/direct-daemonize.cabal
--- a/direct-daemonize.cabal
+++ b/direct-daemonize.cabal
@@ -1,22 +1,32 @@
 name: direct-daemonize
-version: 1.0
-cabal-version: >= 1.2
+version: 3.0
+cabal-version: >= 1.12
 build-type: Simple
 license: BSD3
 license-file: LICENSE
-copyright: Copyright (c) 2009 Dan Knapp
-author: Dan Knapp
-maintainer: dankna@gmail.com
-homepage: http://dankna.com/software/
-bug-reports: http://dankna.com/issues/create/
+copyright: Copyright (c) 2012 Irene Knapp
+author: Irene Knapp <ireney.knapp@gmail.com>
+maintainer: ireney.knapp@gmail.com
+homepage: http://ireneknapp.com/software/
+bug-reports: http://ireneknapp.com/issues/create/
 category: System
 synopsis: Library to switch to daemon mode using built-in OS facilities.
 description:
   This package is a wrapper around the daemon() function on BSD-like Unices,
-  including Mac OS X and glibc-based Linux distributions.  It does not function on
-  other systems.
+  including Mac OS X and glibc-based Linux distributions.  It does not function
+  on other systems.
+  
+  Version 3.0 cleans up the parameters structure.
+  
+  Version 2.0 fixes compatibility problems with the threaded GHC runtime.
+  Doing this required two non-backwards-compatible API changes.  First, the daemonize function now takes an action to perform as a daemon, and never
+  returns.  Second, the functionality of closing all open files has been
+  removed, as it caused crashes.  As a substitute, the option of closing only
+  the three standard streams has been added and made the default.
 
 Library
   exposed-modules: System.Daemonize
   build-depends: base >= 4.1 && < 5,
                  unix >= 2.4.0.1
+  default-language: Haskell2010
+
