diff --git a/keyword-args.cabal b/keyword-args.cabal
--- a/keyword-args.cabal
+++ b/keyword-args.cabal
@@ -1,5 +1,5 @@
 name:                keyword-args
-version:             0.1.0.4
+version:             0.1.0.5
 synopsis:            Extract data from a keyword-args config file format
 
 description: Extracts data from a configuration file with keywords
@@ -28,7 +28,7 @@
 
   hs-source-dirs:      src
   default-language:    Haskell2010
-
+  ghc-options:         -Wall
 
 library
   exposed-modules:    Data.KeywordArgs.Parse
@@ -38,7 +38,7 @@
 
   hs-source-dirs:      src
   default-language:    Haskell2010
-
+  ghc-options:         -Wall
 
 test-suite keyword-args-test
   type: exitcode-stdio-1.0
@@ -51,6 +51,7 @@
                        , hspec
 
   default-language:    Haskell2010
+  ghc-options:         -Wall
 
 source-repository head
   type:     git
diff --git a/src/Data/KeywordArgs/Parse.hs b/src/Data/KeywordArgs/Parse.hs
--- a/src/Data/KeywordArgs/Parse.hs
+++ b/src/Data/KeywordArgs/Parse.hs
@@ -1,14 +1,12 @@
 module Data.KeywordArgs.Parse (configParser) where
 
 import Data.Maybe (catMaybes)
-import Data.Char (isSpace)
 
-import Text.Parsec ((<|>), many, try, manyTill, char, anyChar, many1, satisfy)
+import Text.Parsec ((<|>), many, try, manyTill, char, anyChar, many1)
 import Text.Parsec.String (Parser)
 
-import Text.ParserCombinators.Parsec.Prim hiding (try)
-import Text.ParserCombinators.Parsec.Char (string, space, tab, newline,
-                                           alphaNum)
+import Text.ParserCombinators.Parsec.Prim (GenParser)
+import Text.ParserCombinators.Parsec.Char (space, newline, oneOf, noneOf)
 
 import Control.Monad (liftM2)
 
@@ -22,36 +20,30 @@
 configParser :: Parser [(String, String)]
 configParser = catMaybes <$> many line
 
-
-manyTill1 :: GenParser tok st a -> GenParser tok st end -> GenParser tok st [a]
-manyTill1 p end = liftM2 (:) p (manyTill p end)
-
-isValidKeyChar :: Char -> Bool
-isValidKeyChar c =  c /= '#' && (not . isSpace) c
-
-
-isValidValueChar :: Char -> Bool
-isValidValueChar c =  c /= '#'
-
+line :: Parser (Maybe (String, String))
+line = comment *> return Nothing <|> Just <$> configurationOption
 
 configurationOption :: Parser (String, String)
 configurationOption = do
-  many space
+  _ <- many space
 
-  keyword <- manyTill1 (satisfy isValidKeyChar) (many1 (char ' '))
+  keyword <- manyTill1 anyChar keywordArgSeparator
+  val     <- value
 
-  let
-    endOfOption   = endOfLineOrInput <|> comment
+  return (keyword, val)
 
-    quotedValue   = char '"' *>
-                    manyTill1 (satisfy isValidValueChar) (try (char '"')) <*
-                    endOfOption
+value :: Parser String
+value =
+  unquotedValue <|> quotedValue
 
-    unquotedValue = manyTill1 (satisfy isValidValueChar) endOfOption
+  where
+    endOfOption   = endOfLineOrInput <|> comment
 
-  value <- quotedValue <|> unquotedValue
+    quotedValue   = quote
+                    *> manyTill1 argumentChar quote
+                    <* endOfOption
 
-  return (keyword, value)
+    unquotedValue = manyTill1 argumentChar endOfOption
 
 comment :: Parser ()
 comment =
@@ -62,5 +54,14 @@
 endOfLineOrInput :: Parser ()
 endOfLineOrInput = newline *> return () <|> eof
 
-line :: Parser (Maybe (String, String))
-line = comment *> return Nothing <|> Just <$> configurationOption
+manyTill1 :: GenParser tok st a -> GenParser tok st end -> GenParser tok st [a]
+manyTill1 p end = liftM2 (:) p (manyTill p end)
+
+argumentChar :: Parser Char
+argumentChar =  noneOf "#\""
+
+keywordArgSeparator :: Parser ()
+keywordArgSeparator = many1 (oneOf "\t ") *> return ()
+
+quote :: Parser Char
+quote = char '"'
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -5,11 +5,9 @@
 import System.Console.GetOpt
 
 import System.Environment (getArgs, getProgName)
-import System.Exit (ExitCode(..), exitWith, exitSuccess)
-import System.IO.Error (ioError)
+import System.Exit (exitSuccess)
 
 import Paths_keyword_args (version)
-import Data.Maybe (fromMaybe)
 
 import Data.Version (showVersion)
 
@@ -18,7 +16,6 @@
 import Data.KeywordArgs.Parse
 
 import Text.Parsec
-import Text.ParserCombinators.Parsec.Error (ParseError)
 
 import Data.Csv (encode)
 
@@ -27,6 +24,7 @@
     , optShowHelp    :: Bool
     } deriving Show
 
+defaultOptions :: Options
 defaultOptions = Options
     { optShowVersion = False
     , optShowHelp    = False
@@ -34,20 +32,26 @@
 
 options :: [OptDescr (Options -> Options)]
 options =
-  [ Option ['V'] ["version"] (NoArg (\opts -> opts { optShowVersion = True }))
+  [ Option "V" ["version"] (NoArg (\opts -> opts { optShowVersion = True }))
     "show version number"
 
-  , Option ['h'] ["help"]    (NoArg (\opts -> opts { optShowHelp = True }))
+  , Option "h" ["help"]    (NoArg (\opts -> opts { optShowHelp = True }))
     "show help"
   ]
 
+showHelp :: IO ()
 showHelp = do
   prg <- getProgName
   putStrLn (usageInfo prg options)
   exitSuccess
 
 headerMessage :: String -> String
-headerMessage progName = "Usage: " ++ progName ++ " [OPTION...]"
+headerMessage progName =
+  unlines [
+    progName ++ " " ++
+    "cleans up whitespace and comments in keyword-argument input " ++
+    "and emits CSV output.\n"
+    , "Usage: " ++ progName ++ " [OPTION...]"]
 
 lintOpts :: [String] -> IO (Options, [String])
 lintOpts argv = do
@@ -63,14 +67,12 @@
 
 runCheck :: IO ()
 runCheck = do
-
   f <- getContents
 
   case parseConfig f of
     Left e -> ioError $ userError $ "Parse error: " ++ show e
 
     Right config -> putStr $ unpack $ encode config
-
 
 main :: IO ()
 main = do
