diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,18 @@
+## Changes in 0.35.4
+ - Add `--canonical`, which can be used to produce canonical output instead of
+   trying to produce minimal diffs
+ - Avoid unnecessary writes on `--force` (see #555)
+ - When an existing `.cabal` does not align fields then do not align fields in
+   the generated `.cabal` file.
+ - Fix a bug related to git conflict markers in existing `.cabal` files: When a
+   `.cabal` file was essentially unchanged, but contained git conflict markers
+   then `hpack` did not write a new `.cabal` file at all.  To address this
+   `hpack` now unconditionally writes a new `.cabal` file when the existing
+   `.cabal` file contains any git conflict markers.
+
+## Changes in 0.35.3
+  - Depend on `crypton` instead of `cryptonite`
+
 ## Changes in 0.35.2
   - Add support for `ghc-shared-options`
 
diff --git a/hpack.cabal b/hpack.cabal
--- a/hpack.cabal
+++ b/hpack.cabal
@@ -1,16 +1,17 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.35.2.
+-- This file has been generated from package.yaml by hpack version 0.35.3.
 --
 -- see: https://github.com/sol/hpack
 
 name:           hpack
-version:        0.35.3
+version:        0.35.4
 synopsis:       A modern format for Haskell packages
 description:    See README at <https://github.com/sol/hpack#readme>
 category:       Development
 homepage:       https://github.com/sol/hpack#readme
 bug-reports:    https://github.com/sol/hpack/issues
+author:         Simon Hengel <sol@typeful.net>
 maintainer:     Simon Hengel <sol@typeful.net>
 license:        MIT
 license-file:   LICENSE
diff --git a/resources/test/hpack.cabal b/resources/test/hpack.cabal
--- a/resources/test/hpack.cabal
+++ b/resources/test/hpack.cabal
@@ -1,16 +1,17 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.35.2.
+-- This file has been generated from package.yaml by hpack version 0.35.3.
 --
 -- see: https://github.com/sol/hpack
 
 name:           hpack
-version:        0.35.3
+version:        0.35.4
 synopsis:       A modern format for Haskell packages
 description:    See README at <https://github.com/sol/hpack#readme>
 category:       Development
 homepage:       https://github.com/sol/hpack#readme
 bug-reports:    https://github.com/sol/hpack/issues
+author:         Simon Hengel <sol@typeful.net>
 maintainer:     Simon Hengel <sol@typeful.net>
 license:        MIT
 license-file:   LICENSE
diff --git a/src/Hpack.hs b/src/Hpack.hs
--- a/src/Hpack.hs
+++ b/src/Hpack.hs
@@ -37,6 +37,7 @@
 , Options(..)
 , Force(..)
 , GenerateHashStrategy(..)
+, OutputStrategy(..)
 
 #ifdef TEST
 , hpackResultWithVersion
@@ -84,6 +85,7 @@
 , optionsForce :: Force
 , optionsGenerateHashStrategy :: GenerateHashStrategy
 , optionsToStdout :: Bool
+, optionsOutputStrategy :: OutputStrategy
 }
 
 data GenerateHashStrategy = ForceHash | ForceNoHash | PreferHash | PreferNoHash
@@ -102,12 +104,12 @@
     Help -> do
       printHelp
       return Nothing
-    Run (ParseOptions verbose force hash toStdout file) -> do
+    Run (ParseOptions verbose force hash toStdout file outputStrategy) -> do
       let generateHash = case hash of
             Just True -> ForceHash
             Just False -> ForceNoHash
             Nothing -> PreferNoHash
-      return $ Just (verbose, Options defaultDecodeOptions {decodeOptionsTarget = file} force generateHash toStdout)
+      return $ Just (verbose, Options defaultDecodeOptions {decodeOptionsTarget = file} force generateHash toStdout outputStrategy)
     ParseError -> do
       printHelp
       exitFailure
@@ -116,7 +118,7 @@
 printHelp = do
   name <- getProgName
   Utf8.hPutStrLn stderr $ unlines [
-      "Usage: " ++ name ++ " [ --silent ] [ --force | -f ] [ --[no-]hash ] [ PATH ] [ - ]"
+      "Usage: " ++ name ++ " [ --silent ] [ --canonical ] [ --force | -f ] [ --[no-]hash ] [ PATH ] [ - ]"
     , "       " ++ name ++ " --version"
     , "       " ++ name ++ " --numeric-version"
     , "       " ++ name ++ " --help"
@@ -126,7 +128,7 @@
 hpack verbose options = hpackResult options >>= printResult verbose
 
 defaultOptions :: Options
-defaultOptions = Options defaultDecodeOptions NoForce PreferNoHash False
+defaultOptions = Options defaultDecodeOptions NoForce PreferNoHash False MinimizeDiffs
 
 setTarget :: FilePath -> Options -> Options
 setTarget target options@Options{..} =
@@ -206,8 +208,8 @@
 printWarnings :: [String] -> IO ()
 printWarnings = mapM_ $ Utf8.hPutStrLn stderr . ("WARNING: " ++)
 
-mkStatus :: CabalFile -> CabalFile -> Status
-mkStatus new@(CabalFile _ mNewVersion mNewHash _) existing@(CabalFile _ mExistingVersion _ _)
+mkStatus :: NewCabalFile -> ExistingCabalFile -> Status
+mkStatus new@(CabalFile _ mNewVersion mNewHash _ _) existing@(CabalFile _ mExistingVersion _ _ _)
   | new `hasSameContent` existing = OutputUnchanged
   | otherwise = case mExistingVersion of
       Nothing -> ExistingCabalFileWasModifiedManually
@@ -216,16 +218,19 @@
         | isJust mNewHash && hashMismatch existing -> ExistingCabalFileWasModifiedManually
         | otherwise -> Generated
 
-hasSameContent :: CabalFile -> CabalFile -> Bool
-hasSameContent (CabalFile cabalVersionA _ _ a) (CabalFile cabalVersionB _ _ b) = cabalVersionA == cabalVersionB && a == b
+hasSameContent :: NewCabalFile -> ExistingCabalFile -> Bool
+hasSameContent (CabalFile cabalVersionA _ _ a ()) (CabalFile cabalVersionB _ _ b gitConflictMarkers) =
+     cabalVersionA == cabalVersionB
+  && a == b
+  && gitConflictMarkers == DoesNotHaveGitConflictMarkers
 
-hashMismatch :: CabalFile -> Bool
+hashMismatch :: ExistingCabalFile -> Bool
 hashMismatch cabalFile = case cabalFileHash cabalFile of
   Nothing -> False
-  Just hash -> hash /= calculateHash cabalFile
+  Just hash -> cabalFileGitConflictMarkers cabalFile == HasGitConflictMarkers || hash /= calculateHash cabalFile
 
-calculateHash :: CabalFile -> Hash
-calculateHash (CabalFile cabalVersion _ _ body) = sha256 (unlines $ cabalVersion ++ body)
+calculateHash :: CabalFile a -> Hash
+calculateHash (CabalFile cabalVersion _ _ body _) = sha256 (unlines $ cabalVersion ++ body)
 
 hpackResult :: Options -> IO Result
 hpackResult opts = hpackResultWithError opts >>= either (die . formatHpackError programName) return
@@ -236,12 +241,12 @@
 hpackResultWithError = hpackResultWithVersion version
 
 hpackResultWithVersion :: Version -> Options -> IO (Either HpackError Result)
-hpackResultWithVersion v (Options options force generateHashStrategy toStdout) = do
+hpackResultWithVersion v (Options options force generateHashStrategy toStdout outputStrategy) = do
   readPackageConfigWithError options >>= \ case
     Right (DecodeResult pkg (lines -> cabalVersion) cabalFileName warnings) -> do
       mExistingCabalFile <- readCabalFile cabalFileName
       let
-        newCabalFile = makeCabalFile generateHashStrategy mExistingCabalFile cabalVersion v pkg
+        newCabalFile = makeCabalFile outputStrategy generateHashStrategy mExistingCabalFile cabalVersion v pkg
 
         status = case force of
           Force -> Generated
@@ -258,24 +263,32 @@
       }
     Left err -> return $ Left err
 
-writeCabalFile :: DecodeOptions -> Bool -> FilePath -> CabalFile -> IO ()
+writeCabalFile :: DecodeOptions -> Bool -> FilePath -> NewCabalFile -> IO ()
 writeCabalFile options toStdout name cabalFile = do
   write . unlines $ renderCabalFile (decodeOptionsTarget options) cabalFile
   where
-    write = if toStdout then Utf8.putStr else Utf8.writeFile name
+    write = if toStdout then Utf8.putStr else Utf8.ensureFile name
 
-makeCabalFile :: GenerateHashStrategy -> Maybe CabalFile -> [String] -> Version -> Package -> CabalFile
-makeCabalFile strategy mExistingCabalFile cabalVersion v pkg = cabalFile
+makeCabalFile :: OutputStrategy -> GenerateHashStrategy -> Maybe ExistingCabalFile -> [String] -> Version -> Package -> NewCabalFile
+makeCabalFile outputStrategy generateHashStrategy mExistingCabalFile cabalVersion v pkg = cabalFile
   where
-    cabalFile = CabalFile cabalVersion (Just v) hash body
+    hints :: [String]
+    hints = case outputStrategy of
+      CanonicalOutput -> []
+      MinimizeDiffs -> maybe [] cabalFileContents mExistingCabalFile
 
+    cabalFile :: NewCabalFile
+    cabalFile = CabalFile cabalVersion (Just v) hash body ()
+
+    hash :: Maybe Hash
     hash
-      | shouldGenerateHash mExistingCabalFile strategy = Just $ calculateHash cabalFile
+      | shouldGenerateHash mExistingCabalFile generateHashStrategy = Just $ calculateHash cabalFile
       | otherwise = Nothing
 
-    body = lines $ renderPackage (maybe [] cabalFileContents mExistingCabalFile) pkg
+    body :: [String]
+    body = lines $ renderPackage hints pkg
 
-shouldGenerateHash :: Maybe CabalFile -> GenerateHashStrategy -> Bool
+shouldGenerateHash :: Maybe ExistingCabalFile -> GenerateHashStrategy -> Bool
 shouldGenerateHash mExistingCabalFile strategy = case (strategy, mExistingCabalFile) of
   (ForceHash, _) -> True
   (ForceNoHash, _) -> False
@@ -284,5 +297,5 @@
   (_, Just CabalFile {cabalFileHash = Nothing}) -> False
   (_, Just CabalFile {cabalFileHash = Just _}) -> True
 
-renderCabalFile :: FilePath -> CabalFile -> [String]
-renderCabalFile file (CabalFile cabalVersion hpackVersion hash body) = cabalVersion ++ header file hpackVersion hash ++ body
+renderCabalFile :: FilePath -> NewCabalFile -> [String]
+renderCabalFile file (CabalFile cabalVersion hpackVersion hash body _) = cabalVersion ++ header file hpackVersion hash ++ body
diff --git a/src/Hpack/CabalFile.hs b/src/Hpack/CabalFile.hs
--- a/src/Hpack/CabalFile.hs
+++ b/src/Hpack/CabalFile.hs
@@ -1,7 +1,19 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE ViewPatterns #-}
-module Hpack.CabalFile where
+module Hpack.CabalFile (
+  CabalFile(..)
+, GitConflictMarkers(..)
+, ExistingCabalFile
+, NewCabalFile
+, readCabalFile
+, parseVersion
+#ifdef TEST
+, extractVersion
+, removeGitConflictMarkers
+#endif
+) where
 
 import           Imports
 
@@ -12,28 +24,42 @@
 
 import           Hpack.Util
 
-makeVersion :: [Int] -> Version
-makeVersion v = Version v []
-
-data CabalFile = CabalFile {
+data CabalFile a = CabalFile {
   cabalFileCabalVersion :: [String]
 , cabalFileHpackVersion :: Maybe Version
 , cabalFileHash :: Maybe Hash
 , cabalFileContents :: [String]
+, cabalFileGitConflictMarkers :: a
 } deriving (Eq, Show)
 
-readCabalFile :: FilePath -> IO (Maybe CabalFile)
-readCabalFile cabalFile = fmap parse <$> tryReadFile cabalFile
+data GitConflictMarkers = HasGitConflictMarkers | DoesNotHaveGitConflictMarkers
+  deriving (Show, Eq)
+
+type ExistingCabalFile = CabalFile GitConflictMarkers
+type NewCabalFile = CabalFile ()
+
+readCabalFile :: FilePath -> IO (Maybe ExistingCabalFile)
+readCabalFile cabalFile = fmap parseCabalFile <$> tryReadFile cabalFile
+
+parseCabalFile :: String -> ExistingCabalFile
+parseCabalFile (lines -> input) = case span isComment <$> span (not . isComment) clean of
+  (cabalVersion, (header, body)) -> CabalFile {
+    cabalFileCabalVersion = cabalVersion
+  , cabalFileHpackVersion = extractVersion header
+  , cabalFileHash = extractHash header
+  , cabalFileContents = dropWhile null body
+  , cabalFileGitConflictMarkers = gitConflictMarkers
+  }
   where
-    parse :: String -> CabalFile
-    parse (splitHeader -> (cabalVersion, h, c)) = CabalFile cabalVersion (extractVersion h) (extractHash h) c
+    clean :: [String]
+    clean = removeGitConflictMarkers input
 
-    splitHeader :: String -> ([String], [String], [String])
-    splitHeader (removeGitConflictMarkers . lines -> c) =
-      case span (not . isComment) c of
-        (cabalVersion, xs) -> case span isComment xs of
-          (header, body) -> (cabalVersion, header, dropWhile null body)
+    gitConflictMarkers :: GitConflictMarkers
+    gitConflictMarkers
+      | input == clean = DoesNotHaveGitConflictMarkers
+      | otherwise = HasGitConflictMarkers
 
+    isComment :: String -> Bool
     isComment = ("--" `isPrefixOf`)
 
 extractHash :: [String] -> Maybe Hash
diff --git a/src/Hpack/Options.hs b/src/Hpack/Options.hs
--- a/src/Hpack/Options.hs
+++ b/src/Hpack/Options.hs
@@ -16,12 +16,16 @@
 data Force = Force | NoForce
   deriving (Eq, Show)
 
+data OutputStrategy = CanonicalOutput | MinimizeDiffs
+  deriving (Eq, Show)
+
 data ParseOptions = ParseOptions {
   parseOptionsVerbose :: Verbose
 , parseOptionsForce :: Force
 , parseOptionsHash :: Maybe Bool
 , parseOptionsToStdout :: Bool
 , parseOptionsTarget :: FilePath
+, parseOptionsOutputStrategy :: OutputStrategy
 } deriving (Eq, Show)
 
 parseOptions :: FilePath -> [String] -> IO ParseResult
@@ -34,8 +38,8 @@
       file <- expandTarget defaultTarget target
       let
         options
-          | toStdout = ParseOptions NoVerbose Force hash toStdout file
-          | otherwise = ParseOptions verbose force hash toStdout file
+          | toStdout = ParseOptions NoVerbose Force hash toStdout file outputStrategy
+          | otherwise = ParseOptions verbose force hash toStdout file outputStrategy
       return (Run options)
     Left err -> return err
     where
@@ -43,11 +47,15 @@
       forceFlags = ["--force", "-f"]
       hashFlag = "--hash"
       noHashFlag = "--no-hash"
+      canonicalFlag = "--canonical"
 
-      flags = hashFlag : noHashFlag : silentFlag : forceFlags
+      flags = canonicalFlag : hashFlag : noHashFlag : silentFlag : forceFlags
 
       verbose :: Verbose
       verbose = if silentFlag `elem` args then NoVerbose else Verbose
+
+      outputStrategy :: OutputStrategy
+      outputStrategy = if canonicalFlag `elem` args then CanonicalOutput else MinimizeDiffs
 
       force :: Force
       force = if any (`elem` args) forceFlags then Force else NoForce
diff --git a/src/Hpack/Render.hs b/src/Hpack/Render.hs
--- a/src/Hpack/Render.hs
+++ b/src/Hpack/Render.hs
@@ -48,10 +48,10 @@
 import qualified Hpack.Render.Dsl as Dsl
 
 renderPackage :: [String] -> Package -> String
-renderPackage oldCabalFile = renderPackageWith settings alignment formattingHintsFieldOrder formattingHintsSectionsFieldOrder
+renderPackage oldCabalFile = renderPackageWith settings headerFieldsAlignment formattingHintsFieldOrder formattingHintsSectionsFieldOrder
   where
     FormattingHints{..} = sniffFormattingHints oldCabalFile
-    alignment = fromMaybe 16 formattingHintsAlignment
+    headerFieldsAlignment = fromMaybe 16 formattingHintsAlignment
     settings = formattingHintsRenderSettings
 
 renderPackageWith :: RenderSettings -> Alignment -> [String] -> [(String, [String])] -> Package -> String
diff --git a/src/Hpack/Render/Hints.hs b/src/Hpack/Render/Hints.hs
--- a/src/Hpack/Render/Hints.hs
+++ b/src/Hpack/Render/Hints.hs
@@ -68,16 +68,32 @@
   where
     indentation = minimum $ map (length . takeWhile isSpace) input
 
+data Indentation = Indentation {
+  indentationFieldNameLength :: Int
+, indentationPadding :: Int
+}
+
+indentationTotal :: Indentation -> Int
+indentationTotal (Indentation fieldName padding) = fieldName + padding
+
 sniffAlignment :: [String] -> Maybe Alignment
-sniffAlignment input = case nub . catMaybes . map indentation . catMaybes . map splitField $ input of
-  [n] -> Just (Alignment n)
-  _ -> Nothing
+sniffAlignment input = case indentations of
+  [] -> Nothing
+  _ | all (indentationPadding >>> (== 1)) indentations -> Just 0
+  _ -> case nub (map indentationTotal indentations) of
+    [n] -> Just (Alignment n)
+    _ -> Nothing
   where
+    indentations :: [Indentation]
+    indentations = catMaybes . map (splitField >=> indentation) $ input
 
-    indentation :: (String, String) -> Maybe Int
+    indentation :: (String, String) -> Maybe Indentation
     indentation (name, value) = case span isSpace value of
       (_, "") -> Nothing
-      (xs, _) -> (Just . succ . length $ name ++ xs)
+      (padding, _) -> Just Indentation {
+        indentationFieldNameLength = succ $ length name
+      , indentationPadding = length padding
+      }
 
 splitField :: String -> Maybe (String, String)
 splitField field = case span isNameChar field of
diff --git a/src/Hpack/Utf8.hs b/src/Hpack/Utf8.hs
--- a/src/Hpack/Utf8.hs
+++ b/src/Hpack/Utf8.hs
@@ -1,7 +1,9 @@
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE ScopedTypeVariables #-}
 module Hpack.Utf8 (
   encodeUtf8
 , readFile
-, writeFile
+, ensureFile
 , putStr
 , hPutStr
 , hPutStrLn
@@ -9,6 +11,8 @@
 
 import           Prelude hiding (readFile, writeFile, putStr)
 
+import           Control.Monad
+import           Control.Exception (try, IOException)
 import qualified Data.Text as T
 import qualified Data.Text.Encoding as Encoding
 import           Data.Text.Encoding.Error (lenientDecode)
@@ -48,8 +52,13 @@
 readFile :: FilePath -> IO String
 readFile = fmap decodeText . B.readFile
 
-writeFile :: FilePath -> String -> IO ()
-writeFile name xs = withFile name WriteMode (`hPutStr` xs)
+ensureFile :: FilePath -> String -> IO ()
+ensureFile name new = do
+  try (readFile name) >>= \ case
+    Left (_ :: IOException) -> do
+      withFile name WriteMode (`hPutStr` new)
+    Right old -> unless (old == new) $ do
+      withFile name WriteMode (`hPutStr` new)
 
 putStr :: String -> IO ()
 putStr = hPutStr stdout
diff --git a/test/Helper.hs b/test/Helper.hs
--- a/test/Helper.hs
+++ b/test/Helper.hs
@@ -11,6 +11,7 @@
 , module System.FilePath
 , withCurrentDirectory
 , yaml
+, makeVersion
 ) where
 
 import           Imports
@@ -19,6 +20,7 @@
 import           Test.Mockery.Directory
 import           Control.Monad
 import           Control.Applicative
+import           Data.Version (Version(..))
 import           System.Directory (getCurrentDirectory, setCurrentDirectory, canonicalizePath)
 import           Control.Exception
 import qualified System.IO.Temp as Temp
@@ -44,3 +46,6 @@
 
 yaml :: Language.Haskell.TH.Quote.QuasiQuoter
 yaml = yamlQQ
+
+makeVersion :: [Int] -> Version
+makeVersion v = Version v []
diff --git a/test/Hpack/CabalFileSpec.hs b/test/Hpack/CabalFileSpec.hs
--- a/test/Hpack/CabalFileSpec.hs
+++ b/test/Hpack/CabalFileSpec.hs
@@ -28,12 +28,12 @@
     it "includes hash" $ do
       inTempDirectory $ do
         writeFile file $ mkHeader "package.yaml" version hash
-        readCabalFile file `shouldReturn` Just (CabalFile [] (Just version) (Just hash) [])
+        readCabalFile file `shouldReturn` Just (CabalFile [] (Just version) (Just hash) [] DoesNotHaveGitConflictMarkers)
 
     it "accepts cabal-version at the beginning of the file" $ do
       inTempDirectory $ do
         writeFile file $ ("cabal-version: 2.2\n" ++ mkHeader "package.yaml" version hash)
-        readCabalFile file `shouldReturn` Just (CabalFile ["cabal-version: 2.2"] (Just version) (Just hash) [])
+        readCabalFile file `shouldReturn` Just (CabalFile ["cabal-version: 2.2"] (Just version) (Just hash) [] DoesNotHaveGitConflictMarkers)
 
   describe "extractVersion" $ do
     it "extracts Hpack version from a cabal file" $ do
diff --git a/test/Hpack/OptionsSpec.hs b/test/Hpack/OptionsSpec.hs
--- a/test/Hpack/OptionsSpec.hs
+++ b/test/Hpack/OptionsSpec.hs
@@ -18,10 +18,10 @@
 
     context "by default" $ do
       it "returns Run" $ do
-        parseOptions defaultTarget [] `shouldReturn` Run (ParseOptions Verbose NoForce Nothing False defaultTarget)
+        parseOptions defaultTarget [] `shouldReturn` Run (ParseOptions Verbose NoForce Nothing False defaultTarget MinimizeDiffs)
 
       it "includes target" $ do
-        parseOptions defaultTarget ["foo.yaml"] `shouldReturn` Run (ParseOptions Verbose NoForce Nothing False "foo.yaml")
+        parseOptions defaultTarget ["foo.yaml"] `shouldReturn` Run (ParseOptions Verbose NoForce Nothing False "foo.yaml" MinimizeDiffs)
 
       context "with superfluous arguments" $ do
         it "returns ParseError" $ do
@@ -29,31 +29,31 @@
 
       context "with --silent" $ do
         it "sets optionsVerbose to NoVerbose" $ do
-          parseOptions defaultTarget ["--silent"] `shouldReturn` Run (ParseOptions NoVerbose NoForce Nothing False defaultTarget)
+          parseOptions defaultTarget ["--silent"] `shouldReturn` Run (ParseOptions NoVerbose NoForce Nothing False defaultTarget MinimizeDiffs)
 
       context "with --force" $ do
         it "sets optionsForce to Force" $ do
-          parseOptions defaultTarget ["--force"] `shouldReturn` Run (ParseOptions Verbose Force Nothing False defaultTarget)
+          parseOptions defaultTarget ["--force"] `shouldReturn` Run (ParseOptions Verbose Force Nothing False defaultTarget MinimizeDiffs)
 
       context "with -f" $ do
         it "sets optionsForce to Force" $ do
-          parseOptions defaultTarget ["-f"] `shouldReturn` Run (ParseOptions Verbose Force Nothing False defaultTarget)
+          parseOptions defaultTarget ["-f"] `shouldReturn` Run (ParseOptions Verbose Force Nothing False defaultTarget MinimizeDiffs)
 
       context "when determining parseOptionsHash" $ do
 
         it "assumes True on --hash" $ do
-          parseOptions defaultTarget ["--hash"] `shouldReturn` Run (ParseOptions Verbose NoForce (Just True) False defaultTarget)
+          parseOptions defaultTarget ["--hash"] `shouldReturn` Run (ParseOptions Verbose NoForce (Just True) False defaultTarget MinimizeDiffs)
 
         it "assumes False on --no-hash" $ do
-          parseOptions defaultTarget ["--no-hash"] `shouldReturn` Run (ParseOptions Verbose NoForce (Just False) False defaultTarget)
+          parseOptions defaultTarget ["--no-hash"] `shouldReturn` Run (ParseOptions Verbose NoForce (Just False) False defaultTarget MinimizeDiffs)
 
         it "gives last occurrence precedence" $ do
-          parseOptions defaultTarget ["--no-hash", "--hash"] `shouldReturn` Run (ParseOptions Verbose NoForce (Just True) False defaultTarget)
-          parseOptions defaultTarget ["--hash", "--no-hash"] `shouldReturn` Run (ParseOptions Verbose NoForce (Just False) False defaultTarget)
+          parseOptions defaultTarget ["--no-hash", "--hash"] `shouldReturn` Run (ParseOptions Verbose NoForce (Just True) False defaultTarget MinimizeDiffs)
+          parseOptions defaultTarget ["--hash", "--no-hash"] `shouldReturn` Run (ParseOptions Verbose NoForce (Just False) False defaultTarget MinimizeDiffs)
 
       context "with -" $ do
         it "sets optionsToStdout to True, implies Force and NoVerbose" $ do
-          parseOptions defaultTarget ["-"] `shouldReturn` Run (ParseOptions NoVerbose Force Nothing True defaultTarget)
+          parseOptions defaultTarget ["-"] `shouldReturn` Run (ParseOptions NoVerbose Force Nothing True defaultTarget MinimizeDiffs)
 
         it "rejects - for target" $ do
           parseOptions defaultTarget ["-", "-"] `shouldReturn` ParseError
diff --git a/test/Hpack/Render/HintsSpec.hs b/test/Hpack/Render/HintsSpec.hs
--- a/test/Hpack/Render/HintsSpec.hs
+++ b/test/Hpack/Render/HintsSpec.hs
@@ -21,7 +21,7 @@
   describe "extractFieldOrder" $ do
     it "extracts field order hints" $ do
       let input = [
-              "name:           cabalize"
+              "name:           hpack"
             , "version:        0.0.0"
             , "license:"
             , "license-file: "
@@ -38,7 +38,7 @@
   describe "extractSectionsFieldOrder" $ do
     it "splits input into sections" $ do
       let input = [
-              "name:           cabalize"
+              "name:           hpack"
             , "version:        0.0.0"
             , ""
             , "library"
@@ -88,7 +88,7 @@
   describe "sniffAlignment" $ do
     it "sniffs field alignment from given cabal file" $ do
       let input = [
-              "name:           cabalize"
+              "name:           hpack"
             , "version:        0.0.0"
             , "license:        MIT"
             , "license-file:   LICENSE"
@@ -98,13 +98,29 @@
 
     it "ignores fields without a value on the same line" $ do
       let input = [
-              "name:           cabalize"
+              "name:           hpack"
             , "version:        0.0.0"
             , "description: "
             , "  foo"
             , "  bar"
             ]
       sniffAlignment input `shouldBe` Just 16
+
+    context "when all fields are padded with exactly one space" $ do
+      it "returns 0" $ do
+        let input = [
+                "name: hpack"
+              , "version: 0.0.0"
+              , "license: MIT"
+              , "license-file: LICENSE"
+              , "build-type: Simple"
+              ]
+        sniffAlignment input `shouldBe` Just 0
+
+    context "with an empty input list" $ do
+      it "returns Nothing" $ do
+        let input = []
+        sniffAlignment input `shouldBe` Nothing
 
   describe "splitField" $ do
     it "splits fields" $ do
diff --git a/test/Hpack/Utf8Spec.hs b/test/Hpack/Utf8Spec.hs
--- a/test/Hpack/Utf8Spec.hs
+++ b/test/Hpack/Utf8Spec.hs
@@ -18,7 +18,7 @@
           B.writeFile name "foo\r\nbar"
           Utf8.readFile name `shouldReturn` "foo\nbar"
 
-  describe "writeFile" $ do
+  describe "ensureFile" $ do
     it "uses system specific newline encoding" $ do
       inTempDirectory $ do
         let
@@ -28,5 +28,5 @@
         writeFile name c
         systemSpecific <- B.readFile name
 
-        Utf8.writeFile name c
+        Utf8.ensureFile name c
         B.readFile name `shouldReturn` systemSpecific
diff --git a/test/HpackSpec.hs b/test/HpackSpec.hs
--- a/test/HpackSpec.hs
+++ b/test/HpackSpec.hs
@@ -12,7 +12,7 @@
 import           Hpack.Config
 import           Hpack.CabalFile
 import           Hpack.Error (formatHpackError)
-import           Hpack hiding (hpack)
+import           Hpack
 
 readFile :: FilePath -> IO String
 readFile name = Prelude.readFile name >>= (return $!!)
@@ -52,7 +52,7 @@
     it "is inverse to readCabalFile" $ do
       expected <- lines <$> readFile "resources/test/hpack.cabal"
       Just c <- readCabalFile "resources/test/hpack.cabal"
-      renderCabalFile "package.yaml" c `shouldBe` expected
+      renderCabalFile "package.yaml" c {cabalFileGitConflictMarkers = ()} `shouldBe` expected
 
   describe "hpackResult" $ around_ inTempDirectory $ before_ (writeFile packageConfig "name: foo") $ do
     let
@@ -155,3 +155,26 @@
           old <- readFile file
           hpackWithVersion [0,20,0] `shouldReturn` outputUnchanged
           readFile file `shouldReturn` old
+
+      context "with git conflict markers" $ do
+        context "when the new and the existing .cabal file are essentially the same" $ do
+          it "still removes the conflict markers" $ do
+            writeFile file $ unlines [
+                "--"
+              , "name: foo"
+              ]
+            hpack NoVerbose defaultOptions {optionsForce = Force}
+            old <- readFile file
+            let
+              modified :: String
+              modified = unlines $ case break (== "version: 0.0.0") $ lines old of
+                (xs, v : ys)  -> xs ++
+                  "<<<<<<< ours" :
+                  v :
+                  "=======" :
+                  "version: 0.1.0" :
+                  ">>>>>>> theirs" : ys
+                _ -> undefined
+            writeFile file modified
+            hpack NoVerbose defaultOptions
+            readFile file `shouldReturn` old
