diff --git a/HueAPI.cabal b/HueAPI.cabal
--- a/HueAPI.cabal
+++ b/HueAPI.cabal
@@ -1,5 +1,5 @@
 name:                HueAPI
-version:             0.1
+version:             0.1.1
 synopsis:            API for controlling Philips Hue lights
 description:
 homepage:            https://github.com/sjoerdvisscher/HueAPI
@@ -16,7 +16,7 @@
   build-depends:       base ==4.6.*,
                        aeson ==0.6.*,
                        utf8-string ==0.3.*,
-                       http-conduit ==1.8.*,
+                       http-conduit ==1.9.*,
                        network ==2.4.*,
                        containers ==0.5.*,
                        transformers ==0.3.*,
diff --git a/HueAPI.hs b/HueAPI.hs
--- a/HueAPI.hs
+++ b/HueAPI.hs
@@ -1,4 +1,4 @@
- {-# LANGUAGE OverloadedStrings, DeriveGeneric #-}
+ {-# LANGUAGE OverloadedStrings, DeriveGeneric, DoAndIfThenElse #-}
 module HueAPI (
   
     HueData(..)
@@ -19,10 +19,9 @@
 
 import GHC.Generics
 import Data.Aeson
-import Data.ByteString.Lazy.UTF8 (fromString)
 import Network.HTTP.Conduit
 import Network
-import Data.Map.Strict (Map, toList, (!), adjust)
+import Data.Map.Strict (Map, fromList, (!), adjust)
 import Control.Applicative
 import Control.Monad
 import Control.Monad.IO.Class
@@ -84,7 +83,7 @@
       request' <- parseUrl url
       let request = request' { responseTimeout = Nothing }
       resp <- withManager $ httpLbs request
-      either doConnect return (eitherDecode (responseBody resp))
+      either doConnect return $ eitherDecode $ responseBody resp
     doConnect _ = do
       putStrLn "Press the link button on the base station"
       connect key host
@@ -103,61 +102,69 @@
 updateLight :: Name -> LightState -> Hue ()
 updateLight name l = do
   l' <- getLightState name
-  when (on l /= on l') $
-    updateLightProp name "on" (if on l then "true" else "false")
-  when (on l) $ do
-    when (bri l /= bri l') $
-      updateLightProp name "bri" (show $ bri l)
-    when (hue l /= hue l') $
-      updateLightProp name "hue" (show $ hue l)
-    when (sat l /= sat l') $
-      updateLightProp name "sat" (show $ sat l)
+  if on l then do
+    when (not $ on l') $ updateLightProps name [("on", True)]
+    updateLightProps name $
+         [("bri", toJSON $ bri l)|bri l /= bri l']
+      ++ [("hue", toJSON $ hue l)|hue l /= hue l']
+      ++ [("sat", toJSON $ sat l)|sat l /= sat l']
+  else
+    when (on l') $ updateLightProps name [("on", False)]
   d <- get
   put $ d { lights = adjust (\light -> light { state = if on l then l else l' { on = False } }) name (lights d) }
 
 
 initLight :: Name -> LightState -> Hue ()
 initLight name l = do
-  updateLightProp name "on" "true"
-  updateLightProp name "bri" (show $ bri l)
-  updateLightProp name "hue" (show $ hue l)
-  updateLightProp name "sat" (show $ sat l)
-  updateLightProp name "on" (if on l then "true" else "false")
+  updateLightProps name [("on", True)]
+  updateLightProps name $
+    [ ("bri", toJSON $ bri l)
+    , ("hue", toJSON $ hue l)
+    , ("sat", toJSON $ sat l)
+    ]
+  updateLightProps name [("on", on l)]
   d <- get
   put $ d { lights = adjust (\light -> light { state = l }) name (lights d) }
   
+map2json :: ToJSON a => [(String, a)] -> RequestBody m
+map2json = RequestBodyLBS . encode . fromList
   
-updateLightProp :: Name -> String -> String -> Hue ()
-updateLightProp name prop value = do
+updateLightProps :: ToJSON a => Name -> [(String, a)] -> Hue ()
+updateLightProps _ [] = return ()
+updateLightProps name m = do
   url <- ask
   resp <- liftIO $ withSocketsDo $ do
     initReq <- parseUrl $ url ++ "lights/" ++ name ++ "/state"
     let request = initReq {
-        requestBody = RequestBodyLBS (fromString $ "{\"" ++ prop ++ "\":" ++ value ++ "}")
+        requestBody = map2json m
       , method = "PUT"
       , responseTimeout = Nothing
       }
     withManager (httpLbs request)
   case eitherDecode $ responseBody resp of
-    Right [HueResult (HueError 901 _)] -> do
+    Right [HueResult (HueError i msg)] -> do
+      when (i /= 901) $ -- Don't print internal server errors
+        liftIO $ putStrLn $ "Error " ++ show i ++ ": " ++ msg
       liftIO $ threadDelay 100000
-      updateLightProp name prop value
-    Right [HueResult (HueError i m)] -> fail $ "Error " ++ show i ++ ": " ++ m
+      updateLightProps name m
     _ -> return ()
 
 connect :: String -> String -> IO ()
 connect key host = do
   initReq <- parseUrl $ "http://" ++ host ++ "/api/"
   let request = initReq {
-      requestBody = RequestBodyLBS (fromString $
-        "{\"username\":\"" ++ key ++ "\",\"devicetype\":\"Unknown\"}")
+      requestBody = map2json
+        [ ("username", key)
+        , ("devicetype", "Unknown")
+        ]
     , method = "POST"
     , responseTimeout = Nothing
     }
   resp <- withManager (httpLbs request)
   case eitherDecode $ responseBody resp of
-    Right [HueResult (HueError 101 _)] -> do
-      liftIO $ threadDelay 100000
+    Right [HueResult (HueError i msg)] -> do
+      when (i /= 101) $ -- Don't print "press the button" errors
+        putStrLn $ "Error " ++ show i ++ ": " ++ msg
+      threadDelay 100000
       connect key host
-    Right [HueResult (HueError i m)] -> fail $ "Error " ++ show i ++ ": " ++ m
     _ -> return ()
