diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -7,6 +7,7 @@
 # SYNOPSIS
 
 **hpg**
+\[**-N**]
 \[**-lnsu**]
 \[**-x**&nbsp;*length*]
 
@@ -14,29 +15,34 @@
 
 The
 **hpg**
-utility creates passwords of different sizes, between 1 and 2^16 signs. Please note that a
+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 \[a-zA-Z0-9].
+if the command is called without any options. The default entropy contains lower and upper
+case letters and numbers.
 
 **-l**
 
-> Use lower case.
+> Enables lower case letters.
 
+**-N**
+
+> Disables the printing of the trailing newline character.
+
 **-n**
 
-> Use numbers.
+> Enables numbers.
 
 **-s**
 
-> Use symbols.
+> Enables special characters.
 
 **-u**
 
-> Use upper case.
+> Enables upper case letters.
 
-**-x**
+**-x** *length*
 
-> Use another length, as the default one.
+> Selects the length of the password.
 
 # EXIT STATUS
 
@@ -48,10 +54,8 @@
 
 	$ hpg -lnsu -x 32
 
-# COPYRIGHT
+# AUTHORS
 
-Copyright &#169; 2017 Fritjof Bornebusch  
-This is free software; see the file COPYING for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+Fritjof Bornebusch &lt;[fritjof@alokat.org](mailto:fritjof@alokat.org)&gt;
 
 OpenBSD 6.1 - March 21, 2017
diff --git a/hpg.1 b/hpg.1
new file mode 100644
--- /dev/null
+++ b/hpg.1
@@ -0,0 +1,52 @@
+.\"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.
+.Dd $Mdocdate: March 21 2017 $
+.Dt HPG 1
+.Os
+.Sh NAME
+.Nm hpg
+.Nd simple password generator
+.Sh SYNOPSIS
+.Nm hpg
+.Op Fl N
+.Op Fl lnsu
+.Op Fl x Ar length
+.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.
+.Bl -tag -width Dsssigfile
+.It Fl l
+Enables lower case letters.
+.It Fl N
+Disables the printing of the trailing newline character.
+.It Fl n
+Enables numbers.
+.It Fl s
+Enables special characters.
+.It Fl u
+Enables upper case letters.
+.It Fl x Ar length
+Selects the length of the password.
+.Sh EXIT STATUS
+.Ex -std hpg
+.Sh EXAMPLES
+Create a new random password:
+.Dl $ hpg -lnsu -x 32
+.Sh AUTHORS
+.An -nosplit
+.An Fritjof Bornebusch Aq Mt fritjof@alokat.org
diff --git a/hpg.cabal b/hpg.cabal
--- a/hpg.cabal
+++ b/hpg.cabal
@@ -1,22 +1,23 @@
--- Initial hpg.cabal generated by cabal init.  For further documentation, 
--- see http://haskell.org/cabal/users-guide/
-
 name:               hpg
-version:            0.5
-synopsis:           password generator
-description:        the haskell password generator.
+version:            0.6
+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
+                    1 and 2^16 characters.
+
 homepage:           https://darcs.alokat.org/hpg
 license:            ISC
 license-file:       LICENSE
 author:             Fritjof Bornebusch
 maintainer:         fritjof@alokat.org
-category:           System
+category:           Security
 stability:          Experimental
 build-type:         Simple
 cabal-version:      >=1.16
 
 extra-source-files:
   README.md
+  hpg.1
 
 source-repository head
   type:             darcs
diff --git a/hpg.hs b/hpg.hs
--- a/hpg.hs
+++ b/hpg.hs
@@ -16,19 +16,19 @@
 
 {-# LANGUAGE CPP #-}
 
-import System.Console.GetOpt
-import System.Environment      (getArgs)
-import System.Exit             (exitFailure, exitSuccess)
-import System.IO               (stdout, stderr, hFlush, hPutStr)
+module Main ( main ) where
+
+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 )
+
 #ifdef openbsd_HOST_OS
-import System.OpenBSD.Process  (pledge)
+import System.OpenBSD.Process  ( pledge )
 #endif 
-import System.Random           (randomRIO)
 
-exit_with_message :: String -> IO ()
-exit_with_message msg = do
-    hPutStr stderr (msg ++ "\n")
-    exitFailure
+import System.Random           ( randomRIO )
 
 upperCaseLettersList :: [Char]
 upperCaseLettersList = ['A'..'Z']
@@ -42,33 +42,36 @@
 specialCharactersList :: [Char]
 specialCharactersList = ['!'..'/'] ++ [':'..'@'] ++ ['['..'_'] ++ ['{'..'~']
 
-data Options = Options { optUpperCaseFlag         :: Bool
-                        ,optLowerCaseFlag         :: Bool
-                        ,optNumbersFlag           :: Bool
-                        ,optSpecialCharactersFlag :: Bool
-                        ,optLengthValue           :: Int
+data Options = Options { optLowerCaseFlag         :: Bool
+                       , optNoNewLineFlag         :: Bool
+                       , optNumbersFlag           :: Bool
+                       , optSpecialCharactersFlag :: Bool
+                       , optUpperCaseFlag         :: Bool
+                       , optLengthValue           :: Int
                         }
 
 startOptions :: Options
-startOptions = Options  { optUpperCaseFlag         = False
-                        , optLowerCaseFlag         = False 
-                        , optNumbersFlag           = False
+startOptions = Options  { optLowerCaseFlag         = False
+                        , optNoNewLineFlag         = False
+                        , optNumbersFlag           = False 
                         , optSpecialCharactersFlag = False
+                        , optUpperCaseFlag         = False
                         , optLengthValue           = 16
                         }
 
 options :: [ OptDescr (Options -> IO Options) ]
 options =
-    [ Option "u" []
-        (NoArg
-            (\opt -> return opt { optUpperCaseFlag = True }))
-        "upper case letters"
- 
-    , Option "l" []
+    [
+      Option "l" []
         (NoArg
             (\opt -> return opt { optLowerCaseFlag = True }))
         "lower case letters"
- 
+     
+     , Option "N" []
+         (NoArg
+             (\opt -> return opt { optNoNewLineFlag = True}))
+         "no newline"
+      
     , Option "n" []
         (NoArg
             (\opt -> return opt { optNumbersFlag = True }))
@@ -77,7 +80,12 @@
     , Option "s" [] 
         (NoArg
             (\opt -> return opt { optSpecialCharactersFlag = True }))
-        "special signs"
+        "special characters"
+
+    ,  Option "u" [] 
+          (NoArg  
+              (\opt -> return opt { optUpperCaseFlag = True }))
+          "upper case letters"
  
     , Option "x" []
         (ReqArg
@@ -86,12 +94,17 @@
         "password length"
     ]
 
+exitWithMessage :: String -> IO ()
+exitWithMessage msg = do
+    hPutStr stderr (msg ++ "\n")
+    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 [-ulns]\n" ++ 
+    where header = "usage: hpg [-lnsu]\n" ++ 
                    "           [-x number]"
 
 randomList :: Int -> [Char] -> IO([Int])
@@ -102,49 +115,57 @@
     rs <- randomList (n-1) list
     return (r:rs)
 
-create_password :: Int -> [Bool] -> IO [Char]
-create_password lengthValue flags = do
-    let l = create_signs [upperCaseLettersList,
-                          lowerCaseLettersList,
-                          numbersList,
-                          specialCharactersList] flags
+createPassword :: Int -> [Bool] -> IO [Char]
+createPassword lengthValue flags = do
+    let l = createList [lowerCaseLettersList,
+                        numbersList,
+                        specialCharactersList,
+                        upperCaseLettersList] flags
 
     rl <- randomList lengthValue l
     return [l !! i | i <- rl]
 
-add_signs :: [Char] -> ([Char], Bool) -> [Char] 
-add_signs list (l, True) = list ++ l
-add_signs list (_, False) = list
+addToList :: [Char] -> ([Char], Bool) -> [Char] 
+addToList list (l, True) = list ++ l
+addToList list (_, False) = list
 
-create_signs :: [[Char]] -> [Bool] -> [Char]
-create_signs signs [False, False, False, False] = do
-    -- default values are upper case and lower case letters
-    create_signs signs [True, True, True, False]
+createList :: [[Char]] -> [Bool] -> [Char]
+createList characters [False, False, False, False] = do
+    -- default values are lower case, numbers and
+    -- upper case letters
+    createList characters [True, True, False, True]
 
-create_signs signs flags = do
-    let z = zip signs flags
-    foldl (\x y -> add_signs x y) [] z
+createList characters flags = do
+    let z = zip characters flags
+    foldl (\x y -> addToList x y) [] z
 
 main :: IO ()
 main = do
+
 #ifdef openbsd_HOST_OS
     pledge (Just "stdio") Nothing
 #endif
+
     (actions, _nonOptions) <- getArgs >>= parse
     opts <- foldl (>>=) (return startOptions) actions
-    let Options { optUpperCaseFlag          = upperCase
-                , optLowerCaseFlag          = lowerCase
+    let Options { optLowerCaseFlag          = lowerCase
+                , optNoNewLineFlag          = noNewLine
                 , optNumbersFlag            = numbers
                 , optSpecialCharactersFlag  = specialCharacters
+                , optUpperCaseFlag          = upperCase
                 , optLengthValue            = lengthValue } = opts
 
     if lengthValue > 2^(16::Int)
-        then exit_with_message "password too long"
+        then exitWithMessage "password too long"
         else do
-            pwd <- create_password lengthValue [upperCase,
-                                                lowerCase,
+            pwd <- createPassword lengthValue [lowerCase,
                                                 numbers,
-                                                specialCharacters]
-            hPutStr stdout (pwd ++ "\n")
-            hFlush stdout
-            exitSuccess
+                                                specialCharacters,
+                                                upperCase]
+            
+            hPutStr stdout pwd
+            case noNewLine of
+                False -> hPutStr stdout "\n"
+                _     -> return ()
+
+    exitSuccess
