diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -9,13 +9,22 @@
 import Text.Transf.Process
 
 main        = defaultMain' "transf" optDesc transf
-transf opts = haskellT <> musicT' (getMusicOpts opts) <> musicHaskellT' (getMusicOpts opts) <> musicExtraT
+transf opts = 
+  haskellT
+  <> printT
+  <> evalT
+  -- <> haskellT
+  <> evalHaskellT
+  <> musicT' (getMusicOpts opts) 
+  <> musicHaskellT' (getMusicOpts opts) 
+  <> musicExtraT
 
 
 data Opt
     = Format     String
     | Resolution Int
     | Resize     Int
+    | Prelude    String
 getFormat :: Opt -> Maybe String
 getFormat     (Format a)        = Just a
 getFormat     _                 = Nothing
@@ -23,21 +32,25 @@
 getResolution _                 = Nothing
 getResize     (Resize a)        = Just a
 getResize     _                 = Nothing
+getPrelude    (Prelude a)       = Just a
+getPrelude    _                 = Nothing
 
 firstJust :: [Maybe a] -> Maybe a
 firstJust = listToMaybe . catMaybes
 
 getMusicOpts :: [Opt] -> MusicOpts
 getMusicOpts xs = MusicOpts {
-        format     = fromMaybe (format def) $ firstJust $ fmap getFormat xs,
+        format     = fromMaybe (format def)     $ firstJust $ fmap getFormat xs,
         resolution = fromMaybe (resolution def) $ firstJust $ fmap getResolution xs,
-        resize     = fromMaybe (resize def) $ firstJust $ fmap getResize xs
+        resize     = fromMaybe (resize def)     $ firstJust $ fmap getResize xs,
+        prelude    = fromMaybe (prelude def)    $ firstJust $ fmap getPrelude xs
     }
 
 optDesc :: [OptDescr Opt]
 optDesc = [
-        Option [] ["format"]        (ReqArg Format "pdf|png|ps")     "Music output format",
-        Option [] ["resolution"]    (ReqArg (Resolution . read) "N") "Music resolution",
-        Option [] ["resize"]        (ReqArg (Resize . read) "N")     "Music resize factor"
+        Option [] ["format"]        (ReqArg Format "pdf|png|ps")      "Music output format",
+        Option [] ["resolution"]    (ReqArg (Resolution . read) "N")  "Music resolution",
+        Option [] ["resize"]        (ReqArg (Resize . read) "N")      "Music resize factor",
+        Option [] ["prelude"]       (ReqArg Prelude "<name>")         "Music prelude name"
     ]
 
diff --git a/src/Text/Transf.hs b/src/Text/Transf.hs
--- a/src/Text/Transf.hs
+++ b/src/Text/Transf.hs
@@ -42,6 +42,7 @@
         MusicOpts(..),
         musicT',
         haskellT,
+        evalHaskellT,
         musicHaskellT,
         musicHaskellT',
         musicExtraT,
@@ -319,19 +320,25 @@
 -- > The number is 6
 --
 evalT :: Transform
-evalT = transform "eval" $ \input -> evalWith ["Prelude"] input
+-- evalT = transform "eval" $ \input -> evalWith ["Prelude"] input
+evalT = transform "eval" $ \input -> do
+  (exit, out, err) <- liftIO $ readProcessWithExitCode "runhaskell2" [] input
+  inform err
+  return out
 
 -- TODO move to separate module and/or package
 
 data MusicOpts = MusicOpts {
         format     :: String,
         resolution :: Int,
-        resize     :: Int
+        resize     :: Int,
+        prelude    :: String
     }
 instance Default MusicOpts where def = MusicOpts {
         format     = "png",
         resolution = 200,
-        resize     = 45
+        resize     = 45,
+        prelude     = "basic"
     }
 
 -- |
@@ -349,6 +356,7 @@
 
 musicT' :: MusicOpts -> Transform
 musicT' opts = transform "music" $ \input -> do
+    let prel = prelude opts
     let name = showHex (abs $ hash input) ""
 
     {-
@@ -364,35 +372,37 @@
     -- Use music2... wrappers rather than hint
     -- Note that the use of readProcess will propagate error messages from stderr
     -- (including both parse and type errors).
-    
-    writeFile (name++".music") input
-    liftIO $ void $ readProcess "music2ly"   ["-o", name++".ly",  name++".music"] ""
-    liftIO $ void $ readProcess "music2midi" ["-o", name++".mid", name++".music"] ""
 
-    let makeLy = do
-        (exit, out, err) <- readProcessWithExitCode "lilypond" [
-            "-f", format opts, 
-            "-dresolution=" ++ show (resolution opts) ++ "", name++".ly"
-            ] mempty
-        hPutStr stderr out
-        hPutStr stderr err
-        return ()
+    currentFile <- liftIO $ tryMaybe $ Prelude.readFile (name++".music")
+    unless (currentFile == Just input) $ do
+      writeFile (name++".music") input
+      liftIO $ void $ readProcess "music2ly"   ["--prelude", prel, "-o", name++".ly",  name++".music"] ""
+      liftIO $ void $ readProcess "music2midi" ["--prelude", prel, "-o", name++".mid", name++".music"] ""
+
+      let makeLy = do
+          (exit, out, err) <- readProcessWithExitCode "lilypond" [
+              "-f", format opts, 
+              "-dresolution=" ++ show (resolution opts) ++ "", name++".ly"
+              ] mempty
+          hPutStr stderr out
+          hPutStr stderr err
+          return ()
     
-    let makePng = when (format opts == "png") $ void $ system $ 
-            "convert -transparent white -resize " 
-                ++ show (resize opts) ++"% "
-                ++ name ++".png "
-                ++ name ++ "x.png"
+      let makePng = when (format opts == "png") $ void $ system $ 
+              "convert -transparent white -resize " 
+                  ++ show (resize opts) ++"% "
+                  ++ name ++".png "
+                  ++ name ++ "x.png"
 
-    addPost (liftIO $ makeLy >> makePng)
+      addPost (liftIO $ makeLy >> makePng)
 
     -- let playText = ""
 
     -- Play generated MIDI file
-    let playText = "<div class='haskell-music-listen'><a href='"++name++".mid'>listen</a></div>"
+    let playText = "<div class='haskell-music-listen'><a href='"++name++".mid'>[listen]</a></div>"
     
     -- Play generated WAV file
-    -- let playText = "<div class='haskell-music-listen'><a href='"++name++".wav'>listen</a></div>"
+    -- let playText = "<div class='haskell-music-listen'><a href='"++name++".wav'>[listen]</a></div>"
 
     -- Use Web MIDI player
     -- let playText = "<div>" ++
@@ -453,7 +463,13 @@
     return $ begin ++ "\n\n" ++ musicRes ++ "\n\n" ++ haskellRes ++ "\n\n" ++ end
 
 
+evalHaskellT :: Transform
+evalHaskellT = transform "eval+haskell" $ \input -> do
+    evalRes    <- doTrans evalT input
+    haskellRes <- doTrans haskellT input
+    return $ "\n\n" ++ evalRes ++ "\n\n" ++ haskellRes ++ "\n\n"
 
+
 ----------------------------------------------------------------------------------------------------
 
 -- | Separate the sections delimited by the separators from their context. Returns
@@ -504,3 +520,12 @@
     in foldb f z as `f` foldb f z bs
     where
         split xs = (take n xs, drop n xs) where n = length xs `div` 2
+
+
+tryMaybe :: IO a -> IO (Maybe a)
+tryMaybe action = do
+  r <- try action
+  return $ case r of
+    Left e  -> let e' = (e::SomeException) in Nothing
+    Right x -> Just x
+
diff --git a/transf.cabal b/transf.cabal
--- a/transf.cabal
+++ b/transf.cabal
@@ -1,6 +1,6 @@
 
 name:               transf
-version:            0.12
+version:            0.13
 cabal-version:      >= 1.6
 author:             Hans Hoglund
 maintainer:         Hans Hoglund <hans@hanshoglund.se>
