diff --git a/.gitignore b/.gitignore
new file mode 100644
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,54 @@
+# cabal stuff
+**/dist
+**/cabal.sandbox.config
+**/.cabal-sandbox
+.stack-work
+mk/toplibs
+
+# vim stuff
+**.swp
+**.swo
+
+# ctags stuff
+**/TAGS
+**/tags
+
+# ghc object (when compiled directly)
+**/*.o
+**/*.hi
+**/*.dyn_o
+**/*.dyn_hi
+
+# benchmark binaries
+bench/avltrees
+bench/bools
+bench/heaps
+bench/mergeheaps
+bench/id
+bench/list
+bench/pretty
+bench/sets
+bench/setsofsets
+bench/sieve
+bench/sorting
+bench/spring
+bench/digraphs
+bench/haskell-src
+bench/haskell-src-exts
+eg/sorting
+eg/negation
+eg/alga
+
+# test binaries
+tests/test-mutate
+tests/test-showmutable
+tests/test-derive
+tests/test-utils
+
+# Haddock
+doc/*.html
+doc/*.css
+doc/*.js
+doc/*.png
+doc/*.gif
+doc/*.json
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,108 @@
+# .travis.yml file for FitSpec
+#
+# Copyright:   (c) 2017-2018 Rudy Matela
+# License:     3-Clause BSD  (see the file LICENSE)
+# Maintainer:  Rudy Matela <rudy@matela.com.br>
+
+language: c  # not really
+
+notifications:
+  email:
+    on_failure: change
+
+sudo: false
+
+cache:
+  directories:
+  - $HOME/.ghc
+  - $HOME/.cabal
+  - $HOME/.stack
+
+before_install:
+- export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH
+- ghc --version
+- cabal --version
+- rm -f ~/.cabal/config && cabal update
+# Download and unpack the stack executable
+# "Once Travis whitelists the stack.dev files," simply include stack in the
+# addons section. -- https://docs.haskellstack.org/en/stable/travis_ci/
+- mkdir -p ~/.local/bin
+- export PATH=$HOME/.local/bin:$PATH
+- travis_retry curl -L https://www.stackage.org/stack/linux-x86_64 | tar xz --wildcards --strip-components=1 -C ~/.local/bin '*/stack'
+- stack config set system-ghc --global true
+- stack --version
+- cabal install leancheck cmdargs
+
+script:
+- make && make test-without-extra-deps
+- make haddock
+- make test-sdist
+- make test-via-cabal
+- stack $STACKR --no-terminal --skip-ghc-check test
+
+matrix:
+  allow_failures:
+  - ghc: 'head'
+  - ghc: '7.10'  # Failing due to a bug in cabal?  Deactivating for now...
+  include:
+  - ghc: 'head'
+    env:                   GHCVER=head         CABALVER=head
+    addons: {apt: {packages: [ghc-head,   cabal-install-head], sources: hvr-ghc}}
+  - ghc: '8.4'
+    env:                   GHCVER=8.4.2        CABALVER=2.2
+    addons: {apt: {packages: [ghc-8.4.2,  cabal-install-2.2],  sources: hvr-ghc}}
+  - ghc: '8.2'
+    env:                   GHCVER=8.2.1        CABALVER=2.0
+    addons: {apt: {packages: [ghc-8.2.1,  cabal-install-2.0],  sources: hvr-ghc}}
+  - ghc: '8.0'
+    env:                   GHCVER=8.0.2        CABALVER=1.24
+    addons: {apt: {packages: [ghc-8.0.2,  cabal-install-1.24], sources: hvr-ghc}}
+  - ghc: '7.10'
+    env:                   GHCVER=7.10.3       CABALVER=1.22
+    addons: {apt: {packages: [ghc-7.10.3, cabal-install-1.22], sources: hvr-ghc}}
+  # we only support stack with GHC >= 7.10
+  - ghc: '7.8'
+    env:                   GHCVER=7.8.4        CABALVER=1.18
+    addons: {apt: {packages: [ghc-7.8.4,  cabal-install-1.18], sources: hvr-ghc}}
+    before_install:
+    - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH
+    - ghc --version
+    - cabal --version
+    - rm -f ~/.cabal/config && cabal update
+    - cabal install Cabal==1.18.*
+    - cabal install leancheck cmdargs
+    script:
+    - make && make test-without-extra-deps
+    - make haddock HADDOCKFLAGS=
+    - make test-sdist
+    - cabal test
+  - ghc: '7.6'
+    env:                   GHCVER=7.6.3        CABALVER=1.18
+    addons: {apt: {packages: [ghc-7.6.3,  cabal-install-1.18], sources: hvr-ghc}}
+    before_install:
+    - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH
+    - ghc --version
+    - cabal --version
+    - rm -f ~/.cabal/config && cabal update
+    - cabal install Cabal==1.18.*
+    - cabal install leancheck cmdargs
+    script:
+    - make && make test-without-extra-deps
+    - make haddock HADDOCKFLAGS=
+    - make test-sdist
+    - cabal test
+  - ghc: '7.4'
+    env:                   GHCVER=7.4.2        CABALVER=1.18
+    addons: {apt: {packages: [ghc-7.4.2,  cabal-install-1.18], sources: hvr-ghc}}
+    before_install:
+    - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH
+    - ghc --version
+    - cabal --version
+    - rm -f ~/.cabal/config && cabal update
+    - cabal install Cabal==1.18.*
+    - cabal install leancheck cmdargs
+    script:
+    - make && make test-without-extra-deps
+    - make haddock HADDOCKFLAGS=
+    - make test-sdist
+    - cabal test
diff --git a/Makefile b/Makefile
new file mode 100644
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,130 @@
+# Makefile for FitSpec
+#
+# Copyright:   (c) 2015-2018 Rudy Matela
+# License:     3-Clause BSD  (see the file LICENSE)
+# Maintainer:  Rudy Matela <rudy@matela.com.br>
+#
+# This is faster than Cabal:
+#
+# Time      Scratch  Already compiled
+# Makefile    14s      0s
+# Cabal       90s      1s
+#
+# Cabal tries to "sandbox" the build of every benchmark program
+# rebuilding everything for each of those.
+
+# Misc variables
+GHCIMPORTDIRS = src:bench
+GHCFLAGS = -O2 $(shell grep -q "Arch Linux" /etc/lsb-release && echo -dynamic)
+HADDOCKFLAGS = --no-print-missing-docs
+MOSTBENCHS = \
+  bench/avltrees         \
+  bench/bools            \
+  bench/digraphs         \
+  bench/heaps            \
+  bench/id               \
+  bench/list             \
+  bench/mergeheaps       \
+  bench/pretty           \
+  bench/sets             \
+  bench/setsofsets       \
+  bench/sieve            \
+  bench/sorting          \
+  bench/spring
+BENCHS = $(MOSTBENCHS) \
+  bench/haskell-src      \
+  bench/haskell-src-exts
+MOSTEGS = \
+  eg/sorting \
+  eg/negation
+EGS = $(MOSTEGS) \
+  eg/alga
+TESTS = \
+  tests/test-derive      \
+  tests/test-mutate      \
+  tests/test-showmutable \
+  tests/test-utils
+
+all: mk/toplibs
+
+benchs: $(BENCHS) all
+
+egs: $(EGS) all
+
+ghci: Test/FitSpec.ghci
+
+test: all benchs egs $(TESTS)
+	./tests/test-mutate
+	./tests/test-showmutable
+	./tests/test-derive
+	./tests/test-utils
+
+test-without-extra-deps: all $(MOSTBENCHS) $(MOSTEGS) $(TESTS)
+	./tests/test-mutate
+	./tests/test-showmutable
+	./tests/test-derive
+	./tests/test-utils
+
+legacy-test:
+	make clean && make test-without-extra-deps -j8 GHC=ghc-8.2  GHCFLAGS="-Werror -dynamic"
+	make clean && make test-without-extra-deps -j8 GHC=ghc-8.0  GHCFLAGS="-Werror -dynamic"
+	make clean && make test-without-extra-deps -j8 GHC=ghc-7.10 GHCFLAGS="-Werror -dynamic"
+	make clean && make test-without-extra-deps -j8 GHC=ghc-7.8  GHCFLAGS="-Werror -dynamic"
+	make clean && make test                    -j8
+
+test-via-cabal:
+	cabal configure --enable-tests --enable-benchmarks --ghc-options="-dynamic -Werror" && cabal build && cabal test
+
+test-sdist:
+	tests/test-sdist
+
+prepare-test-via-cabal:
+	rm -rf .cabal-sandbox cabal.sandbox.config
+	cabal sandbox init
+	cabal install --only-dependencies --enable-documentation
+	cabal configure --enable-tests --enable-benchmarks
+
+legacy-test-via-cabal:
+	cabal-ghc-8.2  configure --enable-tests --enable-benchmarks --ghc-option=-dynamic && cabal-ghc-8.2  build && cabal-ghc-8.2  test
+	cabal-ghc-8.0  configure --enable-tests --enable-benchmarks --ghc-option=-dynamic && cabal-ghc-8.0  build && cabal-ghc-8.0  test
+	cabal-ghc-7.10 configure --enable-tests --enable-benchmarks --ghc-option=-dynamic && cabal-ghc-7.10 build && cabal-ghc-7.10 test
+	cabal-ghc-7.8  configure --enable-tests --enable-benchmarks --ghc-option=-dynamic && cabal-ghc-7.8  build && cabal-ghc-7.8  test
+	cabal clean
+
+prepare-legacy-test-via-cabal:
+	rm -rf .cabal-sandbox cabal.sandbox.config
+	cabal sandbox init
+	cabal          install --only-dependencies --enable-tests --enable-benchmarks --enable-documentation
+	cabal-ghc-8.2  install --only-dependencies --enable-tests --enable-benchmarks
+	cabal-ghc-8.0  install --only-dependencies --enable-tests --enable-benchmarks
+	cabal-ghc-7.10 install --only-dependencies --enable-tests --enable-benchmarks
+	cabal-ghc-7.8  install --only-dependencies --enable-tests --enable-benchmarks
+
+clean: clean-hi-o clean-haddock
+	rm -f $(TESTS) $(BENCHS) $(EGS) {eg,bench}/*.{hi,o,dyn_hi,dyn_o}
+
+# Debug: just list all source files compiled normally
+list-hs:
+	$(LISTHS)
+
+list-libs:
+	$(LISTLIBS)
+
+hlint:
+	hlint \
+	  --ignore "Use import/export shortcut" \
+	  --ignore "Use first" \
+	  --ignore "Use second" \
+	  --ignore "Use ***" \
+	  FitSpec.hs FitSpec bench tests
+
+mk/toplibs: src/Test/FitSpec.o bench/Set.o
+	touch mk/toplibs
+
+bench/avltrees: bench/AVLTree.o
+
+bench/heaps: bench/Heap.o
+
+bench/digraphs: bench/Digraph.o
+
+include mk/haskell.mk
diff --git a/bench/haskell-src-exts.hs b/bench/haskell-src-exts.hs
new file mode 100644
--- /dev/null
+++ b/bench/haskell-src-exts.hs
@@ -0,0 +1,38 @@
+{-# LANGUAGE TemplateHaskell #-}
+import Test.FitSpec
+import Language.Haskell.Exts
+import Language.Haskell.Exts.Pretty
+
+instance Eq a => Eq (ParseResult a) where
+  ParseOk x == ParseOk y = x == y
+  ParseFailed l1 s1 == ParseFailed l2 s2 = l1 == l2 && s1 == s2
+  _ == _ = False
+
+deriveMutableCascading ''ParseResult
+deriveMutableCascading ''Module
+deriveMutableCascading ''SrcSpanInfo
+
+properties :: (String -> ParseResult (Module SrcSpanInfo)
+              ,Module SrcSpanInfo -> String)
+           -> [Property]
+properties (parseFileContents,prettyPrint) =
+  [ property $ case parseFileContents "" of
+                 ParseOk (Module _ _ _ _ _) -> True
+                 _ -> False
+  , property $ case parseFileContents "a" of
+                 ParseFailed (SrcLoc "<unknown>.hs" 2 1) _ -> True
+                 _ -> False
+  , property $ \m -> case parseFileContents (prettyPrint m) of
+                       ParseOk m' -> case parseFileContents (prettyPrint m') of
+                                       ParseOk m'' -> m' == m''
+                                       _ -> False
+                       _ -> True
+-- Not true:
+--, property $ \s -> case parseFileContents s of
+--                     ParseOk m' -> prettyPrint m' == s
+--                     _ -> True
+  ]
+
+main = mainWith args { names = ["parseFileContents f", "prettyPrint m"] }
+                (parseFileContents,prettyPrint)
+                properties
diff --git a/bench/haskell-src.hs b/bench/haskell-src.hs
new file mode 100644
--- /dev/null
+++ b/bench/haskell-src.hs
@@ -0,0 +1,58 @@
+{-# LANGUAGE TemplateHaskell, StandaloneDeriving #-}
+import Test.FitSpec
+import Language.Haskell.Parser
+import Language.Haskell.Pretty as P
+import Language.Haskell.Syntax
+import Data.Ratio
+import Data.List (intercalate)
+import Data.Function (on)
+import Data.Char
+
+deriving instance Eq HsModule -- needed for Mutable
+
+deriveMutableCascading ''HsModule
+
+-- change ``take 5'' below to ``take n'' where n `elem` [1,2,3,4]
+-- to see surviving mutants for different refinements
+--
+-- All 5 properties should be reported as ``apparently complete''
+-- so no surviving mutants.
+properties :: (HsModule -> String) -> [Property]
+properties prettyPrint = take 5
+  [ property $
+      \nm loc -> (prettyPrint $ HsModule loc (Module nm) Nothing [] [])
+              == "module " ++ nm ++ " where"
+
+  , property $
+      \nm loc -> (prettyPrint $ HsModule loc (Module nm) (Just []) [] [])
+              == "module " ++ nm ++ " () where"
+
+  , property $
+      \nm loc -> (prettyPrint $ HsModule loc (Module nm) Nothing [] [HsFunBind []])
+              == "module " ++ nm ++ " where"
+
+  , property $
+      \nm loc imports decls ->
+           (prettyPrint $ HsModule loc (Module nm) Nothing imports decls)
+       === unlines (("module " ++ nm ++ " where")
+                   :(map P.prettyPrint imports
+                  ++ map P.prettyPrint decls))
+
+  , property $
+      \nm loc imports exports decls ->
+           (prettyPrint $ HsModule loc (Module nm) (Just exports) imports decls)
+       === unlines (["module " ++ nm ++ " ("
+                               ++ intercalate ", " (map P.prettyPrint exports)
+                               ++ ") where"]
+                 ++ map P.prettyPrint imports
+                 ++ map P.prettyPrint decls)
+  ]
+  where
+  (===) :: String -> String -> Bool
+  (===) = (==) `on` (filter (not . null) . lines)
+
+main = mainWith args { names = ["prettyPrint"]
+                     , timeout = 0
+                     }
+                prettyPrint
+                properties
diff --git a/eg/Makefile b/eg/Makefile
new file mode 100644
--- /dev/null
+++ b/eg/Makefile
@@ -0,0 +1,24 @@
+# Makefile for FitSpec
+
+# Configuration variables
+FITSPECPATH = ../src
+GHCFLAGS = -O2 -i$(FITSPECPATH) -dynamic
+
+# Misc variables
+
+all: sorting negation
+
+clean:
+	rm -f *.hi *.o sorting negation
+
+# Implicit rules:
+
+%.o: %.hs
+	ghc $(GHCFLAGS) $<
+
+%: %.hs
+	ghc $(GHCFLAGS) $<
+
+.PHONY: %.ghci
+%.ghci: %.hs
+	ghci $(GHCFLAGS) -O0 $<
diff --git a/eg/alga.hs b/eg/alga.hs
new file mode 100644
--- /dev/null
+++ b/eg/alga.hs
@@ -0,0 +1,49 @@
+{-# LANGUAGE TemplateHaskell #-}
+import Test.FitSpec
+import Test.LeanCheck.Tiers
+import Algebra.Graph
+
+instance (Listable a, Ord a) => Listable (Graph a) where
+  tiers = nubT
+        $ cons0 Empty
+       \/ cons1 Vertex
+       \/ cons2 Overlay
+       \/ cons2 Connect
+
+deriveMutableE [''Ord] ''Graph
+
+instance Ord a => Ord (Graph a) where
+  (<=) = isSubgraphOf
+
+type A = Int
+
+properties :: ( Graph A -> Graph A -> Graph A
+              , Graph A -> Graph A -> Graph A )
+           -> [Property]
+properties (plus,times) =
+  [ property $ \x y -> x + y == y + x
+  , property $ \x y z -> x + (y + z) == (x + y) + z
+  , property $ \x y z -> x * (y * z) == (x * y) * z
+  , property $ \x y z -> x * (y * z) == (x * y) + (x * z) + (y * z)
+  ]
+  where
+  (+) = plus
+  (*) = times
+  infixl 6 +
+  infixl 7 *
+
+main :: IO ()
+main = do
+  args <- getArgsWith
+    args { names = ["x + y", "x * y"]
+         , nMutants = 1000
+         , nTests   = 1000
+         , timeout  = 0
+         }
+  reportWithExtra
+    [ ((*),(+))
+    , ((*),(*))
+    , ((+),(+)) ]
+    args
+    ((+),(*))
+    properties
diff --git a/eg/negation.hs b/eg/negation.hs
new file mode 100644
--- /dev/null
+++ b/eg/negation.hs
@@ -0,0 +1,9 @@
+-- Minimal example: mutation testing a negation specification
+import Test.FitSpec
+
+properties not =
+  [ property $ \p -> not (not p) == p
+  , property $ \p -> not (not (not p)) == not p
+  ]
+
+main = mainWith args {names = ["not p"]} not properties
diff --git a/eg/sorting.hs b/eg/sorting.hs
new file mode 100644
--- /dev/null
+++ b/eg/sorting.hs
@@ -0,0 +1,43 @@
+-- Minimal example: mutation testing a sort specification
+--
+-- (this program might take a minute to run depending on your system)
+--
+-- Usage:
+--
+-- $ ghc -O2 sorting.hs
+-- $ ./sorting
+-- Apparent incomplete and non-minimal specification based on
+-- 4000 test cases for each of properties 1, 2, 3, 4 and 5
+-- for each of 4000 mutant variations.
+--
+-- 3 survivors (99% killed), smallest:
+--   \xs -> case xs of
+--            [0,0,1] -> [0,1,1]
+--            _ -> sort xs
+--
+-- apparent minimal property subsets:  {1,2,3} {1,2,4}
+-- conjectures:  {3}    =  {4}     96% killed (weak)
+--               {1,3} ==> {5}     98% killed (weak)
+
+import Test.FitSpec
+import Data.List (sort)
+
+properties sort =
+  [ property $ \xs   -> ordered (sort xs)
+  , property $ \xs   -> length (sort xs) == length xs
+  , property $ \x xs -> elem x (sort xs) == elem x xs
+  , property $ \x xs -> notElem x (sort xs) == notElem x xs
+  , property $ \x xs -> minimum (x:xs) == head (sort (x:xs))
+  ]
+  where
+  ordered (x:y:xs) = x <= y && ordered (y:xs)
+  ordered _        = True
+
+main =
+  mainWith args { names = ["sort xs"]
+                , nMutants = 4000
+                , nTests   = 4000
+                , timeout  = 0
+                }
+           (sort::[Word2]->[Word2])
+           properties
diff --git a/fitspec.cabal b/fitspec.cabal
--- a/fitspec.cabal
+++ b/fitspec.cabal
@@ -1,5 +1,5 @@
 name:                fitspec
-version:             0.4.6
+version:             0.4.7
 synopsis:            refining property sets for testing Haskell programs
 description:
   FitSpec provides automated assistance in the task of refining test properties
@@ -29,6 +29,21 @@
                , TODO.md
                , doc/modules.md
                , doc/tutorial-property-creation.md
+extra-source-files: .gitignore
+                  , .travis.yml
+                  , Makefile
+                  , bench/haskell-src-exts.hs
+                  , bench/haskell-src.hs
+                  , eg/Makefile
+                  , eg/alga.hs
+                  , eg/negation.hs
+                  , eg/sorting.hs
+                  , mk/depend.mk
+                  , mk/ghcdeps
+                  , mk/haddock-i
+                  , mk/haskell.mk
+                  , stack.yaml
+                  , tests/test-sdist
 tested-with: GHC==8.2, GHC==8.0, GHC==7.10, GHC==7.8, GHC==7.6, GHC==7.4
 
 source-repository head
@@ -38,7 +53,7 @@
 source-repository this
   type:            git
   location:        https://github.com/rudymatela/fitspec
-  tag:             v0.4.6
+  tag:             v0.4.7
 
 
 library
diff --git a/mk/depend.mk b/mk/depend.mk
new file mode 100644
--- /dev/null
+++ b/mk/depend.mk
@@ -0,0 +1,461 @@
+bench/AVLTree.o: \
+  bench/AVLTree.hs
+bench/avltrees: \
+  bench/avltrees.hs \
+  bench/AVLTree.hs \
+  mk/toplibs
+bench/avltrees.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs \
+  bench/avltrees.hs \
+  bench/AVLTree.hs
+bench/bools: \
+  bench/bools.hs \
+  mk/toplibs
+bench/bools.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs \
+  bench/bools.hs
+bench/Digraph.o: \
+  bench/Digraph.hs
+bench/digraphs: \
+  bench/digraphs.hs \
+  bench/Digraph.hs \
+  mk/toplibs
+bench/digraphs.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs \
+  bench/digraphs.hs \
+  bench/Digraph.hs
+bench/haskell-src-exts: \
+  mk/toplibs
+bench/haskell-src-exts.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs \
+  bench/haskell-src-exts.hs
+bench/haskell-src: \
+  mk/toplibs
+bench/haskell-src.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs \
+  bench/haskell-src.hs
+bench/Heap.o: \
+  bench/Heap.hs
+bench/heaps: \
+  bench/heaps.hs \
+  bench/Heap.hs \
+  mk/toplibs
+bench/heaps.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs \
+  bench/heaps.hs \
+  bench/Heap.hs
+bench/id: \
+  bench/id.hs \
+  mk/toplibs
+bench/id.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs \
+  bench/id.hs
+bench/list: \
+  bench/list.hs \
+  mk/toplibs
+bench/list.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs \
+  bench/list.hs
+bench/mergeheaps: \
+  bench/mergeheaps.hs \
+  bench/Heap.hs \
+  mk/toplibs
+bench/mergeheaps.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs \
+  bench/mergeheaps.hs \
+  bench/Heap.hs
+bench/pretty: \
+  bench/pretty.hs \
+  mk/toplibs
+bench/pretty.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs \
+  bench/pretty.hs
+bench/Set.o: \
+  bench/Set.hs
+bench/sets: \
+  bench/sets.hs \
+  bench/Set.hs \
+  mk/toplibs
+bench/setsofsets: \
+  bench/setsofsets.hs \
+  bench/Set.hs \
+  mk/toplibs
+bench/setsofsets.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs \
+  bench/setsofsets.hs \
+  bench/Set.hs
+bench/sets.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs \
+  bench/sets.hs \
+  bench/Set.hs
+bench/sieve: \
+  bench/sieve.hs \
+  mk/toplibs
+bench/sieve.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs \
+  bench/sieve.hs
+bench/sorting: \
+  bench/sorting.hs \
+  mk/toplibs
+bench/sorting.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs \
+  bench/sorting.hs
+bench/spring: \
+  bench/spring.hs \
+  mk/toplibs
+bench/spring.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs \
+  bench/spring.hs
+eg/alga: \
+  eg/alga.hs \
+  mk/toplibs
+eg/alga.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs \
+  eg/alga.hs
+eg/negation: \
+  eg/negation.hs \
+  mk/toplibs
+eg/negation.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs \
+  eg/negation.hs
+eg/sorting: \
+  eg/sorting.hs \
+  mk/toplibs
+eg/sorting.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs \
+  eg/sorting.hs
+src/Test/FitSpec/Derive.o: \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Derive.hs
+src/Test/FitSpec/Dot.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Dot.hs \
+  src/Test/FitSpec/Derive.hs
+src/Test/FitSpec/Engine: \
+  mk/toplibs
+src/Test/FitSpec/Engine.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Engine.hs
+src/Test/FitSpec/Main: \
+  mk/toplibs
+src/Test/FitSpec/Main.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs
+src/Test/FitSpec: \
+  mk/toplibs
+src/Test/FitSpec/Mutable.o: \
+  src/Test/FitSpec/Mutable.hs
+src/Test/FitSpec/Mutable/Tuples.o: \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs
+src/Test/FitSpec.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs
+src/Test/FitSpec/PrettyPrint.o: \
+  src/Test/FitSpec/PrettyPrint.hs
+src/Test/FitSpec/Report: \
+  mk/toplibs
+src/Test/FitSpec/Report.o: \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Engine.hs
+src/Test/FitSpec/ShowMutable.o: \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/PrettyPrint.hs
+src/Test/FitSpec/ShowMutable/Tuples.o: \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/PrettyPrint.hs
+src/Test/FitSpec/TestTypes.o: \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec/Mutable.hs
+src/Test/FitSpec/Utils.o: \
+  src/Test/FitSpec/Utils.hs
+tests/test-derive.o: \
+  tests/test-derive.hs \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs
+tests/test-derive: \
+  tests/test-derive.hs \
+  mk/toplibs
+tests/test-mutate.o: \
+  tests/test-mutate.hs \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs
+tests/test-mutate: \
+  tests/test-mutate.hs \
+  mk/toplibs
+tests/test-showmutable.o: \
+  tests/test-showmutable.hs \
+  src/Test/FitSpec/Utils.hs \
+  src/Test/FitSpec/TestTypes.hs \
+  src/Test/FitSpec/ShowMutable/Tuples.hs \
+  src/Test/FitSpec/ShowMutable.hs \
+  src/Test/FitSpec/Report.hs \
+  src/Test/FitSpec/PrettyPrint.hs \
+  src/Test/FitSpec.hs \
+  src/Test/FitSpec/Mutable/Tuples.hs \
+  src/Test/FitSpec/Mutable.hs \
+  src/Test/FitSpec/Main.hs \
+  src/Test/FitSpec/Engine.hs \
+  src/Test/FitSpec/Derive.hs
+tests/test-showmutable: \
+  tests/test-showmutable.hs \
+  mk/toplibs
+tests/test-utils.o: \
+  tests/test-utils.hs \
+  src/Test/FitSpec/Utils.hs
+tests/test-utils: \
+  tests/test-utils.hs \
+  mk/toplibs
diff --git a/mk/ghcdeps b/mk/ghcdeps
new file mode 100644
--- /dev/null
+++ b/mk/ghcdeps
@@ -0,0 +1,49 @@
+#!/bin/bash
+#
+# ghcdeps: generate Haskell make dependencies for compiling with GHC.
+#
+# Copyright (c) 2015-2018 Rudy Matela.
+# Distributed under the 3-Clause BSD licence.
+#
+# From a list of files provided on standard input,
+# generate flat make dependencies.
+#
+# Transitive relations are repeated.
+#
+# Usage:
+#   $ ghcdeps -isomedir:someother <<LIST
+#   program.hs
+#   Library.hs
+#   Path/To/Library.hs
+#   LIST
+#   program: ...
+#   Library.o: ...
+#   Path/To/Library.o: ...
+#
+# Or:
+#   $ find -name \*.hs -o -name \*.lhs | ghcdeps [GHCFLAGS]
+#   ...
+#
+# Note that when using find, you have to remember to exclude unecessary files,
+# e.g.:  dist, Setup.hs
+#
+# Yes, this is hacky.  But hey, it works.
+while read fn
+do
+	ghc "$@" -dep-suffix=. -dep-makefile=tmp.mk -M "$fn" ||
+	exit 1
+	deps="`cat tmp.mk |
+	       grep "hs$" |
+	       sort |
+	       sed -e "s/.*: //" |
+	       tac |
+	       tr '\n' ' ' |
+	       sed -e "s/ $//"`"
+	obj=`echo $fn | sed -e 's,^\./,,;s/\.hs$/.o/'`
+	bin=`echo $fn | sed -e 's,^\./,,;s/\.hs$//'`
+	echo "$obj: $deps"
+	grep -q "main" "$fn" && echo "$bin: `echo $deps | sed -e 's|[^ ]*src[^ ]*||g'` mk/toplibs"
+	rm -f tmp.mk
+done |
+sort |
+sed -e 's,  *, \\\n  ,g'
diff --git a/mk/haddock-i b/mk/haddock-i
new file mode 100644
--- /dev/null
+++ b/mk/haddock-i
@@ -0,0 +1,24 @@
+#!/bin/bash
+#
+# haddock-i: list haddock's -i parameters.
+#
+# Copyright (c) 2015-2018 Rudy Matela.
+# Distributed under the 3-Clause BSD licence.
+#
+# $ haddock-i <package1> <package2> ... <packageN>
+#
+# will print -i parameters necessary for haddock to link to Haddock
+# documentation installed on your system, so you can:
+#
+# $ haddock-i base template-haskell | xargs haddock <files>
+errxit() {
+	echo "$@" > /dev/stderr
+	exit 1
+}
+
+for pkg in "$@"; do
+	ghc-pkg field $pkg haddock-html,haddock-interfaces ||
+	errxit "error: haddock-i: cannot find package $pkg (ghc-pkg)"
+done |
+sed "s/.*: //" |
+sed "N;s/\n/,/;s/^/-i/"
diff --git a/mk/haskell.mk b/mk/haskell.mk
new file mode 100644
--- /dev/null
+++ b/mk/haskell.mk
@@ -0,0 +1,110 @@
+# Implicit rules for compiling Haskell code.
+#
+# Copyright (c) 2015-2018 Rudy Matela.
+# Distributed under the 3-Clause BSD licence.
+#
+# You can optionally configure the "Configuration variables" below in your main
+# makefile, e.g.:
+#
+#   GHCIMPORTDIRS = path/to/dir:path/to/another/dir
+#   GHCFLAGS = -O2 -dynamic
+#   GHC = ghc-7.6
+#   include haskell.mk
+
+
+
+# Configuration variables
+
+# GHC Parameters
+GHCIMPORTDIRS ?=
+GHCFLAGS ?=
+GHC ?= ghc
+GHCCMD = $(GHC) -i$(GHCIMPORTDIRS) $(GHCFLAGS)
+
+# Hugs Parameters
+HUGSIMPORTDIRS ?= "/usr/lib/hugs/packages/*"
+HUGSFLAGS ?=
+CPPHS_HUGS ?= cpphs-hugs --noline -D__HUGS__
+HUGS ?= hugs
+RUNHUGS ?= runhugs
+HUGSCMD    = $(HUGS)    -F"$(CPPHS_HUGS)" -P$(HUGSIMPORTDIRS) $(HUGSFLAGS)
+RUNHUGSCMD = $(RUNHUGS) -F"$(CPPHS_HUGS)" -P$(HUGSIMPORTDIRS) $(HUGSFLAGS)
+
+
+# Makefile where to keep the dependencies
+DEPMK ?= mk/depend.mk
+
+# LIB_HSS: all library Haskell files
+# ALL_HSS: all Haskell files
+# You can override ALL/LIB_HSS in your main Makefile
+LIST_LIB_HSS ?= find src -name "*.hs"
+LIST_ALL_HSS ?= find \( -path "./dist" -o -path "./.stack-work" \) -prune \
+                     -o -name "*.*hs" -print
+LIB_HSS ?= $(shell $(LIST_LIB_HSS))
+ALL_HSS ?= $(shell $(LIST_ALL_HSS))
+
+PKGNAME = $(shell cat *.cabal | grep "^name:"    | sed -e "s/name: *//")
+
+
+# Implicit rules
+%.hi %.o: %.hs
+	$(GHCCMD) $< && touch $@
+
+%: %.hs
+	$(GHCCMD) $< && touch $@
+
+.PHONY: %.ghci
+%.ghci: %.hs
+	$(GHCCMD) -O0 --interactive $<
+
+.PHONY: %.hugs
+%.hugs: %.hs
+	$(HUGSCMD) $<
+
+.PHONY: %.runhugs
+%.runhugs: %.hs
+	$(RUNHUGSCMD) $<
+
+
+# Cleaning rule (add as a clean dependency)
+.PHONY: clean-hi-o
+clean-hi-o:
+	find $(ALL_HSS) | sed -e 's/hs$$/o/'      | xargs rm -f
+	find $(ALL_HSS) | sed -e 's/hs$$/hi/'     | xargs rm -f
+	find $(ALL_HSS) | sed -e 's/hs$$/dyn_o/'  | xargs rm -f
+	find $(ALL_HSS) | sed -e 's/hs$$/dyn_hi/' | xargs rm -f
+
+
+# Update dependency file
+.PHONY: depend
+depend:
+	find $(ALL_HSS) | ./mk/ghcdeps -i$(GHCIMPORTDIRS) $(GHCFLAGS) > $(DEPMK)
+
+# haddock rules
+haddock: doc/index.html
+
+clean-haddock:
+	rm -f doc/*.{html,css,js,png,gif,json} README.html
+
+upload-haddock:
+	@echo "use \`cabal upload -d' instead"
+	@echo "(but 1st: cabal install --only-dependencies --enable-documentation)"
+	@echo "(to just compile docs: cabal haddock --for-hackage)"
+	@echo "(on Arch Linux, use: cabal haddock --for-hackage --haddock-options=--optghc=-dynamic)"
+
+doc/index.html: $(LIB_HSS)
+	./mk/haddock-i base template-haskell | xargs \
+	haddock --html -odoc $(LIB_HSS) $(HADDOCKFLAGS) --title=$(PKGNAME)
+
+# lists all Haskell source files
+list-all-hss:
+	@find $(ALL_HSS)
+
+# lists library Haskell source files
+list-lib-hss:
+	@find $(LIB_HSS)
+
+show-pkgname:
+	@echo $(PKGNAME)
+
+include $(DEPMK)
diff --git a/src/Test/FitSpec.hs b/src/Test/FitSpec.hs
--- a/src/Test/FitSpec.hs
+++ b/src/Test/FitSpec.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.FitSpec
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
diff --git a/stack.yaml b/stack.yaml
new file mode 100644
--- /dev/null
+++ b/stack.yaml
@@ -0,0 +1,16 @@
+# stack.yaml docs:
+# https://docs.haskellstack.org/en/stable/yaml_configuration/
+
+# resolver: nightly-2015-09-21
+# resolver: ghc-7.10.2
+resolver: lts-12.7
+
+packages:
+- .
+
+extra-deps:
+- leancheck-0.7.2
+
+flags: {}
+
+extra-package-dbs: []
diff --git a/tests/test-sdist b/tests/test-sdist
new file mode 100644
--- /dev/null
+++ b/tests/test-sdist
@@ -0,0 +1,28 @@
+#!/bin/bash
+#
+# test-sdist: tests the package generated by "cabal sdist".
+#
+# Copyright (c) 2015-2018 Rudy Matela.
+# Distributed under the 3-Clause BSD licence.
+pkgver=` cat *.cabal | grep "^version:" | sed -e "s/version: *//"`
+pkgname=`cat *.cabal | grep "^name:"    | sed -e "s/name: *//"`
+pkg=$pkgname-$pkgver
+set -x
+cabal sdist &&
+cd dist &&
+if [ -d ../.git ]
+then
+	# on git repo, test if files are the same
+	git -C .. ls-files                                      | sort > ls-git   &&
+	tar -tf $pkg.tar.gz | grep -v "/$" | sed -e "s,$pkg/,," | sort > ls-cabal &&
+	diff -rud ls-git ls-cabal &&
+	rm -f ls-git ls-cabal
+else
+	# outside of git repo, test build
+	rm -rf $pkg/ &&
+	tar -xzf $pkg.tar.gz &&
+	cd $pkg/ &&
+	cabal configure --enable-tests --enable-benchmarks &&
+	cabal build &&
+	cabal test
+fi
