diff --git a/src/Network/Ethereum/Web3/Contract.hs b/src/Network/Ethereum/Web3/Contract.hs
--- a/src/Network/Ethereum/Web3/Contract.hs
+++ b/src/Network/Ethereum/Web3/Contract.hs
@@ -43,7 +43,8 @@
 import Control.Exception (throwIO)
 import Data.Text.Lazy (toStrict)
 import qualified Data.Text as T
-import Control.Monad (when)
+import Control.Monad (when, forM)
+import Control.Monad.Trans.Reader (ReaderT(..))
 import Data.Monoid ((<>))
 
 import Network.Ethereum.Web3.Provider
@@ -69,7 +70,7 @@
     event :: Provider p
           => Address
           -- ^ Contract address
-          -> (a -> Web3 p EventAction)
+          -> (a -> ReaderT Change (Web3 p) EventAction)
           -- ^ 'Event' handler
           -> Web3 p ThreadId
           -- ^ 'Web3' wrapped event handler spawn ident
@@ -77,7 +78,7 @@
 
 _event :: (Provider p, Event a)
        => Address
-       -> (a -> Web3 p EventAction)
+       -> (a -> ReaderT Change (Web3 p) EventAction)
        -> Web3 p ThreadId
 _event a f = do
     fid <- let ftyp = snd $ let x = undefined :: Event a => a
@@ -87,16 +88,19 @@
     forkWeb3 $
         let loop = do liftIO (threadDelay 1000000)
                       changes <- eth_getFilterChanges fid
-                      acts <- mapM f (mapMaybe parseChange changes)
+                      acts <- forM (mapMaybe pairChange changes) $ \(changeEvent, changeWithMeta) ->
+                        runReaderT (f changeEvent) changeWithMeta
                       when (TerminateEvent `notElem` acts) loop
         in do loop
               eth_uninstallFilter fid
               return ()
   where
     prepareTopics = fmap (T.drop 2) . drop 1
-    parseChange c = fromData $
-        T.append (T.concat (prepareTopics $ changeTopics c))
-                 (T.drop 2 $ changeData c)
+    pairChange changeWithMeta = do
+      changeEvent <- fromData $
+        T.append (T.concat (prepareTopics $ changeTopics changeWithMeta))
+                 (T.drop 2 $ changeData changeWithMeta)
+      return (changeEvent, changeWithMeta)
 
 -- | Contract method caller
 class ABIEncoding a => Method a where
diff --git a/src/Network/Ethereum/Web3/TH.hs b/src/Network/Ethereum/Web3/TH.hs
--- a/src/Network/Ethereum/Web3/TH.hs
+++ b/src/Network/Ethereum/Web3/TH.hs
@@ -169,15 +169,17 @@
               [conP funName $ fmap varP vars]
               [|ident <> toDataBuilder $(tupE $ fmap varE vars)|]
 
-eventFilterD :: String -> [DecQ]
-eventFilterD topic0 = let addr = mkName "a" in
-  [ funD' (mkName "eventFilter") [wildP, varP addr]
-    [|Filter (Just $(varE addr))
-             (Just [Just topic0, Nothing])
-             Nothing
-             Nothing
-     |]
-  ]
+eventFilterD :: String -> Int -> [DecQ]
+eventFilterD topic0 n =
+  let addr = mkName "a"
+      indexedArgs = replicate n Nothing :: [Maybe String]
+  in [ funD' (mkName "eventFilter") [wildP, varP addr]
+       [|Filter (Just $(varE addr))
+                (Just $ [Just topic0] <> indexedArgs)
+                Nothing
+                Nothing
+       |]
+     ]
 
 funWrapper :: Bool
            -- ^ Is constant?
@@ -227,13 +229,14 @@
 mkEvent eve@(DEvent name inputs _) = sequence
     [ dataD' eventName eventFields derivingD
     , instanceD' eventName encodingT (eventEncodigD eventName inputs)
-    , instanceD' eventName eventT    (eventFilterD (T.unpack $ eventId eve))
+    , instanceD' eventName eventT    (eventFilterD (T.unpack $ eventId eve) indexedFieldsCount)
     ]
   where eventName   = mkName (toUpperFirst (T.unpack name))
         derivingD   = [mkName "Show", mkName "Eq", mkName "Ord"]
         eventFields = normalC eventName (eventBangType <$> inputs)
         encodingT   = conT (mkName "ABIEncoding")
         eventT      = conT (mkName "Event")
+        indexedFieldsCount = length . filter eveArgIndexed $ inputs
 
 -- | Method delcarations maker
 mkFun :: Declaration -> Q [Dec]
diff --git a/src/Network/Ethereum/Web3/Types.hs b/src/Network/Ethereum/Web3/Types.hs
--- a/src/Network/Ethereum/Web3/Types.hs
+++ b/src/Network/Ethereum/Web3/Types.hs
@@ -65,7 +65,7 @@
     { fieldLabelModifier = toLowerFirst . drop 6 }) ''Filter)
 
 -- | Event filder ident
-newtype FilterId = FilterId Int
+newtype FilterId = FilterId Integer
   deriving (Show, Eq, Ord)
 
 instance FromJSON FilterId where
diff --git a/web3.cabal b/web3.cabal
--- a/web3.cabal
+++ b/web3.cabal
@@ -1,5 +1,5 @@
 name: web3
-version: 0.5.4.0
+version: 0.5.5.0
 cabal-version: >=1.10
 build-type: Simple
 license: BSD3
@@ -38,16 +38,16 @@
         base >4.8 && <4.11,
         base16-bytestring >=0.1.1.6 && <0.2,
         template-haskell >=2.11.1.0 && <2.12,
-        http-client-tls >=0.3.3.1 && <0.4,
+        http-client-tls >=0.3.5.1 && <0.4,
         transformers >=0.5.2.0 && <0.6,
-        http-client >=0.5.5 && <0.6,
+        http-client >=0.5.7.0 && <0.6,
         attoparsec >=0.13.1.0 && <0.14,
         bytestring >=0.10.8.1 && <0.11,
-        cryptonite ==0.21.*,
-        vector >=0.11.0.0 && <0.12,
-        memory >=0.14.1 && <0.15,
-        aeson >=1.0.2.1 && <1.1,
-        text >=1.2.2.1 && <1.3
+        cryptonite ==0.23.*,
+        vector >=0.12.0.1 && <0.13,
+        memory >=0.14.6 && <0.15,
+        aeson >=1.1.2.0 && <1.2,
+        text >=1.2.2.2 && <1.3
     default-language: Haskell2010
     default-extensions: OverloadedStrings
     hs-source-dirs: src
@@ -62,9 +62,9 @@
     main-is: Spec.hs
     build-depends:
         base >=4.9.1.0 && <4.10,
-        memory >=0.14.1 && <0.15,
-        text >=1.2.2.1 && <1.3,
-        web3 >=0.5.4.0 && <0.6
+        memory >=0.14.6 && <0.15,
+        text >=1.2.2.2 && <1.3,
+        web3
     default-language: Haskell2010
     default-extensions: OverloadedStrings
     hs-source-dirs: test
