diff --git a/Main.hs b/Main.hs
--- a/Main.hs
+++ b/Main.hs
@@ -2,12 +2,14 @@
 
 import CommandArgs
 import Control.Monad (liftM, when)
+import Control.Applicative ( (<|>) )
 import Data.List
 import Data.Maybe
 import Prelude hiding (getContents)
 import System.FilePath
 import System.IO (withFile, IOMode (ReadMode, WriteMode), hPutStr, hPutStrLn, stdout)
 import System.IO.Strict
+import Text.HPaco.Reader (Reader)
 import Text.HPaco.Readers.Paco
 import Text.HPaco.Optimizer
 import Text.HPaco.Writer as W
@@ -22,7 +24,7 @@
     argStruct <- parseArgs
     let optimizationLevel = caOptimizationLevel argStruct
     when (optimizationLevel > 1) $
-        hPutStrLn stdout $ "Warning: Optimization level " ++ show optimizationLevel ++ " requested, using 1 instead"
+        putStrLn $ "Warning: Optimization level " ++ show optimizationLevel ++ " requested, using 1 instead"
     let filenames = caInputFiles argStruct
 
     if null filenames
@@ -47,7 +49,7 @@
 
 process :: CommandArgs -> String -> FilePath -> String -> IO String
 process cmdargs templateName filename src = do
-    let reader = readPaco filename
+    let reader = getReader cmdargs filename filename
         write = getWriter cmdargs templateName
         rundata = caRunData cmdargs
         pre = "{%with " ++ rundata ++ " %}\n"
@@ -62,11 +64,11 @@
     ast <- reader src'
     case caOutputFormat cmdargs of
         RunInterpreted -> runInterpreted (opt ast) cmdargs templateName >> return "\n"
-        ListDependencies -> return . (getWriter cmdargs filename) $ ast
+        ListDependencies -> return . getWriter cmdargs filename $ ast
         otherwise -> return . write . opt $ ast
     where runInterpreted ast cmdargs templateName =
             let opts = Run.defaultOptions
-                        { Run.roTemplateName = templateName `fromMaybe` (caTemplateName cmdargs)
+                        { Run.roTemplateName = templateName `fromMaybe` caTemplateName cmdargs
                         }
             in Run.run opts ast
 
@@ -77,6 +79,27 @@
 outputFormatExtension RunInterpreted = ""
 outputFormatExtension ListDependencies = "dep"
 
+getReader :: CommandArgs -> FilePath -> Reader
+getReader cmdargs filePath =
+    case getEffectiveInputLanguage cmdargs filePath of
+        Paco -> readPaco
+        Capo -> readCapo
+
+getEffectiveInputLanguage :: CommandArgs -> FilePath -> InputLanguage
+getEffectiveInputLanguage cmdargs filePath =
+    let Just effectiveInputLanguage =
+            caInputLanguage cmdargs
+            <|> inputLanguageFromFilename filePath
+            <|> Just Paco
+    in effectiveInputLanguage
+    
+inputLanguageFromFilename :: FilePath -> Maybe InputLanguage
+inputLanguageFromFilename fn =
+    case takeExtension fn of
+        ".paco" -> Just Paco
+        ".capo" -> Just Capo
+        otherwise -> Nothing
+
 getWriter :: CommandArgs -> String -> Writer
 getWriter cmdargs templateName =
     go (caOutputFormat cmdargs) cmdargs templateName
@@ -89,15 +112,18 @@
             JsonLisp.writeJsonLisp
         go OutputJavascript cmdargs templateName =
             JS.writeJavascript $ JS.defJsWriterOptions
-                                    { woPrettyPrint = caJsPretty cmdargs
-                                    , woTemplateName = templateName `fromMaybe` (caTemplateName cmdargs)
-                                    , woWrapMode = caJsWrapMode cmdargs
+                                    { woPrettyPrint = caPretty cmdargs
+                                    , woTemplateName = templateName `fromMaybe` caTemplateName cmdargs
+                                    , woIncludePreamble = not . caNoPreamble $ cmdargs
+                                    , woWrapMode = caWrapMode cmdargs
+                                    , woSourcePositionComments = caSourcePositions cmdargs
                                     }
         go OutputPHP cmdargs templateName =
             PHP.writePHP $ PHP.defPHPWriterOptions
-                                { woPrettyPrint = caPhpPretty cmdargs
-                                , woTemplateName = templateName `fromMaybe` (caTemplateName cmdargs)
-                                , woIncludePreamble = not . caPhpNoPreamble $ cmdargs
-                                , woWrapMode = caPhpWrapMode cmdargs
+                                { woPrettyPrint = caPretty cmdargs
+                                , woTemplateName = templateName `fromMaybe` caTemplateName cmdargs
+                                , woIncludePreamble = not . caNoPreamble $ cmdargs
+                                , woWrapMode = caWrapMode cmdargs
                                 , woExposeAllFunctions = caPhpExposeAllFunctions cmdargs
+                                , woSourcePositionComments = caSourcePositions cmdargs
                                 }
diff --git a/hpaco.cabal b/hpaco.cabal
--- a/hpaco.cabal
+++ b/hpaco.cabal
@@ -1,5 +1,5 @@
 name:                hpaco
-version:             0.16.2.0
+version:             0.18.0.0
 synopsis:            Modular template compiler
 description:         CLI front-end to the hpaco-lib library. Compiles Paco
                      template source code to JavaScript or PHP, or interprets
@@ -20,7 +20,7 @@
   build-depends:       base == 4.*
                ,       filepath >= 1.1 && < 1.4
                ,       cmdargs >= 0.9 && < 0.10
-               , hpaco-lib == 0.16.2.0
+               , hpaco-lib == 0.18.0.0
                ,       strict == 0.3.*
                -- ,       split >= 0.1 && < 0.2
                -- ,       safe >= 0.3.3 && < 0.4
