diff --git a/GroteTrap.cabal b/GroteTrap.cabal
--- a/GroteTrap.cabal
+++ b/GroteTrap.cabal
@@ -1,14 +1,14 @@
 Name:           GroteTrap
-Version:        0.5.1
+Version:        0.5.2
 Synopsis:       Parser and selection library for expression languages.
 Description:    Allows quick definition of expression languages. You get a parser for free, as well as conversion from text selection to tree selection and back.
 Homepage:       http://www.haskell.org/haskellwiki/GroteTrap
 
 Author:         Jeroen Leeuwestein, Martijn van Steenbergen
 Maintainer:     martijn@van.steenbergen.nl
-Copyright:      Copyright (c) 2007-2015 Jeroen Leeuwestein and Martijn van Steenbergen
+Copyright:      Copyright (c) 2007-2016 Jeroen Leeuwestein and Martijn van Steenbergen
 
-Cabal-Version:  >= 1.6
+Cabal-Version:  >= 1.8
 License:        BSD3
 License-file:   LICENSE
 Category:       Language
@@ -21,10 +21,9 @@
 
 Library
   Build-Depends:    base < 5,
-                    QuickCheck < 2.9,
                     parsec < 3.2,
                     mtl < 2.3,
-                    syb < 0.5
+                    syb < 0.7
   Exposed-Modules:  Language.GroteTrap
                     Language.GroteTrap.Language
                     Language.GroteTrap.Lexer
@@ -36,3 +35,14 @@
                     Language.GroteTrap.Util
   Other-Modules:    Language.GroteTrap.ParseTree
                     Language.GroteTrap.Parser
+
+Test-Suite tests
+  Type:             exitcode-stdio-1.0
+  Main-Is:          Tests.hs
+  Build-Depends:    GroteTrap,
+                    base < 5,
+                    parsec < 3.2,
+                    mtl < 2.3,
+                    QuickCheck < 2.10,
+                    test-framework,
+                    test-framework-quickcheck2
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2008-2015, Jeroen Leeuwestein and Martijn van Steenbergen
+Copyright (c) 2008-2016, Jeroen Leeuwestein and Martijn van Steenbergen
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
diff --git a/Tests.hs b/Tests.hs
new file mode 100644
--- /dev/null
+++ b/Tests.hs
@@ -0,0 +1,40 @@
+module Main where
+
+import Test.Framework (Test, defaultMain)
+import Test.Framework.Providers.QuickCheck2 (testProperty)
+import Test.QuickCheck ((==>))
+
+import Language.GroteTrap.Range
+  (validRange, includes, unionRange, distRange, size)
+import Language.GroteTrap.Trees (up, down, left, right)
+
+main :: IO ()
+main  = defaultMain tests
+
+tests :: [Test]
+tests =
+  [ testProperty "range/propUnionRange" propUnionRange
+  , testProperty "range/propDistRange" propDistRange
+  , testProperty "range/propDistRangeComm" propDistRangeComm
+  , testProperty "trees/propDownUp" propDownUp
+  , testProperty "trees/propUpDown" propUpDown
+  , testProperty "trees/propLeftRight" propLeftRight
+  , testProperty "trees/propRightLeft" propRightLeft
+  ]
+
+-- ranges
+
+propUnionRange r1 r2 = validRange r1 && validRange r2 ==> u `includes` r1 && u `includes` r2
+  where u = unionRange r1 r2
+
+propDistRange r1 r2 = validRange r1 && validRange r2 && r1 `includes` r2 ==>
+                        distRange r1 r2 <= size r1
+
+propDistRangeComm r1 r2 = distRange r1 r2 == distRange r2 r1
+
+-- tree paths
+
+propDownUp     path  =  up (down path) == path
+propUpDown     path  =  not (null path) ==> init (down (up path)) == init path
+propLeftRight  path  =  not (null path) && last path > 0 ==> right (left path) == path
+propRightLeft  path  =  not (null path) && last path >= 0 ==> left (right path) == path
