diff --git a/include/internal/generic/fmpi_data_generic.h b/include/internal/generic/fmpi_data_generic.h
index 5f8cbf662a4d4bba6c60099ee04bda683d7fadd7..24674564df09558859f25d5d92687c57f1d59c50 100644
--- a/include/internal/generic/fmpi_data_generic.h
+++ b/include/internal/generic/fmpi_data_generic.h
@@ -50,9 +50,9 @@ struct fmpi_data fmpi_data_##D##d_out_##T( \
     const struct fmpi_ctx * ctx, T * data, size_t x, size_t y, size_t z \
 )
 
-FMPI_DECLARE_DIM_FUNCS(FMPI_DATA_DECLARATION, 1, FMPI_DATA_TYPES);
-FMPI_DECLARE_DIM_FUNCS(FMPI_DATA_DECLARATION, 2, FMPI_DATA_TYPES);
-FMPI_DECLARE_DIM_FUNCS(FMPI_DATA_DECLARATION, 3, FMPI_DATA_TYPES);
+FMPI_DECLARE_FUNCS_DT(FMPI_DATA_DECLARATION, 1, FMPI_DATA_TYPES);
+FMPI_DECLARE_FUNCS_DT(FMPI_DATA_DECLARATION, 2, FMPI_DATA_TYPES);
+FMPI_DECLARE_FUNCS_DT(FMPI_DATA_DECLARATION, 3, FMPI_DATA_TYPES);
 /*==============================================================================
     GUARD
 ==============================================================================*/
diff --git a/include/internal/generic/fmpi_futhark_generic.h b/include/internal/generic/fmpi_futhark_generic.h
index 5e246e58b236f4296b124059c2c6a3ece181ed20..89438d06126384218d27dfb347d1d2c3e4076c44 100644
--- a/include/internal/generic/fmpi_futhark_generic.h
+++ b/include/internal/generic/fmpi_futhark_generic.h
@@ -79,9 +79,9 @@ void fmpi_futhark_free_##D##d_##T( \
     const struct fmpi_futhark_ctx * ctx, void * array \
 )
 
-FMPI_DECLARE_DIM_FUNCS(FMPI_FUTHARK_DECLARATION, 1, FMPI_FUTHARK_TYPES);
-FMPI_DECLARE_DIM_FUNCS(FMPI_FUTHARK_DECLARATION, 2, FMPI_FUTHARK_TYPES);
-FMPI_DECLARE_DIM_FUNCS(FMPI_FUTHARK_DECLARATION, 3, FMPI_FUTHARK_TYPES);
+FMPI_DECLARE_FUNCS_DT(FMPI_FUTHARK_DECLARATION, 1, FMPI_FUTHARK_TYPES);
+FMPI_DECLARE_FUNCS_DT(FMPI_FUTHARK_DECLARATION, 2, FMPI_FUTHARK_TYPES);
+FMPI_DECLARE_FUNCS_DT(FMPI_FUTHARK_DECLARATION, 3, FMPI_FUTHARK_TYPES);
 /*==============================================================================
     GUARD
 ==============================================================================*/
diff --git a/include/internal/generic/fmpi_generic.h b/include/internal/generic/fmpi_generic.h
index 18c6232521dac6e570ea77fb6b4213c83936f621..84bde477db669cdf5fd241fd8ef524cb598e47f1 100644
--- a/include/internal/generic/fmpi_generic.h
+++ b/include/internal/generic/fmpi_generic.h
@@ -86,7 +86,7 @@
 #define FMPI_GENERIC_ASSOC(FUNC, TYPE) \
     TYPE : fmpi_##FUNC##_##TYPE
 /*------------------------------------------------------------------------------
-    FMPI_DECLARE_FUNCS()
+    FMPI_DECLARE_FUNCS_T()
 ------------------------------------------------------------------------------*/
 /**
  * Declares one or more functions.
@@ -98,23 +98,23 @@
  * @param ... : Comma separated list of type names (each must be a single word).
  *
  * @expansion{
- *  FMPI_DECLARE_FUNCS(M, char, int, double) =>
+ *  FMPI_DECLARE_FUNCS_T(M, char, int, double) =>
  *      M(char) ; M(int) ; M(double)
  * }
  *
  * @example{
  *  #define M(T) T foo_##T(T x); T bar_##T(T x)
- *  FMPI_DECLARE_FUNCS(M, char, int);
+ *  FMPI_DECLARE_FUNCS_T(M, char, int);
  *  // char foo_char(char x);
  *  // char bar_char(char x);
  *  // int foo_int(int x);
  *  // int bar_int(int x);
  * }
  */
-#define FMPI_DECLARE_FUNCS(M, ...) \
+#define FMPI_DECLARE_FUNCS_T(M, ...) \
     CPL_MAP(M, CPL_SEMICOLON, __VA_ARGS__)
 /*------------------------------------------------------------------------------
-    FMPI_DEFINE_FUNCS()
+    FMPI_DEFINE_FUNCS_T()
 ------------------------------------------------------------------------------*/
 /**
  * Defines one or more functions.
@@ -125,7 +125,7 @@
  * @param ... : Comma separated list of type names (each must be a single word).
  *
  * @expansion{
- *  FMPI_DEFINE_FUNCS(M, char, int, double) =>
+ *  FMPI_DEFINE_FUNCS_T(M, char, int, double) =>
  *      M(char) M(int) M(double)
  * }
  *
@@ -137,17 +137,17 @@
  *  T bar_##T(T x) { \
  *      return x; \
  *  }
- *  FMPI_DEFINE_FUNCS(M, char, int)
+ *  FMPI_DEFINE_FUNCS_T(M, char, int)
  *  // char foo_char(char x) { return bar_char(x); }
  *  // char bar_char(char x) { return x; }
  *  // int foo_int(int x) { return bar_int(x); }
  *  // int bar_int(int x) { return x; }
  * }
  */
-#define FMPI_DEFINE_FUNCS(M, ...) \
+#define FMPI_DEFINE_FUNCS_T(M, ...) \
     CPL_MAP(M, CPL_EMPTY, __VA_ARGS__)
 /*------------------------------------------------------------------------------
-    FMPI_DECLARE_DIM_FUNCS()
+    FMPI_DECLARE_FUNCS_DT()
 ------------------------------------------------------------------------------*/
 /**
  * TODO
@@ -164,10 +164,10 @@
  *  TODO
  * }
  */
-#define FMPI_DECLARE_DIM_FUNCS(M, D, ...) \
+#define FMPI_DECLARE_FUNCS_DT(M, D, ...) \
     CPL_MAP_FIXED(M, CPL_SEMICOLON, (D), __VA_ARGS__)
 /*------------------------------------------------------------------------------
-    FMPI_DEFINE_DIM_FUNCS()
+    FMPI_DEFINE_FUNCS_DT()
 ------------------------------------------------------------------------------*/
 /**
  * TODO
@@ -184,7 +184,7 @@
  *  TODO
  * }
  */
-#define FMPI_DEFINE_DIM_FUNCS(M, D, ...) \
+#define FMPI_DEFINE_FUNCS_DT(M, D, ...) \
     CPL_MAP_FIXED(M, CPL_EMPTY, (D), __VA_ARGS__)
 /*==============================================================================
     GUARD
diff --git a/include/internal/generic/fmpi_reduce_generic.h b/include/internal/generic/fmpi_reduce_generic.h
index 034b263ae58d8a1ef2084d3de45c1b160010bf64..43d994805d3c6486bd6bcd51fdd70f60c9f87029 100644
--- a/include/internal/generic/fmpi_reduce_generic.h
+++ b/include/internal/generic/fmpi_reduce_generic.h
@@ -45,7 +45,7 @@ T fmpi_local_reduce_prod_##T( \
 ); \
 T fmpi_reduce_prod_##T(const struct fmpi_ctx * ctx, const T * array)
 
-FMPI_DECLARE_FUNCS(FMPI_REDUCE_DECLARATION, FMPI_REDUCE_PROD_TYPES);
+FMPI_DECLARE_FUNCS_T(FMPI_REDUCE_DECLARATION, FMPI_REDUCE_PROD_TYPES);
 /*==============================================================================
     GUARD
 ==============================================================================*/
diff --git a/include/internal/generic/fmpi_task_generic.h b/include/internal/generic/fmpi_task_generic.h
index fa508b50105dbe2477ef103e42cb5992a3e42191..6c0e871f749a109f4c4c54fe1633f29cbd8bf802 100644
--- a/include/internal/generic/fmpi_task_generic.h
+++ b/include/internal/generic/fmpi_task_generic.h
@@ -42,7 +42,14 @@ int FUNC##_##N( \
     assert(ctx != NULL); \
     assert(args != NULL); \
     assert(args->cnt == N); \
-    return FMPI_TASK_FUNC_##N(FUNC, ctx->fut->ctx, args); \
+    if(args->out.type.derived == FMPI_TYPE_ARRAY) { \
+        if(args->out.type.base == FMPI_TYPE_u8) { \
+            struct futhark_u8_1d ** out = &args->out.start; \
+            return FMPI_TASK_FUNC_##N(FUNC, ctx->fut->ctx, out, args); \
+        } \
+    } else { \
+    } \
+    return FMPI_TASK_FUNC_##N(FUNC, ctx->fut->ctx, args->out.start, args); \
 }
 
 #define FMPI_TASK_REGISTER_IMPL(ctx, func, stencil, ...) \
@@ -62,11 +69,11 @@ int FUNC##_##N( \
         .cnt = CPL_ARG_COUNT(__VA_ARGS__) \
     })
 
-#define FMPI_TASK_FUNC_0(func, ctx, args) \
+#define FMPI_TASK_FUNC_0(func, ctx, out, args) \
     futhark_entry_##func(ctx, args->out.start)
 
-#define FMPI_TASK_FUNC_1(func, ctx, args) \
-    futhark_entry_##func(ctx, args->out.start, \
+#define FMPI_TASK_FUNC_1(func, ctx, out, args) \
+    futhark_entry_##func(ctx, out, \
         args->in[00].start \
     )
 #define FMPI_TASK_FUNC_2(func, ctx, args) \
diff --git a/src/fmpi_data.c b/src/fmpi_data.c
index b47b482b5b7a78db2076240a4745b4c582e81e0a..b98922a7e985975ba381b727564fa270d990940b 100644
--- a/src/fmpi_data.c
+++ b/src/fmpi_data.c
@@ -77,6 +77,6 @@ struct fmpi_data fmpi_data_##D##d_out_##T( \
     }; \
 }
 
-FMPI_DEFINE_DIM_FUNCS(FMPI_DATA_DEFINITION, 1, FMPI_DATA_TYPES)
-FMPI_DEFINE_DIM_FUNCS(FMPI_DATA_DEFINITION, 2, FMPI_DATA_TYPES)
-FMPI_DEFINE_DIM_FUNCS(FMPI_DATA_DEFINITION, 3, FMPI_DATA_TYPES)
+FMPI_DEFINE_FUNCS_DT(FMPI_DATA_DEFINITION, 1, FMPI_DATA_TYPES)
+FMPI_DEFINE_FUNCS_DT(FMPI_DATA_DEFINITION, 2, FMPI_DATA_TYPES)
+FMPI_DEFINE_FUNCS_DT(FMPI_DATA_DEFINITION, 3, FMPI_DATA_TYPES)
diff --git a/src/fmpi_futhark.c b/src/fmpi_futhark.c
index 7a6d136c3b0355e914aa91f703b31fa56865e7de..4161a7544ca5361c95628b37b565ff356bd957b1 100644
--- a/src/fmpi_futhark.c
+++ b/src/fmpi_futhark.c
@@ -178,6 +178,6 @@ void fmpi_futhark_free_##D##d_##T( \
     } \
 }
 
-FMPI_DEFINE_DIM_FUNCS(FMPI_FUTHARK_DEFINITION, 1, FMPI_FUTHARK_TYPES)
-FMPI_DEFINE_DIM_FUNCS(FMPI_FUTHARK_DEFINITION, 2, FMPI_FUTHARK_TYPES)
-FMPI_DEFINE_DIM_FUNCS(FMPI_FUTHARK_DEFINITION, 3, FMPI_FUTHARK_TYPES)
+FMPI_DEFINE_FUNCS_DT(FMPI_FUTHARK_DEFINITION, 1, FMPI_FUTHARK_TYPES)
+FMPI_DEFINE_FUNCS_DT(FMPI_FUTHARK_DEFINITION, 2, FMPI_FUTHARK_TYPES)
+FMPI_DEFINE_FUNCS_DT(FMPI_FUTHARK_DEFINITION, 3, FMPI_FUTHARK_TYPES)
diff --git a/src/fmpi_reduce.c b/src/fmpi_reduce.c
index 572df19a56aad35ff92e887214885424f99c5e09..f07155294fd951917613876f330f885279f1362e 100644
--- a/src/fmpi_reduce.c
+++ b/src/fmpi_reduce.c
@@ -77,4 +77,4 @@ T fmpi_reduce_prod_##T(const struct fmpi_ctx * const ctx, const T * const array)
     return result; \
 }
 
-FMPI_DEFINE_FUNCS(FMPI_REDUCE_DEFINITION, FMPI_REDUCE_PROD_TYPES)
+FMPI_DEFINE_FUNCS_T(FMPI_REDUCE_DEFINITION, FMPI_REDUCE_PROD_TYPES)