diff --git a/include/fmpi_task.h b/include/fmpi_task.h
index 19ca51d8cd214b2623ec0b852b7898190a48643f..98ae4391448909621d5c807be3b720454a336e51 100644
--- a/include/fmpi_task.h
+++ b/include/fmpi_task.h
@@ -31,6 +31,7 @@
 // Internal
 #include "fmpi_data.h"
 #include "fmpi_domain.h"
+#include "fmpi_stencil.h"
 #include "internal/fmpi_futhark.h"
 #include "internal/generic/fmpi_task_generic.h"
 /*==============================================================================
@@ -92,6 +93,7 @@ typedef struct fmpi_task {
     fmpi_task_func func;        //!< TODO
     struct fmpi_task_args args; //!< TODO
     struct fmpi_domain domains[FMPI_TASK_ARGS_MAX]; //!< TODO
+    struct fmpi_stencil stencil; //!< TODO
 } fmpi_task;
 /*==============================================================================
     PUBLIC FUNCTION
@@ -119,7 +121,7 @@ typedef struct fmpi_task {
  */
 struct fmpi_task fmpi_task_register(
     struct fmpi_ctx * ctx, const fmpi_task_func func,
-    const struct fmpi_task_args * args
+    struct fmpi_stencil stencil, const struct fmpi_task_args * args
 );
 /*------------------------------------------------------------------------------
     fmpi_task_run()
@@ -147,8 +149,8 @@ void fmpi_task_run(const struct fmpi_ctx * ctx, const struct fmpi_task * task);
 /*------------------------------------------------------------------------------
     FMPI_TASK_REGISTER()
 ------------------------------------------------------------------------------*/
-#define FMPI_TASK_REGISTER(ctx, func, ...) \
-    FMPI_TASK_REGISTER_IMPL(ctx, func, __VA_ARGS__)
+#define FMPI_TASK_REGISTER(ctx, func, stencil, ...) \
+    FMPI_TASK_REGISTER_IMPL(ctx, func, stencil, __VA_ARGS__)
 /*------------------------------------------------------------------------------
     FMPI_TASK_FUTHARK_SYNC()
 ------------------------------------------------------------------------------*/
diff --git a/include/internal/generic/fmpi_task_generic.h b/include/internal/generic/fmpi_task_generic.h
index fcc5de1a476e798d5eeceb3b6618a425ef273031..dee037add182b4d4b8aef69ecb673bafcd485546 100644
--- a/include/internal/generic/fmpi_task_generic.h
+++ b/include/internal/generic/fmpi_task_generic.h
@@ -46,18 +46,18 @@ void FUNC##_##N( \
     fmpi_futhark_sync(ctx->fut); \
 }
 
-#define FMPI_TASK_REGISTER_IMPL(ctx, func, ...) \
+#define FMPI_TASK_REGISTER_IMPL(ctx, func, stencil, ...) \
     FMPI_PRIV_TASK_CONCAT(FMPI_TASK_REGISTER_, CPL_ARG_COUNT(__VA_ARGS__)) \
-    (ctx, func, __VA_ARGS__)
+    (ctx, func, stencil,__VA_ARGS__)
 
-#define FMPI_TASK_REGISTER_1(ctx, func, arg_out) \
-    fmpi_task_register((ctx), func##_0, &(struct fmpi_task_args){ \
+#define FMPI_TASK_REGISTER_1(ctx, func, stencil, arg_out) \
+    fmpi_task_register((ctx), func##_0, stencil, &(struct fmpi_task_args){ \
         .out = (arg_out), \
         .cnt = 0 \
     })
 
-#define FMPI_TASK_REGISTER_N(ctx, func, arg_out, ...) \
-    fmpi_task_register((ctx), FMPI_PRIV_TASK_CONCAT(func##_, CPL_ARG_COUNT(__VA_ARGS__)), &(struct fmpi_task_args){ \
+#define FMPI_TASK_REGISTER_N(ctx, func, stencil, arg_out, ...) \
+    fmpi_task_register((ctx), FMPI_PRIV_TASK_CONCAT(func##_, CPL_ARG_COUNT(__VA_ARGS__)), stencil, &(struct fmpi_task_args){ \
         .in = {__VA_ARGS__}, \
         .out = (arg_out), \
         .cnt = CPL_ARG_COUNT(__VA_ARGS__) \
@@ -350,37 +350,37 @@ void FUNC##_##N( \
         args->in[30].start, args->in[31] \
     )
 
-#define FMPI_TASK_REGISTER_2(ctx, func, ...)  FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_3(ctx, func, ...)  FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_4(ctx, func, ...)  FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_5(ctx, func, ...)  FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_6(ctx, func, ...)  FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_7(ctx, func, ...)  FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_8(ctx, func, ...)  FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_9(ctx, func, ...)  FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_10(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_11(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_12(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_13(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_14(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_15(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_16(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_17(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_18(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_19(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_20(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_21(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_22(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_23(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_24(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_25(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_26(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_27(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_28(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_29(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_30(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_31(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
-#define FMPI_TASK_REGISTER_32(ctx, func, ...) FMPI_TASK_REGISTER_N(ctx, func, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_2(ctx, func, stencil, ...)  FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_3(ctx, func, stencil, ...)  FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_4(ctx, func, stencil, ...)  FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_5(ctx, func, stencil, ...)  FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_6(ctx, func, stencil, ...)  FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_7(ctx, func, stencil, ...)  FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_8(ctx, func, stencil, ...)  FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_9(ctx, func, stencil, ...)  FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_10(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_11(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_12(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_13(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_14(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_15(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_16(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_17(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_18(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_19(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_20(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_21(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_22(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_23(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_24(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_25(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_26(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_27(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_28(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_29(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_30(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_31(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
+#define FMPI_TASK_REGISTER_32(ctx, func, stencil, ...) FMPI_TASK_REGISTER_N(ctx, func, stencil, __VA_ARGS__)
 /*==============================================================================
     GUARD
 ==============================================================================*/
diff --git a/src/fmpi_task.c b/src/fmpi_task.c
index f49e92189442248003075e70001f69566c3c6133..2995731285b0a10c13cc5358ffea6b849d8aba28 100644
--- a/src/fmpi_task.c
+++ b/src/fmpi_task.c
@@ -28,6 +28,7 @@
 #include <stdint.h> // int64_t
 // Internal
 #include "fmpi_domain.h"
+#include "fmpi_stencil.h"
 #include "internal/fmpi_ctx.h"
 #include "internal/fmpi_futhark.h"
 #include "internal/fmpi_futhark_entry.h"
@@ -40,15 +41,16 @@
     fmpi_task_run()
 ------------------------------------------------------------------------------*/
 struct fmpi_task fmpi_task_register(
-    struct fmpi_ctx * const ctx, const fmpi_task_func func,
-    const struct fmpi_task_args * const args
+    struct fmpi_ctx * ctx, const fmpi_task_func func,
+    const struct fmpi_stencil stencil, const struct fmpi_task_args * args
 ){
     assert(ctx != NULL);
     assert(ctx->task_cnt < FMPI_TASK_MAX);
     assert(args != NULL);
     struct fmpi_task task = {
         .func = func,
-        .args = *args
+        .args = *args,
+        .stencil = stencil
     };
     const size_t rank = (size_t)ctx->mpi->rank;
     for(size_t i = 0; i < task.args.cnt; i++) {