diff --git a/LRU.cabal b/LRU.cabal
--- a/LRU.cabal
+++ b/LRU.cabal
@@ -1,9 +1,12 @@
 Name: LRU
-Version: 0.1
+Version: 0.1.1
 License: BSD3
 Author: Adam Langley
 Homepage: http://www.imperialviolet.org/lru
 Stability: experimental
 Synopsis: Implements an LRU data structure
-Build-Depends: base, QuickCheck
+Tested-With: GHC == 6.8.1
+Cabal-Version: >= 1.2
+Build-Depends: base, QuickCheck, containers
 Exposed-modules: Data.LRU
+Extra-Source-Files: LRU_test.hs
diff --git a/LRU_test.hs b/LRU_test.hs
new file mode 100644
--- /dev/null
+++ b/LRU_test.hs
@@ -0,0 +1,57 @@
+{-# OPTIONS_GHC -fno-monomorphism-restriction #-}
+
+module Main where
+
+import qualified Data.LRU as LRU
+import Test.QuickCheck
+import Data.List (nub, sort)
+import Data.Maybe (fromJust)
+
+import qualified Data.Set as Set
+
+-- | Returns true if the given list contains no duplicates
+isUnique :: (Ord a) => [a] -> Bool
+isUnique list = length (nub $ sort list) == length list
+
+simpleLRU :: (Ord a) => [a] -> [a]
+simpleLRU = foldl update [] where
+  update [] newelem = [newelem]
+  update lru newelem = newelem : (filter (\x -> x /= newelem) lru)
+
+lruInsert = foldl (flip LRU.hit) LRU.empty
+
+popLRU 0 _ = []
+popLRU n lru =
+  (fromJust $ LRU.last lru) : (popLRU (n - 1) (LRU.pop lru))
+
+prop_LRUOrder :: [Int] -> Property
+prop_LRUOrder list =
+  isUnique list ==>
+  (LRU.toList $ lruInsert list) == reverse list
+
+prop_LRUActions list =
+  True ==>
+  (LRU.toList $ lruInsert list) == simpleLRU list
+
+prop_LRUDelete :: [Int] -> Int -> Property
+prop_LRUDelete list x =
+  isUnique list && elem x list ==>
+  Set.difference (Set.fromList list) (Set.fromList $ LRU.toList $ LRU.delete x $ lruInsert list) == Set.fromList [x]
+
+prop_LRUPopping list =
+  isUnique list ==>
+  (popLRU (length list) $ lruInsert list) == list
+
+prop_LRUNull list =
+  isUnique list ==>
+  LRU.null (pop (length list) $ lruInsert list) where
+  pop 0 lru = lru
+  pop n lru = pop (n - 1) $ LRU.pop lru
+
+prop_LRUSize list =
+  isUnique list ==>
+  LRU.size (lruInsert list) == length list
+
+main = do
+  mapM_ (check (defaultConfig { configMaxTest = 1000, configMaxFail = 10000 })) [prop_LRUOrder, prop_LRUActions, prop_LRUPopping, prop_LRUNull, prop_LRUSize]
+  mapM_ (check (defaultConfig { configMaxTest = 1000, configMaxFail = 100000 })) [prop_LRUDelete]
