diff --git a/massiv.cabal b/massiv.cabal
--- a/massiv.cabal
+++ b/massiv.cabal
@@ -1,5 +1,5 @@
 name:                massiv
-version:             0.2.4.0
+version:             0.2.4.1
 synopsis:            Massiv (Массив) is an Array Library.
 description:         Multi-dimensional Arrays with fusion, stencils and parallel computation.
 homepage:            https://github.com/lehins/massiv
@@ -94,6 +94,7 @@
                     , Data.Massiv.Array.Ops.FoldSpec
                     , Data.Massiv.Array.Ops.SliceSpec
                     , Data.Massiv.Array.Ops.TransformSpec
+                    , Data.Massiv.Array.Ops.MapSpec
                     , Data.Massiv.Array.StencilSpec
                     , Data.Massiv.CoreArbitrary
                     , Data.Massiv.Core.IndexSpec
diff --git a/src/Data/Massiv/Array.hs b/src/Data/Massiv/Array.hs
--- a/src/Data/Massiv/Array.hs
+++ b/src/Data/Massiv/Array.hs
@@ -150,6 +150,7 @@
                                      , product
                                      , splitAt
                                      , sum
+                                     , zip
                                      )
 {- $folding
 
diff --git a/src/Data/Massiv/Array/Ops/Map.hs b/src/Data/Massiv/Array/Ops/Map.hs
--- a/src/Data/Massiv/Array/Ops/Map.hs
+++ b/src/Data/Massiv/Array/Ops/Map.hs
@@ -32,13 +32,14 @@
   ) where
 
 
-import           Control.Monad                       (void, when)
+import           Control.Monad                      (void, when)
 import           Data.Massiv.Array.Delayed.Internal
 import           Data.Massiv.Core.Common
 import           Data.Massiv.Core.Scheduler
-import           Prelude                             hiding (map, mapM, mapM_,
-                                                      unzip, unzip3, zip, zip3,
-                                                      zipWith, zipWith3)
+import           Data.Monoid                        ((<>))
+import           Prelude                            hiding (map, mapM, mapM_,
+                                                     unzip, unzip3, zip, zip3,
+                                                     zipWith, zipWith3)
 
 -- | Map a function over an array
 map :: Source r ix e' => (e' -> e) -> Array r ix e' -> Array D ix e
@@ -87,7 +88,7 @@
 izipWith :: (Source r1 ix e1, Source r2 ix e2)
          => (ix -> e1 -> e2 -> e) -> Array r1 ix e1 -> Array r2 ix e2 -> Array D ix e
 izipWith f arr1 arr2 =
-  DArray (getComp arr1) (liftIndex2 min (size arr1) (size arr1)) $ \ !ix ->
+  DArray (getComp arr1 <> getComp arr2) (liftIndex2 min (size arr1) (size arr2)) $ \ !ix ->
     f ix (unsafeIndex arr1 ix) (unsafeIndex arr2 ix)
 {-# INLINE izipWith #-}
 
@@ -109,8 +110,8 @@
   -> Array D ix e
 izipWith3 f arr1 arr2 arr3 =
   DArray
-    (getComp arr1)
-    (liftIndex2 min (liftIndex2 min (size arr1) (size arr1)) (size arr3)) $ \ !ix ->
+    (getComp arr1 <> getComp arr2 <> getComp arr3)
+    (liftIndex2 min (liftIndex2 min (size arr1) (size arr2)) (size arr3)) $ \ !ix ->
     f ix (unsafeIndex arr1 ix) (unsafeIndex arr2 ix) (unsafeIndex arr3 ix)
 {-# INLINE izipWith3 #-}
 
diff --git a/tests/Data/Massiv/Array/Ops/MapSpec.hs b/tests/Data/Massiv/Array/Ops/MapSpec.hs
new file mode 100644
--- /dev/null
+++ b/tests/Data/Massiv/Array/Ops/MapSpec.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE FlexibleContexts    #-}
+{-# LANGUAGE GADTs               #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+module Data.Massiv.Array.Ops.MapSpec (spec) where
+
+import           Data.Massiv.CoreArbitrary as A
+import           Prelude                   as P
+import           Test.Hspec
+import           Test.QuickCheck
+
+prop_zipUnzip ::
+     (Arbitrary ix, CoArbitrary ix, Index ix, Show (Array D ix Int))
+  => proxy ix
+  -> Array D ix Int
+  -> Array D ix Int
+  -> Property
+prop_zipUnzip _ arr1 arr2 =
+  (extract' zeroIndex sz arr1, extract' zeroIndex sz arr2) === A.unzip (A.zip arr1 arr2)
+  where sz = liftIndex2 min (size arr1) (size arr2)
+
+prop_zipFlip ::
+     (Arbitrary ix, CoArbitrary ix, Index ix, Show (Array D ix Int), Show (Array D ix (Int, Int)))
+  => proxy ix
+  -> Array D ix Int
+  -> Array D ix Int
+  -> Property
+prop_zipFlip _ arr1 arr2 =
+  A.zip arr1 arr2 ===
+  A.map (\(e2, e1) -> (e1, e2)) (A.zip arr2 arr1)
+
+prop_zipUnzip3 ::
+     (Arbitrary ix, CoArbitrary ix, Index ix, Show (Array D ix Int))
+  => proxy ix
+  -> Array D ix Int
+  -> Array D ix Int
+  -> Array D ix Int
+  -> Property
+prop_zipUnzip3 _ arr1 arr2 arr3 =
+  (extract' zeroIndex sz arr1, extract' zeroIndex sz arr2, extract' zeroIndex sz arr3) ===
+  A.unzip3 (A.zip3 arr1 arr2 arr3)
+  where
+    sz = liftIndex2 min (liftIndex2 min (size arr1) (size arr2)) (size arr3)
+
+prop_zipFlip3 ::
+     ( Arbitrary ix
+     , CoArbitrary ix
+     , Index ix
+     , Show (Array D ix Int)
+     , Show (Array D ix (Int, Int, Int))
+     )
+  => proxy ix
+  -> Array D ix Int
+  -> Array D ix Int
+  -> Array D ix Int
+  -> Property
+prop_zipFlip3 _ arr1 arr2 arr3 =
+  A.zip3 arr1 arr2 arr3 === A.map (\(e3, e2, e1) -> (e1, e2, e3)) (A.zip3 arr3 arr2 arr1)
+
+mapSpec ::
+     ( Arbitrary ix
+     , CoArbitrary ix
+     , Index ix
+     , Show (Array D ix Int)
+     , Show (Array D ix (Int, Int))
+     , Show (Array D ix (Int, Int, Int))
+     )
+  => proxy ix
+  -> Spec
+mapSpec proxy = do
+  describe "Zipping" $ do
+    it "zipUnzip" $ property $ prop_zipUnzip proxy
+    it "zipFlip" $ property $ prop_zipFlip proxy
+    it "zipUnzip3" $ property $ prop_zipUnzip3 proxy
+    it "zipFlip3" $ property $ prop_zipFlip3 proxy
+
+spec :: Spec
+spec = do
+  describe "Ix1" $ mapSpec (Nothing :: Maybe Ix1)
+  describe "Ix2" $ mapSpec (Nothing :: Maybe Ix2)
+  describe "Ix3" $ mapSpec (Nothing :: Maybe Ix3)
+  describe "Ix4" $ mapSpec (Nothing :: Maybe Ix4)
diff --git a/tests/Spec.hs b/tests/Spec.hs
--- a/tests/Spec.hs
+++ b/tests/Spec.hs
@@ -7,6 +7,7 @@
 --import           Data.Massiv.Array.MutableSpec         as Mutable
 import           Data.Massiv.Array.Ops.ConstructSpec    as Construct
 import           Data.Massiv.Array.Ops.FoldSpec         as Fold
+import           Data.Massiv.Array.Ops.MapSpec          as Map
 import           Data.Massiv.Array.Ops.SliceSpec        as Slice
 import           Data.Massiv.Array.Ops.TransformSpec    as Transform
 import           Data.Massiv.Array.StencilSpec          as Stencil
@@ -30,6 +31,7 @@
       Fold.spec
       Slice.spec
       Transform.spec
+      Map.spec
     describe "Delayed" $ Delayed.spec
     describe "Windowed" $ Windowed.spec
     describe "Manifest" $ Manifest.spec
