diff --git a/WeatherApi.hs b/WeatherApi.hs
--- a/WeatherApi.hs
+++ b/WeatherApi.hs
@@ -30,6 +30,8 @@
 module WeatherApi (WeatherApiHandler(..)
                   ,Config(..)
                   ,Weather(..)
+                  ,ApiError(..)
+                  ,ApiResponse(..)
                   ,getWeather
                   ,getWeather'
                   ,mkWeatherHandler
@@ -43,7 +45,7 @@
                      , apiPort  :: Int
                      , queryFun :: HandleStream String ->
                                   String              ->
-                                      IO (Either String Weather)
+                                      IO (ApiResponse)
                      }
 
 data WeatherApiHandler = WeatherApiHandler
@@ -56,6 +58,9 @@
                        , windCondition :: String
                        , condition     :: String
                        } deriving (Eq, Show)
+
+data ApiError    = NotFoundError String | NetworkError String
+type ApiResponse = Either ApiError Weather
 
 mkWeatherHandler c@(Config apiHost apiPort queryFun) =
   WeatherApiHandler { stream = openStream apiHost apiPort
diff --git a/WeatherApi/Google.hs b/WeatherApi/Google.hs
--- a/WeatherApi/Google.hs
+++ b/WeatherApi/Google.hs
@@ -6,6 +6,8 @@
 import Network.URI
 import WeatherApi
 import Control.Monad (liftM)
+import Codec.Binary.UTF8.String
+
 apiUrl  = "http://www.google.com/ig/api?"
 
 type Lang = String
@@ -15,7 +17,7 @@
 initApi :: Lang -> Enc -> Config
 initApi   lang   enc =
     let params = [("hl", lang), ("oe", enc)]
-        urn c  = urlEncodeVars $ params ++ [("weather", c)]
+        urn c  = urlEncodeVars $ params ++ [("weather", encodeString c)]
     in Config { apiHost  = "www.google.com"
               , apiPort  = 80
               , queryFun = makeQueryFun urn
@@ -23,14 +25,14 @@
 
 retrieve s urn =
     case parseURI $ apiUrl ++ urn of
-      Nothing  -> return $ Left "Invalid URL"
+      Nothing  -> return $ Left $ NetworkError "Invalid URL"
       Just uri -> get s uri
 
 get s uri =
     do
       eresp <- sendHTTP s (Request uri GET [] "")
       case eresp of
-        Left err  -> return $ Left $ show err
+        Left err  -> return $ Left $ NetworkError $ show err
         Right res -> return $ Right $ rspBody res
 
 atTag tag = deep (isElem >>> hasName tag)
@@ -56,13 +58,14 @@
                       ]
 
 -- | This return function witch will actualy retrieve and parse weather from stream
+makeQueryFun :: (String -> String) -> (HandleStream String) -> String -> IO ApiResponse
 makeQueryFun q stream city =
     do
       resp <- retrieve stream $ q city
       case liftM parseXML resp of
-        Left a  -> return $ Left a
+        Left  a -> return $ Left a
         Right a -> do
           r <- runX(a >>> parseWeather)
           case r of
-            []     -> return $ Left "can't retrieve weather"
+            []     -> return $ Left $ NotFoundError "can't retrieve weather"
             (x:xs) -> return $ Right x
diff --git a/weather-api.cabal b/weather-api.cabal
--- a/weather-api.cabal
+++ b/weather-api.cabal
@@ -1,5 +1,5 @@
 Name:              weather-api
-Version:           0.0.1
+Version:           0.1.0
 Synopsis:          Weather api implemented in haskell
 Description:
         This library implement generic api for retrieving weather
@@ -20,6 +20,7 @@
                   ,network       == 2.3.*
                   ,hxt           == 9.2.*
                   ,HTTP          == 4000.2.*
+                  ,utf8-string   == 0.3.7
 
 source-repository head
   type:     git
