diff --git a/hs-GeoIP.cabal b/hs-GeoIP.cabal
--- a/hs-GeoIP.cabal
+++ b/hs-GeoIP.cabal
@@ -1,16 +1,22 @@
 Name:                hs-GeoIP
-Version:             0.1.1
+Version:             0.2
 Synopsis:            Haskell bindings to the MaxMind GeoIPCity database via the C library
 License:             BSD3
 License-file:        LICENSE
 Author:              Ozgun Ataman
 Maintainer:          ozataman@gmail.com
+Homepage:            http://github.com/ozataman/hs-GeoIP
 Category:            Data
 Build-type:          Simple
 Description:
 
   This library provides fast, idiomatic Haskell bindings to MaxMind's
   GeoIPCity IP-based geolocation C API.
+
+  .
+
+  Make sure you have the MaxMind C API installed before installing
+  this library, as it depends on the C API.
 
   .
 
diff --git a/src/Data/Geolocation/GeoIP.hsc b/src/Data/Geolocation/GeoIP.hsc
--- a/src/Data/Geolocation/GeoIP.hsc
+++ b/src/Data/Geolocation/GeoIP.hsc
@@ -6,7 +6,7 @@
 
     (
     -- * Types
-    GeoDB
+      GeoDB
     , GeoIPOption
     , combineOptions
     , standard
@@ -22,6 +22,8 @@
     , openGeoDB
     , geoLocateByIPAddress
     , geoLocateByIPNum
+    , geoStringByIPAddress
+    , geoStringByIPNum
     , mkIpNum
     ) where
 
@@ -155,17 +157,35 @@
 -- | Geo-locate by given IP Adress
 --
 -- > geoLocateByIPAddress db "123.123.123.123"
-geoLocateByIPAddress :: GeoDB -> ByteString -> Maybe GeoIPRecord
-geoLocateByIPAddress db ip = mkIpNum ip >>= geoLocateByIPNum db 
+geoLocateByIPAddress :: GeoDB -> ByteString -> IO (Maybe GeoIPRecord)
+geoLocateByIPAddress db ip =
+  case mkIpNum ip of
+    Nothing -> return Nothing
+    Just inum -> geoLocateByIPNum db inum
 
+geoStringByIPAddress :: GeoDB -> ByteString -> IO (Maybe ByteString)
+geoStringByIPAddress db ip = 
+  case mkIpNum ip of
+    Nothing -> return Nothing
+    Just inum -> geoStringByIPNum db inum
 
+geoStringByIPNum :: GeoDB -> Integer -> IO (Maybe ByteString)
+geoStringByIPNum (GeoDB db) ip =
+  withForeignPtr db $ \db' -> do
+    ptr <- c_GeoIP_name_by_ipnum db' (fromIntegral ip)
+    str <- if nullPtr == ptr
+           then return Nothing
+           else let x = packCString ptr in x `seq` fmap Just x
+    free ptr
+    return str
+
 ------------------------------------------------------------------------------
 -- | Geo-locate by given IP number. Call 'mkIpNum' on a 'String' ip address to
 -- convert to IP number.
 --
 -- > geoLocateByIPNum db 12336939327338
-geoLocateByIPNum :: GeoDB -> Integer -> Maybe GeoIPRecord
-geoLocateByIPNum (GeoDB db) ip = unsafePerformIO $ do
+geoLocateByIPNum :: GeoDB -> Integer -> IO (Maybe GeoIPRecord)
+geoLocateByIPNum (GeoDB db) ip =
   withForeignPtr db $ \db' -> do
     ptr <- c_GeoIP_record_by_ipnum db' (fromIntegral ip)
     rec <- peekGeoIPRecord ptr
@@ -203,6 +223,11 @@
     -> CULong
     -> IO (Ptr GeoIPRecord)
 
+foreign import ccall safe "GeoIP.h GeoIP_name_by_ipnum"
+  c_GeoIP_name_by_ipnum
+    :: Ptr GeoIP
+    -> CULong
+    -> IO CString
 
 foreign import ccall safe "GeoIPCity.h &GeoIPRecord_delete"
   c_GeoIPRecord_delete_funPtr
