diff --git a/mvclient.cabal b/mvclient.cabal
--- a/mvclient.cabal
+++ b/mvclient.cabal
@@ -1,5 +1,5 @@
 Name:                mvclient
-Version:             0.3
+Version:             0.4
 Synopsis:            Client library for metaverse systems like Second Life
 Description:         The client side of connections to virtual world environments
                      like Linden Labs' Second Life, sometimes known as the
@@ -24,13 +24,12 @@
                      BuildTools/Template2Hs.hs,
                      other/LogTranslate.hs
 
-flag network-bytestring
-
 Library
   Hs-source-dirs:      src
   Exposed-modules:     Network.Metaverse, Network.Metaverse.Circuit,
                        Network.Metaverse.PacketTypes, Network.Metaverse.Login
   Build-depends:       base >= 4 && < 5,
+                       base-unicode-symbols == 0.2.1.1,
                        bytestring == 0.9.*,
                        Crypto == 4.2.*,
                        maccatcher == 1.0.*,
@@ -42,10 +41,6 @@
                        control-event >= 1.1.0.4 && < 1.3,
                        parsec == 3.1.*,
                        uuid == 1.2.*,
-                       http-enumerator == 0.2.*,
-                       hexpat == 0.19.*
-  if flag(network-bytestring)
-    Build-depends:     network >= 2.2.1 && < 2.2.3,
-                       network-bytestring >= 0.1.3 && < 0.2
-  else
-    Build-depends:     network >= 2.2.3 && < 2.4
+                       http-enumerator == 0.5.*,
+                       hexpat == 0.19.*,
+                       network >= 2.2.3 && < 2.4
diff --git a/src/Network/Metaverse.hs b/src/Network/Metaverse.hs
--- a/src/Network/Metaverse.hs
+++ b/src/Network/Metaverse.hs
@@ -45,6 +45,7 @@
     getBalance,
     estateBan,
     estateUnban,
+    setTerrainVariables,
 
     -- * Low-level adapters
     -- $lowlevel
@@ -501,6 +502,32 @@
         [ EstateOwnerMessage_ParamList (stringToBytes (show (circuitAgentID circ))),
           EstateOwnerMessage_ParamList (stringToBytes (show flag)),
           EstateOwnerMessage_ParamList (stringToBytes (show uuid)) ]
+
+{-|
+    Sets variables that control region terrain.
+-}
+setTerrainVariables :: Circuit -- ^ The circuit to operate in
+                    -> Float   -- ^ Height of water, in meters
+                    -> Float   -- ^ Limit for raising terrain
+                    -> Float   -- ^ Limit for lowering terrain
+                    -> Bool    -- ^ Use estate sun
+                    -> Bool    -- ^ Use fixed sun
+                    -> Float   -- ^ Sun position
+                    -> IO ()
+setTerrainVariables circ water raise lower esun fsun sunpos = do
+    Just invoice <- nextUUID
+    circuitSend circ True $ EstateOwnerMessage
+        (EstateOwnerMessage_AgentData (circuitAgentID circ) (circuitSessionID circ) nil)
+        (EstateOwnerMessage_MethodData (stringToBytes "setregionterrain") invoice)
+        [ EstateOwnerMessage_ParamList (stringToBytes (show water)),
+          EstateOwnerMessage_ParamList (stringToBytes (show raise)),
+          EstateOwnerMessage_ParamList (stringToBytes (show lower)),
+          EstateOwnerMessage_ParamList (stringToBytes (if esun then "Y" else "N")),
+          EstateOwnerMessage_ParamList (stringToBytes (if fsun then "Y" else "N")),
+          EstateOwnerMessage_ParamList (stringToBytes (show sunpos)),
+          EstateOwnerMessage_ParamList (stringToBytes "Y"),
+          EstateOwnerMessage_ParamList (stringToBytes "N"),
+          EstateOwnerMessage_ParamList (stringToBytes "0.00") ]
 
 {- ==================================================================
    Low-level adapters
diff --git a/src/Network/Metaverse/Circuit.hs b/src/Network/Metaverse/Circuit.hs
--- a/src/Network/Metaverse/Circuit.hs
+++ b/src/Network/Metaverse/Circuit.hs
@@ -339,7 +339,10 @@
     Only does something if the circuit is not closed.
 -}
 ifNotClosed :: Monad m => StateT Accounting m () -> StateT Accounting m ()
-ifNotClosed action = fmap acctClosed S.get >>= \r -> when (not r) action
+ifNotClosed action = do
+    acct <- S.get
+    let r = acctClosed acct
+    when (not r) action
 
 {-
     Sends a packet on the circuit.  This is the function that is narrowly
diff --git a/src/Network/Metaverse/Login.hs b/src/Network/Metaverse/Login.hs
--- a/src/Network/Metaverse/Login.hs
+++ b/src/Network/Metaverse/Login.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE TupleSections       #-}
 {-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE OverloadedStrings   #-}
 
 {-|
     This module implements the XML-RPC based login protocol provided
@@ -28,6 +29,8 @@
 import qualified Data.ByteString      as B
 import qualified Data.ByteString.Lazy as L
 
+import Data.ByteString.Char8 () -- for string instance
+
 data MVToken = MVToken {
     tokenAgentID     :: UUID,
     tokenSimIP       :: String,
@@ -58,7 +61,7 @@
 hashPassword = ("$1$" ++) . toHexString . hash . map (fromIntegral . ord)
 
 loginRequest :: String -> String -> String -> String -> L.ByteString
-loginRequest first last passwd ethmac = format $ Element "methodCall" [] [
+loginRequest first last passwd ethmac = format $ Element ("methodCall" :: String) [] [
     Element "methodName" [] [ Text "login_to_simulator" ],
     Element "params" [] [ Element "param" [] [ Element "value" [] [ Element "struct" [] [
         Element "member" [] [
@@ -75,7 +78,7 @@
             ],
         Element "member" [] [
             Element "name" [] [ Text "start" ],
-            Element "value" [] [ Element "string" [] [ Text "last" ]]
+            Element "value" [] [ Element "string" [] [ Text "home" ]]
             ],
         Element "member" [] [
             Element "name" [] [ Text "channel" ],
@@ -147,11 +150,11 @@
     where doLogin ethmac = do
             let msg = loginRequest first last passwd (show ethmac)
             urlReq <- parseUrl loginURL
-            let req = urlReq { method      = B.pack (map (fromIntegral . ord) "POST"),
-                               requestBody = msg,
-                               requestHeaders = (B.pack $ map (fromIntegral . ord) "Content-type", B.pack $ map (fromIntegral . ord) "text/xml") : requestHeaders urlReq
+            let req = urlReq { method      = "POST",
+                               requestBody = RequestBodyLBS msg,
+                               requestHeaders = ("Content-type", "text/xml") : requestHeaders urlReq
                              }
-            resp <- httpLbsRedirect req
+            resp <- withManager $ httpLbsRedirect req
             let presult = parse' defaultParseOptions (B.concat $ L.toChunks $ responseBody resp)
             case presult of
                 Left err   -> error $ "Bad response: " ++ show err
