diff --git a/DefendTheKing.cabal b/DefendTheKing.cabal
--- a/DefendTheKing.cabal
+++ b/DefendTheKing.cabal
@@ -1,5 +1,5 @@
 Name:                DefendTheKing
-Version:             0.3
+Version:             0.3.1
 Cabal-Version:       >= 1.2
 Synopsis:            A simple RTS game
 Category:            game, FRP
@@ -27,7 +27,7 @@
   Main-IS:           defend.hs
   Other-Modules:     Geometry, Networking, ParseStun, Intro, Draw, Parse, NetMatching, NetEngine, Chess, GameLogic, Font
   Build-Depends:     base >=2 && < 5, peakachu >= 0.3.0, GLUT, containers,
-                     random, time, utility-ht, haskell98,
+                     random, time, utility-ht,
                      network, HTTP >= 4000.0.5, mtl, bytestring, binary,
                      MaybeT, zlib
   GHC-Options:       -O2 -Wall
diff --git a/src/Geometry.hs b/src/Geometry.hs
--- a/src/Geometry.hs
+++ b/src/Geometry.hs
@@ -13,7 +13,7 @@
     base = map (zipWith (-) offset) (tail points)
     [[a0, a1, a2], [b0, b1, b2]] = base
 
-normalizeVector :: Floating a => [a] -> [a]
+normalizeVector :: (Eq a, Floating a) => [a] -> [a]
 normalizeVector vec
   | all (== 0) vec = vec
   | otherwise = map (/ norm) vec
@@ -29,7 +29,7 @@
 
 type Line a = ((a, a), (a, a))
 
-slope :: Fractional a => Line a -> Maybe a
+slope :: (Eq a, Fractional a) => Line a -> Maybe a
 slope ((x0, y0), (x1, y1))
   | x0 == x1 = Nothing
   | otherwise = Just $ (y1-y0) / (x1-x0)
@@ -49,7 +49,7 @@
         in
           Just (x, yAt0 a da + x * da)
 
-expandPolygon :: Floating a => a -> [(a, a)] -> [(a, a)]
+expandPolygon :: (Eq a, Floating a) => a -> [(a, a)] -> [(a, a)]
 expandPolygon ammount outline
   | null t = []
   | otherwise = last t : init t
diff --git a/src/Networking.hs b/src/Networking.hs
--- a/src/Networking.hs
+++ b/src/Networking.hs
@@ -14,6 +14,7 @@
 import Control.Concurrent (forkIO, threadDelay)
 import Control.Concurrent.MVar (newMVar, readMVar)
 import Control.Concurrent.MVar.YC (modifyMVarPure, writeMVar)
+import Control.Exception (try)
 import Control.Monad (forever, join, liftM2, unless, when, replicateM)
 import Data.ADT.Getters
 import Data.Char (chr)
@@ -23,16 +24,16 @@
 import Data.Monoid (Monoid(..))
 import FRP.Peakachu.Backend (Backend(..))
 import FRP.Peakachu.Backend.Internal (Sink(..))
-import Network.BSD (getHostByName, getHostName, hostAddress)
+import Network.BSD (getHostByName, hostAddress)
 import Network.HTTP (getRequest, rspBody, simpleHTTP)
 import Network.Socket (
   Family(..), HostAddress, PortNumber(..),
   SockAddr(..), Socket, SocketType(..),
-  bindSocket, iNADDR_ANY,
+  bindSocket, connect, getSocketName, iNADDR_ANY,
   recvFrom, sendTo, socket
   )
-import Random (randomRIO)
-import System.IO.Error (isAlreadyInUseError, try)
+import System.Random (randomRIO)
+import System.IO.Error (isAlreadyInUseError)
 import Text.Read.HT (maybeRead)
 
 data ProgToUdp a
@@ -89,8 +90,17 @@
   fmap hostAddress . getHostByName
 
 getHostAddress :: IO HostAddress
-getHostAddress =
-  getHostName >>= getHostAddrByName
+getHostAddress = do
+  sock <- socket AF_INET Datagram 0
+  connect sock (SockAddrInet 80 anInternetHostAddress)
+  SockAddrInet _ r <- getSocketName sock
+  return r
+  where
+    -- a random IP from the internet (74.125.230.83).
+    -- It's one of "google.com".
+    -- we're going to fake UDP connect to it. See:
+    -- http://stackoverflow.com/questions/166506/finding-local-ip-addresses-in-python/166589#166589
+    anInternetHostAddress = 1407614282
 
 stunPort :: PortNumber
 stunPort = fromInteger 3478
