diff --git a/include/internal/fmpi_futhark.h b/include/internal/fmpi_futhark.h
index f96d0e21a11a7f7a59d1dfe171a6224ae2ed868e..99673c43496cacccca23bbe9306b4f69ab1499ee 100644
--- a/include/internal/fmpi_futhark.h
+++ b/include/internal/fmpi_futhark.h
@@ -132,6 +132,13 @@ void * fmpi_futhark_new_data(
     const struct fmpi_futhark_ctx * ctx, const void * data,
     enum fmpi_type_base type, size_t dim_cnt, size_t x, size_t y, size_t z
 );
+/*------------------------------------------------------------------------------
+    fmpi_futhark_get_data_sync()
+------------------------------------------------------------------------------*/
+void * fmpi_futhark_get_data_sync(
+    const struct fmpi_futhark_ctx * ctx, void * in, void * out,
+    enum fmpi_type_base type, size_t dim_cnt
+);
 /*==============================================================================
    MACRO
 ==============================================================================*/
diff --git a/include/internal/generic/fmpi_futhark_generic.h b/include/internal/generic/fmpi_futhark_generic.h
index cfecb3b6b0d06748a71577bfb0a1e473aa34189d..266a52bf866828ce0b00a0355ebc683a859a7676 100644
--- a/include/internal/generic/fmpi_futhark_generic.h
+++ b/include/internal/generic/fmpi_futhark_generic.h
@@ -69,6 +69,9 @@ void * fmpi_futhark_new_##D##d_##T( \
 ); \
 void fmpi_futhark_free_##D##d_##T( \
     const struct fmpi_futhark_ctx * ctx, void * array \
+); \
+int fmpi_futhark_values_##D##d_##T( \
+    const struct fmpi_futhark_ctx * ctx, void * in, void * out \
 )
 
 FMPI_DECLARE_FUNCS_DT(FMPI_FUTHARK_DECLARATION, 1, FMPI_FUTHARK_TYPES);
diff --git a/src/fmpi_futhark.c b/src/fmpi_futhark.c
index a76aeb3d359da47d96ff126e3ee803888812e7f8..112a8eaaf7403aaa6dad62f3a3618d86bfd9c5a1 100644
--- a/src/fmpi_futhark.c
+++ b/src/fmpi_futhark.c
@@ -44,6 +44,15 @@ static const fmpi_futhark_new_data_func fmpi_futhark_new_data_func_list[] = {
    FMPI_FUTHARK_FUNC_ENTRY_LIST(new, 2),
    FMPI_FUTHARK_FUNC_ENTRY_LIST(new, 3)
 };
+
+typedef int (*fmpi_futhark_get_data_func)(
+    const struct fmpi_futhark_ctx * ctx, void * in, void * out
+);
+static const fmpi_futhark_get_data_func fmpi_futhark_get_data_func_list[] = {
+    FMPI_FUTHARK_FUNC_ENTRY_LIST(values, 1),
+    FMPI_FUTHARK_FUNC_ENTRY_LIST(values, 2),
+    FMPI_FUTHARK_FUNC_ENTRY_LIST(values, 3)
+};
 /*==============================================================================
     MACRO
 ==============================================================================*/
@@ -151,6 +160,29 @@ void * fmpi_futhark_new_data(
     const size_t idx = FMPI_PRIV_FUTHARK_FUNC_IDX(dim_cnt, type);
     return fmpi_futhark_new_data_func_list[idx](ctx, data, x, y, z);
 }
+/*------------------------------------------------------------------------------
+    fmpi_futhark_get_data()
+------------------------------------------------------------------------------*/
+void * fmpi_futhark_get_data_sync(
+    const struct fmpi_futhark_ctx * const ctx, void * const in, void * const out,
+    const enum fmpi_type_base type, const size_t dim_cnt
+){
+    assert(ctx != NULL);
+    assert(in != NULL);
+    assert(out != NULL);
+    assert(dim_cnt <= FMPI_DIM_MAX);
+    const size_t idx = FMPI_PRIV_FUTHARK_FUNC_IDX(dim_cnt, type);
+    const int err = fmpi_futhark_get_data_func_list[idx](ctx, in, out);
+    if(err != FUTHARK_SUCCESS) {
+        FMPI_RAISE_FUTHARK_ERROR(ctx, "futhark_values_##T##_##D##d() failed!");
+        return NULL;
+    }
+    fmpi_futhark_sync(ctx);
+    if(fmpi_futhark_check_error(ctx, "futhark_values_##T##_##D##d") == true) {
+        return NULL;
+    }
+    return out;
+}
 
 #define FMPI_FUTHARK_DEFINITION(D, T) \
 void * fmpi_futhark_new_##D##d_##T( \
@@ -178,6 +210,15 @@ void fmpi_futhark_free_##D##d_##T( \
     if(err != 0) { \
         fmpi_futhark_check_error(ctx, CPL_STRINGIFY(futhark_free_##T##_##D##d)); \
     } \
+} \
+int fmpi_futhark_values_##D##d_##T( \
+    const struct fmpi_futhark_ctx * const ctx, void * const in, void * const out \
+){ \
+    _Static_assert((D) <= FMPI_DIM_MAX, ""); \
+    assert(ctx != NULL); \
+    assert(in != NULL); \
+    assert(out != NULL); \
+    return futhark_values_##T##_##D##d(ctx->ctx, in, out); \
 }
 
 FMPI_DEFINE_FUNCS_DT(FMPI_FUTHARK_DEFINITION, 1, FMPI_FUTHARK_TYPES)