diff --git a/System/Process.hsc b/System/Process.hsc
--- a/System/Process.hsc
+++ b/System/Process.hsc
@@ -126,7 +126,9 @@
                                 delegate_ctlc = False,
                                 detach_console = False,
                                 create_new_console = False,
-                                new_session = False }
+                                new_session = False,
+                                child_group = Nothing,
+                                child_user = Nothing }
 
 -- | Construct a 'CreateProcess' record for passing to 'createProcess',
 -- representing a command to be passed to the shell.
@@ -142,7 +144,9 @@
                             delegate_ctlc = False,
                             detach_console = False,
                             create_new_console = False,
-                            new_session = False }
+                            new_session = False,
+                            child_group = Nothing,
+                            child_user = Nothing }
 
 {- |
 This is the most general way to spawn an external process.  The
@@ -298,7 +302,7 @@
 -- exit code, an exception is raised.
 --
 -- If an asynchronous exception is thrown to the thread executing
--- @callProcess@. The forked process will be terminated and
+-- @callProcess@, the forked process will be terminated and
 -- @callProcess@ will wait (block) until the process has been
 -- terminated.
 --
@@ -316,7 +320,7 @@
 -- command returns a non-zero exit code, an exception is raised.
 --
 -- If an asynchronous exception is thrown to the thread executing
--- @callCommand@. The forked process will be terminated and
+-- @callCommand@, the forked process will be terminated and
 -- @callCommand@ will wait (block) until the process has been
 -- terminated.
 --
@@ -430,6 +434,7 @@
 --
 -- Note that @Handle@s provided for @std_in@ or @std_out@ via the CreateProcess
 -- record will be ignored.
+--
 -- @since 1.2.3.0
 
 readCreateProcess
diff --git a/System/Process/Internals.hs b/System/Process/Internals.hs
--- a/System/Process/Internals.hs
+++ b/System/Process/Internals.hs
@@ -59,6 +59,8 @@
 import System.IO
 import System.Posix.Process.Internals ( pPrPr_disableITimers, c_execvpe )
 import System.Posix.Types
+#else
+import Data.Word (Word32)
 #endif
 
 #ifdef __GLASGOW_HASKELL__
@@ -99,6 +101,13 @@
 # endif
 #endif
 
+#if defined(mingw32_HOST_OS) || defined(__MINGW32__)
+-- Define some missing types for Windows compatibility
+newtype CGid = CGid Word32
+type GroupID = CGid
+type UserID = CGid
+#endif
+
 -- ----------------------------------------------------------------------------
 -- ProcessHandle type
 
@@ -190,9 +199,19 @@
                                            --   Default: @False@
                                            --
                                            --   @since 1.3.0.0
-  new_session :: Bool                      -- ^ Use posix setsid to start the new process in a new session; does nothing on other platforms.
+  new_session :: Bool,                     -- ^ Use posix setsid to start the new process in a new session; does nothing on other platforms.
                                            --
                                            --   @since 1.3.0.0
+  child_group :: Maybe GroupID,            -- ^ Use posix setgid to set child process's group id; does nothing on other platforms.
+                                           --
+                                           --   Default: @Nothing@
+                                           --
+                                           --   @since 1.4.0.0
+  child_user :: Maybe UserID               -- ^ Use posix setuid to set child process's user id; does nothing on other platforms.
+                                           --
+                                           --   Default: @Nothing@
+                                           --
+                                           --   @since 1.4.0.0
  }
 
 data CmdSpec
@@ -273,7 +292,9 @@
                                   delegate_ctlc = mb_delegate_ctlc,
                                   detach_console = mb_detach_console,
                                   create_new_console = mb_create_new_console,
-                                  new_session = mb_new_session }
+                                  new_session = mb_new_session,
+                                  child_group = mb_child_group,
+                                  child_user = mb_child_user }
  = do
   let (cmd,args) = commandToProcess cmdsp
   withFilePathException cmd $
@@ -283,6 +304,8 @@
    alloca $ \ pFailedDoing ->
    maybeWith withCEnvironment mb_env $ \pEnv ->
    maybeWith withFilePath mb_cwd $ \pWorkDir ->
+   maybeWith with mb_child_group $ \pChildGroup ->
+   maybeWith with mb_child_user $ \pChildUser ->
    withMany withFilePath (cmd:args) $ \cstrs ->
    withArray0 nullPtr cstrs $ \pargs -> do
 
@@ -301,6 +324,7 @@
                          c_runInteractiveProcess pargs pWorkDir pEnv
                                 fdin fdout fderr
                                 pfdStdInput pfdStdOutput pfdStdError
+                                pChildGroup pChildUser
                                 (if mb_delegate_ctlc then 1 else 0)
                                 ((if mb_close_fds then RUN_PROCESS_IN_CLOSE_FDS else 0)
                                 .|.(if mb_create_group then RUN_PROCESS_IN_NEW_GROUP else 0)
@@ -414,6 +438,8 @@
         -> Ptr FD
         -> Ptr FD
         -> Ptr FD
+        -> Ptr CGid
+        -> Ptr CUid
         -> CInt                         -- reset child's SIGINT & SIGQUIT handlers
         -> CInt                         -- flags
         -> Ptr CString
diff --git a/cbits/runProcess.c b/cbits/runProcess.c
--- a/cbits/runProcess.c
+++ b/cbits/runProcess.c
@@ -40,6 +40,10 @@
 #define forkChdirFailed 126
 #define forkExecFailed  127
 
+// These are arbitrarily chosen -- JP
+#define forkSetgidFailed 124
+#define forkSetuidFailed 125
+
 __attribute__((__noreturn__))
 static void childFailed(int pipe, int failCode) {
     int err;
@@ -57,6 +61,7 @@
                        char *workingDirectory, char **environment,
                        int fdStdIn, int fdStdOut, int fdStdErr,
                        int *pfdStdInput, int *pfdStdOutput, int *pfdStdError,
+                       gid_t *childGroup, uid_t *childUser,
                        int reset_int_quit_handlers,
                        int flags,
                        char **failed_doing)
@@ -144,7 +149,21 @@
         if ((flags & RUN_PROCESS_IN_NEW_GROUP) != 0) {
             setpgid(0, 0);
         }
+        
+        if ( childGroup) {
+            if ( setgid( *childGroup) != 0) {
+                // ERROR
+                childFailed(forkCommunicationFds[1], forkSetgidFailed);
+            }
+        }
 
+        if ( childUser) {
+            if ( setuid( *childUser) != 0) {
+                // ERROR
+                childFailed(forkCommunicationFds[1], forkSetuidFailed);
+            }
+        }
+
         unblockUserSignals();
 
         if (workingDirectory) {
@@ -281,6 +300,11 @@
         case forkExecFailed:
             *failed_doing = "runInteractiveProcess: exec";
             break;
+        case forkSetgidFailed:
+            *failed_doing = "runInteractiveProcess: setgid";
+            break;
+        case forkSetuidFailed:
+            *failed_doing = "runInteractiveProcess: setuid";
         default:
             *failed_doing = "runInteractiveProcess: unknown";
             break;
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,6 +1,10 @@
 # Changelog for [`process` package](http://hackage.haskell.org/package/process)
 
-## 1.3.0.0 (unreleased)
+## 1.4.0.0 *November 2015*
+
+* Added `child_user` and `child_group` to `CreateProcess` for unix. [#45](https://github.com/haskell/process/pull/45)
+
+## 1.3.0.0 *August 2015*
 
 * Add `StdStream(NoStream)` to have standard handles closed. [#13](https://github.com/haskell/process/pull/13)
 * Support for Windows `DETACHED_PROCESS` and `setsid` [#32](https://github.com/haskell/process/issues/32)
diff --git a/include/runProcess.h b/include/runProcess.h
--- a/include/runProcess.h
+++ b/include/runProcess.h
@@ -62,6 +62,8 @@
                                          int *pfdStdInput, 
                                          int *pfdStdOutput, 
                                          int *pfdStdError,
+                                         gid_t *childGroup,
+                                         uid_t *childUser,
                                          int reset_int_quit_handlers,
                                          int flags,
                                          char **failed_doing);
diff --git a/process.cabal b/process.cabal
--- a/process.cabal
+++ b/process.cabal
@@ -1,5 +1,5 @@
 name:          process
-version:       1.3.0.0
+version:       1.4.0.0
 -- NOTE: Don't forget to update ./changelog.md
 license:       BSD3
 license-file:  LICENSE
@@ -59,7 +59,7 @@
 
     ghc-options: -Wall
 
-    build-depends: base      >= 4.4 && < 4.9,
+    build-depends: base      >= 4.4 && < 4.10,
                    directory >= 1.1 && < 1.3,
                    filepath  >= 1.2 && < 1.5,
                    deepseq   >= 1.1 && < 1.5
