diff --git a/spice.cabal b/spice.cabal
--- a/spice.cabal
+++ b/spice.cabal
@@ -1,5 +1,5 @@
 name:                spice
-version:             0.1.2.1
+version:             0.2.0.0
 synopsis:            An FRP-based game engine written in Haskell.
 description:         An FRP-based game engine written in Haskell. - See the homepage for more information.
 homepage:            http://github.com/crockeo/spice
@@ -13,17 +13,22 @@
 cabal-version:       >=1.10
 
 library
+  ghc-options:         -Wall -fno-warn-unused-do-bind
+
   exposed-modules:     FRP.Spice
-                       FRP.Spice.Config
+                       FRP.Spice.Graphics
+                       FRP.Spice.Math
+
+  other-modules:       FRP.Spice.Config
                        FRP.Spice.Engine
                        FRP.Spice.Engine.Driver
                        FRP.Spice.Engine.Network
                        FRP.Spice.Engine.RenderWrapper
                        FRP.Spice.Engine.RunInput
                        FRP.Spice.Game
-                       FRP.Spice.Graphics
                        FRP.Spice.Graphics.Color
                        FRP.Spice.Graphics.Geometry
+                       FRP.Spice.Graphics.Scene
                        FRP.Spice.Graphics.Utils
                        FRP.Spice.Input
                        FRP.Spice.Input.Keyboard
diff --git a/src/FRP/Spice/Config.hs b/src/FRP/Spice/Config.hs
--- a/src/FRP/Spice/Config.hs
+++ b/src/FRP/Spice/Config.hs
@@ -17,7 +17,6 @@
 data WindowConfig = WindowConfig { getWindowWidth      :: Int
                                  , getWindowHeight     :: Int
                                  , getWindowFullscreen :: Bool
-                                 , getWindowResizable  :: Bool
                                  , getWindowTitle      :: String
                                  }
   deriving (Eq, Show, Read)
@@ -35,7 +34,6 @@
 defaultWindowConfig = WindowConfig { getWindowWidth      = 640
                                    , getWindowHeight     = 480
                                    , getWindowFullscreen = False
-                                   , getWindowResizable  = False
                                    , getWindowTitle      = "Spice Application"
                                    }
 
diff --git a/src/FRP/Spice/Engine.hs b/src/FRP/Spice/Engine.hs
--- a/src/FRP/Spice/Engine.hs
+++ b/src/FRP/Spice/Engine.hs
@@ -2,7 +2,7 @@
   This module handles starting the engine. This is done via the use of the
   @'startEngine'@ function.
 -}
-module FRP.Spice.Engine where
+module FRP.Spice.Engine (startEngine) where
 
 --------------------
 -- Global Imports --
@@ -23,6 +23,25 @@
 ----------
 -- Code --
 
+-- Containing if the engine has been made before
+madeRef :: IO (IORef Bool)
+madeRef = newIORef False
+
+-- Making the size from a WindowConfig
+makeSize :: WindowConfig -> Size
+makeSize wc = Size (fromIntegral $ getWindowWidth wc) (fromIntegral $ getWindowHeight wc)
+
+-- Making the displaybits from a WindowConfig
+makeDisplayBits :: [DisplayBits]
+makeDisplayBits = [DisplayRGBBits 8 8 8, DisplayAlphaBits 8, DisplayDepthBits 24]
+
+-- Making the window mode from a WindowConfig
+makeWindowMode :: WindowConfig -> WindowMode
+makeWindowMode wc =
+  if getWindowFullscreen wc
+    then FullScreen
+    else Window
+
 {-|
   Starting the spice engine with the parameters prescribed in the
   @'WindowConfig'@. It updates and renders the @'Game'@ automatically so all
@@ -31,33 +50,41 @@
 -}
 startEngine :: Game a => WindowConfig -> a -> IO ()
 startEngine wc game = do
-  -- Opening the window
-  initialize
-  openWindow (Size 640 480) [DisplayRGBBits 8 8 8, DisplayAlphaBits 8, DisplayDepthBits 24] Window
+  made   <- madeRef
+  isMade <- readIORef made
+  if isMade
+    then error "You cannot run 'startEngine' more than once per program."
+    else do
+      writeIORef made True
 
-  -- Checking for the window being closed
-  closed <- newIORef False
-  windowCloseCallback $= do
-    writeIORef closed True
-    return True
+      -- Opening the window
+      initialize
+      openWindow (makeSize wc) makeDisplayBits (makeWindowMode wc)
+      windowTitle $= getWindowTitle wc
 
-  -- Getting an external of the game
-  (gameSignal, gameSink) <- external game
+      -- Checking for the window being closed
+      closed <- newIORef False
+      windowCloseCallback $= do
+        writeIORef closed True
+        return True
 
-  -- Getting the input container
-  ic <- makeInputContainer
+      -- Getting an external of the game
+      (gameSignal, gameSink) <- external game
 
-  -- Updating the input
-  mousePosCallback    $= makeMousePositionCallback ic
-  keyCallback         $= makeKeyboardCallback ic
-  mouseButtonCallback $= makeMouseCallback ic
+      -- Getting the input container
+      ic <- makeInputContainer
 
-  -- Creating the network
-  network <- makeNetwork (getInput ic) gameSignal gameSink
+      -- Updating the input
+      mousePosCallback    $= makeMousePositionCallback wc ic
+      keyCallback         $= makeKeyboardCallback ic
+      mouseButtonCallback $= makeMouseCallback ic
 
-  -- Driving the network
-  GLFW.time $= 0
-  driveNetwork network $ runInput closed
+      -- Creating the network
+      network <- makeNetwork (getInput ic) gameSignal gameSink
 
-  -- Closing the window, after all is said and done
-  closeWindow
+      -- Driving the network
+      GLFW.time $= 0
+      driveNetwork network $ runInput closed
+
+      -- Closing the window, after all is said and done
+      closeWindow
diff --git a/src/FRP/Spice/Engine/Network.hs b/src/FRP/Spice/Engine/Network.hs
--- a/src/FRP/Spice/Engine/Network.hs
+++ b/src/FRP/Spice/Engine/Network.hs
@@ -6,7 +6,6 @@
 
 --------------------
 -- Global Imports --
-import Control.Applicative
 import FRP.Elerea.Param
 
 -------------------
diff --git a/src/FRP/Spice/Engine/RenderWrapper.hs b/src/FRP/Spice/Engine/RenderWrapper.hs
--- a/src/FRP/Spice/Engine/RenderWrapper.hs
+++ b/src/FRP/Spice/Engine/RenderWrapper.hs
@@ -9,18 +9,23 @@
 import Graphics.Rendering.OpenGL
 import Graphics.UI.GLFW
 
+--------------------
+-- Global Imports --
+import FRP.Spice.Graphics.Scene
+
 ----------
 -- Code --
 
 {-|
   A function to be ran on a @'FRP.Spice.Game.Game'@'s render function to
-  provide a bit of a framework around it.
+  provide a bit of a framework around it. It runs @'clear'@ before the render
+  function, and @'flush'@ / @'swapBuffers'@ afterwards.
 -}
-renderWrapper :: IO () -> IO ()
-renderWrapper renderfn = do
+renderWrapper :: Scene -> IO ()
+renderWrapper scene = do
   clear [ColorBuffer]
 
-  renderfn
+  renderScene scene
 
   flush
   swapBuffers
diff --git a/src/FRP/Spice/Engine/RunInput.hs b/src/FRP/Spice/Engine/RunInput.hs
--- a/src/FRP/Spice/Engine/RunInput.hs
+++ b/src/FRP/Spice/Engine/RunInput.hs
@@ -10,10 +10,6 @@
 import Data.IORef
 import GHC.Float
 
--------------------
--- Local Imports --
-import FRP.Spice.Game
-
 ----------
 -- Code --
 
diff --git a/src/FRP/Spice/Game.hs b/src/FRP/Spice/Game.hs
--- a/src/FRP/Spice/Game.hs
+++ b/src/FRP/Spice/Game.hs
@@ -6,6 +6,7 @@
 
 -------------------
 -- Local Imports --
+import FRP.Spice.Graphics.Scene
 import FRP.Spice.Input
 
 ----------
@@ -23,4 +24,4 @@
 -}
 class Game a where
   update :: DeltaTime -> Input -> a -> a
-  render :: a -> IO ()
+  render :: a -> Scene
diff --git a/src/FRP/Spice/Graphics.hs b/src/FRP/Spice/Graphics.hs
--- a/src/FRP/Spice/Graphics.hs
+++ b/src/FRP/Spice/Graphics.hs
@@ -3,6 +3,7 @@
 -}
 module FRP.Spice.Graphics ( module FRP.Spice.Graphics.Geometry
                           , module FRP.Spice.Graphics.Color
+                          , module FRP.Spice.Graphics.Scene
                           , module FRP.Spice.Graphics.Utils
                           ) where
 
@@ -10,4 +11,5 @@
 -- Rexported Imports --
 import FRP.Spice.Graphics.Geometry
 import FRP.Spice.Graphics.Color
+import FRP.Spice.Graphics.Scene
 import FRP.Spice.Graphics.Utils
diff --git a/src/FRP/Spice/Graphics/Color.hs b/src/FRP/Spice/Graphics/Color.hs
--- a/src/FRP/Spice/Graphics/Color.hs
+++ b/src/FRP/Spice/Graphics/Color.hs
@@ -6,7 +6,7 @@
 
 --------------------
 -- Global Imports --
-import Graphics.Rendering.OpenGL (Color4 (..), GLfloat, color)
+import Graphics.Rendering.OpenGL (Color4 (..), color)
 
 -------------------
 -- Local Imports --
diff --git a/src/FRP/Spice/Graphics/Geometry.hs b/src/FRP/Spice/Graphics/Geometry.hs
--- a/src/FRP/Spice/Graphics/Geometry.hs
+++ b/src/FRP/Spice/Graphics/Geometry.hs
@@ -10,6 +10,7 @@
 
 -------------------
 -- Local Imports --
+import FRP.Spice.Graphics.Scene
 import FRP.Spice.Graphics.Utils
 import FRP.Spice.Math.Vector
 
@@ -19,24 +20,24 @@
 {-|
   Rendering a point.
 -}
-renderPoint :: Vector Float -> IO ()
-renderPoint (Vector x y) = do
-  renderPrimitive Points $
-    vertex $ Vertex2 (togl x) (togl y)
+renderPoint :: Vector Float -> Scene
+renderPoint pos =
+  fromElements [Element Points [pos]]
 
 {-|
   Rendering a rectangle.
 -}
-renderRectangle :: Vector Float -> Vector Float -> IO ()
+renderRectangle :: Vector Float -> Vector Float -> Scene
 renderRectangle (Vector x y) (Vector w h) = do
-  renderPrimitive Quads $ do
-    vertex $ Vertex2 (togl (x    )) (togl (y    ))
-    vertex $ Vertex2 (togl (x + w)) (togl (y    ))
-    vertex $ Vertex2 (togl (x + w)) (togl (y + h))
-    vertex $ Vertex2 (togl (x    )) (togl (y + h))
+  fromElements [ Element Quads [ Vector (x    ) (y    )
+                               , Vector (x + w) (y    )
+                               , Vector (x + w) (y + h)
+                               , Vector (x    ) (y + h)
+                               ]
+               ]
 
 {-|
   Rendering a square.
 -}
-renderSquare :: Vector Float -> Float -> IO ()
+renderSquare :: Vector Float -> Float -> Scene
 renderSquare pos size = renderRectangle pos $ Vector size size
diff --git a/src/FRP/Spice/Graphics/Scene.hs b/src/FRP/Spice/Graphics/Scene.hs
new file mode 100644
--- /dev/null
+++ b/src/FRP/Spice/Graphics/Scene.hs
@@ -0,0 +1,78 @@
+module FRP.Spice.Graphics.Scene where
+
+--------------------
+-- Global Imports --
+import Graphics.Rendering.OpenGL
+import Control.Applicative
+import Control.Monad
+
+-------------------
+-- Local Imports --
+import FRP.Spice.Graphics.Utils
+import FRP.Spice.Math.Vector
+
+----------
+-- Code --
+
+{-|
+  Purely specifying the rendering behavior of a single element. To be composed
+  into @'FRP.Spice.Graphics.Scene'@s for a full rendering effect.
+-}
+data Element = Element PrimitiveMode [Vector Float]
+
+{-|
+  For composing a scene out of a set of elements.
+-}
+data SceneT a = SceneT [Element] a
+
+{-|
+  The commonly used instance of SceneT
+-}
+type Scene = SceneT ()
+
+{-|
+  Functor instance to satisfy applicative instance.
+-}
+instance Functor SceneT where
+  fmap fn (SceneT elements v) = SceneT elements $ fn v
+
+{-|
+  Applicative instance to satisfy the monad instance. Not advised to use
+-}
+instance Applicative SceneT where
+  pure  = return
+  (<*>) = ap
+
+{-|
+  Used for being able to compose Scenes in a do-notation. Not very useful
+  outside of that.
+-}
+instance Monad SceneT where
+  return a = SceneT [] a
+  (SceneT elements v) >>= fn =
+    let (SceneT elements' v') = fn v in
+      SceneT (elements ++ elements') v'
+
+{-|
+  Rendering a single @'Element'@.
+-}
+renderElement :: Element -> IO ()
+renderElement (Element pm vs) =
+  renderPrimitive pm $
+    forM_ vs $ \(Vector x y) ->
+      vertex $ Vertex2 (togl x) (togl y)
+
+{-|
+  Constructing a SceneT from a list of elements.
+-}
+fromElements :: [Element] -> Scene
+fromElements elements =
+  SceneT elements ()
+
+{-|
+  Rendering a whole @'Scene'@ (renders each @'Element'@ from first in list to last in
+  list.)
+-}
+renderScene :: Scene -> IO ()
+renderScene (SceneT elements _) =
+  forM_ elements renderElement
diff --git a/src/FRP/Spice/Input.hs b/src/FRP/Spice/Input.hs
--- a/src/FRP/Spice/Input.hs
+++ b/src/FRP/Spice/Input.hs
@@ -16,7 +16,6 @@
 import Data.Map.Strict hiding (keys, map)
 import Graphics.Rendering.OpenGL
 import Graphics.UI.GLFW as GLFW
-import Control.Applicative
 import FRP.Elerea.Param
 
 -------------------
@@ -25,6 +24,7 @@
 import qualified FRP.Spice.Input.Keyboard as Keyboard
 import qualified FRP.Spice.Input.Mouse as Mouse
 import FRP.Spice.Math.Vector
+import FRP.Spice.Config
 
 -----------------------
 -- Rexported Imports --
@@ -91,9 +91,11 @@
 {-|
   Creating a callback to update the mouse position's state.
 -}
-makeMousePositionCallback :: InputContainer -> MousePosCallback
-makeMousePositionCallback ic (Position x y) =
-  mousePositionSinks (getSinks ic) $ Vector (fromIntegral x / 320 - 1) ((-fromIntegral y) / 240 - 1)
+makeMousePositionCallback :: WindowConfig -> InputContainer -> MousePosCallback
+makeMousePositionCallback wc ic (Position x y) =
+  mousePositionSinks (getSinks ic) $
+    Vector (  fromIntegral x  / ((fromIntegral $ getWindowWidth  wc) / 2) - 1)
+           ((-fromIntegral y) / ((fromIntegral $ getWindowHeight wc) / 2) + 1)
 
 {-|
   Creating a callback to update the keyboard's states.
diff --git a/src/FRP/Spice/Input/Mouse.hs b/src/FRP/Spice/Input/Mouse.hs
--- a/src/FRP/Spice/Input/Mouse.hs
+++ b/src/FRP/Spice/Input/Mouse.hs
@@ -7,15 +7,9 @@
 -- Global Imports --
 import qualified Data.Traversable as T (sequence)
 import Data.Map.Strict hiding (keys, map)
-import Graphics.Rendering.OpenGL
 import Graphics.UI.GLFW as GLFW
 import FRP.Elerea.Param
 import Control.Monad
-import Data.Default
-
--------------------
--- Local Imports --
-import FRP.Spice.Math.Vector
 
 ----------
 -- Code --
diff --git a/src/FRP/Spice/Input/MousePosition.hs b/src/FRP/Spice/Input/MousePosition.hs
--- a/src/FRP/Spice/Input/MousePosition.hs
+++ b/src/FRP/Spice/Input/MousePosition.hs
@@ -5,8 +5,6 @@
 
 --------------------
 -- Global Imports --
-import Graphics.Rendering.OpenGL
-import Graphics.UI.GLFW as GLFW
 import FRP.Elerea.Param
 import Data.Default
 
diff --git a/src/FRP/Spice/Math.hs b/src/FRP/Spice/Math.hs
new file mode 100644
--- /dev/null
+++ b/src/FRP/Spice/Math.hs
@@ -0,0 +1,9 @@
+{-|
+  This module re-exports a number of modules having to do with math.
+-}
+module FRP.Spice.Math ( module FRP.Spice.Math.Vector
+                      ) where
+
+-----------------------
+-- Rexported Imports --
+import FRP.Spice.Math.Vector
