diff --git a/dow.cabal b/dow.cabal
--- a/dow.cabal
+++ b/dow.cabal
@@ -1,5 +1,5 @@
 Name:                dow
-Version:             0.2.1
+Version:             0.2.2
 Cabal-Version:       >= 1.2
 Synopsis:            Dungeons of Wor
 Category:            game, reactivity, FRP
@@ -41,8 +41,7 @@
   data/sprites.txt
 
 Executable dow
-  Executable:        dow
   HS-Source-Dirs:    src
   Main-IS:           Main.hs
-  Build-Depends:     base >= 4 && < 5, elerea >= 2.0.0, OpenGL >= 2.4, GLFW >= 0.4, array, mtl, directory
+  Build-Depends:     base >= 4 && < 5, elerea >= 2.0.0, OpenGL >= 2.4, GLFW >= 0.4, array, directory
   GHC-Options:       -O2 -fno-warn-deprecated-flags
diff --git a/src/Level.hs b/src/Level.hs
--- a/src/Level.hs
+++ b/src/Level.hs
@@ -1,6 +1,6 @@
 module Level where
 
-import Control.Monad.Error
+import Control.Monad
 import Data.Array
 import Data.List
 
@@ -53,7 +53,7 @@
 isVertical South = True
 isVertical _     = False
 
-parseLevel :: [String] -> Either String (Level,[String])
+parseLevel :: [String] -> Maybe (Level,[String])
 parseLevel lines = do
   let lines' = dropWhile null lines
       nameLine = head lines'
@@ -81,8 +81,9 @@
          (d,f) <- [(North,head),(South,last),(West,map head),(East,map last)],
          i <- findIndices (`elem` chars) (f lines)]
 
-  when (null lines' || length mazeLines < 3) $ fail "Nothing to parse"
-  when (head nameLine /= '"') $ fail "Missing level name"
+  guard $ not (null lines')
+  guard $ length mazeLines > 2
+  guard $ head nameLine == '"'
 
   return (Level { levelName = takeWhile (/= '"') (tail nameLine)
                 , levelSize = (width,height)
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -4,6 +4,7 @@
 import Control.Monad
 import Control.Monad.Fix
 import Data.IORef
+import Data.List
 import FRP.Elerea.Simple
 import Graphics.UI.GLFW
 import Graphics.Rendering.OpenGL
@@ -65,14 +66,7 @@
 
   closeWindow
 
-loadLevels file = do
-  dat <- lines <$> readFile file
-  let levels = parseLevels dat
-      parseLevels dat = case parseLevel dat of
-        Left _ -> []
-        Right (l,dat') -> l : parseLevels dat'
-
-  return levels
+loadLevels file = unfoldr parseLevel . lines <$> readFile file
 
 loadSprites file = do
   dat <- lines <$> readFile file
