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.0
+Version:          0.0.1
 License:          BSD3
 License-File:     LICENSE
 Author:           Henning Thielemann <haskell@henning-thielemann.de>
@@ -45,7 +45,7 @@
 Build-Type:       Simple
 
 Source-Repository this
-  Tag:         0.0
+  Tag:         0.0.1
   Type:        darcs
   Location:    http://hub.darcs.net/thielema/comfort-array/
 
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
@@ -1,11 +1,5 @@
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE TypeOperators #-}
-{-
-Tests:
-   map offset (indices sh) = [0..]
-   length (indices sh) = size sh
-   sizeOffset sh ix = (size sh, offset sh ix)
--}
 module Data.Array.Comfort.Shape (
    C(..),
 
@@ -243,23 +237,6 @@
 
 data sh0:+:sh1 = sh0:+:sh1
    deriving (Eq, Show)
-
-{-
--- cf. sample-frame:Stereo
-instance (Storable sh0, Storable sh1) => Storable (sh0:+:sh1) where
-   {-# INLINE sizeOf #-}
-   {-# INLINE alignment #-}
-   {-# INLINE peek #-}
-   {-# INLINE poke #-}
-   sizeOf ~(sh0:+:sh1) = sizeOf sh0 + mod (- sizeOf sh0) (alignment sh1) + sizeOf sh1
-   alignment ~(sh0:+:sh1) = alignment sh0
-   poke p (sh0:+:sh1) =
-      let q = castToElemPtr p
-      in  poke q sh0 >> pokeElemOff q 1 sh1
-   peek p =
-      let q = castToElemPtr p
-      in  Monad.lift2 Shifted (peek q) (peekElemOff q 1)
--}
 
 instance (C sh0, C sh1) => C (sh0:+:sh1) where
    type Index (sh0:+:sh1) = Either (Index sh0) (Index sh1)
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
@@ -6,6 +6,8 @@
    toList,
    fromList,
    vectorFromList,
+
+   Array.map,
    ) where
 
-import Data.Array.Comfort.Storable.Internal
+import Data.Array.Comfort.Storable.Internal as Array
diff --git a/src/Data/Array/Comfort/Storable/Internal.hs b/src/Data/Array/Comfort/Storable/Internal.hs
--- a/src/Data/Array/Comfort/Storable/Internal.hs
+++ b/src/Data/Array/Comfort/Storable/Internal.hs
@@ -6,10 +6,13 @@
 
    (!),
    unsafeCreate,
+   unsafeCreateWithSize,
    toList,
    fromList,
    vectorFromList,
 
+   map,
+
    createIO,
    createWithSizeIO,
    showIO,
@@ -21,14 +24,14 @@
 
 import qualified Data.Array.Comfort.Shape as Shape
 
-import Foreign.Marshal.Array (pokeArray, peekArray, )
-import Foreign.Storable (Storable, peekElemOff, )
+import Foreign.Marshal.Array (pokeArray, peekArray, advancePtr, )
+import Foreign.Storable (Storable, poke, peek, peekElemOff, )
 import Foreign.ForeignPtr (ForeignPtr, withForeignPtr, mallocForeignPtrArray, )
 import Foreign.Ptr (Ptr, )
 
 import System.IO.Unsafe (unsafePerformIO, )
 
-import Prelude hiding (readIO, )
+import Prelude hiding (map, readIO, )
 
 
 data Array sh a =
@@ -40,7 +43,6 @@
 instance (Shape.C sh, Show sh, Storable a, Show a) => Show (Array sh a) where
    show = unsafePerformIO . showIO
 
--- add assertion, at least in an exposed version
 reshape :: sh1 -> Array sh0 a -> Array sh1 a
 reshape sh (Array _ fptr) = Array sh fptr
 
@@ -54,6 +56,10 @@
    (Shape.C sh, Storable a) => sh -> (Ptr a -> IO ()) -> Array sh a
 unsafeCreate sh = unsafePerformIO . createIO sh
 
+unsafeCreateWithSize ::
+   (Shape.C sh, Storable a) => sh -> (Int -> Ptr a -> IO ()) -> Array sh a
+unsafeCreateWithSize sh = unsafePerformIO . createWithSizeIO sh
+
 (!) :: (Shape.C sh, Storable a) => Array sh a -> Shape.Index sh -> a
 (!) arr = unsafePerformIO . readIO arr
 
@@ -65,6 +71,19 @@
 
 vectorFromList :: (Storable a) => [a] -> Array (Shape.ZeroBased Int) a
 vectorFromList = unsafePerformIO . vectorFromListIO
+
+
+map ::
+   (Shape.C sh, Storable a, Storable b) =>
+   (a -> b) -> Array sh a -> Array sh b
+map f (Array sh a) =
+   unsafeCreate sh $ \dstPtr ->
+   withForeignPtr a $ \srcPtr ->
+   sequence_ $ take (Shape.size sh) $
+      zipWith
+         (\src dst -> poke dst . f =<< peek src)
+         (iterate (flip advancePtr 1) srcPtr)
+         (iterate (flip advancePtr 1) dstPtr)
 
 
 createIO ::
