diff --git a/Distribution/ParseUtils.hs b/Distribution/ParseUtils.hs
index 0eb95d9b240548a2e0eba8a092d24e526b9338db..234fc296e2e0f56e0d2521a57995aa287c4a6ba2 100644
--- a/Distribution/ParseUtils.hs
+++ b/Distribution/ParseUtils.hs
@@ -76,7 +76,8 @@ import Distribution.Compat.ReadP as ReadP hiding (get)
 import Distribution.ReadE
 import Distribution.Text
          ( Text(..) )
-import Distribution.Simple.Utils (intercalate, lowercase)
+import Distribution.Simple.Utils
+         ( intercalate, lowercase, normaliseLineEndings )
 import Language.Haskell.Extension (Extension)
 
 import Text.PrettyPrint.HughesPJ hiding (braces)
@@ -428,13 +429,6 @@ trimLeading  = dropWhile isSpace
 trimTrailing = reverse . dropWhile isSpace . reverse
 
 
--- | Fix different systems silly line ending conventions
-normaliseLineEndings :: String -> String
-normaliseLineEndings [] = []
-normaliseLineEndings ('\r':'\n':s) = '\n' : normaliseLineEndings s -- windows
-normaliseLineEndings ('\r':s)      = '\n' : normaliseLineEndings s -- old osx
-normaliseLineEndings (  c :s)      =   c  : normaliseLineEndings s
-
 type SyntaxTree = Tree (LineNo, HasTabs, String)
 
 -- | Parse the stream of tokens into a tree of them, based on indent \/ layout
diff --git a/Distribution/Simple/Program/HcPkg.hs b/Distribution/Simple/Program/HcPkg.hs
index 04593c3b7e7731decdbff5cc82822cb3c1f10aeb..c845a7a069957276dddddea25029bdb7c3068752 100644
--- a/Distribution/Simple/Program/HcPkg.hs
+++ b/Distribution/Simple/Program/HcPkg.hs
@@ -132,6 +132,8 @@ dump verbosity hcPkg packagedb = do
             []   -> Left [ pkg | ParseOk _ pkg <- parsed ]
             msgs -> Right msgs
 
+    --TODO: this could be a lot faster. We're doing normaliseLineEndings twice
+    -- and converting back and forth with lines/unlines.
     splitPkgs :: String -> [String]
     splitPkgs = map unlines . splitWith ("---" ==) . lines
       where
diff --git a/Distribution/Simple/Program/Run.hs b/Distribution/Simple/Program/Run.hs
index 3279a40f7ab8631b6145258a99160e01e9144408..5e93f93faa215a694c89b4726914340c24b12ed8 100644
--- a/Distribution/Simple/Program/Run.hs
+++ b/Distribution/Simple/Program/Run.hs
@@ -26,7 +26,7 @@ import Distribution.Simple.Program.Types
          ( ConfiguredProgram(..), programPath )
 import Distribution.Simple.Utils
          ( die, rawSystemExit, rawSystemStdInOut
-         , toUTF8, fromUTF8 )
+         , toUTF8, fromUTF8, normaliseLineEndings )
 import Distribution.Verbosity
          ( Verbosity )
 
@@ -129,12 +129,14 @@ getProgramInvocationOutput verbosity
     progInvokeOutputEncoding = encoding
   } = do
   let utf8 = case encoding of IOEncodingUTF8 -> True; _ -> False
+      decode | utf8      = fromUTF8 . normaliseLineEndings
+             | otherwise = id
   (output, errors, exitCode) <- rawSystemStdInOut verbosity
                                   path args
                                   Nothing utf8
   when (exitCode /= ExitSuccess) $
     die errors
-  return (if utf8 then fromUTF8 output else output)
+  return (decode output)
 
 
 getProgramInvocationOutput _ _ =
diff --git a/Distribution/Simple/Utils.hs b/Distribution/Simple/Utils.hs
index c95e787019d7eb860336af5837af1a2085ae1d7f..2338b167b75d86398ea3abb76a1c69c6d49ac1a4 100644
--- a/Distribution/Simple/Utils.hs
+++ b/Distribution/Simple/Utils.hs
@@ -117,6 +117,7 @@ module Distribution.Simple.Utils (
         readUTF8File,
         withUTF8FileContents,
         writeUTF8File,
+        normaliseLineEndings,
 
         -- * generic utils
         equating,
@@ -1033,6 +1034,13 @@ withUTF8FileContents name action =
 writeUTF8File :: FilePath -> String -> IO ()
 writeUTF8File path = writeFileAtomic path . toUTF8
 
+-- | Fix different systems silly line ending conventions
+normaliseLineEndings :: String -> String
+normaliseLineEndings [] = []
+normaliseLineEndings ('\r':'\n':s) = '\n' : normaliseLineEndings s -- windows
+normaliseLineEndings ('\r':s)      = '\n' : normaliseLineEndings s -- old osx
+normaliseLineEndings (  c :s)      =   c  : normaliseLineEndings s
+
 -- ------------------------------------------------------------
 -- * Common utils
 -- ------------------------------------------------------------