diff --git a/massiv.cabal b/massiv.cabal
--- a/massiv.cabal
+++ b/massiv.cabal
@@ -1,5 +1,5 @@
 name:                massiv
-version:             0.1.2.0
+version:             0.1.3.0
 synopsis:            Massiv (Массив) is an Array Library.
 description:         Multi-dimensional Arrays with fusion, stencils and parallel computation.
 homepage:            https://github.com/lehins/massiv
diff --git a/src/Data/Massiv/Array/Delayed.hs b/src/Data/Massiv/Array/Delayed.hs
--- a/src/Data/Massiv/Array/Delayed.hs
+++ b/src/Data/Massiv/Array/Delayed.hs
@@ -15,6 +15,7 @@
   , DI
   , toInterleaved
   , DW
+  , makeWindowedArray
   ) where
 
 import           Data.Massiv.Array.Delayed.Interleaved
diff --git a/src/Data/Massiv/Array/Delayed/Internal.hs b/src/Data/Massiv/Array/Delayed/Internal.hs
--- a/src/Data/Massiv/Array/Delayed/Internal.hs
+++ b/src/Data/Massiv/Array/Delayed/Internal.hs
@@ -252,12 +252,11 @@
   | sz2 == oneIndex = liftArray (`f` (unsafeIndex arr2 zeroIndex)) arr1
   | sz1 == sz2 =
     DArray (getComp arr1) sz1 (\ !ix -> f (unsafeIndex arr1 ix) (unsafeIndex arr2 ix))
-  | otherwise =
-    error $
-    "Array dimensions must be the same, instead got: " ++
-    show (size arr1) ++ " and " ++ show (size arr2)
+  | otherwise = errorSizeMismatch "liftArray2" (size arr1) (size arr2)
   where
     oneIndex = pureIndex 1
     sz1 = size arr1
     sz2 = size arr2
 {-# INLINE liftArray2 #-}
+
+
diff --git a/src/Data/Massiv/Array/Delayed/Windowed.hs b/src/Data/Massiv/Array/Delayed/Windowed.hs
--- a/src/Data/Massiv/Array/Delayed/Windowed.hs
+++ b/src/Data/Massiv/Array/Delayed/Windowed.hs
@@ -78,6 +78,8 @@
 -- | Supply a separate generating function for interior of an array. This is
 -- very usful for stencil mapping, where interior function does not perform
 -- boundary checks, thus significantly speeding up computation process.
+--
+-- @since 0.1.3
 makeWindowedArray
   :: Source r ix e
   => Array r ix e -- ^ Source array that will have a window inserted into it
diff --git a/src/Data/Massiv/Array/Manifest.hs b/src/Data/Massiv/Array/Manifest.hs
--- a/src/Data/Massiv/Array/Manifest.hs
+++ b/src/Data/Massiv/Array/Manifest.hs
@@ -27,6 +27,8 @@
   -- * Storable
   , S(..)
   , Storable
+  , withPtr
+  , unsafeWithPtr
   -- * Unboxed
   , U(..)
   , Unbox
diff --git a/src/Data/Massiv/Array/Manifest/Internal.hs b/src/Data/Massiv/Array/Manifest/Internal.hs
--- a/src/Data/Massiv/Array/Manifest/Internal.hs
+++ b/src/Data/Massiv/Array/Manifest/Internal.hs
@@ -24,6 +24,7 @@
   , computeAs
   , computeProxy
   , computeSource
+  , computeInto
   , clone
   , convert
   , convertAs
@@ -38,7 +39,8 @@
   ) where
 
 import           Control.Exception                  (try)
-import           Control.Monad.ST                   (runST)
+import           Control.Monad                      (unless)
+import           Control.Monad.ST                   (RealWorld, runST)
 import           Data.Foldable                      (Foldable (..))
 import           Data.Massiv.Array.Delayed.Internal
 import           Data.Massiv.Array.Ops.Fold         as M
@@ -185,7 +187,6 @@
   {-# INLINE loadP #-}
 
 
-
 loadMutableS :: (Load r' ix e, Mutable r ix e) =>
                 Array r' ix e -> Array r ix e
 loadMutableS !arr =
@@ -226,7 +227,7 @@
 {-# INLINE computeAs #-}
 
 
--- | Same as `convert` and `convertAs`, but let's you supply resulting representation type as a proxy
+-- | Same as `compute` and `computeAs`, but let's you supply resulting representation type as a proxy
 -- argument.
 --
 -- @since 0.1.1
@@ -242,6 +243,23 @@
 computeProxy :: (Load r' ix e, Mutable r ix e) => proxy r -> Array r' ix e -> Array r ix e
 computeProxy _ = compute
 {-# INLINE computeProxy #-}
+
+
+-- | Compute an Array while loading the results into the supplied mutable target array. Sizes of
+-- both arrays must agree, otherwise error.
+--
+-- @since 0.1.3
+computeInto ::
+     (Load r' ix e, Mutable r ix e)
+  => MArray RealWorld r ix e -- ^ Target Array
+  -> Array r' ix e -- ^ Array to load
+  -> IO ()
+computeInto !mArr !arr = do
+  unless (msize mArr == size arr) $ errorSizeMismatch "computeInto" (msize mArr) (size arr)
+  case getComp arr of
+    Seq        -> loadS arr (unsafeLinearRead mArr) (unsafeLinearWrite mArr)
+    ParOn wIds -> loadP wIds arr (unsafeLinearRead mArr) (unsafeLinearWrite mArr)
+{-# INLINE computeInto #-}
 
 
 -- | This is just like `compute`, but can be applied to `Source` arrays and will be a noop if
diff --git a/src/Data/Massiv/Array/Manifest/Storable.hs b/src/Data/Massiv/Array/Manifest/Storable.hs
--- a/src/Data/Massiv/Array/Manifest/Storable.hs
+++ b/src/Data/Massiv/Array/Manifest/Storable.hs
@@ -17,6 +17,8 @@
   ( S (..)
   , Array(..)
   , VS.Storable
+  , withPtr
+  , unsafeWithPtr
   ) where
 
 import           Control.DeepSeq                     (NFData (..), deepseq)
@@ -30,6 +32,7 @@
 import           Data.Massiv.Core.List
 import qualified Data.Vector.Storable                as VS
 import qualified Data.Vector.Storable.Mutable        as MVS
+import           Foreign.Ptr
 import           GHC.Exts                            as GHC (IsList (..))
 import           Prelude                             hiding (mapM)
 
@@ -147,3 +150,18 @@
   {-# INLINE fromList #-}
   toList = GHC.toList . toListArray
   {-# INLINE toList #-}
+
+-- | A pointer to the beginning of originally created array, i.e. various index manipulation
+-- functions that do slicing, extracting, etc. have no affect on this pointer.
+--
+-- @since 0.1.3
+unsafeWithPtr :: VS.Storable a => Array S ix a -> (Ptr a -> IO b) -> IO b
+unsafeWithPtr arr = VS.unsafeWith (sData arr)
+
+
+
+-- | A pointer to the beginning of the mutable array.
+--
+-- @since 0.1.3
+withPtr :: (Index ix, VS.Storable a) => MArray RealWorld S ix a -> (Ptr a -> IO b) -> IO b
+withPtr (MSArray _ mv) = MVS.unsafeWith mv
diff --git a/src/Data/Massiv/Array/Mutable.hs b/src/Data/Massiv/Array/Mutable.hs
--- a/src/Data/Massiv/Array/Mutable.hs
+++ b/src/Data/Massiv/Array/Mutable.hs
@@ -29,6 +29,9 @@
   , modify'
   , swap
   , swap'
+  -- * Computation
+  , RealWorld
+  , computeInto
   -- * Generate (experimental)
 
   -- $generate
diff --git a/src/Data/Massiv/Core/Computation.hs b/src/Data/Massiv/Core/Computation.hs
--- a/src/Data/Massiv/Core/Computation.hs
+++ b/src/Data/Massiv/Core/Computation.hs
@@ -16,11 +16,11 @@
 
 import           Control.DeepSeq (NFData (..), deepseq)
 #if MIN_VERSION_base(4,9,0)
+#if !MIN_VERSION_base(4,11,0)
 import Data.Semigroup
-
+#endif
 instance Semigroup Comp where
   (<>) = joinComp
-
 #endif
 
 
diff --git a/src/Data/Massiv/Core/Index/Class.hs b/src/Data/Massiv/Core/Index/Class.hs
--- a/src/Data/Massiv/Core/Index/Class.hs
+++ b/src/Data/Massiv/Core/Index/Class.hs
@@ -413,3 +413,10 @@
   fName ++
   ": Index out of bounds: " ++ show ix ++ " for Array of size: " ++ show sz
 {-# NOINLINE errorIx #-}
+
+
+-- | Helper function for throwing error when sizes do not match
+errorSizeMismatch :: (Show ix, Show ix') => String -> ix -> ix' -> a
+errorSizeMismatch fName sz sz' =
+  error $ fName ++ ": Mismatch in size of arrays " ++ show sz ++ " vs " ++ show sz'
+{-# NOINLINE errorSizeMismatch #-}
