diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -14,6 +14,11 @@
 cabal install elocrypt
 ```
 
+Binaries are also available:
+ * [elocrypt-0.4.0-linux-bin.tar.gz](https://github.com/sgillespie/elocrypt/releases/download/v0.4.0/elocrypt-0.4.0-linux-bin.tar.gz)
+ * [elocrypt-0.4.0-osx-bin.tar.gz](https://github.com/sgillespie/elocrypt/releases/download/v0.4.0/elocrypt-0.4.0-osx-bin.tar.gz)
+ * [elocrypt-0.4.0-windows-bin.exe](https://github.com/sgillespie/elocrypt/releases/download/v0.4.0/elocrypt-0.4.0-windows-bin.exe)
+
 ## Running
 Running elocrypt is as simple as:
 ```
diff --git a/cli-test/Tests.hs b/cli-test/Tests.hs
--- a/cli-test/Tests.hs
+++ b/cli-test/Tests.hs
@@ -36,7 +36,7 @@
 
 instance Arbitrary CliArgs where
   arbitrary = do
-    len  <- arbitrary `suchThat` (>2) `suchThat` (<=40) :: Gen Int
+    len  <- arbitrary `suchThat` (>0) `suchThat` (<=40) :: Gen Int
     num  <- arbitrary `suchThat` (>2) `suchThat` (<=20) :: Gen Int
     args <- sublistOf ["-n %d" `printf` num,
                        show len]
@@ -82,6 +82,24 @@
       (in', out', err', p) <- run' "dist/build/elocrypt/elocrypt" args
       response <- readHandle out'
       return . all (>1) . tail . reverse . map length . map words . lines $ response
+
+prop_shouldNotPrintZeroPasswords :: CliArgs -> Property
+prop_shouldNotPrintZeroPasswords (CliArgs args)
+  = isNothing (getPosParam args) ==>
+    ioProperty $ do
+      let args' = args ++ ["0"]
+      
+      (in', out', err', p) <- run' "dist/build/elocrypt/elocrypt" args'
+      response <- readHandle out'
+      return (response == "")
+
+prop_shouldPrintLongPasswords :: GreaterThan79 Int -> Property
+prop_shouldPrintLongPasswords (GT79 a)
+  = ioProperty $ do
+      (in', out', err', p) <- run' "dist/build/elocrypt/elocrypt" [show a]
+      response <- readHandle out'
+      return . all (==1) . map length . map words . lines $ response
+
 
 -- Utility functions
 run' :: FilePath -> [String] -> IO (Handle, Handle, Handle, ProcessHandle)
diff --git a/elocrypt.cabal b/elocrypt.cabal
--- a/elocrypt.cabal
+++ b/elocrypt.cabal
@@ -1,5 +1,5 @@
 name:                elocrypt
-version:             0.4.0
+version:             0.4.1
 synopsis:            Generate easy-to-remember, hard-to-guess passwords
 homepage:            https://www.github.com/sgillespie/elocrypt
 license:             OtherLicense
@@ -26,7 +26,7 @@
 source-repository this
   type: git
   location: https://github.com/sgillespie/elocrypt.git
-  tag: v0.4.0
+  tag: v0.4.1
                   
 library
   exposed-modules:     Data.Elocrypt,
diff --git a/src/cli/Main.hs b/src/cli/Main.hs
--- a/src/cli/Main.hs
+++ b/src/cli/Main.hs
@@ -11,7 +11,7 @@
 
 import Data.Elocrypt
 
-version = "elocrypt 0.4.0"
+version = "elocrypt 0.4.1"
 termLen = 80
 termHeight = 10
 
@@ -28,14 +28,19 @@
     hPutStrLn stderr version
     exitSuccess
 
-  putStrLn (passwords opts gen)
+  -- TODO[sgillespie]: REFACTOR ME?
+  if (optLength opts == 0)
+    then exitSuccess
+    else putStrLn (passwords opts gen)
 
 passwords :: RandomGen g => Options -> g -> String
 passwords opts gen = format . group' cols $ ps
   where ps = take num . newPasswords (optLength opts) $ gen
         format = concat . intersperse "\n" . map (concat . intersperse "  ")
-        cols = termLen `div` (optLength opts + 2)
-        num = fromMaybe (cols * termHeight) (optNumber opts)
+        cols = if optLength opts <= termLen - 2
+                  then termLen `div` (optLength opts + 2)
+                  else 1
+        num = fromMaybe ((if cols == 0 then 1 else cols) * termHeight) (optNumber opts)
 
 group' :: Int -> [a] -> [[a]]
 group' _ [] = []
diff --git a/src/lib/Data/Elocrypt.hs b/src/lib/Data/Elocrypt.hs
--- a/src/lib/Data/Elocrypt.hs
+++ b/src/lib/Data/Elocrypt.hs
@@ -85,8 +85,11 @@
 mkPassword :: MonadRandom m
               => Int -- ^ password length
               -> m String
-mkPassword len = first2 >>= reverse' >>= lastN (len - 2) >>= reverse'
-  where reverse' = return . reverse
+mkPassword len = do
+  f2 <- reverse `liftM` first2
+  if len > 2
+    then reverse `liftM` lastN (len - 2) f2
+    else return . reverse . take len $ f2
 
 -- |Plural version of mkPassword.  Generate an infinite list of passwords using
 --  the MonadRandom m.  MonadRandom is exposed here for extra control.
diff --git a/test/Test/Elocrypt/Instances.hs b/test/Test/Elocrypt/Instances.hs
--- a/test/Test/Elocrypt/Instances.hs
+++ b/test/Test/Elocrypt/Instances.hs
@@ -18,3 +18,9 @@
 
 instance (Num a, Ord a, Arbitrary a) => Arbitrary (GreaterThan2 a) where
   arbitrary = GT2 `fmap` (arbitrary `suchThat` (>2))
+
+newtype GreaterThan79 a = GT79 { getGT79 :: a }
+                        deriving (Eq, Ord, Show)
+
+instance (Integral a, Random a) => Arbitrary (GreaterThan79 a) where
+  arbitrary = GT79 `fmap` choose (80, 500)
diff --git a/test/Test/ElocryptTest.hs b/test/Test/ElocryptTest.hs
--- a/test/Test/ElocryptTest.hs
+++ b/test/Test/ElocryptTest.hs
@@ -25,17 +25,21 @@
   = p /= ps
   where (p:ps:_) = fst (genPasswords len gen)
 
-prop_newPasswordShouldBeLength :: GreaterThan2 Int -> StdGen -> Bool
-prop_newPasswordShouldBeLength (GT2 len) gen = length (newPassword len gen) == len
+prop_newPasswordShouldBeLength :: Int -> StdGen -> Property
+prop_newPasswordShouldBeLength len gen = len > 0 ==> length (newPassword len gen) == len
 
-prop_newPasswordShouldConsistOfAlphabet :: GreaterThan2 Int -> StdGen -> Bool
-prop_newPasswordShouldConsistOfAlphabet (GT2 len) gen
+prop_newPasswordShouldConsistOfAlphabet :: Int -> StdGen -> Bool
+prop_newPasswordShouldConsistOfAlphabet len gen
   = all ((flip elem) alphabet) (newPassword len gen)
 
 prop_newPasswordsShouldBeUnique :: GreaterThan2 Int -> StdGen -> Bool
 prop_newPasswordsShouldBeUnique (GT2 len) gen
   = p /= ps
   where (p:ps:_) = newPasswords len gen
+
+prop_newPasswordShouldHaveLen :: Int -> StdGen -> Property
+prop_newPasswordShouldHaveLen len gen
+  = len >= 0 ==> length (newPassword len gen) == len
 
 prop_first2ShouldHaveLength2 :: StdGen -> Bool
 prop_first2ShouldHaveLength2 g = length (evalRand first2 g) == 2
