diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
 ## Changelog for the `threepenny-gui` package
 
+**0.4.2.0** -- Maintenance release.
+
+* Dependency `bytestring >=0.9.2` is now implemented correctly.
+* Allow newer versions of `aeson` dependency.
+* Allow newer versions of `network`, `transformers` and `template-haskell` dependencies.
+* Helper scripts in the `samples` directory now assume that you use a cabal sandbox for development.
+* The `UI` monad is now an instance of the `Applicative` class.
+
 **0.4.1.0** -- Maintenance release.
 
 * Dependency on `text` package now from version 0.11 to 1.1.*.
diff --git a/samples/Buttons.hs b/samples/Buttons.hs
--- a/samples/Buttons.hs
+++ b/samples/Buttons.hs
@@ -71,5 +71,5 @@
 viewSource = UI.p #+
     [UI.anchor #. "view-source" # set UI.href url #+ [string "View source code"]]
     where
-    url = "https://github.com/HeinrichApfelmus/threepenny-gui/blob/master/src/Buttons.hs"
+    url = samplesURL ++ "Buttons.hs"
 
diff --git a/samples/Chat.hs b/samples/Chat.hs
--- a/samples/Chat.hs
+++ b/samples/Chat.hs
@@ -102,4 +102,4 @@
 viewSource =
     UI.anchor #. "view-source" # set UI.href url #+ [string "View source code"]
     where
-    url = "https://github.com/HeinrichApfelmus/threepenny-gui/blob/master/src/Chat.hs"
+    url = samplesURL ++ "Chat.hs"
diff --git a/samples/MissingDollars.hs b/samples/MissingDollars.hs
--- a/samples/MissingDollars.hs
+++ b/samples/MissingDollars.hs
@@ -44,7 +44,7 @@
         ]
     ]
   where
-    urlSource      = "https://github.com/HeinrichApfelmus/threepenny-gui/blob/master/src/MissingDollars.hs"
+    urlSource      = samplesURL ++ "MissingDollars.hs"
     urlAttribution = "http://www.vex.net/~trebla/humour/missing_dollar.html"
 
 
diff --git a/samples/Paths.hs b/samples/Paths.hs
--- a/samples/Paths.hs
+++ b/samples/Paths.hs
@@ -1,5 +1,5 @@
 {-# LANGUAGE CPP#-}
-module Paths (getStaticDir) where
+module Paths (getStaticDir, samplesURL) where
 
 import Control.Monad
 import System.FilePath
@@ -18,3 +18,7 @@
 getStaticDir = return "../wwwroot/"
 
 #endif
+
+-- | Base URL for the example source code.
+samplesURL :: String
+samplesURL = "https://github.com/HeinrichApfelmus/threepenny-gui/blob/master/samples/"
diff --git a/samples/UseWords.hs b/samples/UseWords.hs
--- a/samples/UseWords.hs
+++ b/samples/UseWords.hs
@@ -73,7 +73,7 @@
 viewSource = UI.p #+
     [UI.anchor #. "view-source" # set UI.href url #+ [UI.string "View source code"]]
     where
-    url = "https://github.com/HeinrichApfelmus/threepenny-gui/blob/master/src/UseWords.hs"
+    url = samplesURL ++ "UseWords.hs"
 
 {-----------------------------------------------------------------------------
     Parsing
diff --git a/src/Graphics/UI/Threepenny/Core.hs b/src/Graphics/UI/Threepenny/Core.hs
--- a/src/Graphics/UI/Threepenny/Core.hs
+++ b/src/Graphics/UI/Threepenny/Core.hs
@@ -64,6 +64,7 @@
 import Data.Functor
 import Data.String (fromString)
 
+import Control.Applicative (Applicative)
 import Control.Concurrent.MVar
 import Control.Monad
 import Control.Monad.Fix
@@ -156,6 +157,10 @@
 
 instance Functor UI where
     fmap f = UI . fmap f . unUI
+
+instance Applicative UI where
+    pure  = return
+    (<*>) = ap
 
 instance Monad UI where
     return  = UI . return
diff --git a/src/Graphics/UI/Threepenny/Internal/Driver.hs b/src/Graphics/UI/Threepenny/Internal/Driver.hs
--- a/src/Graphics/UI/Threepenny/Internal/Driver.hs
+++ b/src/Graphics/UI/Threepenny/Internal/Driver.hs
@@ -88,7 +88,6 @@
 
 import qualified Data.Aeson                    as JSON
 import           Data.Aeson                    (Result(..))
-import           Data.Aeson.Generic
 import qualified Data.ByteString.Lazy.Char8    as LBS
 import           Data.Data
 
@@ -248,7 +247,7 @@
 signal Session{..} = do
     input <- getParam "signal"
     let err = error $ "Unable to parse " ++ show input
-    case JSON.decode . LBS.fromStrict =<< input of
+    case JSON.decode . LBS.fromChunks . return =<< input of
         Just    signal -> liftIO $ writeChan sSignals signal
         Nothing        -> err
 
diff --git a/src/Graphics/UI/Threepenny/Internal/Types.hs b/src/Graphics/UI/Threepenny/Internal/Types.hs
--- a/src/Graphics/UI/Threepenny/Internal/Types.hs
+++ b/src/Graphics/UI/Threepenny/Internal/Types.hs
@@ -17,12 +17,13 @@
 import Data.Map                         (Map)
 import Data.String                      (fromString)
 import Data.Time
+import Data.Text.Encoding               (encodeUtf8, decodeUtf8)
 
 import Network.URI
 import Data.Data
 import           Data.Aeson             as JSON
 import qualified Data.Aeson.Types       as JSON
-import qualified Data.Aeson.Generic
+import Data.Text
 
 import System.IO (stderr)
 import System.IO.Unsafe
@@ -62,9 +63,9 @@
 
 -- Marshalling ElementId
 instance ToJSON ElementId where
-    toJSON (ElementId o)  = toJSON o
+    toJSON (ElementId o)  = toJSON $ decodeUtf8 o
 instance FromJSON ElementId where
-    parseJSON (Object v)  = ElementId <$> v .: "Element"
+    parseJSON (Object v)  = (ElementId . encodeUtf8) <$> v .: "Element"
     parseJSON _           = mzero
 
 
@@ -148,6 +149,10 @@
 
 instance NFData Closure where rnf (Closure x) = rnf x
 
+instance ToJSON Closure where
+    toJSON (Closure (x,y)) = toJSON [toJSON x, toJSON y]
+
+
 {-----------------------------------------------------------------------------
     Public types
 ------------------------------------------------------------------------------}
@@ -204,7 +209,23 @@
   deriving (Typeable,Data,Show)
 
 instance ToJSON Instruction where
-    toJSON x = Data.Aeson.Generic.toJSON x 
+    toJSON (Debug x)          = object [ "tag" .= ("Debug" :: Text)
+                                       , "contents" .= x]
+    toJSON (SetToken x)       = object [ "tag" .= ("SetToken" :: Text)
+                                       , "contents" .= x]
+    toJSON (Bind x y)         = object [ "tag" .= ("Bind" :: Text)
+                                       , "contents" .= [toJSON x, toJSON y]]
+    toJSON (GetValues xs)     = object [ "tag" .= ("GetValues" :: Text)
+                                       , "contents" .= xs]
+    toJSON (RunJSFunction  x) = object [ "tag" .= ("RunJSFunction" :: Text)
+                                       , "contents" .= x]
+    toJSON (CallJSFunction x) = object [ "tag" .= ("CallJSFunction" :: Text)
+                                       , "contents" .= x]
+    toJSON (CallDeferredFunction (x,y,z))
+                              = object [ "tag" .= ("CallDeferredFunction" :: Text)
+                                       , "contents" .= [toJSON x, toJSON y, toJSON z]]
+    toJSON (Delete x)         = object [ "tag" .= ("Delete" :: Text)
+                                       , "contents" .= x]
 
 instance NFData Instruction where
     rnf (Debug    x  ) = rnf x
diff --git a/src/Graphics/UI/driver.js b/src/Graphics/UI/driver.js
--- a/src/Graphics/UI/driver.js
+++ b/src/Graphics/UI/driver.js
@@ -205,46 +205,45 @@
     // sendEvent     -- Function that sends a message { Event : value } to the server.
   
     console_log("Event: %s",JSON.stringify(event));
-    for(var key in event){
-      switch(key){
+    switch(event.tag){
 
-      case "CallDeferredFunction": {
-        // FIXME: CallDeferredFunction probably doesn't work right now.
-        var call        = event.CallDeferredFunction;
-        var closure     = call[0];
-        var theFunction = eval(call[1]);
-        var params      = call[2];
-        theFunction.apply(window, params.concat(function(){
-          console_log(this);
-          var args = Array.prototype.slice.call(arguments,0);
-          sendEvent(closure[0],closure[1],args);
-        }));
-        reply();
-        break;
-      }
-      case "RunJSFunction": {
-        eval(event.RunJSFunction);
+    case "CallDeferredFunction": {
+      // FIXME: CallDeferredFunction probably doesn't work right now.
+      var call        = event.contents;
+      var closure     = call[0];
+      var theFunction = eval(call[1]);
+      var params      = call[2];
+      theFunction.apply(window, params.concat(function(){
+        console_log(this);
+        var args = Array.prototype.slice.call(arguments,0);
+        sendEvent(closure[0],closure[1],args);
+      }));
+      reply();
+      break;
+    }
+    case "RunJSFunction": {
+        eval(event.contents);
         reply();
         break;
-      }
-      case "CallJSFunction": {
-        var result = eval(event.CallJSFunction);
+    }
+    case "CallJSFunction": {
+        var result = eval(event.contents);
         reply({FunctionResult : result});
         break;
-      }
-      case "Delete": {
-        deleteElid(event.Delete);
+    }
+    case "Delete": {
+        deleteElid(event.contents);
         reply();
         break;
-      }
-      case "Debug": {
+    }
+    case "Debug": {
         if(window.console)
-          console.log("Server debug: %o",event.Debug);
+          console.log("Server debug: %o",event.contents);
         reply();
         break;
-      }
-      case "GetValues": {
-        var ids = event.GetValues;
+    }
+    case "GetValues": {
+        var ids = event.contents;
         var len = ids.length;
         var values = [];
         for(var i = 0; i < len; i++) {
@@ -252,9 +251,9 @@
         }
         reply({ Values: values });
         break;
-      }
-      case "Bind": {
-        var bind        = event.Bind;
+    }
+    case "Bind": {
+        var bind        = event.contents;
         var eventType   = bind[0];
         var elid        = bind[1];
         var el          = elidToElement(elid);
@@ -298,9 +297,8 @@
         }
         reply();
         break;
-      }
-      default: reply();
-      }
+    }
+    default: reply();
     }
   }
 
diff --git a/threepenny-gui.cabal b/threepenny-gui.cabal
--- a/threepenny-gui.cabal
+++ b/threepenny-gui.cabal
@@ -1,5 +1,5 @@
 Name:                threepenny-gui
-Version:             0.4.1.0
+Version:             0.4.2.0
 Synopsis:            GUI framework that uses the web browser as a display.
 Description:
     Threepenny-GUI is a GUI framework that uses the web browser as a display.
@@ -92,7 +92,7 @@
       cpp-options:  -DREBUG
       ghc-options:  -O2   
   build-depends:     base                   >= 4     && < 5
-                    ,aeson                  == 0.6.*
+                    ,aeson                  >= 0.6   && < 0.8
                     ,attoparsec-enumerator  == 0.3.*
                     ,bytestring             >= 0.9.2 && < 0.11
                     ,containers             >= 0.4.2 && < 0.6
@@ -101,15 +101,15 @@
                     ,filepath               == 1.3.*
                     ,hashable               >= 1.1.0  && < 1.3
                     ,MonadCatchIO-transformers == 0.3.*
-                    ,network                >= 2.3.0  && < 2.5
+                    ,network                >= 2.3.0  && < 2.6
                     ,safe                   == 0.3.*
                     ,snap-server            == 0.9.*
                     ,snap-core              == 0.9.*
                     ,stm                    >= 2.3    && < 2.5
-                    ,template-haskell       >= 2.7.0  && < 2.9
+                    ,template-haskell       >= 2.7.0  && < 2.10
                     ,text                   >= 0.11   && < 1.2
                     ,time                   == 1.4.*
-                    ,transformers           == 0.3.*
+                    ,transformers           >= 0.3.0  && < 0.5
                     ,unordered-containers   == 0.2.*
                     ,utf8-string            == 0.3.*
                     ,websockets             == 0.8.*
