diff --git a/Data/Eigen/Util.hs b/Data/Eigen/Util.hs
--- a/Data/Eigen/Util.hs
+++ b/Data/Eigen/Util.hs
@@ -68,11 +68,14 @@
 vstack mats = E.transpose $ hstack $ L.map E.transpose mats
 
 -- | Kronecker matric multiplication.
-kronecker mat1 mat2 = vstack $ L.map hstack result
+kronecker :: E.Elem a b => E.Matrix a b -> E.Matrix a b -> E.Matrix a b
+kronecker mat1 mat2 = E.imap (\i j v -> 
+        (mat1 E.! (div i x, div j y)) * ( mat2 E.! (rem i x, rem j y))
+    ) resMat
   where
-    result = to2DList c1 $ L.reverse $ E.fold ( \c e -> ((E.map (*e) mat2):c) ) [] mat1 
-    [ (r1,c1), (r2,c2) ] = [ E.dims mat1, E.dims mat2 ]
-    (r, c) = ( r1*r2, c1*c2 )
+    [ (p,q), (x,y) ] = [ E.dims mat1, E.dims mat2 ]
+    (r, c) = ( p*x, q*y )
+    resMat = E.zero r c 
 
 -- | rowAdd r1 = r1 + k * r2
 rowAdd :: E.Elem a b => Int -> (a,  Int) -> E.Matrix a b -> E.Matrix a b
diff --git a/haskell-eigen-util.cabal b/haskell-eigen-util.cabal
--- a/haskell-eigen-util.cabal
+++ b/haskell-eigen-util.cabal
@@ -1,5 +1,5 @@
 name:                haskell-eigen-util
-version:             0.1.0.3
+version:             0.1.0.4
 synopsis:            Some utility functions for haskell-eigen library
 description:         Please see README.md
 homepage:            https://github.com/dilawar/haskell-eigen-util#README.md
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -1,17 +1,19 @@
-
 import qualified Data.Eigen.Matrix as E
 import Data.Eigen.Util
 
-testKronecker m1 m2 = kronecker m1 m2
 
-mat1 = E.fromList [ [0.85, 0.15], [0.1, 0.9] ] :: E.MatrixXd 
-mat2 = E.fromList [ [0.8, 0.2], [0.05, 0.95] ] :: E.MatrixXd 
+mat1 = E.fromList [ [1, 2], [3, 4] ] :: E.MatrixXd 
+mat2 = E.fromList [ [5, 6], [7, 8] ] :: E.MatrixXd 
+res = E.fromList [ [5,6,10,12], [7,8,14,16], [15, 18, 20, 24], [21, 24, 28, 32 ] ] :: E.MatrixXd
 
+testKronecker m1 m2 = do 
+    pprintIO m1
+    pprintIO m2
+    pprintIO res
+    pprintIO $ kronecker m1 m2
+    putStrLn "Test done"
+
 main :: IO ()
 main = do 
-    pprintIO mat1
-    pprintIO mat2
-    let res = kronecker mat1 mat2
-    {-pprintIO res-}
-    print $ res
+    testKronecker mat1 mat2 
     putStrLn "All done"
