diff --git a/haskellscrabble.cabal b/haskellscrabble.cabal
--- a/haskellscrabble.cabal
+++ b/haskellscrabble.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                haskellscrabble
-version:             1.2.2
+version:             1.3.2
 synopsis:            A scrabble library capturing the core game logic of scrabble.
 description:         A scrabble library which enforces legal transitions between moves. Intended to facilitate the development of a playable game.
 homepage:            http://www.github.com/happy0/haskellscrabble
diff --git a/src/Wordify/Rules/Board.hs b/src/Wordify/Rules/Board.hs
--- a/src/Wordify/Rules/Board.hs
+++ b/src/Wordify/Rules/Board.hs
@@ -3,6 +3,7 @@
                            allSquares,
                            placeTile,
                            occupiedSquareAt,
+                           emptySquaresFrom,
                            lettersAbove,
                            lettersBelow,
                            lettersLeft,
@@ -20,7 +21,8 @@
   import Wordify.Rules.Board.Internal
   import Control.Applicative
   import Data.List.Split
-  import Data.List
+  import qualified Data.List as L
+  import Data.Foldable as F
 
   instance Show Board where
     show = prettyPrint
@@ -70,17 +72,31 @@
   lettersRight :: Board -> Pos -> Seq (Pos,Square)
   lettersRight board pos = walkFrom board pos right
 
+  {- | Finds the empty square positions horizontally or vertically from a given position,
+       skipping any squares that are occupied by a tile
+  -}
+  emptySquaresFrom :: Board -> Pos -> Int -> Direction -> [Pos]
+  emptySquaresFrom board startPos numSquares direction =
+    let changing = [constant .. 15]
+    in  L.take numSquares $ 
+            L.filter (isJust . unoccupiedSquareAt board) $
+                 mapMaybe posAt $ zipDirection (repeat constant) changing
+    where
+        constant = if direction == Horizontal then yPos startPos else xPos startPos
+        zipDirection = if (direction == Horizontal) then flip L.zip else L.zip
+     
+
   {- | Pretty prints a board to a human readable string representation. Helpful for development. -}
   prettyPrint :: Board -> String
   prettyPrint board = rowsWithLabels ++ columnLabelSeparator ++ columnLabels
     where
-      rows = transpose . chunksOf 15 . map (squareToString . snd) . allSquares
+      rows = L.transpose . chunksOf 15 . map (squareToString . snd) . allSquares
       rowsWithLabels = concatMap (\(rowNo, row) -> (rowStr rowNo) ++ concat row ++ "\n") . Prelude.zip [1 .. ] $ (rows board)
 
       rowStr :: Int -> String
       rowStr number = if number < 10 then ((show number) ++ " | ") else (show number) ++ "| "
       columnLabelSeparator = "  " ++ (Prelude.take (15 * 5) $ repeat '-') ++ "\n"
-      columnLabels = "      " ++ (concat $ Prelude.take (15 * 2) . intersperse "    " . map ( : []) $ ['A' .. ])
+      columnLabels = "      " ++ (concat $ Prelude.take (15 * 2) . L.intersperse "    " . map ( : []) $ ['A' .. ])
 
       squareToString square = 
         case (tileIfOccupied square) of
diff --git a/src/Wordify/Rules/FormedWord.hs b/src/Wordify/Rules/FormedWord.hs
--- a/src/Wordify/Rules/FormedWord.hs
+++ b/src/Wordify/Rules/FormedWord.hs
@@ -39,7 +39,6 @@
                                   
   type FormedWord = Seq (Pos, Square)
   type PlacedSquares = Map Pos Square
-  data Direction = Horizontal | Vertical deriving Eq
 
   {- |
     Pretty prints the places a given formed word intersects with letters that were already on the board
diff --git a/src/Wordify/Rules/LetterBag.hs b/src/Wordify/Rules/LetterBag.hs
--- a/src/Wordify/Rules/LetterBag.hs
+++ b/src/Wordify/Rules/LetterBag.hs
@@ -3,6 +3,7 @@
                                 tiles,
                                 bagFromTiles, 
                                 makeBagUsingGenerator,
+                                bagLetters,
                                 takeLetters,
                                 exchangeLetters,
                                 shuffleBag,
@@ -18,13 +19,14 @@
 import Wordify.Rules.ScrabbleError
 import Text.ParserCombinators.Parsec
 import Data.Char
+import qualified Data.Map as M
 import Wordify.Rules.LetterBag.Internal
 import System.IO
 import Data.Array.ST
 import Control.Monad.ST
 import Data.STRef
-
-
+import qualified Data.Set as S
+import qualified Data.Maybe as Mb
 
 {- |
   Creates a letter bag from a file where each line contains a space delimited letter character, letter value, and letter distribution.
@@ -58,6 +60,21 @@
 -}
 bagFromTiles :: [Tile] -> IO LetterBag
 bagFromTiles bagTiles = newStdGen >>= return . LetterBag bagTiles (length bagTiles)
+
+{-|
+    Maps each letter in the letter bag to the tile for that letter.
+    Ignores blank letters. 
+ -}
+bagLetters :: LetterBag -> M.Map Char Tile
+bagLetters letterBag = 
+    let maybeLetters =  Mb.mapMaybe pairIfTileHasLetter $ tiles letterBag
+    in M.fromList maybeLetters
+    where
+        pairIfTileHasLetter :: Tile -> Maybe (Char, Tile)
+        pairIfTileHasLetter tile =
+            case (tileLetter tile) of
+                Just lettr -> Just (lettr, tile)
+                _ -> Nothing
 
 {- |
   Takes 'n' numbers from a letter bag, yielding 'Nothing'
diff --git a/src/Wordify/Rules/Pos.hs b/src/Wordify/Rules/Pos.hs
--- a/src/Wordify/Rules/Pos.hs
+++ b/src/Wordify/Rules/Pos.hs
@@ -1,5 +1,6 @@
 
 module Wordify.Rules.Pos (Pos,
+                          Direction(Horizontal, Vertical),
                           posAt,
                           above,
                           below,
@@ -15,6 +16,8 @@
   import qualified Data.Map as Map
   import Wordify.Rules.Pos.Internal
   import Data.Maybe
+
+  data Direction = Horizontal | Vertical deriving Eq
 
   posMin :: Int
   posMin = 1 
