diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,17 @@
+## Version 0.12.1.0 (18 Jan 2016)
+
+- Updated dependency bounds.
+
+- Improve subparser contexts to improve usage error texts
+
+- Doc
+
+- Fixed bugs
+    * \# 164 - Invalid options and invalid arguments after parser has succeeded
+               not displaying
+    * \# 146 - multi-word filename completion is broken
+
+
 ## Version 0.12.0.0 (17 Sep 2015)
 
 - Add "missing" error condition descriptions when required flags and arguments
diff --git a/Options/Applicative/BashCompletion.hs b/Options/Applicative/BashCompletion.hs
--- a/Options/Applicative/BashCompletion.hs
+++ b/Options/Applicative/BashCompletion.hs
@@ -78,6 +78,7 @@
   [ "_" ++ progn ++ "()"
   , "{"
   , "    local cmdline"
+  , "    local IFS=$'\n'"
   , "    CMDLINE=(--bash-completion-index $COMP_CWORD)"
   , ""
   , "    for arg in ${COMP_WORDS[@]}; do"
diff --git a/Options/Applicative/Common.hs b/Options/Applicative/Common.hs
--- a/Options/Applicative/Common.hs
+++ b/Options/Applicative/Common.hs
@@ -52,7 +52,7 @@
   OptDescStyle (..)
   ) where
 
-import Control.Applicative (pure, (<*>), (<$>), (<|>), (<$))
+import Control.Applicative (pure, (<*>), (<*), (*>), (<$>), (<|>), (<$))
 import Control.Arrow (left)
 import Control.Monad (guard, mzero, msum, when, liftM)
 import Control.Monad.Trans.Class (lift)
@@ -102,14 +102,13 @@
     return result
   CmdReader _ f ->
     flip fmap (f arg) $ \subp -> StateT $ \args -> do
-      setContext (Just arg) subp
       prefs <- getPrefs
       let runSubparser
             | prefBacktrack prefs = \i a ->
                 runParser (getPolicy i) (infoParser i) a
             | otherwise = \i a
             -> (,) <$> runParserInfo i a <*> pure []
-      runSubparser subp args
+      enterContext arg subp *> runSubparser subp args <* exitContext
   _ -> Nothing
 
 optMatches :: MonadP m => Bool -> OptReader a -> OptWord -> Maybe (StateT Args m a)
@@ -243,8 +242,9 @@
 runParserFully :: MonadP m => ArgPolicy -> Parser a -> Args -> m a
 runParserFully policy p args = do
   (r, args') <- runParser policy p args
-  guard $ null args'
-  return r
+  case args' of
+    []  -> return r
+    a:_ -> parseError a
 
 -- | The default value of a 'Parser'.  This function returns an error if any of
 -- the options don't have a default value.
@@ -258,13 +258,11 @@
       = Left $ Leaf (f (OptHelpInfo m d) opt)
       | otherwise
       = Left $ MultNode []
-evalParser m d f (MultP p1 p2) = case evalParser m d f p1 <*> evalParser m d f p2 of
-  Right a -> Right a
-  Left _  -> case (evalParser m d f p1, evalParser m d f p2) of
-    (Left a', Left b') -> Left $ MultNode [a', b']
-    (Left a', _)       -> Left $ MultNode [a']
-    (_, Left b')       -> Left $ MultNode [b']
-    _                  -> Left $ MultNode []
+evalParser m d f (MultP p1 p2) = case (evalParser m d f p1, evalParser m d f p2) of
+  (Right a', Right b') -> Right $ a' b'
+  (Left a', Left b')   -> Left $ MultNode [a', b']
+  (Left a', _)         -> Left $ MultNode [a']
+  (_, Left b')         -> Left $ MultNode [b']
 evalParser m d f (AltP p1 p2) = case (evalParser m d f p1, evalParser m d f p2) of
   (Right a', _)        -> Right a'
   (_, Right b')        -> Right b'
diff --git a/Options/Applicative/Extra.hs b/Options/Applicative/Extra.hs
--- a/Options/Applicative/Extra.hs
+++ b/Options/Applicative/Extra.hs
@@ -44,6 +44,9 @@
   , help "Show this help text"
   , hidden ]
 
+-- | Builder for a command parser with a \"helper\" option attached.
+-- Used in the same way as `subparser`, but includes a \"--help|-h\" inside
+-- the subcommand.
 hsubparser :: Mod CommandFields a -> Parser a
 hsubparser m = mkParser d g rdr
   where
@@ -133,7 +136,7 @@
 --
 -- @handleParseResult . Failure $ parserFailure pprefs pinfo ShowHelpText mempty@
 parserFailure :: ParserPrefs -> ParserInfo a
-              -> ParseError -> Context
+              -> ParseError -> [Context]
               -> ParserFailure ParserHelp
 parserFailure pprefs pinfo msg ctx = ParserFailure $ \progn ->
   let h = with_context ctx pinfo $ \names pinfo' -> mconcat
@@ -149,12 +152,12 @@
       ShowHelpText   -> ExitSuccess
       InfoMsg  _     -> ExitSuccess
 
-    with_context :: Context
+    with_context :: [Context]
                  -> ParserInfo a
                  -> (forall b . [String] -> ParserInfo b -> c)
                  -> c
-    with_context NullContext i f = f [] i
-    with_context (Context n i) _ f = f n i
+    with_context [] i f = f [] i
+    with_context c@(Context _ i:_) _ f = f (contextNames c) i
 
     usage_help progn names i = case msg of
       InfoMsg _ -> mempty
diff --git a/Options/Applicative/Internal.hs b/Options/Applicative/Internal.hs
--- a/Options/Applicative/Internal.hs
+++ b/Options/Applicative/Internal.hs
@@ -17,6 +17,7 @@
   , runCompletion
   , SomeParser(..)
   , ComplError(..)
+  , contextNames
 
   , ListT
   , takeListT
@@ -35,15 +36,13 @@
   (runExcept, runExceptT, withExcept, ExceptT(..), throwE, catchE)
 import Control.Monad.Trans.Reader
   (mapReaderT, runReader, runReaderT, Reader, ReaderT, ask)
-import Control.Monad.Trans.Writer (runWriterT, WriterT, tell)
-import Control.Monad.Trans.State (StateT, get, put, evalStateT)
-import Data.Maybe (maybeToList)
-import Data.Monoid (Monoid(..))
+import Control.Monad.Trans.State (StateT, get, put, modify, evalStateT, runStateT)
 
 import Options.Applicative.Types
 
 class (Alternative m, MonadPlus m) => MonadP m where
-  setContext :: Maybe String -> ParserInfo a -> m ()
+  enterContext :: String -> ParserInfo a -> m ()
+  exitContext :: m ()
   getPrefs :: m ParserPrefs
 
   missingArgP :: ParseError -> Completer -> m a
@@ -51,7 +50,7 @@
   errorP :: ParseError -> m a
   exitP :: Parser b -> Either ParseError a -> m a
 
-newtype P a = P (ExceptT ParseError (WriterT Context (Reader ParserPrefs)) a)
+newtype P a = P (ExceptT ParseError (StateT [Context] (Reader ParserPrefs)) a)
 
 instance Functor P where
   fmap f (P m) = P $ fmap f m
@@ -74,20 +73,16 @@
 
 
 data Context
-  = forall a . Context [String] (ParserInfo a)
-  | NullContext
-
-contextNames :: Context -> [String]
-contextNames (Context ns _) = ns
-contextNames NullContext = []
+  = forall a . Context String (ParserInfo a)
 
-instance Monoid Context where
-  mempty = NullContext
-  mappend c (Context ns i) = Context (contextNames c ++ ns) i
-  mappend c _ = c
+contextNames :: [Context] -> [String]
+contextNames ns =
+  let go (Context n _) = n
+  in  reverse $ go <$> ns
 
 instance MonadP P where
-  setContext name = P . lift . tell . Context (maybeToList name)
+  enterContext name pinfo = P $ lift $ modify $ (:) $ Context name pinfo
+  exitContext = P $ lift $ modify $ drop 1
   getPrefs = P . lift . lift $ ask
 
   missingArgP e _ = errorP e
@@ -101,8 +96,8 @@
 hoistEither :: MonadP m => Either ParseError a -> m a
 hoistEither = either errorP return
 
-runP :: P a -> ParserPrefs -> (Either ParseError a, Context)
-runP (P p) = runReader . runWriterT . runExceptT $ p
+runP :: P a -> ParserPrefs -> (Either ParseError a, [Context])
+runP (P p) = runReader . flip runStateT [] . runExceptT $ p
 
 uncons :: [a] -> Maybe (a, [a])
 uncons [] = Nothing
@@ -165,7 +160,8 @@
   mplus (Completion x) (Completion y) = Completion $ mplus x y
 
 instance MonadP Completion where
-  setContext _ _ = return ()
+  enterContext _ _ = return ()
+  exitContext = return ()
   getPrefs = Completion $ lift ask
 
   missingArgP _ = Completion . lift . lift . ComplOption
diff --git a/optparse-applicative.cabal b/optparse-applicative.cabal
--- a/optparse-applicative.cabal
+++ b/optparse-applicative.cabal
@@ -1,5 +1,5 @@
 name:                optparse-applicative
-version:             0.12.0.0
+version:             0.12.1.0
 synopsis:            Utilities and combinators for parsing command line options
 description:
     Here is a simple example of an applicative option parser:
@@ -110,7 +110,7 @@
                        Options.Applicative.Internal
   ghc-options:         -Wall
   build-depends:       base == 4.*,
-                       transformers >= 0.2 && < 0.5,
-                       transformers-compat >= 0.3 && < 0.5,
-                       process >= 1.0 && < 1.4,
+                       transformers >= 0.2 && < 0.6,
+                       transformers-compat >= 0.3 && < 0.6,
+                       process >= 1.0 && < 1.5,
                        ansi-wl-pprint >= 0.6.6 && < 0.7
