diff --git a/include/fmpi_domain.h b/include/fmpi_domain.h
index 41c8c61bc38f2746dd9eaac1a331edff9cf093ca..51cb754a23b0fb56f8d9cb190fcfd292357c24fc 100644
--- a/include/fmpi_domain.h
+++ b/include/fmpi_domain.h
@@ -58,6 +58,13 @@ struct fmpi_domain fmpi_new_domain(
     const struct fmpi_ctx * ctx, const struct fmpi_data * data,
     struct fmpi_stencil stencil
 );
+/*------------------------------------------------------------------------------
+    fmpi_domain_set_inner()
+------------------------------------------------------------------------------*/
+void fmpi_domain_set_inner(
+    const struct fmpi_ctx * ctx, const struct fmpi_domain * domain,
+    const void * data
+);
 /*==============================================================================
     GUARD
 ==============================================================================*/
diff --git a/src/fmpi_domain.c b/src/fmpi_domain.c
index a83d4d3622e334a116cd4da49afa488fc2de5ee6..4927832425c5753582cd14da88e2b8fd6db2208a 100644
--- a/src/fmpi_domain.c
+++ b/src/fmpi_domain.c
@@ -73,9 +73,22 @@ struct fmpi_domain fmpi_new_domain(
     domain.inner = fmpi_partition_block_1d(ctx, data);
     if(stencil.type != FMPI_STENCIL_NONE) {
         domain.halo = fmpi_halo_1d(ctx, domain.inner, stencil);
+        domain.inner.raw = (char *)domain.halo.raw + (data->type.size * stencil.length);
     }
     return domain;
 }
+/*------------------------------------------------------------------------------
+    fmpi_domain_set_inner()
+------------------------------------------------------------------------------*/
+void fmpi_domain_set_inner(
+    const struct fmpi_ctx * const ctx, const struct fmpi_domain * const domain,
+    const void * const data
+){
+    assert(ctx != NULL);
+    assert(domain != NULL);
+    assert(data != NULL);
+    memcpy(domain->inner.raw, data, domain->inner.size);
+}
 /*==============================================================================
     PRIVATE FUNCTION DEFINITION
 ==============================================================================*/
diff --git a/src/fmpi_task.c b/src/fmpi_task.c
index 6022fb12712e26d2ecd5b0570d8975b4327a62e0..3119a205398ab5ca6fbcbe517aa2b05eadda31be 100644
--- a/src/fmpi_task.c
+++ b/src/fmpi_task.c
@@ -116,7 +116,7 @@ int fmpi_task_run_sync(
                 "fmpi_futhark_get_data_sync() failed!"
             );
         }
-        const int err = fmpi_futhark_free_data_sync(
+        int err = fmpi_futhark_free_data_sync(
             ctx->fut, task->args.out.gpu, task->args.out.type.base,
             task->args.out.dim_cnt
         );
@@ -127,16 +127,11 @@ int fmpi_task_run_sync(
         }
     }
     if(task->stencil.type != FMPI_STENCIL_NONE) {
-        const int rank = ctx->mpi->rank;
-        size_t type_size = task->domains[0].halo.type.size;
-        void * const halo = task->domains[0].halo.raw;
-        const void * const inner = task->args.out.raw;
-        void * const dest = (rank == 0) ? ((char *)halo + type_size) : halo;
-        const void * const src = (rank != 0) ? ((const char *)inner - type_size) : inner;
-        const size_t inner_size = task->domains[0].inner.size;
-        const size_t size = (rank != (ctx->mpi->size - 1)) ? (inner_size + type_size) : inner_size;
-        memcpy(dest, src, size);
+        fmpi_domain_set_inner(ctx, &task->domains[0], task->args.out.raw);
 
+        const int rank = ctx->mpi->rank;
+        size_t type_size = task->domains[0].inner.type.size;
+        
         const size_t idx_1 = type_size;
         const size_t idx_nm2 = (task->domains[0].halo.cnt-2) * type_size;
         const size_t idx_nm1 = idx_nm2 + idx_1;