diff --git a/magico.cabal b/magico.cabal
--- a/magico.cabal
+++ b/magico.cabal
@@ -1,5 +1,5 @@
 Name:                magico
-Version:             0.0.2
+Version:             0.0.2.1
 Synopsis:            Compute solutions for Magico puzzle
 Description:
   Compute solutions for Magico puzzle:
@@ -14,7 +14,7 @@
 Cabal-Version:       >=1.10
 
 Source-Repository this
-  Tag:         0.0.2
+  Tag:         0.0.2.1
   Type:        darcs
   Location:    http://hub.darcs.net/thielema/magico
 
@@ -25,8 +25,8 @@
 Executable magico
   Main-is:             Main.hs
   Build-Depends:
-    lapack >=0.2.2 && <0.3,
-    comfort-array >=0.3.1 && <0.4,
+    lapack >=0.3 && <0.4,
+    comfort-array >=0.4 && <0.5,
     transformers >=0.3 && <0.6,
     utility-ht >=0.0.11 && <0.1,
     base >=4.5 && <5
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -11,14 +11,14 @@
 import qualified Numeric.LAPACK.Matrix as Matrix
 import qualified Numeric.LAPACK.Vector as Vector
 import Numeric.LAPACK.Matrix ((===))
-import Numeric.LAPACK.Vector (Vector)
+import Numeric.LAPACK.Vector (Vector, (+++))
 import Numeric.LAPACK.Format ((##))
 
 import qualified Data.Array.Comfort.Boxed as BoxedArray
 import qualified Data.Array.Comfort.Storable as Array
 import qualified Data.Array.Comfort.Shape as Shape
 import Data.Array.Comfort.Storable ((!))
-import Data.Array.Comfort.Shape ((:+:)((:+:)))
+import Data.Array.Comfort.Shape ((:+:))
 
 import Foreign.Storable (Storable)
 
@@ -43,22 +43,21 @@
 type Index2 = (Index, Index)
 
 squareShape :: SquareShape
-squareShape = (Shape.Enumeration, Shape.Enumeration)
+squareShape = Shape.static
 
 
 type SumsShape =
       (():+:()) :+: (Shape.Enumeration Index :+: Shape.Enumeration Index)
 
 sumsShape :: SumsShape
-sumsShape = (():+:()) :+: (Shape.Enumeration :+: Shape.Enumeration)
+sumsShape = Shape.static
 
 sums :: (Storable a) => a -> a -> (a,a,a) -> (a,a,a) -> SumsVector a
 sums diag0 diag1 horiz vert =
    let vec3 (x,y,z) = Vector.fromList Shape.Enumeration [x,y,z]
-       x<+>y = Vector.append x y
-   in (Vector.singleton diag0 <+> Vector.singleton diag1)
-      <+>
-      (vec3 horiz <+> vec3 vert)
+   in (Vector.singleton diag0 +++ Vector.singleton diag1)
+      +++
+      (vec3 horiz +++ vec3 vert)
 
 
 indices :: Triple Index
@@ -83,7 +82,7 @@
 fullMatrix =
    Matrix.fromRowArray squareShape $
    fmap
-      (\is -> Array.sample squareShape (\j -> if Fold.elem j is then 1 else 0))
+      (Array.fromAssociations 0 squareShape . map (flip (,) 1) . Fold.toList)
       sumIndices
 
 isIntegerVector :: Solution Double -> Bool
@@ -117,14 +116,14 @@
 ranks = BoxedArray.map (rank . extendedMatrix) $ BoxedArray.indices squareShape
 
 nullspace ::
-   ExtMatrix Double -> Matrix.General Matrix.ZeroInt SquareShape Double
+   ExtMatrix Double -> Matrix.General Matrix.ShapeInt SquareShape Double
 nullspace mat =
    let (_vr,sigma,vl) = Singular.decompose mat
        rnk = length $ takeWhile (>1e-7) $ Vector.toList sigma
    in Matrix.dropRows rnk $
       Matrix.mapHeight (Shape.ZeroBased . Shape.size) $ Matrix.fromFull vl
 
-masks :: Board (Matrix.General Matrix.ZeroInt SquareShape Double)
+masks :: Board (Matrix.General Matrix.ShapeInt SquareShape Double)
 masks =
    BoxedArray.map (nullspace . extendedMatrix) $ BoxedArray.indices squareShape
 
@@ -155,16 +154,13 @@
 -}
 solve :: (Index2, Int) -> SumsVector Int -> [Solution Int]
 solve (givenI2, given) ss =
-   let vec =
-          Vector.append
-             (Array.map fromIntegral ss)
-             (Vector.singleton $ fromIntegral given)
-       mat = extendedMatrix givenI2
+   let mat = extendedMatrix givenI2
    in  filter (all (>=0) . Vector.toList) $
        map (Array.map round) $
        integerSolutions (Fold.maximum $ Vector.toList ss) (null1 mat) $
        Matrix.unliftColumn MatrixShape.ColumnMajor
-          (snd . Singular.leastSquaresMinimumNormRCond 1e-7 mat) vec
+          (snd . Singular.leastSquaresMinimumNormRCond 1e-7 mat) $
+       Array.map fromIntegral $ ss +++ Vector.singleton given
 
 printSolution :: Solution Int -> IO ()
 printSolution sol = do
