diff --git a/lib/GEODE/Options.hs b/lib/GEODE/Options.hs
index 2f347f91cf887100e5765dfedf5de10ce3169259..af2c293e0769c78cee11796273a0a543ae8d18b8 100644
--- a/lib/GEODE/Options.hs
+++ b/lib/GEODE/Options.hs
@@ -1,43 +1,23 @@
 {-# LANGUAGE NamedFieldPuns #-}
 module GEODE.Options
   ( Output(..)
+  , atLeastOne
   , output ) where
 
-import Control.Applicative (optional)
+import Control.Applicative ((<|>), empty, many, optional)
+import Data.List.NonEmpty (NonEmpty(..), nonEmpty)
 import Data.Maybe (catMaybes)
 import Options.Applicative
-  ( Parser, flag, help, long, metavar, short
+  ( Parser, flag', help, long, metavar, short
   , strOption )
 
-data OutputFlags =
-  OutputFlags
-    { metadata :: Maybe ()
-    , textRoot :: Maybe FilePath
-    , xmlRoot :: Maybe FilePath }
-
 data Output = Metadata | TextRoot FilePath | XMLRoot FilePath
 
-outputFlags :: Parser OutputFlags
-outputFlags = OutputFlags
-  <$> flag Nothing (Just ())
-        ( long "metadata"
-        <> short 'm'
-        <> help "Print metadata for splitted files on stdout" )
-  <*> (optional . strOption)
-        ( long "text-root"
-        <> short 't'
-        <> metavar "DIRECTORY"
-        <> help "Path where to create files containing the text version of the articles" )
-  <*> (optional . strOption)
-        ( long "xml-root"
-        <> short 'x'
-        <> metavar "DIRECTORY"
-        <> help "Path where to create files containing the XML" )
-
-output :: Parser [Output]
-output = catMaybes . toList <$> outputFlags
-  where
-    toList (OutputFlags {metadata, textRoot, xmlRoot}) =
-      [ Metadata <$ metadata, TextRoot <$> textRoot, XMLRoot <$> xmlRoot ]
+output :: Parser Output
+output =
+    flag' Metadata ( long "metadata" <> short 'm')
+  <|> (TextRoot <$> strOption ( long "text-root" <> short 't'))
+  <|> (TextRoot <$> strOption ( long "xml-root" <> short 'x'))
 
---atLeastOne :: [Output] -> IO [Output]
+atLeastOne :: Parser a -> Parser (NonEmpty a)
+atLeastOne p = (:|) <$> p <*> many p