diff --git a/Server.hs b/Server.hs
--- a/Server.hs
+++ b/Server.hs
@@ -3,37 +3,45 @@
 
 import Control.Monad (msum,guard)
 import Control.Monad.Trans (MonadIO(liftIO))
-import Data.List (isPrefixOf, isSuffixOf)
+import Data.List (isPrefixOf, isSuffixOf, (\\))
 import Data.Version (showVersion)
 import Happstack.Server
 import Happstack.Server.Compression
+import System.Directory
 import System.Environment
 import System.FilePath
+import System.Process
 import qualified Language.Elm as Elm
 import Paths_elm_server
 
-runtime = "/elm-" ++ showVersion version ++ ".js"
+runtime = "/elm-runtime.js"
 
-serve :: String -> IO ()
-serve libLoc = do
-  putStrLn ("Elm Server " ++ showVersion version ++
-            ": running at <http://localhost:8000>")
+serve :: Int -> String -> IO ()
+serve portNumber libLoc = do
+  putStrLn $ "Elm Server " ++ showVersion version ++
+             ": running at <http://localhost:" ++ show portNumber ++ ">"
   putStrLn "Just refresh a page to recompile it!"
-  simpleHTTP nullConf $ do
+  simpleHTTP httpConf $ do
          _ <- compressedResponseFilter
          msum [ uriRest serveElm
               , uriRest (serveLib libLoc)
               , serveDirectory EnableBrowsing [] "."
               ]
+  where httpConf = nullConf { port = portNumber }
 
 pageTitle :: String -> String
 pageTitle = dropExtension . takeBaseName
 
+serveElm :: FilePath -> ServerPartT IO Response
 serveElm fp = do
   guard (takeExtension fp == ".elm")
-  content <- liftIO (readFile (tail fp))
-  ok . toResponse $ Elm.toHtml runtime (pageTitle fp) content
+  let file = tail fp
+  liftIO $ rawSystem "elm" [ "--make" ,"--runtime=" ++ runtime
+                           , "--cache-dir=elm-server-cache", file ]
+  liftIO $ removeDirectoryRecursive "elm-server-cache"
+  serveFile (asContentType "text/html") ("build" </> replaceExtension file "html")
 
+serveLib :: FilePath -> [Char] -> ServerPartT IO Response
 serveLib libLoc fp = do
   guard (fp == runtime)
   serveFile (asContentType "application/javascript") libLoc
@@ -44,13 +52,19 @@
 parse :: [String] -> IO ()
 parse ("--help":_) = putStrLn usage
 parse ("--version":_) = putStrLn ("The Elm Server " ++ showVersion version)
-parse [] = serve =<< Elm.runtime
-parse [arg]
-    | "--runtime-location=" `isPrefixOf` arg =
-        serve . tail $ dropWhile (/='=') arg
-    | otherwise = putStrLn usageMini
-parse _ = putStrLn usageMini
+parse args =
+  case null remainingArgs of
+    True -> serve portNumber =<< elmRuntime
+    False -> putStrLn usageMini
+  where
+    runtimeArg = filter (isPrefixOf "--runtime-location=") args
+    portArg = filter (isPrefixOf "--port=") args
+    remainingArgs = (args \\ runtimeArg) \\ portArg
 
+    argValue arg = tail $ dropWhile (/= '=') (head arg)
+    portNumber = if null portArg then 8000 else read (argValue portArg) :: Int
+    elmRuntime = if null runtimeArg then Elm.runtime else return $ argValue runtimeArg
+
 usageMini :: String
 usageMini =
   "Usage: elm-server [OPTIONS]\n\
@@ -61,6 +75,9 @@
   "Usage: elm-server [OPTIONS]\n\
   \Compiles and serves .elm files from the current directory.\n\
   \Example: elm-server\n\
+  \\n\
+  \Server configuration:\n\
+  \  --port               set the port to listen on (default: 8000)\n\
   \\n\
   \Resource Locations:\n\
   \  --runtime-location   set the location of the Elm runtime\n\
diff --git a/elm-server.cabal b/elm-server.cabal
--- a/elm-server.cabal
+++ b/elm-server.cabal
@@ -1,5 +1,5 @@
 Name:                elm-server
-Version:             0.8
+Version:             0.9
 Synopsis:            The Elm language server.
 Description:         This package provides a standalone, Happstack-based Elm server.
 
@@ -27,12 +27,14 @@
   Main-is:             Server.hs
   Build-depends:       base >=4.2 && <5,
                        containers >= 0.3,
+                       directory,
                        transformers >= 0.2,
                        mtl >= 2,
                        parsec >= 3.1.1,
                        blaze-html >= 0.5.1,
                        HTTP >= 4000,
-                       happstack-server == 7.1.1 || == 7.1.7 || == 7.0.2,
+                       happstack-server,
                        deepseq,
                        filepath,
-                       Elm >= 0.8
+                       Elm >= 0.9.0.1,
+                       process
