diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/expiring-containers.cabal b/expiring-containers.cabal
--- a/expiring-containers.cabal
+++ b/expiring-containers.cabal
@@ -1,78 +1,52 @@
-name:
-  expiring-containers
-version:
-  0.2.2
-synopsis:
-  Expiring containers
-category:
-  Time, Containers
-homepage:
-  https://github.com/metrix-ai/expiring-containers
-bug-reports:
-  https://github.com/metrix-ai/expiring-containers/issues
-author:
-  Oleg Shevchenko <shevchenko.cmc@gmail.com>
-maintainer:
-  Metrix.AI Ninjas <ninjas@metrix.ai>
-copyright:
-  (c) 2018, Metrix.AI
-license:
-  MIT
-license-file:
-  LICENSE
-build-type:
-  Simple
-cabal-version:
-  >=1.24
+name: expiring-containers
+version: 0.2.2.1
+synopsis: Expiring containers
+category: Time, Containers
+homepage: https://github.com/metrix-ai/expiring-containers
+bug-reports: https://github.com/metrix-ai/expiring-containers/issues
+author: Oleg Shevchenko <shevchenko.cmc@gmail.com>
+maintainer: Metrix.AI Ninjas <ninjas@metrix.ai>
+copyright: (c) 2018, Metrix.AI
+license: MIT
+license-file: LICENSE
+build-type: Simple
+cabal-version: >=1.24
 
 source-repository head
-  type:
-    git
-  location:
-    https://github.com/metrix-ai/expiring-containers.git
+  type: git
+  location: https://github.com/metrix-ai/expiring-containers.git
 
 library
-  hs-source-dirs:
-    library
-  default-extensions:
-    Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples, StrictData
+  hs-source-dirs: library
+  default-extensions: Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples, StrictData
   ghc-options: -funbox-strict-fields
-  default-language:
-    Haskell2010
+  default-language: Haskell2010
   exposed-modules:
     ExpiringContainers.ExpiringMap
     ExpiringContainers.ExpiringSet
   other-modules:
   build-depends:
     base >=4.7 && <5,
-    time >=1.8 && <2,
-    hashable >=1.2 && <2,
-    timestamp >=0.2 && <0.3,
     containers >=0.5.10 && <0.5.15,
+    hashable >=1.2 && <2,
     int-multimap >=0.3.1 && <0.4,
+    time >=1.8 && <2,
+    timestamp >=0.2 && <0.3,
     unordered-containers >=0.2.8.0 && <0.3
 
 test-suite test
-  type:
-    exitcode-stdio-1.0
-  hs-source-dirs:
-    test
-  main-is:
-    Main.hs
-  default-extensions:
-    Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples
-  default-language:
-    Haskell2010
+  type: exitcode-stdio-1.0
+  hs-source-dirs: test
+  main-is: Main.hs
+  default-extensions: Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples
+  default-language: Haskell2010
   build-depends:
     expiring-containers,
-    base >=4.7 && <5,
-    time >=1.8 && <2,
-    hashable >=1.2 && <2,
-    timestamp >=0.2 && <0.3,
-    containers >=0.5.10 && <0.5.15,
     int-multimap >=0.3.1 && <0.4,
-    unordered-containers >=0.2.8.0 && <0.3,
-    tasty >=1.0.1 && <1.0.2,
+    QuickCheck >=2.8.1 && <3,
+    quickcheck-instances >=0.3.11 && <0.4,
+    rerebase <2,
+    tasty >=0.12 && <2,
     tasty-hunit >=0.9 && <0.11,
-    tasty-quickcheck >=0.10 && <0.12,
-    quickcheck-instances >=0.3.18 && <0.4
+    tasty-quickcheck >=0.9 && <0.11,
+    timestamp >=0.2 && <0.3
diff --git a/library/ExpiringContainers/ExpiringSet.hs b/library/ExpiringContainers/ExpiringSet.hs
--- a/library/ExpiringContainers/ExpiringSet.hs
+++ b/library/ExpiringContainers/ExpiringSet.hs
@@ -43,10 +43,12 @@
 Set that expiring with time
 -}
 data ExpiringSet element =
+  {-|
+  * Elements indexed by timestamps
+  * Timestamps indexed by elements
+  -}
   ExpiringSet
-    {-| Elements indexed by timestamps -}
     (IntMap.IntMultimap element)
-    {-| Timestamps indexed by elements -}
     (HashMap.HashMap element Int)
     deriving(Eq, Show, Generic)
 
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -6,7 +6,6 @@
 import Test.Tasty.Runners
 import Test.Tasty.HUnit
 import Test.Tasty.QuickCheck
--- import Test.QuickCheck.Instances
 import Test.QuickCheck.Instances.Time
 import qualified ExpiringContainers.ExpiringSet as A
 import qualified ExpiringContainers.ExpiringMap as B
@@ -73,19 +72,6 @@
         f = applyFun fun
     in A.map f (A.insert key value1 set) === A.insert key (f value1) (A.map f set)
     ,
-    -- testProperty "map delete" $ \ (list :: [(UTCTime, Int)], key :: UTCTime, value1 :: Int, fun :: (Fun Int Char)) ->
-    -- let set = A.fromList list
-    --     f = applyFun fun
-    -- in A.map f (A.delete value1 set) === A.delete (f value1) (A.map f set)
-    -- ,
-    -- testProperty "clean" $ \ (list :: [(UTCTime, Int)], key :: UTCTime) ->
-    -- let (list1, expire) = A.clean key $ A.fromList list
-    -- in (D.fromList $ fmap (\(t,a) -> a) $ C.filter (\(t,a) -> t < key) list) === (D.fromList list1)
-    -- ,
-    -- testProperty "mapping" $ \ (list :: [(UTCTime, Int)]) ->
-    -- (D.fromList $ map (testFuncL . (\(t,a) -> (,) (timestampUtcTime $ utcTimeTimestamp t) a)) list) ===
-    --    (D.fromList $ A.toList $ A.map testFunc $ A.fromList list)
-    -- ,
     testProperty "member" $ \ (list :: [(UTCTime, Int)], key :: UTCTime, value :: Int) ->
     (A.member value $ A.delete value $ A.insert key value $ A.fromList list) === False
     ,
@@ -172,14 +158,6 @@
         f = applyFun fun
     in fmap f (B.lookup key map') === B.lookup key (B.map f map')
     ,
-    -- testProperty "map" $ \ (list :: [(UTCTime, Int, Int)], time :: UTCTime, key :: Int, value :: Int) ->
-    -- let map' = B.fromList list
-    -- in fmap (\x -> B.insert time key value map') (B.lookup key map') === (map' <$ (B.lookup key map'))
-    -- ,
-    -- testProperty "clean" $ \ (list :: [(UTCTime, Int)], key :: UTCTime) ->
-    -- let (list1, expire) = A.clean key $ A.fromList list
-    -- in (D.fromList $ fmap (\(t,a) -> a) $ C.filter (\(t,a) -> t < key) list) === (D.fromList list1)
-    -- ,
     testProperty "member" $ \ (list :: [(UTCTime, Int, Int)], time :: UTCTime, key :: Int, value :: Int) ->
     (B.member key $ B.delete key $ B.insert time key value $ B.fromList list) === False
     ,
@@ -189,13 +167,7 @@
     ,
     testProperty "traverse" $ \ (list :: [(UTCTime, Int, Int)]) ->
     let map' = B.fromList list   
-    in (traverse (\a -> [a + 1]) map') === [fmap (\a -> a + 1) map'] 
-    -- ,
-    -- testProperty "insert and delete" $ \ (list :: [(UTCTime, Int, Int)], time :: UTCTime, key :: Int, value :: Int) ->
-    -- let list2 = C.nubBy (\(t1,k1,v1) (t2,k2,v2) -> k1 == k2) list
-    -- in (D.fromList $ fmap (\(t,a,b) -> (,,) (timestampUtcTime $ utcTimeTimestamp t) a b) $
-    --  C.deleteBy (\(t1,k1,v1) (t2,k2,v2) -> k1 == k2) (time, key, value) list2) === (D.fromList $ B.toList $ B.delete key $ B.insert time key value $ B.fromList list)
-
+    in (traverse (\a -> [a + 1]) map') === [fmap (\a -> a + 1) map']
   ]
 
 testFunc :: (Show a) => a -> String
