diff --git a/example/Queen8.hs b/example/Queen8.hs
--- a/example/Queen8.hs
+++ b/example/Queen8.hs
@@ -47,7 +47,7 @@
 Since the search algorithm treats every element the same way,
 the generic algorithm chooses in every step
 a row, a column or a diagonal
-where there the least possibilities to place a queen.
+with the smallest number of possibilities to place a queen.
 -}
 assign :: Int -> Int -> Assign
 assign i j =
diff --git a/set-cover.cabal b/set-cover.cabal
--- a/set-cover.cabal
+++ b/set-cover.cabal
@@ -1,10 +1,11 @@
+Cabal-Version:    2.2
 Name:             set-cover
-Version:          0.1.1
-License:          BSD3
+Version:          0.1.1.1
+License:          BSD-3-Clause
 License-File:     LICENSE
 Author:           Henning Thielemann, Helmut Podhaisky
 Maintainer:       Henning Thielemann <haskell@henning-thielemann.de>
-Homepage:         http://hub.darcs.net/thielema/set-cover/
+Homepage:         https://hub.darcs.net/thielema/set-cover/
 Category:         Math, Algorithms
 Synopsis:         Solve exact set cover problems like Sudoku, 8 Queens, Soma Cube, Tetris Cube
 Description:
@@ -29,7 +30,6 @@
   There is also an experimental implementation using LLVM and @knead@.
   Do not rely on that interface in released packages.
 Tested-With:      GHC==7.4.2, GHC==7.6.3, GHC==7.8.2
-Cabal-Version:    >=1.8
 Build-Type:       Simple
 Extra-Source-Files:
   Changes.md
@@ -40,32 +40,33 @@
   Default:     False
 
 Flag llvm
-  Description: Enable efficient signal processing using LLVM
+  Description: Enable efficient array processing using LLVM
   Manual:      True
   Default:     False
 
 Source-Repository this
-  Tag:         0.1.1
+  Tag:         0.1.1.1
   Type:        darcs
-  Location:    http://hub.darcs.net/thielema/set-cover/
+  Location:    https://hub.darcs.net/thielema/set-cover/
 
 Source-Repository head
   Type:        darcs
-  Location:    http://hub.darcs.net/thielema/set-cover/
+  Location:    https://hub.darcs.net/thielema/set-cover/
 
 Library
   Build-Depends:
     psqueues >=0.2 && <0.3,
-    enummapset >=0.1 && <0.7,
-    transformers >=0.2 && <0.6,
+    enummapset >=0.1 && <0.8,
+    transformers >=0.2 && <0.7,
     array >=0.4 && <0.6,
-    containers >=0.4 && <0.7,
+    containers >=0.4 && <0.8,
     non-empty >=0.2 && <0.4,
     semigroups >=0.1 && <1.0,
     utility-ht >=0.0.12 && <0.1,
     prelude-compat ==0.*,
     base >=4 && <5
 
+  Default-Language: Haskell98
   GHC-Options:      -Wall
   Hs-Source-Dirs:   src
   Exposed-Modules:
@@ -89,13 +90,14 @@
 
   If flag(llvm)
     Build-Depends:
-      knead >=0.4 && <0.6,
-      llvm-extra >=0.10 && <0.11,
-      llvm-tf >=9.2 && <9.3,
+      knead >=1.0 && <1.1,
+      llvm-dsl >=0.1 && <0.2,
+      llvm-extra >=0.11 && <0.12,
+      llvm-tf >=9.2 && <17.1,
       tfp >=1.0 && <1.1,
-      comfort-array >=0.3 && <0.5,
+      comfort-array >=0.3 && <0.6,
       storable-record >=0.0.5 && <0.1,
-      storable-endian >=0.2.6 && <0.3,
+      storable-endian >=0.2.5 && <0.3,
       bool8 >=0.0 && <0.1,
       lazyio >=0.1 && <0.2
     Exposed-Modules:
@@ -109,7 +111,7 @@
   Type: exitcode-stdio-1.0
   Build-Depends:
     set-cover,
-    transformers >=0.2 && <0.6,
+    transformers >=0.2 && <0.7,
     enummapset,
     containers,
     array >=0.1 && <0.6,
@@ -122,7 +124,8 @@
     Hs-Source-Dirs: test/knead
   Else
     Hs-Source-Dirs: test/plain
-  GHC-Options:    -Wall
+  Default-Language: Haskell98
+  GHC-Options:      -Wall
   Other-Modules:
     Mastermind.Test
     Mastermind.Guess
@@ -130,158 +133,136 @@
     Test.Knead
     Test.Utility
 
+Common example
+  Default-Language: Haskell98
+  GHC-Options:    -Wall
+  Hs-Source-Dirs: example
+  Build-Depends:
+    set-cover,
+    utility-ht,
+    base
+
 Executable tetris-cube
+  Import: example
   If flag(buildExamples)
     Build-Depends:
       haha >=0.3.1 && <0.4,
       pooled-io >=0.0 && <0.1,
-      set-cover,
-      containers,
-      utility-ht,
-      base
+      containers
   Else
     Buildable: False
-  GHC-Options:    -Wall -rtsopts -threaded
-  Hs-Source-Dirs: example
+  GHC-Options:    -rtsopts -threaded
   Main-Is: TetrisCube.hs
   Other-Modules:
     Utility
 
 Executable soma-cube
+  Import: example
   If flag(buildExamples)
     Build-Depends:
-      set-cover,
-      containers,
-      utility-ht,
-      base
+      containers
   Else
     Buildable: False
-  GHC-Options:    -Wall -rtsopts -threaded
-  Hs-Source-Dirs: example
+  GHC-Options:    -rtsopts -threaded
   Main-Is: Soma.hs
 
 Executable queen8
+  Import: example
   If flag(buildExamples)
     Build-Depends:
-      set-cover,
-      containers,
       array >=0.1 && <0.6,
-      utility-ht,
-      base
+      containers
   Else
     Buildable: False
-  GHC-Options:    -Wall -rtsopts -threaded
-  Hs-Source-Dirs: example
+  GHC-Options:    -rtsopts -threaded
   Main-Is: Queen8.hs
 
 Executable sudoku-setcover
+  Import: example
   If flag(buildExamples)
     Build-Depends:
-      set-cover,
       haha >=0.3.1 && <0.4,
-      random >=1.0 && <1.2,
-      transformers >=0.2 && <0.6,
-      containers,
+      random >=1.0 && <1.3,
+      transformers >=0.2 && <0.7,
       array >=0.1 && <0.6,
-      utility-ht,
-      base
+      containers
   Else
     Buildable: False
-  GHC-Options:    -Wall -rtsopts -threaded
-  Hs-Source-Dirs: example
+  GHC-Options:      -rtsopts -threaded
   Main-Is: Sudoku.hs
   Other-Modules: Random, Mastermind.Utility
 
 Executable lcube
+  Import: example
   If flag(buildExamples)
     Build-Depends:
-      set-cover,
       pooled-io >=0.0 && <0.1,
-      containers,
-      utility-ht,
-      base
+      containers
   Else
     Buildable: False
-  GHC-Options:    -Wall -rtsopts -threaded
-  Hs-Source-Dirs: example
+  GHC-Options:    -rtsopts -threaded
   Main-Is: LCube.hs
   Other-Modules:
     Utility
 
 Executable baumeister
+  Import: example
   If flag(buildExamples)
     Build-Depends:
-      set-cover,
-      containers,
-      utility-ht,
-      base
+      containers
   Else
     Buildable: False
-  GHC-Options:    -Wall -rtsopts -threaded
-  Hs-Source-Dirs: example
+  GHC-Options:    -rtsopts -threaded
   Main-Is: Baumeister.hs
   Other-Modules:
     Utility
 
 Executable lonpos-pyramid
+  Import: example
   If flag(buildExamples)
     Build-Depends:
-      set-cover,
-      containers,
-      utility-ht,
-      base
+      containers
   Else
     Buildable: False
-  GHC-Options:    -Wall -rtsopts -threaded
-  Hs-Source-Dirs: example
+  GHC-Options:    -rtsopts -threaded
   Main-Is: LonposPyramid.hs
   Other-Modules:
     Utility
 
 Executable alphametics
+  Import: example
   If flag(buildExamples)
     Build-Depends:
-      set-cover,
       non-empty >=0.2 && <0.4,
-      transformers >=0.2 && <0.6,
-      containers,
-      utility-ht,
-      base
+      transformers >=0.2 && <0.7,
+      containers
   Else
     Buildable: False
-  GHC-Options:    -Wall -rtsopts -threaded
-  Hs-Source-Dirs: example
+  GHC-Options:    -rtsopts -threaded
   Main-Is: Alphametics.hs
 
 Executable domino
+  Import: example
   If flag(buildExamples)
     Build-Depends:
-      set-cover,
       unicode >=0.0 && <0.1,
-      containers,
       semigroups,
-      utility-ht,
-      base
+      containers
   Else
     Buildable: False
-  GHC-Options:    -Wall -rtsopts -threaded
-  Hs-Source-Dirs: example
+  GHC-Options:    -rtsopts -threaded
   Main-Is: Domino.hs
 
 Executable nonogram
+  Import: example
   If flag(buildExamples)
     Build-Depends:
-      set-cover,
       non-empty >=0.2 && <0.4,
       psqueues,
       enummapset,
-      containers,
-      utility-ht,
-      base
+      containers
   Else
     Buildable: False
-  GHC-Options:    -Wall
-  Hs-Source-Dirs: example
   Main-Is: Nonogram.hs
   Other-Modules:
     Nonogram.Example
@@ -292,20 +273,16 @@
     Nonogram.Base
 
 Executable mastermind-setcover
+  Import: example
   If flag(buildExamples)
     Build-Depends:
-      set-cover,
-      random >=1.0 && <1.2,
-      transformers >=0.2 && <0.6,
-      enummapset,
-      containers,
+      random >=1.0 && <1.3,
+      transformers >=0.2 && <0.7,
       array >=0.1 && <0.6,
-      utility-ht,
-      base
+      enummapset,
+      containers
   Else
     Buildable: False
-  GHC-Options:    -Wall
-  Hs-Source-Dirs: example
   Main-Is: Mastermind.hs
   Other-Modules:
     Mastermind.Utility
@@ -315,24 +292,20 @@
     Random
 
 Executable mastermind-knead
+  Import: example
   If flag(buildExamples) && flag(llvm)
     GHC-Prof-Options: -rtsopts -auto-all
     Build-Depends:
-      set-cover,
       haha >=0.3.1 && <0.4,
-      random >=1.0 && <1.2,
+      random >=1.0 && <1.3,
       lazyio,
-      transformers >=0.2 && <0.6,
-      enummapset,
-      containers,
+      transformers >=0.2 && <0.7,
       array >=0.1 && <0.6,
-      utility-ht,
-      base
+      enummapset,
+      containers
   Else
     Buildable: False
   Extra-Libraries: stdc++
-  GHC-Options:    -Wall
-  Hs-Source-Dirs: example
   Main-Is: MastermindKnead.hs
   Other-Modules:
     Mastermind.Utility
@@ -342,20 +315,16 @@
     Random
 
 Benchmark mastermind-benchmark
+  Import: example
   Type: exitcode-stdio-1.0
   Build-Depends:
-    set-cover,
     timeit,
     QuickCheck >=2.5 && <3.0,
-    random >=1.0 && <1.2,
-    transformers >=0.2 && <0.6,
-    enummapset,
-    containers,
+    random >=1.0 && <1.3,
+    transformers >=0.2 && <0.7,
     array >=0.1 && <0.6,
-    utility-ht,
-    base
-  GHC-Options:    -Wall
-  Hs-Source-Dirs: example
+    enummapset,
+    containers
   Main-Is: Mastermind/Benchmark.hs
   Other-Modules:
     Mastermind.Test
@@ -363,29 +332,24 @@
     Mastermind.Utility
 
 Executable pangram
+  Import: example
   If flag(buildExamples)
     Build-Depends:
-      set-cover,
-      containers,
-      base
+      containers
   Else
     Buildable: False
-  GHC-Options:    -Wall
-  Hs-Source-Dirs: example
   Main-Is: Pangram.hs
 
 Executable conway-puzzle
+  Import: example
   If flag(buildExamples)
     Build-Depends:
-      set-cover,
       pooled-io >=0.0 && <0.1,
       transformers,
-      containers,
-      base
+      containers
   Else
     Buildable: False
-  GHC-Options:    -Wall -rtsopts -threaded
-  Hs-Source-Dirs: example
+  GHC-Options:    -rtsopts -threaded
   Main-Is: ConwayPuzzle.hs
   Other-Modules:
     Utility
diff --git a/src/Math/SetCover/Exact/Knead.hs b/src/Math/SetCover/Exact/Knead.hs
--- a/src/Math/SetCover/Exact/Knead.hs
+++ b/src/Math/SetCover/Exact/Knead.hs
@@ -28,10 +28,10 @@
 import Control.Monad (foldM)
 import Control.Applicative (liftA3, pure, (<$>))
 
-import qualified Data.Array.Knead.Parameterized.Render as Render
-import qualified Data.Array.Knead.Simple.Physical as Phys
-import qualified Data.Array.Knead.Simple.Symbolic as Symb
-import qualified Data.Array.Knead.Simple.Slice as Slice
+import qualified Data.Array.Knead.Symbolic.Render as Render
+import qualified Data.Array.Knead.Symbolic.Physical as Phys
+import qualified Data.Array.Knead.Symbolic as Symb
+import qualified Data.Array.Knead.Symbolic.Slice as Slice
 import qualified Data.Array.Knead.Shape as Shape
 import qualified Data.Array.Knead.Expression as Expr
 import Data.Array.Knead.Expression ((.|.*))
diff --git a/src/Math/SetCover/Exact/Knead/Saturated.hs b/src/Math/SetCover/Exact/Knead/Saturated.hs
--- a/src/Math/SetCover/Exact/Knead/Saturated.hs
+++ b/src/Math/SetCover/Exact/Knead/Saturated.hs
@@ -18,14 +18,14 @@
 import Control.Monad (foldM)
 import Control.Applicative (liftA3, pure, (<$>))
 
-import qualified Data.Array.Knead.Parameterized.Render as Render
-import qualified Data.Array.Knead.Simple.Physical as Phys
-import qualified Data.Array.Knead.Simple.Symbolic as Symb
-import qualified Data.Array.Knead.Simple.Slice as Slice
+import qualified Data.Array.Knead.Symbolic.Render as Render
+import qualified Data.Array.Knead.Symbolic.Physical as Phys
+import qualified Data.Array.Knead.Symbolic as Symb
+import qualified Data.Array.Knead.Symbolic.Slice as Slice
 import qualified Data.Array.Knead.Shape as Shape
-import qualified Data.Array.Knead.Expression.Vector as ExprVec
-import qualified Data.Array.Knead.Expression as Expr
-import Data.Array.Knead.Expression (Exp, (/=*), (<*), (.&.*), )
+import qualified LLVM.DSL.Expression.Vector as ExprVec
+import qualified LLVM.DSL.Expression as Expr
+import LLVM.DSL.Expression (Exp, (/=*), (<*), (.&.*), )
 
 import qualified Data.Array.Comfort.Boxed as Array
 import Data.Array.Comfort.Boxed (Array)
@@ -137,7 +137,7 @@
 
 incSatX86 :: Exp Counters -> Exp Counters -> Exp Counters
 incSatX86 =
-   Expr.liftTupleM2 (\x y -> fromMaybe incSatGeneric Intr.maybeUAddSat x y)
+   Expr.liftReprM2 (\x y -> fromMaybe incSatGeneric Intr.maybeUAddSat x y)
 
 sumRows ::
    Symb.Array (SetDim, blockDim) Counters ->
@@ -158,7 +158,7 @@
    Expr.fromInteger' numCounters
 
 toCounters :: Exp Block -> Exp Counters
-toCounters = Expr.liftTupleM LLVM.bitcast
+toCounters = Expr.liftReprM LLVM.bitcast
 
 _pickBits :: Exp BitId -> Exp Block -> Exp Counters
 _pickBits k block =
@@ -166,13 +166,13 @@
 
 
 word16 :: Exp BitId -> Exp Word.Word16
-word16 = Expr.liftTupleM LLVM.ext . bitPos
+word16 = Expr.liftReprM LLVM.ext . bitPos
 
 toBlock16 :: Exp Block -> Exp Block16
-toBlock16 = Expr.liftTupleM LLVM.bitcast
+toBlock16 = Expr.liftReprM LLVM.bitcast
 
 fromBlock16 :: Exp Block16 -> Exp Counters
-fromBlock16 = Expr.liftTupleM LLVM.bitcast
+fromBlock16 = Expr.liftReprM LLVM.bitcast
 
 pickBitsX86 :: Exp BitId -> Exp Block -> Exp Counters
 pickBitsX86 k block =
@@ -212,7 +212,7 @@
 
 extractBlock :: Exp CounterId -> Exp Block -> Exp Subblock
 extractBlock =
-   Expr.liftTupleM2 (\k v -> LLVM.extractelement v =<< LLVM.zext k)
+   Expr.liftReprM2 (\k v -> LLVM.extractelement v =<< LLVM.zext k)
 
 flattenCounters ::
    Symb.Array (BlockDim, BitDim) Counters ->
@@ -223,7 +223,7 @@
 
 
 bitPos :: Exp BitId -> Exp Subblock
-bitPos = Expr.liftTupleM LLVM.bitcast
+bitPos = Expr.liftReprM LLVM.bitcast
 
 singleBit :: Exp BitId -> Exp Subblock
 singleBit = Expr.shl 1 . bitPos
diff --git a/src/Math/SetCover/Exact/Knead/Symbolic.hs b/src/Math/SetCover/Exact/Knead/Symbolic.hs
--- a/src/Math/SetCover/Exact/Knead/Symbolic.hs
+++ b/src/Math/SetCover/Exact/Knead/Symbolic.hs
@@ -18,14 +18,14 @@
 import Control.Monad.HT ((<=<))
 import Control.Applicative (liftA2, (<$>))
 
-import qualified Data.Array.Knead.Parameterized.Render as Render
-import qualified Data.Array.Knead.Simple.Physical as Phys
-import qualified Data.Array.Knead.Simple.Symbolic as Symb
-import qualified Data.Array.Knead.Simple.Slice as Slice
+import qualified Data.Array.Knead.Symbolic.Render as Render
+import qualified Data.Array.Knead.Symbolic.Physical as Phys
+import qualified Data.Array.Knead.Symbolic as Symb
+import qualified Data.Array.Knead.Symbolic.Slice as Slice
 import qualified Data.Array.Knead.Shape as Shape
-import qualified Data.Array.Knead.Expression as Expr
-import Data.Array.Knead.Simple.Symbolic ((!))
-import Data.Array.Knead.Expression
+import qualified LLVM.DSL.Expression as Expr
+import Data.Array.Knead.Symbolic ((!))
+import LLVM.DSL.Expression
          (Exp, (==*), (<*), xor, (.|.*), (.&.*), )
 
 import qualified Data.Array.Comfort.Shape as ComfortShape
@@ -33,8 +33,8 @@
 import qualified Data.Array.Comfort.Boxed as Array
 import Data.Array.Comfort.Boxed (Array)
 
+import qualified LLVM.Extra.Multi.Value.Storable as Storable
 import qualified LLVM.Extra.Multi.Value as MultiValue
-import qualified LLVM.Extra.Storable as Storable
 import LLVM.Extra.Multi.Value (atom)
 
 import qualified Data.Word as Word
diff --git a/src/Math/SetCover/Exact/Knead/Vector.hs b/src/Math/SetCover/Exact/Knead/Vector.hs
--- a/src/Math/SetCover/Exact/Knead/Vector.hs
+++ b/src/Math/SetCover/Exact/Knead/Vector.hs
@@ -10,11 +10,10 @@
 import Control.Monad ((<=<))
 import Control.Applicative (liftA2)
 
-import qualified Data.Array.Knead.Expression as Expr
+import qualified LLVM.DSL.Expression as Expr
 
-import qualified LLVM.Extra.Storable as Storable
+import qualified LLVM.Extra.Multi.Value.Storable as Storable
 import qualified LLVM.Extra.Multi.Value as MultiValue
-import qualified LLVM.Extra.Tuple as Tuple
 import qualified LLVM.Extra.Arithmetic as A
 
 import qualified LLVM.Core as LLVM
@@ -61,11 +60,8 @@
       let ptr64 = castPtr ptr
       in  liftA2 Block (peekLE ptr64) (peekLE (advancePtr ptr64 1))
 
-instance Tuple.Value Block where
-   type ValueOf Block = LLVM.Value ByteVector
-   valueOf = LLVM.valueOf . blockVector
-
 instance MultiValue.C Block where
+   type Repr Block = LLVM.Value ByteVector
    cons = MultiValue.consPrimitive . blockVector
    undef = MultiValue.undefPrimitive
    zero = MultiValue.zeroPrimitive
@@ -86,8 +82,8 @@
    xor = MultiValue.liftM2 LLVM.xor; inv = MultiValue.liftM LLVM.inv
 
 instance Storable.C Block where
-   load = Storable.load <=< castBlockPtr
-   store b = Storable.store b <=< castBlockPtr
+   load = fmap MultiValue.cast . Storable.load <=< castBlockPtr
+   store b = Storable.store (MultiValue.cast b) <=< castBlockPtr
 
 castBlockPtr ::
    LLVM.Value (Ptr Block) ->
@@ -107,7 +103,7 @@
 
 instance BitSet Block where
    nullBlock =
-      Expr.liftTupleM (\x ->
+      Expr.liftReprM (\x ->
          A.cmp LLVM.CmpEQ (LLVM.value LLVM.zero) =<< toWord128 x)
    blocksFromSets sets =
       let (avails, free) = Blocks.blocksFromSets sets
@@ -119,5 +115,5 @@
             NonEmptyM.sliceVertical . (++ repeat 0)
       in  (map sliceRow avails, sliceRow free)
    keepMinimumBit =
-      Expr.liftTupleM (\x0 ->
+      Expr.liftReprM (\x0 ->
          do x <- toWord128 x0; fromWord128 =<< A.and x =<< A.neg x)
