diff --git a/GetURL.hs b/GetURL.hs
--- a/GetURL.hs
+++ b/GetURL.hs
@@ -4,22 +4,9 @@
 
 module GetURL (getURL) where
 
-import Network.HTTP
-import Network.Browser
-import Network.URI
+import Network.HTTP.Conduit
 import Data.ByteString (ByteString)
+import qualified Data.ByteString.Lazy as L
 
 getURL :: String -> IO ByteString
-getURL url = do
-  Network.Browser.browse $ do
-    setCheckForProxy True
-    setDebugLog Nothing
-    setOutHandler (const (return ()))
-    (_, rsp) <- request (getRequest' (escapeURIString isUnescapedInURI url))
-    return (rspBody rsp)
-  where
-   getRequest' :: String -> Request ByteString
-   getRequest' urlString =
-    case parseURI urlString of
-      Nothing -> error ("getRequest: Not a valid URL - " ++ urlString)
-      Just u  -> mkRequest GET u
+getURL url = L.toStrict <$> simpleHttp url
diff --git a/TMVar.hs b/TMVar.hs
deleted file mode 100644
--- a/TMVar.hs
+++ /dev/null
@@ -1,49 +0,0 @@
-module TMVar where
-
-import Control.Concurrent.STM hiding (TMVar, takeTMVar)
-
--- <<TMVar
-newtype TMVar a = TMVar (TVar (Maybe a))
--- >>
-
-newTMVar :: a -> STM (TMVar a)
-newTMVar a = do
-  t <- newTVar (Just a)
-  return (TMVar t)
-
--- <<newEmptyTMVar
-newEmptyTMVar :: STM (TMVar a)
-newEmptyTMVar = do
-  t <- newTVar Nothing
-  return (TMVar t)
--- >>
-
--- <<takeTMVar
-takeTMVar :: TMVar a -> STM a
-takeTMVar (TMVar t) = do
-  m <- readTVar t                       -- <1>
-  case m of
-    Nothing -> retry                    -- <2>
-    Just a  -> do
-      writeTVar t Nothing               -- <3>
-      return a
--- >>
-
--- <<putTMVar
-putTMVar :: TMVar a -> a -> STM ()
-putTMVar (TMVar t) a = do
-  m <- readTVar t
-  case m of
-    Nothing -> do
-      writeTVar t (Just a)
-      return ()
-    Just _  -> retry
--- >>
-
--- <<takeEitherTMVar
-takeEitherTMVar :: TMVar a -> TMVar b -> STM (Either a b)
-takeEitherTMVar ma mb =
-  fmap Left (takeTMVar ma)
-    `orElse`
-  fmap Right (takeTMVar mb)
--- >>
diff --git a/WindowManager.hs b/WindowManager.hs
deleted file mode 100644
--- a/WindowManager.hs
+++ /dev/null
@@ -1,74 +0,0 @@
-module WindowManager where
-
-import Control.Concurrent.STM
-import Data.Map as Map
-import Data.Set as Set
-import Data.Maybe
-
-data Window
-instance Eq Window
-instance Ord Window
-
-data Desktop
-instance Eq Desktop
-instance Ord Desktop
-
-type Display = Map Desktop (TVar (Set Window))
-
--- <<moveWindowSTM
-moveWindowSTM :: Display -> Window -> Desktop -> Desktop -> STM ()
-moveWindowSTM disp win a b = do
-  wa <- readTVar ma
-  wb <- readTVar mb
-  writeTVar ma (Set.delete win wa)
-  writeTVar mb (Set.insert win wb)
- where
-  ma = disp ! a
-  mb = disp ! b
--- >>
-
--- <<moveWindow
-moveWindow :: Display -> Window -> Desktop -> Desktop -> IO ()
-moveWindow disp win a b = atomically $ moveWindowSTM disp win a b
--- >>
-
--- <<swapWindows
-swapWindows :: Display
-            -> Window -> Desktop
-            -> Window -> Desktop
-            -> IO ()
-swapWindows disp w a v b = atomically $ do
-  moveWindowSTM disp w a b
-  moveWindowSTM disp v b a
--- >>
-
-render :: Set Window -> IO ()
-render = undefined
-
--- <<UserFocus
-type UserFocus = TVar Desktop
--- >>
-
--- <<getWindows
-getWindows :: Display -> UserFocus -> STM (Set Window)
-getWindows disp focus = do
-  desktop <- readTVar focus
-  readTVar (disp ! desktop)
--- >>
-
--- <<renderThread
-renderThread :: Display -> UserFocus -> IO ()
-renderThread disp focus = do
-  wins <- atomically $ getWindows disp focus    -- <1>
-  loop wins                                     -- <2>
- where
-  loop wins = do                                -- <3>
-    render wins                                 -- <4>
-    next <- atomically $ do
-               wins' <- getWindows disp focus   -- <5>
-               if (wins == wins')               -- <6>
-                   then retry                   -- <7>
-                   else return wins'            -- <8>
-    loop next
--- >>
-
diff --git a/miscmodules.hs b/miscmodules.hs
deleted file mode 100644
--- a/miscmodules.hs
+++ /dev/null
@@ -1,6 +0,0 @@
-import WindowManager
-import TMVar
-import TList
-
-main :: IO ()
-main = return ()
diff --git a/miscmodules/TMVar.hs b/miscmodules/TMVar.hs
new file mode 100644
--- /dev/null
+++ b/miscmodules/TMVar.hs
@@ -0,0 +1,49 @@
+module TMVar where
+
+import Control.Concurrent.STM hiding (TMVar, takeTMVar)
+
+-- <<TMVar
+newtype TMVar a = TMVar (TVar (Maybe a))
+-- >>
+
+newTMVar :: a -> STM (TMVar a)
+newTMVar a = do
+  t <- newTVar (Just a)
+  return (TMVar t)
+
+-- <<newEmptyTMVar
+newEmptyTMVar :: STM (TMVar a)
+newEmptyTMVar = do
+  t <- newTVar Nothing
+  return (TMVar t)
+-- >>
+
+-- <<takeTMVar
+takeTMVar :: TMVar a -> STM a
+takeTMVar (TMVar t) = do
+  m <- readTVar t                       -- <1>
+  case m of
+    Nothing -> retry                    -- <2>
+    Just a  -> do
+      writeTVar t Nothing               -- <3>
+      return a
+-- >>
+
+-- <<putTMVar
+putTMVar :: TMVar a -> a -> STM ()
+putTMVar (TMVar t) a = do
+  m <- readTVar t
+  case m of
+    Nothing -> do
+      writeTVar t (Just a)
+      return ()
+    Just _  -> retry
+-- >>
+
+-- <<takeEitherTMVar
+takeEitherTMVar :: TMVar a -> TMVar b -> STM (Either a b)
+takeEitherTMVar ma mb =
+  fmap Left (takeTMVar ma)
+    `orElse`
+  fmap Right (takeTMVar mb)
+-- >>
diff --git a/miscmodules/WindowManager.hs b/miscmodules/WindowManager.hs
new file mode 100644
--- /dev/null
+++ b/miscmodules/WindowManager.hs
@@ -0,0 +1,74 @@
+module WindowManager where
+
+import Control.Concurrent.STM
+import Data.Map as Map
+import Data.Set as Set
+import Data.Maybe
+
+data Window
+instance Eq Window
+instance Ord Window
+
+data Desktop
+instance Eq Desktop
+instance Ord Desktop
+
+type Display = Map Desktop (TVar (Set Window))
+
+-- <<moveWindowSTM
+moveWindowSTM :: Display -> Window -> Desktop -> Desktop -> STM ()
+moveWindowSTM disp win a b = do
+  wa <- readTVar ma
+  wb <- readTVar mb
+  writeTVar ma (Set.delete win wa)
+  writeTVar mb (Set.insert win wb)
+ where
+  ma = disp ! a
+  mb = disp ! b
+-- >>
+
+-- <<moveWindow
+moveWindow :: Display -> Window -> Desktop -> Desktop -> IO ()
+moveWindow disp win a b = atomically $ moveWindowSTM disp win a b
+-- >>
+
+-- <<swapWindows
+swapWindows :: Display
+            -> Window -> Desktop
+            -> Window -> Desktop
+            -> IO ()
+swapWindows disp w a v b = atomically $ do
+  moveWindowSTM disp w a b
+  moveWindowSTM disp v b a
+-- >>
+
+render :: Set Window -> IO ()
+render = undefined
+
+-- <<UserFocus
+type UserFocus = TVar Desktop
+-- >>
+
+-- <<getWindows
+getWindows :: Display -> UserFocus -> STM (Set Window)
+getWindows disp focus = do
+  desktop <- readTVar focus
+  readTVar (disp ! desktop)
+-- >>
+
+-- <<renderThread
+renderThread :: Display -> UserFocus -> IO ()
+renderThread disp focus = do
+  wins <- atomically $ getWindows disp focus    -- <1>
+  loop wins                                     -- <2>
+ where
+  loop wins = do                                -- <3>
+    render wins                                 -- <4>
+    next <- atomically $ do
+               wins' <- getWindows disp focus   -- <5>
+               if (wins == wins')               -- <6>
+                   then retry                   -- <7>
+                   else return wins'            -- <8>
+    loop next
+-- >>
+
diff --git a/miscmodules/miscmodules.hs b/miscmodules/miscmodules.hs
new file mode 100644
--- /dev/null
+++ b/miscmodules/miscmodules.hs
@@ -0,0 +1,6 @@
+import WindowManager
+import TMVar
+import TList
+
+main :: IO ()
+main = return ()
diff --git a/other/bingtranslatorconc.hs b/other/bingtranslatorconc.hs
--- a/other/bingtranslatorconc.hs
+++ b/other/bingtranslatorconc.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE PatternGuards #-}
-import Network.HTTP hiding (postRequest)
 import Control.Exception
 import Control.Monad
 import Text.Printf
@@ -9,9 +8,6 @@
 import System.Environment
 import Control.Concurrent
 import Prelude hiding (catch)
-import Network.HTTP
-import Network.Browser
-import Network.URI
 import Data.ByteString (ByteString)
 import qualified Data.ByteString.Char8 as B
 import Text.XML.Light
diff --git a/parconc-examples.cabal b/parconc-examples.cabal
--- a/parconc-examples.cabal
+++ b/parconc-examples.cabal
@@ -1,5 +1,5 @@
 name:                parconc-examples
-version:             0.4.3
+version:             0.4.4
 synopsis:            Examples to accompany the book "Parallel and Concurrent Programming in Haskell"
 -- description:         
 license:             BSD3
@@ -465,7 +465,7 @@
   other-modules: GetURL
   build-depends:   base >= 4.5 && < 4.9
                  , containers >= 0.4 && < 0.6
-                 , HTTP ==4000.2.*
+                 , http-conduit >= 2.1 && < 2.3
                  , bytestring >= 0.9 && < 0.11
   if flag(network26)
       build-depends: network >= 2.6 && < 2.7
@@ -481,7 +481,7 @@
                  , stm ==2.4.*
                  , bytestring >= 0.9 && < 0.11
                  , time >= 1.4 && < 1.6
-                 , HTTP ==4000.2.*
+                 , http-conduit >= 2.1 && < 2.3
   if flag(network26)
       build-depends: network >= 2.6 && < 2.7
                    , network-uri >= 2.6 && < 2.7
@@ -496,7 +496,7 @@
                  , stm ==2.4.*
                  , bytestring >= 0.9 && < 0.11
                  , time >= 1.4 && < 1.6
-                 , HTTP ==4000.2.*
+                 , http-conduit >= 2.1 && < 2.3
   if flag(network26)
       build-depends: network >= 2.6 && < 2.7
                    , network-uri >= 2.6 && < 2.7
@@ -511,7 +511,7 @@
                  , stm ==2.4.*
                  , bytestring >= 0.9 && < 0.11
                  , time >= 1.4 && < 1.6
-                 , HTTP ==4000.2.*
+                 , http-conduit >= 2.1 && < 2.3
   if flag(network26)
       build-depends: network >= 2.6 && < 2.7
                    , network-uri >= 2.6 && < 2.7
@@ -526,7 +526,7 @@
                  , stm ==2.4.*
                  , bytestring >= 0.9 && < 0.11
                  , time >= 1.4 && < 1.6
-                 , HTTP ==4000.2.*
+                 , http-conduit >= 2.1 && < 2.3
   if flag(network26)
       build-depends: network >= 2.6 && < 2.7
                    , network-uri >= 2.6 && < 2.7
@@ -541,7 +541,7 @@
                  , stm ==2.4.*
                  , bytestring >= 0.9 && < 0.11
                  , time >= 1.4 && < 1.6
-                 , HTTP ==4000.2.*
+                 , http-conduit >= 2.1 && < 2.3
   if flag(network26)
       build-depends: network >= 2.6 && < 2.7
                    , network-uri >= 2.6 && < 2.7
@@ -559,7 +559,7 @@
                  , stm ==2.4.*
                  , bytestring >= 0.9 && < 0.11
                  , time >= 1.4 && < 1.6
-                 , HTTP ==4000.2.*
+                 , http-conduit >= 2.1 && < 2.3
   if flag(network26)
       build-depends: network >= 2.6 && < 2.7
                    , network-uri >= 2.6 && < 2.7
@@ -574,7 +574,7 @@
                  , stm ==2.4.*
                  , bytestring >= 0.9 && < 0.11
                  , time >= 1.4 && < 1.6
-                 , HTTP ==4000.2.*
+                 , http-conduit >= 2.1 && < 2.3
   if flag(network26)
       build-depends: network >= 2.6 && < 2.7
                    , network-uri >= 2.6 && < 2.7
@@ -610,8 +610,14 @@
 -- -----------------------------------------------------------------------------
 -- conc-stm
 
+-- NB. The book refers to "tmvar.hs" and "windowmanager.hs", so we
+-- can't change rename these files.  However, we need to use proper
+-- upper-case module names, so we use symbolic links from a
+-- subdirectory (mismodules) so that the repo remains safe to use on
+-- case-insensitive filesystems (#15).
 executable  miscmodules
   main-is: miscmodules.hs
+  hs-source-dirs: miscmodules .
   other-modules: TMVar, TList, TQueue, TBQueue, WindowManager
   build-depends:   base >= 4.5 && < 4.9
                  , containers >= 0.4 && < 0.6
@@ -625,7 +631,7 @@
                  , stm ==2.4.*
                  , bytestring >= 0.9 && < 0.11
                  , time >= 1.4 && < 1.6
-                 , HTTP ==4000.2.*
+                 , http-conduit >= 2.1 && < 2.3
   if flag(network26)
       build-depends: network >= 2.6 && < 2.7
                    , network-uri >= 2.6 && < 2.7
@@ -649,7 +655,7 @@
                  , stm ==2.4.*
                  , bytestring >= 0.9 && < 0.11
                  , time >= 1.4 && < 1.6
-                 , HTTP ==4000.2.*
+                 , http-conduit >= 2.1 && < 2.3
   if flag(network26)
       build-depends: network >= 2.6 && < 2.7
                    , network-uri >= 2.6 && < 2.7
@@ -664,7 +670,7 @@
                  , stm ==2.4.*
                  , bytestring >= 0.9 && < 0.11
                  , time >= 1.4 && < 1.6
-                 , HTTP ==4000.2.*
+                 , http-conduit >= 2.1 && < 2.3
   if flag(network26)
       build-depends: network >= 2.6 && < 2.7
                    , network-uri >= 2.6 && < 2.7
@@ -679,7 +685,7 @@
                  , stm ==2.4.*
                  , bytestring >= 0.9 && < 0.11
                  , time >= 1.4 && < 1.6
-                 , HTTP ==4000.2.*
+                 , http-conduit >= 2.1 && < 2.3
   if flag(network26)
       build-depends: network >= 2.6 && < 2.7
                    , network-uri >= 2.6 && < 2.7
@@ -1060,7 +1066,7 @@
   build-depends:   base >= 4.5 && < 4.9
                  , bytestring >= 0.9 && < 0.11
                  , time >= 1.4 && < 1.6
-                 , HTTP ==4000.2.*
+                 , http-conduit >= 2.1 && < 2.3
                  , utf8-string >= 0.3 && < 1.1
                  , xml ==1.3.*
   if flag(network26)
@@ -1077,7 +1083,7 @@
   build-depends:   base >= 4.5 && < 4.9
                  , bytestring >= 0.9 && < 0.11
                  , time >= 1.4 && < 1.6
-                 , HTTP ==4000.2.*
+                 , http-conduit >= 2.1 && < 2.3
                  , utf8-string >= 0.3 && < 1.1
                  , xml ==1.3.*
   if flag(network26)
@@ -1094,7 +1100,7 @@
                  , stm ==2.4.*
                  , bytestring >= 0.9 && < 0.11
                  , time >= 1.4 && < 1.6
-                 , HTTP ==4000.2.*
+                 , http-conduit >= 2.1 && < 2.3
   if flag(network26)
       build-depends: network >= 2.6 && < 2.7
                    , network-uri >= 2.6 && < 2.7
