diff --git a/Opts.hs b/Opts.hs
new file mode 100644
--- /dev/null
+++ b/Opts.hs
@@ -0,0 +1,59 @@
+-- | Option parser
+
+module Opts
+    ( Options(..)
+    , getOpts
+    ) where
+
+import           Control.Applicative (Alternative(..))
+import           Data.Monoid ((<>))
+import qualified Options.Applicative as O
+import           PPDiff (ColorEnable(..))
+
+data Options = Options
+    { shouldUseEditor :: Bool
+    , shouldDumpDiffs :: Bool
+    , shouldDumpDiff2 :: Bool
+    , shouldUseColor :: Maybe ColorEnable
+    , shouldSetConflictStyle :: Bool
+    }
+
+parser :: O.Parser Options
+parser =
+    Options
+    <$> O.switch
+        ( O.long "editor" <> O.short 'e'
+          <> O.help "Execute $EDITOR for each conflicted file that remains conflicted"
+        )
+    <*> O.switch
+        ( O.long "diff" <> O.short 'd'
+          <> O.help "Dump the left/right diffs from base in each conflict remaining"
+        )
+    <*> O.switch
+        ( O.long "diff2" <> O.short '2'
+          <> O.help "Dump the diff between left and right in each conflict remaining"
+        )
+    <*> ( O.flag' (Just EnableColor)
+          (O.long "color" <> O.short 'c' <> O.help "Enable color")
+          <|> O.flag' (Just DisableColor)
+              (O.long "no-color" <> O.short 'C' <> O.help "Disable color")
+          <|> pure Nothing
+        )
+    <*> ( O.switch
+          ( O.long "style" <> O.short 's'
+            <> O.help "Configure git's global merge.conflictstyle to diff3 if needed"
+          )
+        )
+
+opts :: O.ParserInfo Options
+opts =
+    O.info (O.helper <*> parser) $
+    O.fullDesc
+    <> O.progDesc
+       "Resolve any git conflicts that have become trivial by editing operations.\n\
+       \Go to http://github.com/ElastiLotem/resolve-trivial-conflicts for example use."
+    <> O.header "resolve-trivial-conflicts - Become a conflicts hero"
+
+getOpts :: IO Options
+getOpts = O.execParser opts
+
diff --git a/resolve-trivial-conflicts.cabal b/resolve-trivial-conflicts.cabal
--- a/resolve-trivial-conflicts.cabal
+++ b/resolve-trivial-conflicts.cabal
@@ -2,7 +2,7 @@
 -- further documentation, see http://haskell.org/cabal/users-guide/
 
 name:                resolve-trivial-conflicts
-version:             0.3.1.2
+version:             0.3.2
 synopsis:            Remove trivial conflict markers in a git repository
 description:         Remove trivial conflict markers in a git repository
 homepage:            https://github.com/ElastiLotem/resolve-trivial-conflicts
@@ -24,7 +24,7 @@
   main-is:             resolve_trivial_conflicts.hs
   ghc-options:         -rtsopts -Wall
   ghc-prof-options:    -rtsopts -Wall -auto-all -caf-all
-  other-modules:       PPDiff
+  other-modules:       PPDiff, Opts
   -- other-extensions:
   build-depends:       base >=4.6 && <5
                      , base-compat >= 0.8.2 && < 0.9
@@ -35,5 +35,6 @@
                      , unix >=2.7
                      , Diff >=0.3
                      , ansi-terminal >=0.6.2
+                     , optparse-applicative >=0.11 && <0.13
   -- hs-source-dirs:
   default-language:    Haskell2010
diff --git a/resolve_trivial_conflicts.hs b/resolve_trivial_conflicts.hs
--- a/resolve_trivial_conflicts.hs
+++ b/resolve_trivial_conflicts.hs
@@ -11,9 +11,11 @@
 import           Data.List (isPrefixOf, isSuffixOf)
 import           Data.Maybe (mapMaybe)
 import qualified Data.Monoid as Monoid
+import qualified Opts
+import           Opts (Options(..))
 import           PPDiff (ppDiff, ColorEnable(..))
 import           System.Directory (renameFile, removeFile, getCurrentDirectory)
-import           System.Environment (getProgName, getArgs, getEnv)
+import           System.Environment (getEnv)
 import           System.Exit (ExitCode(..))
 import           System.FilePath ((<.>), makeRelative, joinPath, splitPath)
 import qualified System.FilePath as FilePath
@@ -127,9 +129,14 @@
 
 getConflictDiffs :: Conflict -> [SideDiff]
 getConflictDiffs Conflict{..} =
-    [ (A, cMarkerA, getDiff cLinesBase cLinesA) | not (null cLinesA) ] ++
-    [ (B, (fst cMarkerB, snd cMarkerEnd), getDiff cLinesBase cLinesB) | not (null cLinesB) ]
+    [ (A, cMarkerA, getDiff cLinesBase cLinesA)
+    | not (null cLinesA) ] ++
+    [ (B, (fst cMarkerB, snd cMarkerEnd), getDiff cLinesBase cLinesB)
+    | not (null cLinesB) ]
 
+getConflictDiff2s :: Conflict -> ((LineNo, String), (LineNo, String), [Diff String])
+getConflictDiff2s Conflict{..} = (cMarkerA, cMarkerB, getDiff cLinesA cLinesB)
+
 resolveContent :: [Either String Conflict] -> NewContent
 resolveContent = asResult . mconcat . map go
     where
@@ -149,50 +156,6 @@
 gitAdd fileName =
     callProcess "git" ["add", "--", fileName]
 
-data Options = Options
-    { shouldUseEditor :: Bool
-    , shouldDumpDiffs :: Bool
-    , shouldUseColor :: Maybe ColorEnable
-    , shouldSetConflictStyle :: Bool
-    }
-instance Monoid Options where
-    mempty = Options False False Nothing False
-    Options oe0 od0 oc0 os0 `mappend` Options oe1 od1 oc1 os1 =
-        Options
-        (combineBool oe0 oe1 "-e")
-        (combineBool od0 od1 "-d")
-        (combineMaybe oc0 oc1 "-c or -C")
-        (os0 || os1)
-        where
-            err flag = error $ "Multiple " ++ flag ++ " flags used"
-            combineMaybe (Just _) (Just _) flag = err flag
-            combineMaybe Nothing Nothing _ = Nothing
-            combineMaybe (Just x) Nothing _ = Just x
-            combineMaybe Nothing (Just y) _ = Just y
-            combineBool True True flag = err flag
-            combineBool x y _ = x || y
-
-getOpts :: [String] -> IO Options
-getOpts = fmap mconcat . mapM parseArg
-    where
-        parseArg "-e" = return mempty { shouldUseEditor = True }
-        parseArg "-d" = return mempty { shouldDumpDiffs = True }
-        parseArg "-c" = return mempty { shouldUseColor = Just EnableColor }
-        parseArg "-C" = return mempty { shouldUseColor = Just DisableColor }
-        parseArg "-s" = return mempty { shouldSetConflictStyle = True }
-        parseArg arg =
-            do  prog <- getProgName
-                putStr $ unlines
-                    [ "Usage: " ++ prog ++ " [-e] [-d] [-c] [-C] [-s]"
-                    , ""
-                    , "-e    Execute $EDITOR for each conflicted file that remains conflicted"
-                    , "-d    Dump the left/right diffs from base in each conflict remaining"
-                    , "-c    Enable color"
-                    , "-C    Disable color"
-                    , "-s    Configure git's global merge.conflictstyle to diff3 if needed"
-                    ]
-                fail $ "Unknown argument: " ++ show arg
-
 openEditor :: Options -> FilePath -> IO ()
 openEditor opts path
     | shouldUseEditor opts =
@@ -200,19 +163,24 @@
             callProcess editor [path]
     | otherwise = return ()
 
-dumpDiffs :: ColorEnable -> Options -> FilePath -> [SideDiff] -> IO ()
-dumpDiffs colorEnable opts filePath diffs
-    | shouldDumpDiffs opts = mapM_ dumpDiff diffs
-    | otherwise = return ()
+dumpDiffs :: ColorEnable -> Options -> FilePath -> [Conflict] -> IO ()
+dumpDiffs colorEnable opts filePath conflicts =
+    do
+        when (shouldDumpDiffs opts) $ mapM_ dumpDiff $ concatMap getConflictDiffs conflicts
+        when (shouldDumpDiff2 opts) $ mapM_ dumpDiff2 $ map getConflictDiff2s conflicts
     where
         dumpDiff (side, (lineNo, marker), diff) =
             do  putStrLn $ concat
                     [filePath, ":", show lineNo, ":Diff", show side, ": ", marker]
                 putStr $ unlines $ map (ppDiff colorEnable) diff
+        dumpDiff2 ((lineNoA, markerA), (lineNoB, markerB), diff) =
+            do  putStrLn $ concat [filePath, ":", show lineNoA, " <->", markerA]
+                putStrLn $ concat [filePath, ":", show lineNoB, ": ", markerB]
+                putStr $ unlines $ map (ppDiff colorEnable) diff
 
-dumpAndOpenEditor :: ColorEnable -> Options -> FilePath -> [SideDiff] -> IO ()
-dumpAndOpenEditor colorEnable opts path diffs =
-    do  dumpDiffs colorEnable opts path diffs
+dumpAndOpenEditor :: ColorEnable -> Options -> FilePath -> [Conflict] -> IO ()
+dumpAndOpenEditor colorEnable opts path conflicts =
+    do  dumpDiffs colorEnable opts path conflicts
         openEditor opts path
 
 overwrite :: FilePath -> String -> IO ()
@@ -249,10 +217,7 @@
         where
             doDump =
                 dumpAndOpenEditor colorEnable opts fileName
-                [ cDiff
-                | Right conflict <- parseConflicts newContent
-                , cDiff <- getConflictDiffs conflict
-                ]
+                [ conflict | Right conflict <- parseConflicts newContent ]
 
 stripNewline :: String -> String
 stripNewline x
@@ -378,7 +343,7 @@
 
 main :: IO ()
 main =
-  do  opts <- getOpts =<< getArgs
+  do  opts <- Opts.getOpts
       colorEnable <-
           case shouldUseColor opts of
               Nothing -> shouldUseColorByTerminal
