diff --git a/OpenBSD/Compat.hs b/OpenBSD/Compat.hs
new file mode 100644
--- /dev/null
+++ b/OpenBSD/Compat.hs
@@ -0,0 +1,20 @@
+{-|
+  Copyright (c) 2017 Fritjof Bornebusch <fritjof@alokat.org>
+ 
+  Permission to use, copy, modify, and distribute this software for any
+  purpose with or without fee is hereby granted, provided that the above
+  copyright notice and this permission notice appear in all copies.
+ 
+  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+-}
+
+module OpenBSD.Compat ( pledge ) where
+
+pledge :: Maybe String -> Maybe [FilePath] -> IO ()
+pledge _promises _paths = return ()
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -16,9 +16,9 @@
 The
 **hpg**
 utility creates passwords of different sizes, between 1 and 2^16 characters. Please note that a
-lenght of &lt;8 is not very secure and should be avoided. That is why the default value is 16
-if the command is called without any options. The default entropy contains lower and upper
-case letters and numbers.
+length of &lt;8 is not very secure and should be avoided. For this reason the default password length
+is 16 if the command is called without any options. The default entropy contains lower and upper
+case letters as well as numbers.
 
 **-l**
 
diff --git a/hpg.1 b/hpg.1
--- a/hpg.1
+++ b/hpg.1
@@ -25,10 +25,10 @@
 .Sh DESCRIPTION
 The
 .Nm
-utility creates passwords of different sizes, between 1 and 2^16 characters. Please note that a
-lenght of <8 is not very secure and should be avoided. That is why the default value is 16
-if the command is called without any options. The default entropy contains lower and upper
-case letters and numbers.
+utility creates passwords of different sizes, between 1 and 2^16 -1 characters. Please note that a
+length of <8 is not very secure and should be avoided. For this reason the default password length
+is 16 if the command is called without any options. The default entropy contains lower and upper
+case letters as well as numbers.
 .Bl -tag -width Dsssigfile
 .It Fl l
 Enables lower case letters.
diff --git a/hpg.cabal b/hpg.cabal
--- a/hpg.cabal
+++ b/hpg.cabal
@@ -1,5 +1,5 @@
 name:               hpg
-version:            0.6
+version:            0.7
 synopsis:           a simple password generator
 description:        hpg is a free, open source password generator. It's design
                     is pretty simple and it generates random passwords between
@@ -30,6 +30,9 @@
 
 executable          hpg
   main-is:          hpg.hs
+  hs-source-dirs:   .
+  other-modules:
+                    OpenBSD.Compat
 
   -- use OpenBSDs pledge(2) if available
   if os(openbsd)
@@ -38,7 +41,6 @@
   build-depends:    base >= 4.8 && < 4.10,
                     random >= 1.0.1.1 && < 1.2
   
-  hs-source-dirs:   .
   default-language: Haskell2010
 
   if flag(warn-as-error)
diff --git a/hpg.hs b/hpg.hs
--- a/hpg.hs
+++ b/hpg.hs
@@ -18,18 +18,23 @@
 
 module Main ( main ) where
 
+import Data.Word               ( Word16 )
 import System.Console.GetOpt   ( ArgDescr(ReqArg, NoArg), ArgOrder(RequireOrder),
                                  getOpt, OptDescr(Option) )
 import System.Environment      ( getArgs )
 import System.Exit             ( exitFailure, exitSuccess )
-import System.IO               ( hPutStr, stderr, stdout )
+import System.IO               ( hPutStr, hPutStrLn, stderr, stdout )
 
 #ifdef openbsd_HOST_OS
 import System.OpenBSD.Process  ( pledge )
+#else
+import OpenBSD.Compat          ( pledge )
 #endif 
 
 import System.Random           ( randomRIO )
 
+default ( Word16 )
+
 upperCaseLettersList :: [Char]
 upperCaseLettersList = ['A'..'Z']
 
@@ -47,7 +52,7 @@
                        , optNumbersFlag           :: Bool
                        , optSpecialCharactersFlag :: Bool
                        , optUpperCaseFlag         :: Bool
-                       , optLengthValue           :: Int
+                       , optLengthValue           :: Word16
                         }
 
 startOptions :: Options
@@ -89,25 +94,40 @@
  
     , Option "x" []
         (ReqArg
-            (\arg opt -> return opt { optLengthValue = read arg })
-            "number")
+            (\arg opt -> return opt { optLengthValue = do
+                                          let value = read arg :: Integer
+                                          case isWord16 value of
+                                              True -> read arg
+                                              _    -> 0
+                                    })
+            "length")
         "password length"
     ]
 
+isWord16 :: Integer -> Bool
+isWord16 n
+    | n < toInteger(minBound::Word16) = False
+    | n > toInteger(maxBound::Word16) = False
+    | otherwise = True
+
 exitWithMessage :: String -> IO ()
 exitWithMessage msg = do
-    hPutStr stderr (msg ++ "\n")
+    hPutStrLn stderr msg
     exitFailure
 
 parse :: [String] -> IO ([Options -> IO Options], [String])
 parse args =
     case getOpt RequireOrder options args of
         (actions, nonOptions,[]) -> return (actions, nonOptions)
-        (_,_,errors) -> ioError (userError (concat errors ++ header)) 
-    where header = "usage: hpg [-lnsu]\n" ++ 
-                   "           [-x number]"
+        (_,_,errors)              -> do
+            hPutStrLn stderr (concat errors ++ header)
+            exitFailure
 
-randomList :: Int -> [Char] -> IO([Int])
+    where header = "usage: hpg [-N]\n" ++
+                   "           [-lnsu]\n" ++ 
+                   "           [-x length]"
+
+randomList :: Word16 -> [Char] -> IO([Int])
 randomList 0 _ = return []
 randomList n list = do
     let l = length list
@@ -115,7 +135,7 @@
     rs <- randomList (n-1) list
     return (r:rs)
 
-createPassword :: Int -> [Bool] -> IO [Char]
+createPassword :: Word16 -> [Bool] -> IO [Char]
 createPassword lengthValue flags = do
     let l = createList [lowerCaseLettersList,
                         numbersList,
@@ -141,10 +161,7 @@
 
 main :: IO ()
 main = do
-
-#ifdef openbsd_HOST_OS
     pledge (Just "stdio") Nothing
-#endif
 
     (actions, _nonOptions) <- getArgs >>= parse
     opts <- foldl (>>=) (return startOptions) actions
@@ -155,13 +172,13 @@
                 , optUpperCaseFlag          = upperCase
                 , optLengthValue            = lengthValue } = opts
 
-    if lengthValue > 2^(16::Int)
-        then exitWithMessage "password too long"
+    if lengthValue == 0
+        then exitWithMessage "invalid password length"
         else do
             pwd <- createPassword lengthValue [lowerCase,
-                                                numbers,
-                                                specialCharacters,
-                                                upperCase]
+                                               numbers,
+                                               specialCharacters,
+                                               upperCase]
             
             hPutStr stdout pwd
             case noNewLine of
