diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,8 @@
+# 0.2.0.1
+- Fixed a problem with correct decoding of 28-bit offsets
+
 # 0.2.0.0
-Changed interface to normal Either String GeoResult
+- Changed interface to normal Either String GeoResult
 
 # 0.1.0.3 -> 0.1.0.4
 - Removed lru
diff --git a/Data/GeoIP2/SearchTree.hs b/Data/GeoIP2/SearchTree.hs
--- a/Data/GeoIP2/SearchTree.hs
+++ b/Data/GeoIP2/SearchTree.hs
@@ -25,7 +25,7 @@
     bytes = BS.take (fromIntegral bytecount) $ BS.drop (fromIntegral $ index * bytecount) mem
     num = BS.foldl' (\acc new -> fromIntegral new + 256 * acc) 0 bytes :: Word64
     -- 28 bits has a strange record format
-    left28 = num `shift` (-32) .|. (num .&. 0xf0000000)
+    left28 = num `shift` (-32) .|. (num .&. 0xf0000000) `shift` (-4)
   in case recordbits of
       28 -> (fromIntegral left28, fromIntegral (num .&. ((1 `shift` recordbits) - 1)))
       _  -> (fromIntegral (num `shift` negate recordbits), fromIntegral (num .&. ((1 `shift` recordbits) - 1)))
diff --git a/geoip2.cabal b/geoip2.cabal
--- a/geoip2.cabal
+++ b/geoip2.cabal
@@ -1,5 +1,5 @@
 name:                geoip2
-version:             0.2.0.0
+version:             0.2.0.1
 synopsis:            Pure haskell interface to MaxMind GeoIP database
 description:
   GeoIP2 is a haskell binding to the MaxMind GeoIP2 database.
