diff --git a/antagonist.cabal b/antagonist.cabal
--- a/antagonist.cabal
+++ b/antagonist.cabal
@@ -10,7 +10,7 @@
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             0.1.0.3
+version:             0.1.0.7
 
 -- A short (one-line) description of the package.
 synopsis:            A web interface to Antisplice dungeons.
@@ -48,7 +48,7 @@
 
 library
   exposed-modules: Web.Antagonist.Server, Web.Antagonist.Server.Data
-  build-depends:       base >=4.6 && <4.7, yesod >=1.2 && <1.3, antisplice >=0.12.1 && <0.13, text >=0.11 && <0.12, chatty >=0.5 && <0.6, shakespeare-text >=1.0 && <1.1, hamlet >=1.1 && <1.2, mtl >=2.1 && <2.2, shakespeare-css >=1.0 && <1.1, shakespeare-js >=1.2 && <1.3, time >=1.4 && <1.5, old-locale >=1.0 && <1.1
+  build-depends:       base >=4.6 && <4.7, yesod >=1.2 && <1.3, antisplice >=0.12.1 && <0.13, text >=0.11 && <0.12, chatty >=0.5.3 && <0.6, shakespeare-text >=1.0 && <1.1, hamlet >=1.1 && <1.2, mtl >=2.1 && <2.2, shakespeare-css >=1.0 && <1.1, shakespeare-js >=1.2 && <1.3, time >=1.4 && <1.5, old-locale >=1.0 && <1.1
   default-language: Haskell2010
   hs-source-dirs:   shared, server, .
 
@@ -63,7 +63,7 @@
   -- other-extensions:    
   
   -- Other library packages from which modules are imported.
-  build-depends:       base >=4.6 && <4.7, yesod >=1.2 && <1.3, antisplice >=0.12.1 && <0.13, text >=0.11 && <0.12, chatty >=0.5 && <0.6, shakespeare-text >=1.0 && <1.1, hamlet >=1.1 && <1.2, mtl >=2.1 && <2.2, shakespeare-css >=1.0 && <1.1, shakespeare-js >=1.2 && <1.3, ironforge >=0.1 && <0.2, time >=1.4 && <1.5, old-locale >=1.0 && <1.1
+  build-depends:       base >=4.6 && <4.7, yesod >=1.2 && <1.3, antisplice >=0.12.1 && <0.13, text >=0.11 && <0.12, chatty >=0.5.3 && <0.6, shakespeare-text >=1.0 && <1.1, hamlet >=1.1 && <1.2, mtl >=2.1 && <2.2, shakespeare-css >=1.0 && <1.1, shakespeare-js >=1.2 && <1.3, ironforge >=0.1 && <0.2, time >=1.4 && <1.5, old-locale >=1.0 && <1.1
   
   -- Directories containing source files.
   hs-source-dirs:      shared, server, .
diff --git a/play.js b/play.js
--- a/play.js
+++ b/play.js
@@ -34,7 +34,7 @@
         cons.innerHTML+=res.news;
         cons.scrollTop = cons.scrollHeight;
       }
-      document.getElementById("prom").textContent = res.prompt;
+      document.getElementById("prom").innerHTML = res.prompt;
       fixwidth();
     }
   }
@@ -67,6 +67,6 @@
 }
 document.getElementById("inp").onkeypress = keypress;
 function fixwidth() {
-  document.getElementById("inp").style.width = (window.innerWidth - document.getElementById("prom").offsetWidth - 12)+"px";
+  document.getElementById("inp").style.width = (window.innerWidth - document.getElementById("prom").offsetWidth - 60)+"px";
 }
 fixwidth();
diff --git a/server/Web/Antagonist/Server.hs b/server/Web/Antagonist/Server.hs
--- a/server/Web/Antagonist/Server.hs
+++ b/server/Web/Antagonist/Server.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, FlexibleInstances, OverloadedStrings, RankNTypes, FlexibleContexts #-}
+{-# LANGUAGE QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, FlexibleInstances, OverloadedStrings, RankNTypes, FlexibleContexts, TupleSections #-}
 
 -- | A subsite serving a single-user dungeon.
 module Web.Antagonist.Server (
@@ -23,6 +23,7 @@
 import Control.Monad.Error.Class
 import Data.IORef
 import Data.Monoid
+import Data.List
 import Data.Text (pack,unpack)
 import Data.Time.Format
 import System.Locale
@@ -46,9 +47,15 @@
   (ss,ns) <- case avlLookup ssid ss_ of
     Just (x,ns,st) -> return (x,ns)
     Nothing -> do
+      liftIO $ atomicModifyIORef avlref $
+        let op a
+              | avlSize a >= 100 = avlRemove (se a) a
+              | otherwise = a
+            se = indexOf . head . sortBy (\(_,_,_,a) (_,_,_,b) -> a `compare` b) . avlPreorder
+        in op &&& op
       (ss,r) <- liftIO $ runRecorderT $ startSession ctor
       return (ss,replay r)
-  ((_,ss1),r) <- liftIO $ runRecorderT $ runSession ss runScheduledTasks
+  ((_,ss1),r) <- liftIO $ runRecorderT $ runSession ctor ss runScheduledTasks
   putSession ssid ss1 none
   return (ssid,ss1,ns <> replay r)
 
@@ -66,7 +73,7 @@
 getPrompt :: MonadIO m => SessionState -> m String
 getPrompt ss = do
   u <- liftIO $ mutctime
-  ((ps,_),_) <- liftIO $ runRecorderT $ runSession ss $ expand $
+  ((ps,_),_) <- liftIO $ runRecorderT $ runSession (return ()) ss $ expand $
                 formatTime defaultTimeLocale "%R $user #{health}H#?{ #{otitle} #{ohealth}H}" u
   return ps
 
@@ -90,9 +97,10 @@
 
 postPutR :: (Yesod master,RenderMessage master FormMessage) => HandlerT SingleUserSub (HandlerT master IO) Value
 postPutR = do
+  SingleUserSub _ _ ctor <- getYesod
   (ssid,ss,ns) <- extractSession
   line <- lift $ runInputPost $ id <$> ireq textField "line"
-  ((_,x),r) <- liftIO $ runRecorderT $ runSession ss $ act $ unpack line
+  ((_,x),r) <- liftIO $ runRecorderT $ runSession ctor ss $ act $ unpack line
   putSession ssid x none
   nss <- prepOutput (ns <> replay r)
   ps <- getPrompt x
@@ -105,7 +113,7 @@
 putSession ssid ss nn = do
   SingleUserSub ctrref avlref ctor <- getYesod
   stamp <- liftIO mgetstamp
-  void $ liftIO $ atomicModifyIORef avlref $ (avlInsert (ssid,ss,nn,stamp)) &&& (avlInsert (ssid,ss,nn,stamp))
+  void $ liftIO $ atomicModifyIORef avlref $ let op = avlInsert (ssid,ss,nn,stamp) in op &&& op
 
 runScheduledTasks :: ChattyDungeonM ()
 runScheduledTasks = do
@@ -115,8 +123,8 @@
   putDungeonState ds{timeTriggersOf=foldr avlRemove (timeTriggersOf ds) $ map fst ts}
   forM_ ts (runHandler . snd)
 
-runSession :: (MonadIO m,MonadClock m,MonadRandom m,MonadPrinter m) => SessionState -> ChattyDungeonM a -> m (a,SessionState)
-runSession ss m = do
+runSession :: (MonadIO m,MonadClock m,MonadRandom m,MonadPrinter m) => Constructor -> SessionState -> ChattyDungeonM a -> m (a,SessionState)
+runSession ctor ss m = do
   x <- withSession ss m
   case x of
     Right r -> return r
@@ -132,8 +140,12 @@
         CantEquipThatThereError -> "I can't wear that there. You might want to try some other place?"
         WhereToEquipError -> "Where?"
         CantCastThatNowError -> "Sorry, I can't cast that now. Check your health, mana and cooldowns."
+        CantAcquireThatError -> "I can't take that."
+        WontHitThatError -> "I won't hit that."
         _ -> ""
-      return (undefined,ss)
+      case e of
+        QuitError -> liftM (undefined,) $ startSession ctor
+        _ -> return (undefined,ss)
       
 withSession :: (MonadIO m,MonadClock m,MonadRandom m,MonadPrinter m) => SessionState -> ChattyDungeonM a -> m (Either SplErr (a,SessionState))
 withSession ((((s,ts),as),c),es) m =
