diff --git a/lesson06.hs b/lesson06.hs
--- a/lesson06.hs
+++ b/lesson06.hs
@@ -14,8 +14,8 @@
 import Data.IORef ( IORef, newIORef, readIORef, writeIORef )
 import Foreign ( withForeignPtr, plusPtr, peek, alloca )
 import qualified Data.ByteString.Internal as BSI
-import System.Directory ( getCurrentDirectory, setCurrentDirectory )
 import Util ( Image(..), bitmapLoad )
+import Paths_nehe_tuts
 
 initGL :: IO GLuint
 initGL = do
@@ -30,7 +30,9 @@
 
 loadGLTextures :: IO GLuint
 loadGLTextures = do
-  Just (Image w h pd) <- bitmapLoad "Data/NeHe.bmp"
+  fp <- getDataFileName "NeHe.bmp"
+  putStrLn $ "loading texture: " ++ fp
+  Just (Image w h pd) <- bitmapLoad fp
   putStrLn $ "Image width  = " ++ show w
   putStrLn $ "Image height = " ++ show h
   tex <- alloca $ \p -> do
@@ -155,9 +157,7 @@
 
 main :: IO ()
 main = do
-     cd <- getCurrentDirectory
      True <- GLFW.initialize
-     setCurrentDirectory cd
      -- select type of display mode:
      -- Double buffer
      -- RGBA color
diff --git a/lesson07.hs b/lesson07.hs
--- a/lesson07.hs
+++ b/lesson07.hs
@@ -17,8 +17,8 @@
 import Foreign.Storable ( Storable )
 import Foreign.Marshal.Array ( newArray, allocaArray, peekArray )
 import qualified Data.ByteString.Internal as BSI
-import System.Directory ( getCurrentDirectory, setCurrentDirectory )
 import Util ( Image(..), bitmapLoad )
+import Paths_nehe_tuts
 
 newArray' :: Storable a => [a] -> IO (ForeignPtr a)
 newArray' xs = (newArray xs) >>= newForeignPtr_
@@ -47,7 +47,8 @@
 
 loadGLTextures :: IO [GLuint]
 loadGLTextures = do
-  Just (Image w h pd) <- bitmapLoad "Data/Crate.bmp"
+  fp <- getDataFileName "Crate.bmp"
+  Just (Image w h pd) <- bitmapLoad fp
   let numTextures = 3
   texs <- allocaArray numTextures $ \p -> do
             glGenTextures (fromIntegral numTextures) p
@@ -231,9 +232,7 @@
 
 main :: IO ()
 main = do
-     cd <- getCurrentDirectory
      True <- GLFW.initialize
-     setCurrentDirectory cd
      -- select type of display mode:
      -- Double buffer
      -- RGBA color
diff --git a/lesson08.hs b/lesson08.hs
--- a/lesson08.hs
+++ b/lesson08.hs
@@ -17,8 +17,8 @@
 import Foreign.Storable ( Storable )
 import Foreign.Marshal.Array ( newArray, allocaArray, peekArray )
 import qualified Data.ByteString.Internal as BSI
-import System.Directory ( getCurrentDirectory, setCurrentDirectory )
 import Util ( Image(..), bitmapLoad )
+import Paths_nehe_tuts
 
 newArray' :: Storable a => [a] -> IO (ForeignPtr a)
 newArray' xs = (newArray xs) >>= newForeignPtr_
@@ -48,7 +48,8 @@
 
 loadGLTextures :: IO [GLuint]
 loadGLTextures = do
-  Just (Image w h pd) <- bitmapLoad "Data/glass.bmp"
+  fp <- getDataFileName "glass.bmp"
+  Just (Image w h pd) <- bitmapLoad fp
   let numTextures = 3
   texs <- allocaArray numTextures $ \p -> do
             glGenTextures (fromIntegral numTextures) p
@@ -240,9 +241,7 @@
 
 main :: IO ()
 main = do
-     cd <- getCurrentDirectory
      True <- GLFW.initialize
-     setCurrentDirectory cd
      -- select type of display mode:
      -- Double buffer
      -- RGBA color
diff --git a/lesson09.hs b/lesson09.hs
--- a/lesson09.hs
+++ b/lesson09.hs
@@ -18,9 +18,9 @@
 import Foreign.Storable ( Storable )
 import Foreign.Marshal.Array ( newArray )
 import qualified Data.ByteString.Internal as BSI
-import System.Directory ( getCurrentDirectory, setCurrentDirectory )
 import Util ( Image(..), bitmapLoad )
 import System.Random ( getStdRandom, randomR )
+import Paths_nehe_tuts
 
 data Star = Star { starColor :: !(GLubyte, GLubyte, GLubyte)
                  , starDist  :: !GLfloat 
@@ -60,7 +60,8 @@
 
 loadGLTextures :: IO GLuint
 loadGLTextures = do
-  Just (Image w h pd) <- bitmapLoad "Data/Star.bmp"
+  fp <- getDataFileName "Star.bmp"
+  Just (Image w h pd) <- bitmapLoad fp
   tex <- alloca $ \p -> do
             glGenTextures 1 p
             peek p
@@ -185,9 +186,7 @@
 
 main :: IO ()
 main = do
-     cd <- getCurrentDirectory
      True <- GLFW.initialize
-     setCurrentDirectory cd
      -- select type of display mode:
      -- Double buffer
      -- RGBA color
diff --git a/lesson10.hs b/lesson10.hs
--- a/lesson10.hs
+++ b/lesson10.hs
@@ -16,9 +16,9 @@
 import Foreign.Storable ( Storable )
 import Foreign.Marshal.Array ( allocaArray, peekArray, newArray )
 import qualified Data.ByteString.Internal as BSI
-import System.Directory ( getCurrentDirectory, setCurrentDirectory )
 import Util ( Image(..), bitmapLoad )
 import Control.Monad ( when, forM_, forever )
+import Paths_nehe_tuts
 
 type Sector = [Tri]
 
@@ -78,14 +78,16 @@
 readRef r = r >>= readIORef
 
 setupWorld :: IO Sector
-setupWorld = do h <- openFile "Data/world.txt" ReadMode
-                ls <- (fmap (filter ignorable) ((fmap lines . hGetContents) h))
-                let numtris = read ((head . tail . words . head) ls)
-                let tris = readTris (tail ls)
-                when (length tris /= numtris) $ do
-                  putStrLn "error reading world.txt"
-                  exitWith (ExitFailure 1)
-                return tris
+setupWorld = do
+  fp <- getDataFileName "world.txt"
+  h  <- openFile fp ReadMode
+  ls <- (fmap (filter ignorable) ((fmap lines . hGetContents) h))
+  let numtris = read ((head . tail . words . head) ls)
+      tris    = readTris (tail ls)
+  when (length tris /= numtris) $ do
+    putStrLn "error reading world.txt"
+    exitWith (ExitFailure 1)
+  return tris
   where
   readTris :: [String] -> [Tri]
   readTris (l1:l2:l3:ls) = (Tri (readVert (words l1))
@@ -104,7 +106,7 @@
   ignorable ('/':'/':_) = False
   ignorable []          = False
   ignorable _           = True
-                
+
 initGL :: IO [GLuint]
 initGL = do
   glEnable gl_TEXTURE_2D
@@ -128,7 +130,8 @@
 
 loadTextures :: IO [GLuint]
 loadTextures = do
-  Just (Image w h pd) <- bitmapLoad "Data/mud.bmp"
+  fp <- getDataFileName "mud.bmp"
+  Just (Image w h pd) <- bitmapLoad fp
   let numTexs = 3 :: Int
   texs <- allocaArray (fromIntegral numTexs) $ \p -> do
     glGenTextures (fromIntegral numTexs) p
@@ -275,9 +278,7 @@
 
 main :: IO ()
 main = do
-     cd <- getCurrentDirectory
      True <- GLFW.initialize
-     setCurrentDirectory cd
      sector <- setupWorld
      -- select type of display mode:
      -- Double buffer
diff --git a/lesson11.hs b/lesson11.hs
--- a/lesson11.hs
+++ b/lesson11.hs
@@ -16,7 +16,7 @@
 import Util ( Image(..), bitmapLoad )
 import Data.Array.IO ( readArray, IOArray, newListArray )
 import Control.Applicative ( (<$>), (<*>) )
-import System.Directory ( getCurrentDirectory, setCurrentDirectory )
+import Paths_nehe_tuts
 
 type Points = IOArray (Int, Int, Int) GLfloat
 
@@ -38,7 +38,8 @@
 
 loadGLTextures :: IO GLuint
 loadGLTextures = do
-  Just (Image w h pd) <- bitmapLoad "Data/tim.bmp"
+  fp <- getDataFileName "tim.bmp"
+  Just (Image w h pd) <- bitmapLoad fp
   putStrLn $ "Image w = " ++ show w
   putStrLn $ "Image h = " ++ show h
   tex <- alloca $ \p -> do
@@ -138,9 +139,7 @@
 
 main :: IO ()
 main = do
-     cd <- getCurrentDirectory
      True <- GLFW.initialize
-     setCurrentDirectory cd
      -- select type of display mode:
      -- Double buffer
      -- RGBA color
diff --git a/lesson12.hs b/lesson12.hs
--- a/lesson12.hs
+++ b/lesson12.hs
@@ -15,7 +15,7 @@
 import Foreign ( withForeignPtr, plusPtr, alloca, peek )
 import qualified Data.ByteString.Internal as BSI
 import Util ( Image(..), bitmapLoad )
-import System.Directory ( getCurrentDirectory, setCurrentDirectory )
+import Paths_nehe_tuts
 
 boxcol :: [(GLfloat, GLfloat, GLfloat)]
 boxcol = [(1, 0, 0), (1, 0.5, 0), (1, 1, 0), 
@@ -83,7 +83,8 @@
 
 loadTextures :: IO GLuint
 loadTextures = do
-  Just (Image w h pd) <- bitmapLoad "Data/cube.bmp"
+  fp <- getDataFileName "cube.bmp"
+  Just (Image w h pd) <- bitmapLoad fp
   putStrLn $ "Image w = " ++ show w
   putStrLn $ "Image h = " ++ show h
   tex <- alloca $ \p -> do
@@ -154,9 +155,7 @@
 
 main :: IO ()
 main = do
-     cd <- getCurrentDirectory
      True <- GLFW.initialize
-     setCurrentDirectory cd
      -- select type of display mode:
      -- Double buffer
      -- RGBA color
diff --git a/nehe-tuts.cabal b/nehe-tuts.cabal
--- a/nehe-tuts.cabal
+++ b/nehe-tuts.cabal
@@ -1,5 +1,5 @@
 Name:   nehe-tuts
-Version: 0.2.1
+Version: 0.2.2
 Synopsis:   Port of the NeHe OpenGL tutorials to Haskell.
 Description:    Port of the NeHe OpenGL tutorials to Haskell; so far only lessons 1-12 have been ported.
 Author: Jason Dagit
@@ -9,7 +9,9 @@
 Category: Graphics
 Cabal-Version:  >= 1.8
 Build-type: Simple
-Extra-Source-Files: README, Data/Crate.bmp, Data/Star.bmp, Data/glass.bmp, Data/tim.bmp, Data/NeHe.bmp, Data/cube.bmp, Data/mud.bmp, Data/world.txt
+Extra-Source-Files: README
+data-dir: Data
+data-files: *.bmp, *.txt
 source-repository head
   type: git
   location: https://github.com/dagit/nehe-tuts
@@ -46,7 +48,7 @@
     GHC-Options: -Wall
 Executable lesson06
     Main-is: lesson06.hs
-    Other-modules: Util
+    Other-modules: Util, Paths_nehe_tuts
     Build-Depends: base >= 3 && < 5, OpenGLRaw == 1.1.*,
                    GLURaw == 1.1.*, GLFW-b == 0.0.*,
                    bytestring == 0.9.*, cereal == 0.3.*,
@@ -54,7 +56,7 @@
     GHC-Options: -Wall
 Executable lesson07
     Main-is: lesson07.hs
-    Other-modules: Util
+    Other-modules: Util, Paths_nehe_tuts
     Build-Depends: base >= 3 && < 5, OpenGLRaw == 1.1.*,
                    GLURaw == 1.1.*, GLFW-b == 0.0.*,
                    bytestring == 0.9.*, cereal == 0.3.*,
@@ -62,7 +64,7 @@
     GHC-Options: -Wall
 Executable lesson08
     Main-is: lesson08.hs
-    Other-modules: Util
+    Other-modules: Util, Paths_nehe_tuts
     Build-Depends: base >= 3 && < 5, OpenGLRaw == 1.1.*,
                    GLURaw == 1.1.*, GLFW-b == 0.0.*,
                    bytestring == 0.9.*, cereal == 0.3.*,
@@ -70,7 +72,7 @@
     GHC-Options: -Wall
 Executable lesson09
     Main-is: lesson09.hs
-    Other-modules: Util
+    Other-modules: Util, Paths_nehe_tuts
     Build-Depends: base >= 3 && < 5, OpenGLRaw == 1.1.*,
                    GLURaw == 1.1.*, GLFW-b == 0.0.*,
                    bytestring == 0.9.*, cereal == 0.3.*,
@@ -78,7 +80,7 @@
     GHC-Options: -Wall
 Executable lesson10
     Main-is: lesson10.hs
-    Other-modules: Util
+    Other-modules: Util, Paths_nehe_tuts
     Build-Depends: base >= 3 && < 5, OpenGLRaw == 1.1.*,
                    GLURaw == 1.1.*, GLFW-b == 0.0.*,
                    bytestring == 0.9.*, cereal == 0.3.*,
@@ -86,7 +88,7 @@
     GHC-Options: -Wall
 Executable lesson11
     Main-is: lesson11.hs
-    Other-modules: Util
+    Other-modules: Util, Paths_nehe_tuts
     Build-Depends: base >= 3 && < 5, OpenGLRaw == 1.1.*,
                    GLURaw == 1.1.*, GLFW-b == 0.0.*,
                    bytestring == 0.9.*, cereal == 0.3.*,
@@ -94,7 +96,7 @@
     GHC-Options: -Wall
 Executable lesson12
     Main-is: lesson12.hs
-    Other-modules: Util
+    Other-modules: Util, Paths_nehe_tuts
     Build-Depends: base >= 3 && < 5, OpenGLRaw == 1.1.*,
                    GLURaw == 1.1.*, GLFW-b == 0.0.*,
                    bytestring == 0.9.*, cereal == 0.3.*,
