diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,3 @@
+# 0.2.3
+
+  * Negotiate `UTF8_ATOMS` to support OTP 20.
diff --git a/erlang.cabal b/erlang.cabal
--- a/erlang.cabal
+++ b/erlang.cabal
@@ -1,5 +1,5 @@
 name:                erlang
-version:             0.2.2
+version:             0.2.3
 stability:           alpha
 description:
   Speaks the Erlang network protocol and impersonates an Erlang node
@@ -16,6 +16,8 @@
 synopsis:            FFI interface to Erlang.
 cabal-version:       >= 1.6
 build-type:          Simple
+extra-source-files:
+  CHANGELOG
 source-repository head
   type:     git
   location: https://github.com/gombocarti/erlang-ffi.git
diff --git a/src/Foreign/Erlang/Network.hs b/src/Foreign/Erlang/Network.hs
--- a/src/Foreign/Erlang/Network.hs
+++ b/src/Foreign/Erlang/Network.hs
@@ -1,5 +1,5 @@
 -- |
--- Module      : Foreign.Erlang.OTP
+-- Module      : Foreign.Erlang.Network
 -- Copyright   : (c) Eric Sessoms, 2008
 --               (c) Artúr Poór, 2015
 -- License     : GPL3
@@ -61,14 +61,20 @@
 flagHiddenAtomCache    =  0x40
 flagNewFunTags         =  0x80
 flagExtendedPidsPorts  = 0x100
+flagUTF8Atoms          = 0x10000
 
-flagExtendedReferences :: Word16
-flagExtendedPidsPorts  :: Word16
+flagExtendedReferences :: Word32
+flagExtendedPidsPorts  :: Word32
+flagUTF8Atoms          :: Word32
 
 getUserCookie :: IO String
 getUserCookie = do
     home <- getHomeDirectory
-    readFile $ home </> ".erlang.cookie"
+    withFile (home </> ".erlang.cookie") ReadMode $ \h -> do
+      eof <- hIsEOF h
+      if eof
+        then return ""
+        else hGetLine h
 
 toNetwork :: Int -> Integer -> [Word8]
 toNetwork b n = reverse . take b $ unfoldr toNetwork' n ++ repeat 0
@@ -179,7 +185,7 @@
     sendName = out $
         tag 'n' <>
         putn erlangVersion <>
-        putN (flagExtendedReferences .|. flagExtendedPidsPorts) <>
+        putN (flagExtendedReferences .|. flagExtendedPidsPorts .|. flagUTF8Atoms) <>
         putA self
 
     recvStatus = do
diff --git a/src/Foreign/Erlang/Types.hs b/src/Foreign/Erlang/Types.hs
--- a/src/Foreign/Erlang/Types.hs
+++ b/src/Foreign/Erlang/Types.hs
@@ -248,6 +248,10 @@
         id <- forM [1..4*len] (const getWord8)
         return $ ErlNewRef node creation id
 
+      'v' -> getn >>= liftM ErlAtom . getA
+
+      'w' -> getC >>= liftM ErlAtom . getA
+
       x -> fail $ "Unsupported serialization code: " ++ show (ord x)
 
 
