diff --git a/data/T10I4D100K.dat b/data/T10I4D100K.dat
new file mode 100644
# file too large to diff: data/T10I4D100K.dat
diff --git a/hinduce-examples.cabal b/hinduce-examples.cabal
--- a/hinduce-examples.cabal
+++ b/hinduce-examples.cabal
@@ -1,5 +1,5 @@
 Name:           hinduce-examples
-Version:        0.0.0.1
+Version:        0.0.0.2
 License:        BSD3
 Author:         Robert Hensing
 Synopsis:       Example data for hInduce
@@ -13,6 +13,7 @@
     data/iris/iris.data
     data/iris/bezdekIris.data
     data/iris/iris.names
+    data/T10I4D100K.dat
 
 Library
     Build-Depends:      base >= 4 && < 5
@@ -21,7 +22,14 @@
                         , csv >= 0.1.2
                         , hinduce-classifier >= 0.0.0.0
                         , hinduce-classifier-decisiontree >= 0.0.0.0
+                        , hinduce-associations-apriori >= 0.0.0.0
                         , convertible
+                        , containers >= 0.4.2.0
+                        , vector >= 0.9.1
     Exposed-Modules:    Data.HInduce.Examples
+                        -- These need not be exposed, but we do to make
+                        -- the haddock documentation more readable.
+                        , Data.HInduce.Examples.DecisionTree
+                        , Data.HInduce.Examples.Associations
     Other-Modules:	Paths_hinduce_examples
     Hs-Source-Dirs:     src
diff --git a/src/Data/HInduce/Examples.hs b/src/Data/HInduce/Examples.hs
--- a/src/Data/HInduce/Examples.hs
+++ b/src/Data/HInduce/Examples.hs
@@ -1,89 +1,27 @@
-{-# LANGUAGE MultiParamTypeClasses #-}
-module Data.HInduce.Examples (
-  -- * Re-exports
-  module Data.HInduce.Classifier
+-- | This package / module provides example data and example code to help you
+-- get started with HInduce. You are advised to import this module (ghci: 
+-- @:m + Data.HInduce.Examples@), not the individual ones below, because
+-- @Data.HInduce.Examples@ re-exports modules that are required to run the
+-- examples yourself.
+--
+-- Click on a module below to view the examples you're interested in. Also note
+-- the grey "Source" links at the right hand site of the webpage.
+module Data.HInduce.Examples ( -- * The Examples
+                             module Data.HInduce.Examples.DecisionTree
+                             , module Data.HInduce.Examples.Associations
+  -- * Re-exports for convenience
+  , module Data.HInduce.Classifier
   , module Data.HInduce.Classifier.DecisionTree
+  , module Data.HInduce.Associations.Apriori
   , module Data.List.HIUtils
   , module Text.Layout
-  , module Data.Convertible
-  -- * Helpers (TODO move to module)
-  , readCSV
-  -- * Iris data set
-  -- | Taken from the UCI Machine Learning Repository: <http://archive.ics.uci.edu/ml/datasets/Iris>
-  -- 
-  -- Let's build a decision tree and try it:
-  --
-  -- >>> let model = buildDTree (genMany autoDeciders) irisAttrs irisClass iris
-  --
-  -- >>> classify model [5,4,2,1]
-  -- Setosa
-  -- >>> iris !! 10
-  -- Iris {sepalLength = 5.4, sepalWidth = 3.7, petalLength = 1.5, petalWidth = 0.2, irisClass = Setosa}
-  --
-  -- Seems good! But can we really know that?
-  -- Let's train and test on separate data
-  --
-  -- >>> let model' = buildDTree (genMany autoDeciders) irisAttrs irisClass (oddIx iris)
-  --
-  -- >>> dt $ confusion' model' (map (irisAttrs &&& irisClass) $ evenIx iris)
-  -- Table: Confusion Matrix
-  --          ||-->Actual
-  -- Predicted\/             Setosa           Versicolor           Virginica
-  --     Setosa 0.3333333333333333                                         
-  -- Versicolor                     0.30666666666666664              4.0e-2
-  --  Virginica                    2.666666666666667e-2 0.29333333333333333
-  --
-  -- Now we see that even though not the whole data set was available
-  -- when the model was induced, only few misclassifications occur.
-
-  , Iris(..), IrisClass(..), irisAttrs, irisAttrs', readIris, iris
-  ) where
-import Paths_hinduce_examples
+                             ) where
 
+import Data.HInduce.Examples.DecisionTree
+import Data.HInduce.Examples.Associations
 import Data.HInduce.Classifier
 import Data.HInduce.Classifier.DecisionTree
-import Text.Layout
-import Data.Convertible
+import Data.HInduce.Associations.Apriori
 import Data.List.HIUtils
-import System.IO
-import Text.CSV
-import System.IO.Unsafe
-
-test :: FilePath -> IO FilePath
-test = getDataFileName
-
-readCSV x = do
-  f <- getDataFileName $ "data/" ++ x
-  parseCSVFromFile f
-
-openDataR x = do
-  f <- getDataFileName $ "data/" ++ x
-  openFile f ReadMode
-
-data IrisClass = Setosa | Versicolor | Virginica
-                                       deriving (Eq, Ord, Show, Read)
-instance Layout IrisClass DisplayText where format = fromShow
-
-data Iris = Iris { sepalLength :: Double 
-                 , sepalWidth :: Double 
-                 , petalLength :: Double 
-                 , petalWidth :: Double 
-                 , irisClass :: IrisClass
-                 }
-          deriving (Eq, Ord, Show, Read)
-  
-irisAttrs (Iris p q r s _) = [p, q, r, s]
-irisAttrs' (Iris p q r s _) = ((p, q), (r, s))
-
-readIris = do
-  (Right csv) <- readCSV "iris/iris.data"
-  return $ map readIrisEntry $ filter (/=[""]) csv
-
-readIrisEntry [p,q,r,s,"Iris-setosa"] = 
-  Iris (read p) (read q) (read r) (read s) Setosa
-readIrisEntry [p,q,r,s,"Iris-versicolor"] = 
-  Iris (read p) (read q) (read r) (read s) Versicolor
-readIrisEntry [p,q,r,s,"Iris-virginica"] =
-  Iris (read p) (read q) (read r) (read s) Virginica
+import Text.Layout
 
-iris = unsafePerformIO readIris
diff --git a/src/Data/HInduce/Examples/Associations.hs b/src/Data/HInduce/Examples/Associations.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/HInduce/Examples/Associations.hs
@@ -0,0 +1,27 @@
+-- | An example of association rule mining:
+--
+-- >>> rules transactions items (top ((take 40) . (filter (\(_,a)->a>= 60))))
+-- > fromList [((fromList [32],fromList [947]),0.1694915254237288),((fromList [39],fromList [145]),0.17238139971817754),((fromList [39],fromList [145,419]),8.266791921089714e-2),((fromList [39],fromList [368]),0.1326914044152184),((fromList [39],fromList [419]),0.1200093940817285),
+module Data.HInduce.Examples.Associations where
+import Data.HInduce.Associations.Apriori
+import Text.Layout
+import System.IO.Unsafe
+import qualified Data.Set as S
+import qualified Data.Vector as V
+import Control.Arrow
+import Data.Set
+import Data.Vector
+
+import Paths_hinduce_examples
+
+-- | The transactions in the T10I4D100K.dat data set.
+transactions :: Data.Vector.Vector (Data.Set.Set Int)
+
+-- | The items in the T10I4D100K.dat data set.
+items :: Data.Set.Set Int
+
+(transactions, items) = unsafePerformIO $ do
+  name <- getDataFileName "data/T10I4D100K.dat"
+  ds <- loadDataSet name
+  return $ V.fromList &&& S.unions $ ds
+
diff --git a/src/Data/HInduce/Examples/DecisionTree.hs b/src/Data/HInduce/Examples/DecisionTree.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/HInduce/Examples/DecisionTree.hs
@@ -0,0 +1,80 @@
+{-# LANGUAGE MultiParamTypeClasses #-}
+module Data.HInduce.Examples.DecisionTree (
+  -- * Helpers (TODO move to module)
+  readCSV
+  -- * Iris data set
+  -- | Taken from the UCI Machine Learning Repository: <http://archive.ics.uci.edu/ml/datasets/Iris>
+  -- 
+  -- Let's build a decision tree and try it:
+  --
+  -- >>> let model = buildDTree (genMany autoDeciders) irisAttrs irisClass iris
+  --
+  -- >>> classify model [5,4,2,1]
+  -- Setosa
+  -- >>> iris !! 10
+  -- Iris {sepalLength = 5.4, sepalWidth = 3.7, petalLength = 1.5, petalWidth = 0.2, irisClass = Setosa}
+  --
+  -- Seems good! But can we really know that?
+  -- Let's train and test on separate data
+  --
+  -- >>> let model' = buildDTree (genMany autoDeciders) irisAttrs irisClass (oddIx iris)
+  --
+  -- >>> dt $ confusion' model' (map (irisAttrs &&& irisClass) $ evenIx iris)
+  -- Table: Confusion Matrix
+  --          ||-->Actual
+  -- Predicted\/             Setosa           Versicolor           Virginica
+  --     Setosa 0.3333333333333333                                         
+  -- Versicolor                     0.30666666666666664              4.0e-2
+  --  Virginica                    2.666666666666667e-2 0.29333333333333333
+  --
+  -- Now we see that even though not the whole data set was available
+  -- when the model was induced, only few misclassifications occur.
+
+  , Iris(..), IrisClass(..), irisAttrs, irisAttrs', readIris, iris
+  ) where
+import Paths_hinduce_examples
+
+import Data.HInduce.Classifier
+import Data.HInduce.Classifier.DecisionTree
+import Text.Layout
+import Data.Convertible
+import Data.List.HIUtils
+import System.IO
+import Text.CSV
+import System.IO.Unsafe
+
+readCSV x = do
+  f <- getDataFileName $ "data/" ++ x
+  parseCSVFromFile f
+
+openDataR x = do
+  f <- getDataFileName $ "data/" ++ x
+  openFile f ReadMode
+
+data IrisClass = Setosa | Versicolor | Virginica
+                                       deriving (Eq, Ord, Show, Read)
+instance Layout IrisClass DisplayText where format = fromShow
+
+data Iris = Iris { sepalLength :: Double 
+                 , sepalWidth :: Double 
+                 , petalLength :: Double 
+                 , petalWidth :: Double 
+                 , irisClass :: IrisClass
+                 }
+          deriving (Eq, Ord, Show, Read)
+  
+irisAttrs (Iris p q r s _) = [p, q, r, s]
+irisAttrs' (Iris p q r s _) = ((p, q), (r, s))
+
+readIris = do
+  (Right csv) <- readCSV "iris/iris.data"
+  return $ map readIrisEntry $ filter (/=[""]) csv
+
+readIrisEntry [p,q,r,s,"Iris-setosa"] = 
+  Iris (read p) (read q) (read r) (read s) Setosa
+readIrisEntry [p,q,r,s,"Iris-versicolor"] = 
+  Iris (read p) (read q) (read r) (read s) Versicolor
+readIrisEntry [p,q,r,s,"Iris-virginica"] =
+  Iris (read p) (read q) (read r) (read s) Virginica
+
+iris = unsafePerformIO readIris
