diff --git a/ChangeLog b/ChangeLog
new file mode 100644
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,4 @@
+# 0.3.0
+
+- Fix compatibility with network-3.0
+
diff --git a/examples/receiver.hs b/examples/receiver.hs
--- a/examples/receiver.hs
+++ b/examples/receiver.hs
@@ -1,11 +1,13 @@
-import Network.Socket (withSocketsDo, recvFrom)
+import Network.Socket (withSocketsDo)
+import qualified Data.ByteString.Char8 as C
+import Network.Socket.ByteString (recvFrom)
 import Network.Multicast
 
 main :: IO ()
 main = withSocketsDo $ do
     sock <- multicastReceiver "224.0.0.99" 9999
     let loop = do
-        (msg, _, addr) <- recvFrom sock 1024
-        putStrLn $ "Recv [" ++ show addr ++ "]: " ++ msg
+        (msg, addr) <- recvFrom sock 1024
+        putStrLn $ "Recv [" ++ show addr ++ "]: " ++ C.unpack msg
         loop
     loop
diff --git a/examples/sender.hs b/examples/sender.hs
--- a/examples/sender.hs
+++ b/examples/sender.hs
@@ -1,15 +1,17 @@
-import Network.Socket (withSocketsDo, sendTo)
+import Network.Socket (withSocketsDo)
+import Network.Socket.ByteString (sendTo)
+import qualified Data.ByteString.Char8 as C
 import Network.Multicast
 
-import System.Time (getClockTime)
+import Data.Time.Clock (getCurrentTime)
 import Control.Concurrent (threadDelay)
 
 main :: IO ()
 main = withSocketsDo $ do
     (sock, addr) <- multicastSender "224.0.0.99" 9999
     let loop = do
-        msg <- fmap show getClockTime
-        sendTo sock msg addr
+        msg <- fmap show getCurrentTime
+        sendTo sock (C.pack msg) addr
         putStrLn $ "Send [" ++ show addr ++ "]: " ++ msg
         threadDelay 100000
         loop
diff --git a/network-multicast.cabal b/network-multicast.cabal
--- a/network-multicast.cabal
+++ b/network-multicast.cabal
@@ -1,6 +1,6 @@
 name:               network-multicast
-version:            0.2.0
-copyright:          2008-2016 Audrey Tang
+version:            0.3.0
+copyright:          2008-2019 Audrey Tang
 license:            PublicDomain
 license-file:       LICENSE
 author:             Audrey Tang <audreyt@audreyt.org>
@@ -12,12 +12,12 @@
 build-type:         Simple
 category:           Network
 cabal-version:      >= 1.6
-extra-source-files: examples/sender.hs examples/receiver.hs
+extra-source-files: examples/sender.hs examples/receiver.hs ChangeLog
 
 library
     extensions:         ForeignFunctionInterface, CPP
     exposed-modules:    Network.Multicast
-    build-depends:      base >= 4 && < 5, network
+    build-depends:      base >= 4 && < 5, network, network-bsd
     hs-source-dirs:     src
     if os(win32)
         extra-libraries: ws2_32
diff --git a/src/Network/Multicast.hsc b/src/Network/Multicast.hsc
--- a/src/Network/Multicast.hsc
+++ b/src/Network/Multicast.hsc
@@ -31,6 +31,7 @@
 import Foreign.Marshal
 import Foreign.Ptr
 import Control.Exception (bracketOnError)
+import Data.Word (Word32)
 
 type TimeToLive = Int
 type LoopbackMode = Bool
@@ -39,6 +40,9 @@
 enableLoopback = True
 noLoopback     = False
 
+inet_addr :: HostName -> IO HostAddress
+inet_addr = fmap hostAddress . getHostByName
+
 -- | Calling 'multicastSender' creates a client side UDP socket for sending
 -- multicast datagrams to the specified host and port.
 --
@@ -73,7 +77,7 @@
 -- >         print (msg, addr) in loop
 --
 multicastReceiver :: HostName -> PortNumber -> IO Socket
-multicastReceiver host port = bracketOnError get sClose setup
+multicastReceiver host port = bracketOnError get close setup
   where
     get :: IO Socket
     get = do
@@ -88,14 +92,22 @@
 #endif
     setup :: Socket -> IO Socket
     setup sock = do
-      bindSocket sock $ SockAddrInet port iNADDR_ANY
+      bind sock $ SockAddrInet port iNADDR_ANY
       addMembership sock host Nothing
       return sock
 
+iNADDR_ANY :: HostAddress
+iNADDR_ANY = htonl 0
+
+-- | Converts the from host byte order to network byte order.
+foreign import ccall unsafe "htonl" htonl :: Word32 -> Word32
+
+
 doSetSocketOption :: Storable a => CInt -> Socket -> a -> IO CInt
-doSetSocketOption ip_multicast_option (MkSocket s _ _ _ _) x = alloca $ \ptr -> do
+doSetSocketOption ip_multicast_option sock x = alloca $ \ptr -> do
     poke ptr x
-    c_setsockopt s _IPPROTO_IP ip_multicast_option (castPtr ptr) (toEnum $ sizeOf x)
+    fd <- fdSocket sock
+    c_setsockopt fd _IPPROTO_IP ip_multicast_option (castPtr ptr) (toEnum $ sizeOf x)
 
 -- | Enable or disable the loopback mode on a socket created by 'multicastSender'.
 -- Loopback is enabled by default; disabling it may improve performance a little bit.
@@ -130,14 +142,15 @@
     _ -> ioError (errnoToIOError name (Errno (fromIntegral err)) Nothing Nothing)
 
 doMulticastGroup :: CInt -> Socket -> HostName -> Maybe HostName -> IO CInt
-doMulticastGroup flag (MkSocket s _ _ _ _) host local = allocaBytes #{size struct ip_mreq} $ \mReqPtr -> do
+doMulticastGroup flag sock host local = allocaBytes #{size struct ip_mreq} $ \mReqPtr -> do
     addr <- inet_addr host
     iface <- case local of
         Nothing -> return (#{const INADDR_ANY} `asTypeOf` addr)
         Just loc -> inet_addr loc
     #{poke struct ip_mreq, imr_multiaddr} mReqPtr addr
     #{poke struct ip_mreq, imr_interface} mReqPtr iface
-    c_setsockopt s _IPPROTO_IP flag (castPtr mReqPtr) (#{size struct ip_mreq})
+    fd <- fdSocket sock
+    c_setsockopt fd _IPPROTO_IP flag (castPtr mReqPtr) (#{size struct ip_mreq})
 
 #ifdef mingw32_HOST_OS
 foreign import stdcall unsafe "setsockopt"
@@ -175,3 +188,4 @@
 
 _IPPROTO_IP :: CInt
 _IPPROTO_IP = #const IPPROTO_IP
+
