diff --git a/Makefile b/Makefile
new file mode 100644
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,19 @@
+GHC=	ghc
+
+.PHONY:	all
+all:	cube
+
+cube:	Cube.hs CubeExpr.hs
+	$(GHC) --make -Wall Cube.hs -o cube
+
+CUBES=	misc.cube bool.cube pair.cube maybe.cube either.cube nat.cube natmisc.cube \
+	list.cube listmisc.cube unit.cube void.cube exists.cube
+
+.PHONY:	test
+test:	$(CUBES)
+	cube - $(CUBES) test.cube > test.out
+	cmp test.ok test.out && echo Test OK
+
+.PHONY:	clean
+clean:
+	rm -rf *.o *.hi *~ cube setup dist test.out
diff --git a/REPL.hs b/REPL.hs
new file mode 100644
--- /dev/null
+++ b/REPL.hs
@@ -0,0 +1,34 @@
+--
+-- Copyright (c) 2005 Lennart Augustsson
+-- See LICENSE for licensing details.
+--
+module REPL(REPL(..), repl) where
+import qualified Control.Exception
+import System.Console.Editline.Readline(readline, addHistory)
+
+data REPL s = REPL {
+    repl_init :: IO (String, s),                -- prompt and initial state
+    repl_eval :: s -> String -> IO (Bool, s),           -- quit flag and new state
+    repl_exit :: s -> IO ()
+    }
+
+repl :: REPL s -> IO ()
+repl p = do
+    (prompt, state) <- repl_init p
+    let loop s = (do
+            mline <- readline prompt
+            case mline of
+                Nothing -> loop s
+                Just line -> do
+                    (quit, s') <- repl_eval p s line
+                    if quit then
+                        repl_exit p s'
+                     else do
+                        addHistory line
+                        loop s'
+            ) `Control.Exception.catch` ( \ exc ->
+                do
+                    putStrLn $ "\nInterrupted (" ++ show exc ++ ")"
+                    loop s
+            )
+    loop state
diff --git a/lambdacube.cabal b/lambdacube.cabal
--- a/lambdacube.cabal
+++ b/lambdacube.cabal
@@ -1,5 +1,5 @@
 Name:		lambdacube
-Version:	2008.12.24
+Version:	2008.12.25
 License:	BSD3
 License-file:	LICENSE
 Author:		Lennart Augustsson <lennart@augustsson.net>
@@ -10,6 +10,8 @@
 Build-Depends:	base, pretty, mtl, editline
 Build-Type:	Simple
 Extra-source-files:
+		Makefile
+		test.ok
 		bool.cube
 		char.cube
 		either.cube
@@ -28,5 +30,5 @@
 
 Executable:	cube
 Main-Is:	Cube.hs
-Other-modules:	CubeExpr
+Other-modules:	CubeExpr REPL
 
diff --git a/test.ok b/test.ok
new file mode 100644
--- /dev/null
+++ b/test.ok
@@ -0,0 +1,6 @@
+Type:
+forall (Char :: *) .
+       Char->forall (listT :: *) . listT->(Char->listT->listT)->listT
+Value:
+\ (Char :: *) ('b' :: Char) (listT :: *) (nil :: listT)
+  (cons :: Char->listT->listT) -> cons 'b' (cons 'b' (cons 'b' nil))
