diff --git a/src/Text/Pandoc/Readers/Man.hs b/src/Text/Pandoc/Readers/Man.hs
index d70eedb86..7b752373f 100644
--- a/src/Text/Pandoc/Readers/Man.hs
+++ b/src/Text/Pandoc/Readers/Man.hs
@@ -37,7 +37,7 @@ import Control.Monad (liftM)
 import Control.Monad.Except (throwError)
 import Data.Default (Default)
 import Data.Map (insert)
-import Data.Maybe (isJust, catMaybes)
+import Data.Maybe (catMaybes)
 import Data.List (intersperse, intercalate)
 import qualified Data.Text as T
 
@@ -159,6 +159,9 @@ parseMan = do
   isNull Null = True
   isNull _    = False
 
+eofline :: PandocMonad m => ManLexer m ()
+eofline = (newline >> return ()) <|> eof
+
 -- TODO escape characters in arguments
 lexMacro :: PandocMonad m => ManLexer m ManToken
 lexMacro = do
@@ -166,7 +169,7 @@ lexMacro = do
   many space
   macroName <- many1 (letter <|> oneOf ['\\', '"'])
   args <- lexArgs
-  let joinedArgs = concat $ intersperse " " args
+  let joinedArgs = unwords args
   let knownMacro mkind = MMacro mkind args
 
   let tok = case macroName of
@@ -190,17 +193,17 @@ lexMacro = do
 
   lexArgs :: PandocMonad m => ManLexer m [String]
   lexArgs = do
-    eolOpt <- optionMaybe $ char '\n'
-    if isJust eolOpt
-      then return []
-      else do
-        many1 space
-        arg <- try quotedArg <|> plainArg
-        otherargs <- lexArgs
-        return $ arg : otherargs
+    args <- many oneArg
+    eofline
+    return args
 
     where
 
+    oneArg :: PandocMonad m => ManLexer m String
+    oneArg = do
+      many1 $ char ' '
+      try quotedArg <|> plainArg
+
     plainArg :: PandocMonad m => ManLexer m String
     plainArg = many1 $ noneOf " \t\n"
 
@@ -257,7 +260,7 @@ escapeLexer = do
 lexLine :: PandocMonad m => ManLexer m ManToken
 lexLine = do
   lnparts <- many1 (esc <|> linePart)
-  newline
+  eofline
   return $ MLine $ catMaybes lnparts
   where
 
@@ -384,7 +387,7 @@ strToInline s ItalicBold = Strong [Emph [Str s]]
 parsePara :: PandocMonad m => ManParser m Block
 parsePara = do
   inls <- many1 (strInl <|> lineInl <|> linkInl <|> comment)
-  let withspaces = intersperse [Str " "] inls
+  let withspaces = intersperse [Space] inls
   return $ Para (concat withspaces)
 
   where
@@ -420,7 +423,9 @@ parsePara = do
       other <- many anyChar
       let manurl pagename section = "../"++section++"/"++pagename++"."++section
       return $ [ Link nullAttr [Strong [Str mpage]] (manurl mpage [mansect], mpage)
-               , Strong [Str $ " ("++[mansect] ++ ")", Str other]]
+               , Strong [Str $ " ("++[mansect] ++ ")"
+               , Str other]
+               ]
 
   comment :: PandocMonad m => ManParser m [Inline]
   comment = mcomment >> return []
@@ -448,9 +453,7 @@ parseHeader = do
   return $ Header lvl nullAttr [Str s]
 
 parseBulletList :: PandocMonad m => ManParser m Block
-parseBulletList = do
-  bls <- many1 block
-  return $ BulletList $ map (:[]) bls
+parseBulletList = BulletList . map (: []) <$> many1 block
 
   where
 
diff --git a/test/Tests/Readers/Man.hs b/test/Tests/Readers/Man.hs
index a9fe324d1..4807095a5 100644
--- a/test/Tests/Readers/Man.hs
+++ b/test/Tests/Readers/Man.hs
@@ -23,10 +23,22 @@ tests = [
   -- .SH "HEllo bbb" "aaa"" as"
   testGroup "Macros" [
           "Bold" =:
-          ".B foo\n"
+          ".B foo"
           =?> (para $ strong "foo")
         , "Italic" =:
-          ".I foo\n"
-          =?> (para $ emph "foo")
+          ".I bar\n"
+          =?> (para $ emph "bar")
+        , "BoldItalic" =:
+          ".BI foo bar"
+          =?> (para $ strong $ emph $ str "foo bar")
+        , "H1" =:
+          ".SH The header\n"
+          =?> header 2 (str "The header")
+        , "H2" =:
+          ".SS The header 2"
+          =?> header 3 (str "The header 2")
+        , "Macro args" =:
+          ".B \"single arg with \"\"Q\"\"\""
+          =?> (para $ strong $ str "single arg with \"Q\"")
         ]
   ]