diff --git a/HSH/Helpers/UnixUsers.hs b/HSH/Helpers/UnixUsers.hs
--- a/HSH/Helpers/UnixUsers.hs
+++ b/HSH/Helpers/UnixUsers.hs
@@ -3,6 +3,10 @@
 
 -- I don't know how portable this is.
 -- It works for me, on ubuntu Hardy Heron
+{-
+Recommend against using this module.
+Instead use System.Posix.Users, which I overlooked when writing.
+-}
 import HSH
 
 import System.Directory (doesDirectoryExist)
@@ -84,7 +88,15 @@
 addUserToGroup (SysUser u) (SysGroup g) 
   | null . SU.strip $ u = fail "addUserToGroup: blank user"
   | null . SU.strip $ g = fail "addUserToGroup: blank group" 
-  | otherwise = tryS $ runIO $ render1 [("u",u),("g",g)] "usermod -G $g$ -a $u$"
+  | otherwise = tryS $ do 
+      isU <- isSystemUser . SysUser $ u
+      when (not isU) $ fail $ "chown, not a system user: " ++ u
+      isG <- isSystemGroup . SysGroup $ g
+      when (not isG) $ fail $ "chown, not a system group: " ++ g
+      let cmd = render1 [("u",u),("g",g)] "usermod -G $g$ -a $u$"
+      putStrLn $ "addUserToGroup, running: " ++ cmd
+      runIO $ cmd
+      
 
 -- need to test this more thoroughly. What happens if we attempt to remove user from primary group?
 rmUserFromGroup :: SysUser -> SysGroup -> IO ( Either String () )
@@ -95,13 +107,19 @@
   runIO $ render1 [("u",unsysuser u),("sdMod",sdMod)] "usermod -G $sdMod$ $u$"
 
 
-chown :: (Maybe SysUser) -> (Maybe SysGroup) -> Recurse -> FilePath -> IO ( Either String () )
+chown :: (Maybe SysUser) -> (Maybe SysGroup) -> Recurse -> FilePath -> IO (Either String ())
 chown _ _ _ [] = fail "chown, empty path"
 chown mbUser mbGroup (Recurse recurse) path = tryS $ do
   let uname = maybe "" unsysuser mbUser
       grp = maybe "" unsysgroup mbGroup
       eOwner = getOwner uname grp
       rFlag = if recurse then "-R" else ""
+  when (not . null $ uname) $ do
+    isU <- isSystemUser . SysUser $ uname
+    when (not isU) $ fail $ "chown, not a system user: " ++ uname
+  when (not . null $ grp) $ do
+    isG <- isSystemGroup . SysGroup $ grp
+    when (not isG) $ fail $ "chown, not a system group: " ++ grp
   case eOwner of
     Left msg -> fail msg
     Right owner -> runIO $ render1 [("owner",owner) 
diff --git a/HSHHelpers.cabal b/HSHHelpers.cabal
--- a/HSHHelpers.cabal
+++ b/HSHHelpers.cabal
@@ -1,5 +1,5 @@
 Name: HSHHelpers
-Version: 0.21
+Version: 0.23
 License: GPL
 License-file: gpl.txt
 Description: 
@@ -8,6 +8,9 @@
 
   Rather than duplicate code, released on hackage.
 
+  A lot of this is cruft. For instance, you are probably better off having a look at System.Posix.Files and
+  System.Posix.Users, which I overlooked when writing, before making too much use of hsh helpers. 
+
 Synopsis: Convenience functions that use HSH, instances for HSH. 
 Maintainer: Thomas Hartman <thomashartman1 at gmail>
 Author: Thomas Hartman
@@ -15,7 +18,7 @@
 Copyright: Copyright (c) 2008 Thomas Hartman
 Exposed-Modules: HSH.Helpers, HSH.Helpers.Instances, HSH.Helpers.UnixUsers, HSH.Helpers.FileManip, 
                  HSH.Helpers.Utils, HSH.Helpers.Email
-Build-Depends: base >= 0.4 && <5, HSH >= 1 && <1.27, unix, HStringTemplateHelpers, MissingH >= 1.0, regex-pcre, directory, bytestring, filepath, mtl,
+Build-Depends: base >= 0.4 && <5, HSH >= 1 && <1.27, unix, HStringTemplateHelpers, MissingH <= 1.0.3, regex-pcre, directory, bytestring, filepath, mtl,
                DebugTraceHelpers
 Category: System
 Build-type: Simple
