diff --git a/labyrinth.cabal b/labyrinth.cabal
--- a/labyrinth.cabal
+++ b/labyrinth.cabal
@@ -1,5 +1,5 @@
 name:                labyrinth
-version:             0.1.0.0
+version:             0.1.5.0
 synopsis:            A complicated turn-based game
 description:         Players take turns in a labyrinth, competing with each
                      other to pick a treasure and carry it out. They only know
@@ -10,7 +10,6 @@
 license-file:        LICENSE
 author:              Alexey Kotlyarov
 maintainer:          koterpillar@gmail.com
--- copyright:           
 category:            Game
 build-type:          Simple
 cabal-version:       >=1.8
@@ -25,13 +24,46 @@
 
 executable labyrinth-server
   main-is:             LabyrinthServer.hs
-  build-depends:       base ==4.5.*, mtl ==2.1.*, template-haskell ==2.7.*, acid-state ==0.8.*, happstack-server ==7.1.*, derive ==2.5.*, safecopy ==0.8.*, parsec ==3.1.*, containers ==0.4.*, random ==1.0.*, text ==0.11.*, transformers ==0.3.*, MonadRandom ==0.1.*
+  build-depends:       base >= 4.5 && < 4.7
+                     , mtl ==2.1.*
+                     , template-haskell >= 2.7 && < 2.9
+                     , lens ==3.8.*
+                     , acid-state ==0.8.*
+                     , happstack-server ==7.1.*
+                     , derive ==2.5.*
+                     , safecopy ==0.8.*
+                     , parsec ==3.1.*
+                     , containers >= 0.4 && < 0.6
+                     , random ==1.0.*
+                     , text ==0.11.*
+                     , transformers ==0.3.*
+                     , MonadRandom ==0.1.*
+                     , json ==0.7.*
+                     , monad-loops ==0.3.*
   hs-source-dirs:      src
   if (flag(static))
     ghc-options:       -static -optl-pthread -optl-static
 
-Test-Suite tests
+test-Suite tests
   type:                exitcode-stdio-1.0
   main-is:             Main.hs
-  build-depends:       base ==4.5.*, mtl ==2.1.*, template-haskell ==2.7.*, acid-state ==0.8.*, happstack-server ==7.1.*, derive ==2.5.*, safecopy ==0.8.*, parsec ==3.1.*, containers ==0.4.*, random ==1.0.*, text ==0.11.*, transformers ==0.3.*, MonadRandom ==0.1.*, HTF ==0.10.*, HUnit ==1.2.*
+  build-depends:       base >= 4.5 && < 4.7
+                     , mtl ==2.1.*
+                     , template-haskell >= 2.7 && < 2.9
+                     , lens ==3.8.*
+                     , acid-state ==0.8.*
+                     , happstack-server ==7.1.*
+                     , derive ==2.5.*
+                     , safecopy ==0.8.*
+                     , parsec ==3.1.*
+                     , containers >= 0.4 && < 0.6
+                     , random ==1.0.*
+                     , text ==0.11.*
+                     , transformers ==0.3.*
+                     , MonadRandom ==0.1.*
+                     , json ==0.7.*
+                     , monad-loops ==0.3.*
+                     , HTF ==0.10.*
+                     , HUnit ==1.2.*
+                     , QuickCheck >=2.6 && < 2.7
   hs-source-dirs:      src, testsuite
diff --git a/src/LabyrinthServer.hs b/src/LabyrinthServer.hs
--- a/src/LabyrinthServer.hs
+++ b/src/LabyrinthServer.hs
@@ -1,6 +1,7 @@
 module Main where
 
 import Control.Exception (bracket)
+import Control.Lens
 import Control.Monad
 import Control.Monad.IO.Class
 
@@ -14,7 +15,7 @@
 
 import Happstack.Server hiding (result)
 
-import Peeker
+import qualified Text.JSON as J
 
 import System.Environment
 import System.Random
@@ -23,15 +24,15 @@
 
 import LabyrinthServer.Data
 
-createLabyrinth :: (MonadIO m) => Int -> m Labyrinth
-createLabyrinth n = do
+createLabyrinth :: (MonadIO m) => Int -> Int -> Int -> m Labyrinth
+createLabyrinth w h n = do
     gen <- liftIO getStdGen
-    let (l, gen') = generateLabyrinth 5 6 n gen
+    let (l, gen') = generateLabyrinth w h n gen
     liftIO $ setStdGen gen'
     return l
 
 newId :: (MonadIO m) => m String
-newId = sequence $ take 32 $ repeat $ liftIO $ randomRIO ('a', 'z')
+newId = replicateM 32 $ liftIO $ randomRIO ('a', 'z')
 
 getPort :: IO Int
 getPort = do
@@ -46,7 +47,7 @@
     port <- getPort
     let conf = nullConf { port = port }
     bracket (openLocalState noGames)
-        (createCheckpointAndClose)
+        createCheckpointAndClose
         (simpleHTTP conf . myApp)
 
 myApp :: AcidState Games -> ServerPart Response
@@ -57,7 +58,6 @@
                     ++ map gameAction gameActions
           gameActions = [ makeMove
                         , showLog
-                        , cheat
                         ]
 
 bodyPolicy = defaultBodyPolicy "/tmp/" 0 1000 1000
@@ -72,32 +72,23 @@
 createGame acid = dir "add" $ nullDir >> method POST >> do
     nullDir
     decodeBody bodyPolicy
+    lWidth <- lookRead "width"
+    lHeight <- lookRead "height"
     pCount <- lookRead "players"
     gameId <- newId
-    lab <- createLabyrinth pCount
+    lab <- createLabyrinth lWidth lHeight pCount
     res <- update' acid $ AddGame gameId lab
-    if res
-        then ok $ toResponse "ok"
-        else ok $ toResponse "bad game"
+    ok $ toResponse $ if res then "ok" else "bad game"
 
 listGames :: AcidState Games -> ServerPart Response
 listGames acid = dir "list" $ nullDir >> do
-    games <- query' acid $ GameList
-    ok $ toResponse $ intercalate ", " $ games
-
-cheat :: AcidState Games -> GameId -> ServerPart Response
-cheat acid gameId = dir "cheat" $ nullDir >> do
-    l <- query' acid $ ShowLabyrinth gameId
-    ok $ toResponse $ show l
+    games <- query' acid GetGames
+    ok $ toResponse $ J.encode $ gameListJSON games
 
 showLog :: AcidState Games -> GameId -> ServerPart Response
 showLog acid gameId = dir "log" $ nullDir >> do
-    l <- query' acid $ GameLog gameId
-    let str = intercalate "\n" $ map showMove l
-    ok $ toResponse str
-    where showMove m = "player " ++ show (getP rplayer m)
-                    ++ ": " ++ show (getP rmove m)
-                    ++ "\n" ++ show (getP rresult m)
+    g <- query' acid $ GetGame gameId
+    ok $ toResponse $ J.encode $ gameJSON g
 
 makeMove :: AcidState Games -> GameId -> ServerPart Response
 makeMove acid gameId = dir "move" $ nullDir >> method POST >> do
diff --git a/testsuite/Main.hs b/testsuite/Main.hs
--- a/testsuite/Main.hs
+++ b/testsuite/Main.hs
@@ -5,11 +5,14 @@
 import {-@ HTF_TESTS @-} TestLabyrinth
 import {-@ HTF_TESTS @-} TestLabyrinth.Generate
 import {-@ HTF_TESTS @-} TestLabyrinth.Move.ChoosePosition
+import {-@ HTF_TESTS @-} TestLabyrinth.Move.Conditional
 import {-@ HTF_TESTS @-} TestLabyrinth.Move.Grenade
 import {-@ HTF_TESTS @-} TestLabyrinth.Move.Movement
+import {-@ HTF_TESTS @-} TestLabyrinth.Move.Query
+import {-@ HTF_TESTS @-} TestLabyrinth.Move.Say
 import {-@ HTF_TESTS @-} TestLabyrinth.Move.Shoot
+import {-@ HTF_TESTS @-} TestLabyrinth.Move.Surrender
 import {-@ HTF_TESTS @-} TestLabyrinth.ShowLabyrinth
 import {-@ HTF_TESTS @-} TestLabyrinth.ShowMove
-import {-@ HTF_TESTS @-} TestPeeker
 
 main = htfMain htf_importedTests
