diff --git a/haskanoid.cabal b/haskanoid.cabal
--- a/haskanoid.cabal
+++ b/haskanoid.cabal
@@ -10,7 +10,7 @@
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             0.1.5.3
+version:             0.1.5.4
 
 -- A short (one-line) description of the package.
 synopsis:            A breakout game written in Yampa using SDL
diff --git a/src/Levels.hs b/src/Levels.hs
--- a/src/Levels.hs
+++ b/src/Levels.hs
@@ -12,6 +12,7 @@
 module Levels where
 
 import Control.Arrow((***))
+import Data.List (nub)
 import Physics.TwoDimensions.Dimensions
 
 import Constants
@@ -25,6 +26,11 @@
  , levelMusic :: MusicResource -- ^ Background music
  }
 
+-- | Number of levels. Change this in the code to finish
+-- in a different level.
+numLevels :: Int
+numLevels = length levels
+
 -- * Concrete levels
 levels :: [LevelSpec]
 levels = [ -- Level 0
@@ -44,7 +50,66 @@
                      , levelBg    = Resource "data/level2.png"
                      , levelMusic = Resource "data/level2.mp3"
                      }
-         ]
+         ,
+           -- Level 3
+           LevelSpec { blockPoss  = blockPosS 3
+                     , levelBg    = Resource "data/level1.png"
+                     , levelMusic = Resource "data/level0.mp3"
+                     }
+         ,
+           -- Level 4
+           LevelSpec { blockPoss  = blockPosS 4
+                     , levelBg    = Resource "data/level1.png"
+                     , levelMusic = Resource "data/level1.mp3"
+                     }
+         ,
+           -- Level 5
+           LevelSpec { blockPoss  = blockPosS 5
+                     , levelBg    = Resource "data/level2.png"
+                     , levelMusic = Resource "data/level2.mp3"
+                     }
+         ,
+           -- Level 6
+           LevelSpec { blockPoss  = blockPosS 6
+                     , levelBg    = Resource "data/level1.png"
+                     , levelMusic = Resource "data/level0.mp3"
+                     }
+         ,
+           -- Level 7
+           LevelSpec { blockPoss  = blockPosS 7
+                     , levelBg    = Resource "data/level1.png"
+                     , levelMusic = Resource "data/level1.mp3"
+                     }
+         ,
+           -- Level 8
+           LevelSpec { blockPoss  = blockPosS 8
+                     , levelBg    = Resource "data/level2.png"
+                     , levelMusic = Resource "data/level2.mp3"
+                     }
+         ,
+           -- Level 9
+           LevelSpec { blockPoss  = blockPosS 9
+                     , levelBg    = Resource "data/level0.png"
+                     , levelMusic = Resource "data/level1.mp3"
+                     }
+         ,
+           -- Level 10
+           LevelSpec { blockPoss  = blockPosS 10
+                     , levelBg    = Resource "data/level1.png"
+                     , levelMusic = Resource "data/level1.mp3"
+                     }
+         ,
+           -- Level 11
+           LevelSpec { blockPoss  = blockPosS 11
+                     , levelBg    = Resource "data/level2.png"
+                     , levelMusic = Resource "data/level2.mp3"
+                     }
+         ,
+           -- Level 12
+           LevelSpec { blockPoss  = blockPosS 12
+                     , levelBg    = Resource "data/level0.png"
+                     , levelMusic = Resource "data/level1.mp3"
+                     }         ]
 
 -- | Level block specification (positions)
 
@@ -55,33 +120,16 @@
 -- % XXXXXXXX
 -- % XXXXXXXX
 blockPosS :: Int -> [Pos2D]
-blockPosS 0 = map (adjustHPos *** adjustVPos) allBlocks
+blockPosS 0 = map adjustPos allBlocks
 
  where allBlocks :: (Enum a, Num a) => [(a,a)]
        allBlocks = [(x,y) | x <- [0..blockColumns-1], y <- [0..blockRows-1]]
 
-       adjustHPos :: Double -> Double
-       adjustHPos = (leftMargin +) . ((blockWidth + blockSeparation) *)
-
-       adjustVPos :: Double -> Double
-       adjustVPos = (topMargin +) . ((blockHeight + blockSeparation) *)
-
        blockRows :: Num a => a
        blockRows = 4
 
-       -- Fit as many as possible
-       blockColumns :: Num a => a
-       blockColumns =
-         1 + round' ((gameWidth - blockWidth - 2 * leftMargin) / (blockWidth + blockSeparation))
-        where round' = fromIntegral . floor
 
-       leftMargin :: Num a => a
-       leftMargin = 25
 
-       topMargin :: Num a => a
-       topMargin = 10
-       
-
 -- Level 1
 --   %%%%%%%%
 -- %    XXXX
@@ -91,40 +139,246 @@
 -- % XXXXX
 -- % XXXX
 --
-blockPosS 1 = map (adjustHPos *** adjustVPos) allBlocks
+blockPosS 1 = map adjustPos allBlocks
  where
    allBlocks :: (Enum a, Num a, Eq a, Ord a) => [(a,a)]
-   allBlocks = [ (x,y) | x <- [0..7], y <- [0..5]
+   allBlocks = [ (x,y) | x <- [0..blockColumns-1], y <- [0..blockRows-1]
                        , (x + y > 2) && (x + y < 10)
                ]
-
-   adjustHPos :: Double -> Double
-   adjustHPos = (leftMargin +) . ((blockWidth + blockSeparation) *)
-
-   adjustVPos :: Double -> Double
-   adjustVPos = ((blockHeight + blockSeparation) *)
-
-   leftMargin :: Num a => a
-   leftMargin = 20
+               
+   blockRows :: Num a => a
+   blockRows = 6
 
 -- Level 2
---   %%%%%%
--- %  XXXXX
--- % X XXXX
--- % XX XXX
-blockPosS 2  = map (adjustHPos *** adjustVPos) allBlocks
+blockPosS 2  = map adjustPos allBlocks
  where
    allBlocks :: (Enum a, Num a, Eq a) => [(a,a)]
-   allBlocks = [(x,y) | x <- [0..5], y <- [0..2], x /= y]
+   allBlocks = [(x,y) | x <- [0..blockColumns - 1], y <- [0..blockRows-1]
+                      , x /= y && (blockColumns - 1 - x) /= y]
 
-   adjustHPos :: Double -> Double
-   adjustHPos = (blockWidth *)
+   blockRows :: Num a => a
+   blockRows = 4
+               
 
-   adjustVPos :: Double -> Double
-   adjustVPos = (100 +) . (blockHeight *)
+-- Level 3
+--   %%%%%%%%
+-- %  X X X X
+-- % X X X X
+-- %  X X X X
+-- % X X X X
+blockPosS 3 = map adjustPos allBlocks
 
+ where allBlocks :: (Enum a, Num a, Eq a, Integral a) => [(a,a)]
+       allBlocks = [(x,y) | x <- [0..blockColumns-1], y <- [0..blockRows-1],
+                    ((even x) && (odd y) || (odd x) && (even y))]
+
+       blockRows :: Num a => a
+       blockRows = 4
+
+
+-- Level 4
+--   %%%%%%%%
+-- % XXXXXXXX
+-- %
+-- %  X X X X
+-- %
+-- % X X X X
+-- %
+-- % XXXXXXXX
+blockPosS 4 = map adjustPos allBlocks
+
+ where allBlocks :: (Enum a, Num a, Eq a, Integral a) => [(a,a)]
+       allBlocks = [(x,y) | x <- [0..blockColumns-1], y <- [0,blockRows-1]] ++
+                   [(x,y) | x <- [0..blockColumns-1], y <- [2], odd x] ++
+                   [(x,y) | x <- [0..blockColumns-1], y <- [4], even x]
+
+       blockRows :: Num a => a
+       blockRows = 7
+
+-- Level 5
+--   %%%%%%%%
+-- %    X
+-- %   X X
+-- %  X   X
+-- % XXXXXXX
+blockPosS 5 = map adjustPos allBlocks
+
+ where allBlocks :: (Enum a, Num a, Eq a, Integral a) => [(a,a)]
+       allBlocks = nub $
+         [(3,0),(blockColumns-4,1)] ++
+         [(2,1),(blockColumns-3,1)] ++
+         [(1,2),(blockColumns-2,2)] ++
+         [(x,y) | x <- [0..blockColumns-1], y <- [3]]
+
+-- Level 6
+--   %%%%%%%%
+-- %  XXXXXX
+-- % X      X
+-- % X      X
+-- % X      X
+-- %  XXXXXX
+blockPosS 6 = map adjustPos allBlocks
+
+ where allBlocks :: (Enum a, Num a, Eq a, Integral a) => [(a,a)]
+       allBlocks = [(x,y) | x <- [1..blockColumns-2], y <- [0,blockRows-1]] ++
+                   [(x,y) | x <- [0,blockColumns-1],  y <- [1..blockRows-2]]
+
+       blockRows :: Num a => a
+       blockRows = 5
+
+
+-- Level 7
+--   %%%%%%%%
+-- %  XXXXXX
+-- % X      X
+-- %    XX  
+-- %    XX 
+-- % X      X
+-- %  XXXXXX
+blockPosS 7 = map adjustPos allBlocks
+
+ where allBlocks :: (Enum a, Num a, Eq a, Integral a) => [(a,a)]
+       allBlocks = [(x,y) | x <- [1..blockColumns-2], y <- [0,blockRows-1]] ++
+                   [(x,y) | x <- [0,blockColumns-1],  y <- [1,blockRows-2]] ++
+                   [(x,y) | x <- [3,4], y <- [2..4]]
+
+       blockRows :: Num a => a
+       blockRows = 7
+
+-- Level 8
+--   %%%%%%%%
+-- % XX XXXXX
+-- % XX XXXXX
+-- % 
+-- % XX XXXXX
+-- % XX XXXXX
+-- % XX XXXXX
+-- % XX XXXXX
+-- % XX XXXXX
+-- % XX XXXXX
+-- % XX XXXXX
+blockPosS 8 = map adjustPos allBlocks
+
+ where allBlocks :: (Enum a, Num a, Eq a, Integral a) => [(a,a)]
+       allBlocks = [(x,y) | x <- [0..blockColumns-1]
+                          , y <- [0..blockRows-1]
+                          , x /= 2, y /= 2 ]
+
+       blockRows :: Num a => a
+       blockRows = 9
+
+-- Level 9
+--   %%%%%%%%
+-- %    X
+-- %   XXX
+-- %  X X X
+-- % XXXXXXX
+-- %  X X X
+-- %   XXX
+-- %    X
+blockPosS 9 = map ((adjustHPos *** adjustVPos) . fI2) allBlocks
+
+ where allBlocks :: (Enum a, Num a, Eq a, Integral a) => [(a,a)]
+       allBlocks = [(x,y) | x <- [3], y <- [0..6]] ++
+                   [(x,y) | x <- [0..6], y <- [3]] ++
+                   [(x,y) | x <- [2,4], y <- [1,5]] ++
+                   [(x,y) | x <- [1,5], y <- [2,4]]
+                   
+       adjustHPos :: Double -> Double
+       adjustHPos = (leftMargin +) . ((blockWidth + blockSeparation) *)
+
+       leftMargin :: Num a => a
+       leftMargin = round' ((gameWidth - (blockWidth + blockSeparation) * 7)/2)
+         where round' = fromIntegral . floor
+
+
+-- Level 10
+--   %%%%%%%%
+-- %  X X X
+-- %  X X X 
+-- %  X X X 
+-- %  X X X 
+-- % XXXXXXX
+-- %  X X X 
+-- %  X X X 
+-- %  X X X
+-- %  X X X 
+blockPosS 10 = map adjustPos allBlocks
+
+ where allBlocks :: (Enum a, Num a, Eq a, Integral a) => [(a,a)]
+       allBlocks = [(x,y) | x <- [0..blockColumns-1]
+                          , y <- [0..blockRows-1], odd x] ++
+                   [(x,y) | x <- [0..blockColumns-1], y <- [midRow], even x]
+
+       blockRows :: Num a => a
+       blockRows = 9
+
+       midRow :: Integral a => a
+       midRow = blockRows `div` 2
+
+
+
+-- Level 11
+--   %%%%%%%%
+-- % XX     
+-- % XXXX     
+-- % XXXXXX  
+-- % XXXXXXXX
+-- % XXXXXX  
+-- % XXXX     
+-- % XX     
+blockPosS 11 = map adjustPos allBlocks
+
+ where allBlocks :: (Enum a, Num a, Eq a, Integral a) => [(a,a)]
+       allBlocks = [(x,y) | y <- [0..blockRows-1]
+                          , x <- [0..(blockColumns-1) - 2 * abs (y - midRow)]]
+
+       blockRows :: Num a => a
+       blockRows = 7
+
+       midRow :: Integral a => a
+       midRow = blockRows `div` 2
+
+-- Level 12
+--   %%%%%%%%
+-- % XXXXXXX
+-- %   X X
+-- %   X X
+-- %
+-- %  X   X
+-- % X     X
+
+blockPosS 12 = map adjustPos allBlocks
+
+ where allBlocks :: (Enum a, Num a, Eq a, Integral a) => [(a,a)]
+       allBlocks = [(x,y) | x <- [0..blockColumns-1], y <- [0]] ++
+                   [(x,y) | x <- [2, blockColumns-3], y <- [1,2]] ++
+                   [(1,4), (blockColumns-2,4), (0,5), (blockColumns-1,5)]
+
+       blockRows :: Num a => a
+       blockRows = 9
+
 blockPosS _ = error "No more levels"
 
+-- Dynamic positioning/level size
+
+adjustPos :: Integral a => (a,a) -> (Double, Double)
+adjustPos = ((adjustHPos *** adjustVPos) . fI2)
+
+adjustVPos :: Double -> Double
+adjustVPos = (topMargin +) . ((blockHeight + blockSeparation) *)
+
+adjustHPos :: Double -> Double
+adjustHPos = (leftMargin +) . ((blockWidth + blockSeparation) *)
+
+-- Fit as many as possible
+blockColumns :: Num a => a
+blockColumns =
+    1 + round' ( (gameWidth - blockWidth - 2 * leftMargin)
+               / (blockWidth + blockSeparation)
+               )
+  where round' = fromIntegral . floor
+
 -- * Testing constants
 --
 -- These constans are used by the game, and can be mofidied on order to test
@@ -137,7 +391,15 @@
 initialLevel :: Int
 initialLevel = 0
 
--- | Number of levels. Change this in the code to finish
--- in a different level.
-numLevels :: Int
-numLevels = length levels
+-- * Constants
+
+topMargin :: Num a => a
+topMargin = 10
+
+leftMargin :: Num a => a
+leftMargin = 25
+
+-- * Auxiliary functions
+
+fI2 :: Integral a => (a,a) -> (Double, Double)
+fI2 (x,y) = (fromIntegral x, fromIntegral y)       
