We started with type systems where the refinement language expresses arbitrary program expressions.Even though these systems are expressive, the assertions formed can not be staticallyverified. %To reason in such systems, we presented two alternatives:interactive theorem proving, where the user should provide explicit proofs, and contracts calculi, where the assertions are verified at runtime.%Next we presented refinement type system which restrict the refinement language, so as to render type checking decidable.%thus both type checking and inference%is decidable.As an example, we presented Liquid Types, in which the refinement language is restricted according to a finite set of qualifiersand allows not only decidable verification, but also automatic type inference.Then, we presented Abstract Refinement Types, which can be usedin a refinement type system to enhance expressiveness without increasing complexity.Then, we present \toolnamethat combines liquidTypes with abstraction over refinementsto enhance expressiveness of LiquidTypes.\toolname is a quite expressive verification tool for Haskell programs that can be used to check termination, totality and general functional correctness.Finally, we evaluate \toolname in real world Haskell libraries.