diff --git a/ghc-core.cabal b/ghc-core.cabal
--- a/ghc-core.cabal
+++ b/ghc-core.cabal
@@ -1,5 +1,5 @@
 name:           ghc-core
-version:        0.3.0.1
+version:        0.4
 license:        BSD3
 license-file:   LICENSE
 author:         Don Stewart
@@ -27,7 +27,7 @@
     build-depends:  base,
                     process,
                     pcre-light,
-                    hscolour ==1.9,
+                    hscolour >=1.10,
                     directory,
                     filepath
     main-is:        ghc-core.hs
diff --git a/ghc-core.hs b/ghc-core.hs
--- a/ghc-core.hs
+++ b/ghc-core.hs
@@ -94,6 +94,8 @@
         (_, _, es) -> ioError (userError (concat es ++ usageInfo header options))
     where header = "Usage: ghc-core [OPTION...] [--] [GHC_OPTION...] [files...]"
 
+isExtCoreFile :: FilePath -> Bool
+isExtCoreFile = (== ".hcr") . takeExtension
 ------------------------------------------------------------------------
 
 main :: IO ()
@@ -107,21 +109,25 @@
     mv <- getEnvMaybe "PAGER"
     let less = case mv of Just s -> case s of "less" -> "less -f" ; _ -> s
                           _      -> "less -f"
-
-    strs' <- polish `fmap` compileWithCore (optGhcExe opts) args
-    (strs,tmps) <- do
-        -- TODO this is a bit lazy on my part...
-        x <- readProcess "sh" ["-c","ls /tmp/ghc*/*.s | head -1"] []
-        case x of
-            Left _ -> return (strs', Nothing)
-            Right s -> if "-fvia-C" `elem` args
-                            then do asm <- readFile (init s)
-                                    return ((strs' ++ asm), Just $ takeDirectory s)
-                            else return (strs', Just $ takeDirectory s)
+ 
+    (strs, tmps) <- case args of
+                      [fp] | isExtCoreFile fp -> do
+                                contents <- readFile fp
+                                return (contents, Nothing)
+                      _ -> do
+                        strs' <- polish `fmap` compileWithCore (optGhcExe opts) args
+                    -- TODO this is a bit lazy on my part...
+                        x <- readProcess "sh" ["-c","ls /tmp/ghc*/*.s | head -1"] []
+                        case x of
+                          Left _ -> return (strs', Nothing)
+                          Right s -> if "-fvia-C" `elem` args
+                                       then do asm <- readFile (init s)
+                                               return ((strs' ++ asm), Just $ takeDirectory s)
+                                       else return (strs', Just $ takeDirectory s)
 
     let nice = hscolour
                 (optFormat opts)
-                colourPrefs False True False strs
+                colourPrefs False True False [] strs
 
     bracket
         (openTempFile "/tmp" "ghc-core-XXXX.hcr")
@@ -191,7 +197,7 @@
 compileWithCore ghc opts = do
     let args = words "-O2 -keep-tmp-files -ddump-simpl -ddump-asm -ddump-simpl-stats -no-recomp --make"
 
-    x <- readProcess ghc (opts ++ args) []
+    x <- readProcess ghc (args ++ opts) []
     case x of
          Left (err,str,std) -> do
             mapM_ putStrLn (lines str)
