diff --git a/comfort-array.cabal b/comfort-array.cabal
--- a/comfort-array.cabal
+++ b/comfort-array.cabal
@@ -1,5 +1,5 @@
 Name:             comfort-array
-Version:          0.5.1
+Version:          0.5.1.1
 License:          BSD3
 License-File:     LICENSE
 Author:           Henning Thielemann <haskell@henning-thielemann.de>
@@ -75,6 +75,8 @@
   .
   * Fast Fourier Transforms using the package @comfort-fftw@
   .
+  * Fast Linear Programming using the package @comfort-glpk@
+  .
   * Efficient Array Processing via LLVM Just-In-Time code generation
     using the package @knead@.
   .
@@ -90,7 +92,7 @@
   test-module.list
 
 Source-Repository this
-  Tag:         0.5.1
+  Tag:         0.5.1.1
   Type:        darcs
   Location:    https://hub.darcs.net/thielema/comfort-array/
 
@@ -113,7 +115,7 @@
     QuickCheck >=2 && <3,
     semigroups >=0.18.3 && <1.0,
     containers >=0.4 && <0.7,
-    transformers >=0.3 && <0.6,
+    transformers >=0.3 && <0.7,
     non-empty >=0.3.2 && <0.4,
     utility-ht >=0.0.10 && <0.1,
     prelude-compat >=0.0 && <0.1,
diff --git a/src/Data/Array/Comfort/Shape.hs b/src/Data/Array/Comfort/Shape.hs
--- a/src/Data/Array/Comfort/Shape.hs
+++ b/src/Data/Array/Comfort/Shape.hs
@@ -540,6 +540,13 @@
 You can use an arbitrary 'Set' of indices as shape.
 The array elements are ordered according to the index order in the 'Set'.
 
+An @Array (Set k) a@ is isomorphic to a @Map k a@,
+however it is missing most 'Map' operations like @insert@, @delete@ and @union@.
+An @Array (Set k, Set j) a@ has a cartesian structure
+and thus is not isomorphic to @Map (k,j) a@.
+This means, if the array has two elements with indices @(k0,j0)@ and @(k1,j1)@
+it has also an element with index @(k0,j1)@.
+
 Disadvantage is that combinators of different Set indexed arrays
 have to compare whole sets.
 However, the Set implementation may have low-level optimizations
diff --git a/src/Data/Array/Comfort/Storable.hs b/src/Data/Array/Comfort/Storable.hs
--- a/src/Data/Array/Comfort/Storable.hs
+++ b/src/Data/Array/Comfort/Storable.hs
@@ -140,6 +140,10 @@
 mapShape f arr = reshape (f $ shape arr) arr
 
 
+{- |
+>>> Array.fromList (Shape.ZeroBased (5::Int)) ['a'..]
+StorableArray.fromList (ZeroBased {zeroBasedSize = 5}) "abcde"
+-}
 fromList :: (Shape.C sh, Storable a) => sh -> [a] -> Array sh a
 fromList sh arr = runST (MutArrayNC.unsafeFreeze =<< MutArray.fromList sh arr)
 
diff --git a/src/Data/Array/Comfort/Storable/Unchecked.hs b/src/Data/Array/Comfort/Storable/Unchecked.hs
--- a/src/Data/Array/Comfort/Storable/Unchecked.hs
+++ b/src/Data/Array/Comfort/Storable/Unchecked.hs
@@ -123,7 +123,7 @@
    withForeignPtr a $ \srcAPtr ->
    withForeignPtr b $ \srcBPtr ->
    sequence_ $ List.take (Shape.size sh) $
-      zipWith3
+      List.zipWith3
          (\srcA srcB dst -> poke dst =<< liftA2 f (peek srcA) (peek srcB))
          (iterate (flip advancePtr 1) srcAPtr)
          (iterate (flip advancePtr 1) srcBPtr)
diff --git a/test/DocTest/Data/Array/Comfort/Shape.hs b/test/DocTest/Data/Array/Comfort/Shape.hs
--- a/test/DocTest/Data/Array/Comfort/Shape.hs
+++ b/test/DocTest/Data/Array/Comfort/Shape.hs
@@ -56,22 +56,22 @@
 {-# LINE 491 "src/Data/Array/Comfort/Shape.hs" #-}
    (Shape.indices (Shape.Enumeration :: Shape.Enumeration Ordering))
   [ExpectedLine [LineChunk "[LT,EQ,GT]"]]
- DocTest.printPrefix "Data.Array.Comfort.Shape:548: "
-{-# LINE 548 "src/Data/Array/Comfort/Shape.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Shape:555: "
+{-# LINE 555 "src/Data/Array/Comfort/Shape.hs" #-}
  DocTest.example
-{-# LINE 548 "src/Data/Array/Comfort/Shape.hs" #-}
+{-# LINE 555 "src/Data/Array/Comfort/Shape.hs" #-}
    (Shape.indices (Set.fromList "comfort"))
   [ExpectedLine [LineChunk "\"cfmort\""]]
- DocTest.printPrefix "Data.Array.Comfort.Shape:584: "
-{-# LINE 584 "src/Data/Array/Comfort/Shape.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Shape:591: "
+{-# LINE 591 "src/Data/Array/Comfort/Shape.hs" #-}
  DocTest.example
-{-# LINE 584 "src/Data/Array/Comfort/Shape.hs" #-}
+{-# LINE 591 "src/Data/Array/Comfort/Shape.hs" #-}
    (Shape.indices $ fmap Shape.ZeroBased $ Map.fromList [('b', (0::Int)), ('a', 5), ('c', 2)])
   [ExpectedLine [LineChunk "[('a',0),('a',1),('a',2),('a',3),('a',4),('c',0),('c',1)]"]]
- DocTest.printPrefix "Data.Array.Comfort.Shape:649: "
-{-# LINE 649 "src/Data/Array/Comfort/Shape.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Shape:656: "
+{-# LINE 656 "src/Data/Array/Comfort/Shape.hs" #-}
  DocTest.example
-{-# LINE 649 "src/Data/Array/Comfort/Shape.hs" #-}
+{-# LINE 656 "src/Data/Array/Comfort/Shape.hs" #-}
    (
   let sh2 = (Shape.ZeroBased (2::Int), Shape.ZeroBased (2::Int)) in
   let sh3 = (Shape.ZeroBased (3::Int), Shape.ZeroBased (3::Int)) in
@@ -80,98 +80,98 @@
   Shape.indexFromOffset (Shape.Deferred sh2) 3)
   )
   [ExpectedLine [LineChunk "(4,3)"]]
- DocTest.printPrefix "Data.Array.Comfort.Shape:749: "
-{-# LINE 749 "src/Data/Array/Comfort/Shape.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Shape:756: "
+{-# LINE 756 "src/Data/Array/Comfort/Shape.hs" #-}
  DocTest.example
-{-# LINE 749 "src/Data/Array/Comfort/Shape.hs" #-}
+{-# LINE 756 "src/Data/Array/Comfort/Shape.hs" #-}
    (Shape.indices (Shape.ZeroBased (3::Int), Shape.ZeroBased (3::Int)))
   [ExpectedLine [LineChunk "[(0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2)]"]]
- DocTest.printPrefix "Data.Array.Comfort.Shape:849: "
-{-# LINE 849 "src/Data/Array/Comfort/Shape.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Shape:856: "
+{-# LINE 856 "src/Data/Array/Comfort/Shape.hs" #-}
  DocTest.example
-{-# LINE 849 "src/Data/Array/Comfort/Shape.hs" #-}
+{-# LINE 856 "src/Data/Array/Comfort/Shape.hs" #-}
    (Shape.indices $ Shape.Square $ Shape.ZeroBased (3::Int))
   [ExpectedLine [LineChunk "[(0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2)]"]]
- DocTest.printPrefix "Data.Array.Comfort.Shape:892: "
-{-# LINE 892 "src/Data/Array/Comfort/Shape.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Shape:899: "
+{-# LINE 899 "src/Data/Array/Comfort/Shape.hs" #-}
  DocTest.example
-{-# LINE 892 "src/Data/Array/Comfort/Shape.hs" #-}
+{-# LINE 899 "src/Data/Array/Comfort/Shape.hs" #-}
    (Shape.indices $ Shape.Cube $ Shape.ZeroBased (2::Int))
   [ExpectedLine [LineChunk "[(0,0,0),(0,0,1),(0,1,0),(0,1,1),(1,0,0),(1,0,1),(1,1,0),(1,1,1)]"]]
- DocTest.printPrefix "Data.Array.Comfort.Shape:951: "
-{-# LINE 951 "src/Data/Array/Comfort/Shape.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Shape:958: "
+{-# LINE 958 "src/Data/Array/Comfort/Shape.hs" #-}
  DocTest.example
-{-# LINE 951 "src/Data/Array/Comfort/Shape.hs" #-}
+{-# LINE 958 "src/Data/Array/Comfort/Shape.hs" #-}
    (Shape.indices $ Shape.Triangular Shape.Upper $ Shape.ZeroBased (3::Int))
   [ExpectedLine [LineChunk "[(0,0),(0,1),(0,2),(1,1),(1,2),(2,2)]"]]
- DocTest.printPrefix "Data.Array.Comfort.Shape:953: "
-{-# LINE 953 "src/Data/Array/Comfort/Shape.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Shape:960: "
+{-# LINE 960 "src/Data/Array/Comfort/Shape.hs" #-}
  DocTest.example
-{-# LINE 953 "src/Data/Array/Comfort/Shape.hs" #-}
+{-# LINE 960 "src/Data/Array/Comfort/Shape.hs" #-}
    (Shape.indices $ Shape.Triangular Shape.Lower $ Shape.ZeroBased (3::Int))
   [ExpectedLine [LineChunk "[(0,0),(1,0),(1,1),(2,0),(2,1),(2,2)]"]]
- DocTest.printPrefix "Data.Array.Comfort.Shape:1085: "
-{-# LINE 1085 "src/Data/Array/Comfort/Shape.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Shape:1092: "
+{-# LINE 1092 "src/Data/Array/Comfort/Shape.hs" #-}
  DocTest.example
-{-# LINE 1085 "src/Data/Array/Comfort/Shape.hs" #-}
+{-# LINE 1092 "src/Data/Array/Comfort/Shape.hs" #-}
    (Shape.indices $ Shape.simplexAscending (replicate 3 Shape.AllDistinct) $ Shape.ZeroBased (4::Int))
   [ExpectedLine [LineChunk "[[0,1,2],[0,1,3],[0,2,3],[1,2,3]]"]]
- DocTest.printPrefix "Data.Array.Comfort.Shape:1087: "
-{-# LINE 1087 "src/Data/Array/Comfort/Shape.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Shape:1094: "
+{-# LINE 1094 "src/Data/Array/Comfort/Shape.hs" #-}
  DocTest.example
-{-# LINE 1087 "src/Data/Array/Comfort/Shape.hs" #-}
+{-# LINE 1094 "src/Data/Array/Comfort/Shape.hs" #-}
    (Shape.indices $ Shape.simplexAscending (replicate 3 Shape.SomeRepetitive) $ Shape.ZeroBased (3::Int))
   [ExpectedLine [LineChunk "[[0,0,0],[0,0,1],[0,0,2],[0,1,1],[0,1,2],[0,2,2],[1,1,1],[1,1,2],[1,2,2],[2,2,2]]"]]
- DocTest.printPrefix "Data.Array.Comfort.Shape:1089: "
-{-# LINE 1089 "src/Data/Array/Comfort/Shape.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Shape:1096: "
+{-# LINE 1096 "src/Data/Array/Comfort/Shape.hs" #-}
  DocTest.example
-{-# LINE 1089 "src/Data/Array/Comfort/Shape.hs" #-}
+{-# LINE 1096 "src/Data/Array/Comfort/Shape.hs" #-}
    (Shape.indices $ Shape.simplexAscending [Shape.Repetitive,Shape.Distinct,Shape.Repetitive] $ Shape.ZeroBased (4::Int))
   [ExpectedLine [LineChunk "[[0,0,1],[0,0,2],[0,0,3],[0,1,2],[0,1,3],[0,2,3],[1,1,2],[1,1,3],[1,2,3],[2,2,3]]"]]
- DocTest.printPrefix "Data.Array.Comfort.Shape:1091: "
-{-# LINE 1091 "src/Data/Array/Comfort/Shape.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Shape:1098: "
+{-# LINE 1098 "src/Data/Array/Comfort/Shape.hs" #-}
  DocTest.example
-{-# LINE 1091 "src/Data/Array/Comfort/Shape.hs" #-}
+{-# LINE 1098 "src/Data/Array/Comfort/Shape.hs" #-}
    (Shape.indices $ Shape.simplexAscending [Shape.Repetitive,Shape.Distinct,Shape.Distinct] $ Shape.ZeroBased (4::Int))
   [ExpectedLine [LineChunk "[[0,0,1],[0,0,2],[0,0,3],[0,1,2],[0,1,3],[0,2,3],[1,1,2],[1,1,3],[1,2,3],[2,2,3]]"]]
- DocTest.printPrefix "Data.Array.Comfort.Shape:1094: "
-{-# LINE 1094 "src/Data/Array/Comfort/Shape.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Shape:1101: "
+{-# LINE 1101 "src/Data/Array/Comfort/Shape.hs" #-}
  DocTest.example
-{-# LINE 1094 "src/Data/Array/Comfort/Shape.hs" #-}
+{-# LINE 1101 "src/Data/Array/Comfort/Shape.hs" #-}
    (Shape.indices $ Shape.simplexDescending (replicate 3 Shape.AllDistinct) $ Shape.ZeroBased (4::Int))
   [ExpectedLine [LineChunk "[[2,1,0],[3,1,0],[3,2,0],[3,2,1]]"]]
- DocTest.printPrefix "Data.Array.Comfort.Shape:1096: "
-{-# LINE 1096 "src/Data/Array/Comfort/Shape.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Shape:1103: "
+{-# LINE 1103 "src/Data/Array/Comfort/Shape.hs" #-}
  DocTest.example
-{-# LINE 1096 "src/Data/Array/Comfort/Shape.hs" #-}
+{-# LINE 1103 "src/Data/Array/Comfort/Shape.hs" #-}
    (Shape.indices $ Shape.simplexDescending (replicate 3 Shape.SomeRepetitive) $ Shape.ZeroBased (3::Int))
   [ExpectedLine [LineChunk "[[0,0,0],[1,0,0],[1,1,0],[1,1,1],[2,0,0],[2,1,0],[2,1,1],[2,2,0],[2,2,1],[2,2,2]]"]]
- DocTest.printPrefix "Data.Array.Comfort.Shape:1098: "
-{-# LINE 1098 "src/Data/Array/Comfort/Shape.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Shape:1105: "
+{-# LINE 1105 "src/Data/Array/Comfort/Shape.hs" #-}
  DocTest.example
-{-# LINE 1098 "src/Data/Array/Comfort/Shape.hs" #-}
+{-# LINE 1105 "src/Data/Array/Comfort/Shape.hs" #-}
    (Shape.indices $ Shape.simplexDescending [Shape.Repetitive,Shape.Distinct,Shape.Repetitive] $ Shape.ZeroBased (4::Int))
   [ExpectedLine [LineChunk "[[1,1,0],[2,1,0],[2,2,0],[2,2,1],[3,1,0],[3,2,0],[3,2,1],[3,3,0],[3,3,1],[3,3,2]]"]]
- DocTest.printPrefix "Data.Array.Comfort.Shape:1100: "
-{-# LINE 1100 "src/Data/Array/Comfort/Shape.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Shape:1107: "
+{-# LINE 1107 "src/Data/Array/Comfort/Shape.hs" #-}
  DocTest.example
-{-# LINE 1100 "src/Data/Array/Comfort/Shape.hs" #-}
+{-# LINE 1107 "src/Data/Array/Comfort/Shape.hs" #-}
    (Shape.indices $ Shape.simplexDescending [Shape.Repetitive,Shape.Distinct,Shape.Distinct] $ Shape.ZeroBased (4::Int))
   [ExpectedLine [LineChunk "[[1,1,0],[2,1,0],[2,2,0],[2,2,1],[3,1,0],[3,2,0],[3,2,1],[3,3,0],[3,3,1],[3,3,2]]"]]
- DocTest.printPrefix "Data.Array.Comfort.Shape:1334: "
-{-# LINE 1334 "src/Data/Array/Comfort/Shape.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Shape:1341: "
+{-# LINE 1341 "src/Data/Array/Comfort/Shape.hs" #-}
  DocTest.property
-{-# LINE 1334 "src/Data/Array/Comfort/Shape.hs" #-}
+{-# LINE 1341 "src/Data/Array/Comfort/Shape.hs" #-}
      (let shape = Shape.Cyclic (10::Int) in Shape.offset shape (-1) == Shape.offset shape 9)
- DocTest.printPrefix "Data.Array.Comfort.Shape:1339: "
-{-# LINE 1339 "src/Data/Array/Comfort/Shape.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Shape:1346: "
+{-# LINE 1346 "src/Data/Array/Comfort/Shape.hs" #-}
  DocTest.example
-{-# LINE 1339 "src/Data/Array/Comfort/Shape.hs" #-}
+{-# LINE 1346 "src/Data/Array/Comfort/Shape.hs" #-}
    (Shape.indices (Shape.Cyclic (7::Int)))
   [ExpectedLine [LineChunk "[0,1,2,3,4,5,6]"]]
- DocTest.printPrefix "Data.Array.Comfort.Shape:1383: "
-{-# LINE 1383 "src/Data/Array/Comfort/Shape.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Shape:1390: "
+{-# LINE 1390 "src/Data/Array/Comfort/Shape.hs" #-}
  DocTest.example
-{-# LINE 1383 "src/Data/Array/Comfort/Shape.hs" #-}
+{-# LINE 1390 "src/Data/Array/Comfort/Shape.hs" #-}
    (Shape.indices (Shape.ZeroBased (3::Int) ::+ Shape.Range 'a' 'c'))
   [ExpectedLine [LineChunk "[Left 0,Left 1,Left 2,Right 'a',Right 'b',Right 'c']"]]
diff --git a/test/DocTest/Data/Array/Comfort/Storable.hs b/test/DocTest/Data/Array/Comfort/Storable.hs
--- a/test/DocTest/Data/Array/Comfort/Storable.hs
+++ b/test/DocTest/Data/Array/Comfort/Storable.hs
@@ -3,6 +3,7 @@
 
 module DocTest.Data.Array.Comfort.Storable where
 
+import Test.DocTest.Base
 import qualified Test.DocTest.Driver as DocTest
 
 {-# LINE 84 "src/Data/Array/Comfort/Storable.hs" #-}
@@ -54,28 +55,34 @@
 
 test :: DocTest.T ()
 test = do
- DocTest.printPrefix "Data.Array.Comfort.Storable:243: "
-{-# LINE 243 "src/Data/Array/Comfort/Storable.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Storable:144: "
+{-# LINE 144 "src/Data/Array/Comfort/Storable.hs" #-}
+ DocTest.example
+{-# LINE 144 "src/Data/Array/Comfort/Storable.hs" #-}
+   (Array.fromList (Shape.ZeroBased (5::Int)) ['a'..])
+  [ExpectedLine [LineChunk "StorableArray.fromList (ZeroBased {zeroBasedSize = 5}) \"abcde\""]]
+ DocTest.printPrefix "Data.Array.Comfort.Storable:247: "
+{-# LINE 247 "src/Data/Array/Comfort/Storable.hs" #-}
  DocTest.property
-{-# LINE 243 "src/Data/Array/Comfort/Storable.hs" #-}
+{-# LINE 247 "src/Data/Array/Comfort/Storable.hs" #-}
      (QC.forAll genNonEmptyArray2 $ \xs -> QC.forAll (QC.elements $ Shape.indices $ Array.shape xs) $ \(ix0,ix1) -> Array.pick xs ix0 ! ix1 == xs!(ix0,ix1))
- DocTest.printPrefix "Data.Array.Comfort.Storable:261: "
-{-# LINE 261 "src/Data/Array/Comfort/Storable.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Storable:265: "
+{-# LINE 265 "src/Data/Array/Comfort/Storable.hs" #-}
  DocTest.property
-{-# LINE 261 "src/Data/Array/Comfort/Storable.hs" #-}
+{-# LINE 265 "src/Data/Array/Comfort/Storable.hs" #-}
      (QC.forAll genArray2 $ \xs -> xs == Array.fromRowArray (snd $ Array.shape xs) (Array.toRowArray xs))
- DocTest.printPrefix "Data.Array.Comfort.Storable:278: "
-{-# LINE 278 "src/Data/Array/Comfort/Storable.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Storable:282: "
+{-# LINE 282 "src/Data/Array/Comfort/Storable.hs" #-}
  DocTest.property
-{-# LINE 278 "src/Data/Array/Comfort/Storable.hs" #-}
+{-# LINE 282 "src/Data/Array/Comfort/Storable.hs" #-}
      (forAllNonEmpty $ \xs -> Array.minimum xs ==? minimum (Array.toList xs))
- DocTest.printPrefix "Data.Array.Comfort.Storable:286: "
-{-# LINE 286 "src/Data/Array/Comfort/Storable.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Storable:290: "
+{-# LINE 290 "src/Data/Array/Comfort/Storable.hs" #-}
  DocTest.property
-{-# LINE 286 "src/Data/Array/Comfort/Storable.hs" #-}
+{-# LINE 290 "src/Data/Array/Comfort/Storable.hs" #-}
      (forAllNonEmpty $ \xs -> Array.maximum xs ==? maximum (Array.toList xs))
- DocTest.printPrefix "Data.Array.Comfort.Storable:298: "
-{-# LINE 298 "src/Data/Array/Comfort/Storable.hs" #-}
+ DocTest.printPrefix "Data.Array.Comfort.Storable:302: "
+{-# LINE 302 "src/Data/Array/Comfort/Storable.hs" #-}
  DocTest.property
-{-# LINE 298 "src/Data/Array/Comfort/Storable.hs" #-}
+{-# LINE 302 "src/Data/Array/Comfort/Storable.hs" #-}
      (forAllNonEmpty $ \xs -> Array.limits xs ==? (Array.minimum xs, Array.maximum xs))
