diff --git a/Main.hs b/Main.hs
--- a/Main.hs
+++ b/Main.hs
@@ -5,14 +5,21 @@
 import System.Directory.Tools (doesNotExistOrOldThan)
 import System.Process         (runProcess, waitForProcess)
 import System.FilePath        (takeDirectory, takeFileName)
+import System.Exit            (ExitCode(ExitSuccess), exitWith)
+import Control.Monad          (when)
 import Control.Monad.Tools    (whenM, unlessM, skipRet)
 import Control.Applicative    ((<$>))
 import Text.RegexPR           (gsubRegexPR)
 import Text.ParserCombinators.MTLParse
+                              (Parse, runParse, ParseT, evalParseT,
+			       spot, token, tokenBack, tokens, parseNot,
+			       still, greedyList, list, neList, greedyNeList,
+			       mplus, endOfInput, lift)
 import YJTools.Tribial        (ghcMake)
 import Data.Char              (isSpace)
-import Data.Maybe             (maybeToList)
 import Data.Function.Tools    (applyUnless)
+import Prelude hiding         (readFile, writeFile)
+import System.IO.UTF8         (readFile, writeFile)
 
 ehaskellDir, haskellSffx, ehsHandleStr, putStrStr :: String
 ehaskellDir  = "_ehs/"
@@ -35,11 +42,15 @@
   copyRequiredFile edir cont
   whenM   (doesNotExistOrOldThan srcFile infile)  $
     writeFile srcFile $ fst $ head $ runParse parseAll ("", cont)
-  whenM (doesNotExistOrOldThan exeFile srcFile) $
-    ghcMake exeName edir >> return ()
-  runProcess exeFile (maybeToList outfile) Nothing Nothing Nothing Nothing Nothing
-    >>= waitForProcess
-  return ()
+  whenM (doesNotExistOrOldThan exeFile srcFile) $ do
+    ec <- ghcMake exeName edir
+    when (ec /= ExitSuccess) $ exitWith ec
+  case outfile of
+       Nothing -> do runProcess exeFile [] Nothing Nothing Nothing Nothing Nothing >>= waitForProcess
+                     return ()
+       Just fn -> whenM (doesNotExistOrOldThan fn exeFile) $ do
+                     runProcess exeFile [fn] Nothing Nothing Nothing Nothing Nothing >>= waitForProcess
+		     return ()
 
 copyRequiredFile :: FilePath -> String -> IO ()
 copyRequiredFile dir src = evalParseT (copyRequiredFileParse dir) ("",src) >> return ()
@@ -78,7 +89,7 @@
                                          :: Parse Char (Bool, String)
 parseApplyBegin, parseApplyContinue, parseApplyEnd
                                          :: Parse Char String
-mkOutputText, mkOutputHere,
+mkOutputText, mkOutputTop, mkOutputHere,
   mkOutputCode, mkOutputShowCode, mkOutputReturnCode, mkOutputReturnShowCode
                                          :: String -> String
 getHandleStr                             :: String
@@ -86,7 +97,8 @@
 parseAll
   = ( myConcat . ((False, "main = do {\n"++getHandleStr):)
                . (++[(False, "  hClose " ++ ehsHandleStr ++ " }\n")])
-	       . ((True, "import System.IO (stdout, hPutStr, openFile, IOMode(WriteMode), hClose)\n"):)
+	       . ((True, "import System.IO (stdout, openFile, IOMode(WriteMode), hClose)\n"):)
+	       . ((True, "import System.IO.UTF8 (hPutStr)\n"):)
 	       . ((True, "import System.Environment (getArgs)\n"):) )
         <$> parse >>= endOfInput
 
@@ -158,7 +170,7 @@
   tokens "<%%"
   code <- parseInner
   tokens "%%>"
-  return $ (True, code ++ ";\n")
+  return $ (True, mkOutputTop code)
 
 parseApply = do
   b  <- parseApplyBegin
@@ -197,7 +209,8 @@
     spot (const True)
 
 mkOutputText txt            = "  " ++ putStrStr ++ " $ " ++ show txt ++ ";\n"
-mkOutputHere code           = "  (" ++ code ++ ")" ++ ";\n"
+mkOutputTop code            =          code ++ ";\n"
+mkOutputHere code           = "  "  ++ code ++ ";\n"
 mkOutputCode code           = "  (" ++ code ++ ") >>= " ++ putStrStr ++ ";\n"
 mkOutputShowCode code       = "  (" ++ code ++ ") >>= " ++ putStrStr ++ ". show ;\n"
 mkOutputReturnCode code     = "  " ++ putStrStr ++ " $ (" ++ code ++ ") ;\n"
diff --git a/ehaskell.cabal b/ehaskell.cabal
--- a/ehaskell.cabal
+++ b/ehaskell.cabal
@@ -1,5 +1,5 @@
 Name:		ehaskell
-Version:	0.3
+Version:	0.4
 Cabal-Version:	>= 1.2
 Build-Type:	Simple
 License:	GPL
@@ -44,5 +44,5 @@
 
 Executable ehs
   Main-Is:		Main.hs
-  Build-Depends:	base, mtlparse >= 0.0.1, yjtools >= 0.8, directory, regexpr >= 0.3.3, process, filepath
+  Build-Depends:	base, mtlparse >= 0.0.1, yjtools >= 0.8, directory, regexpr >= 0.3.3, process, filepath, utf8-string
   GHC-Options:		-Wall
