diff --git a/CMakeLists.txt b/CMakeLists.txt
index 059cebceebf032ba903c17bd70cdb2c77a17296c..5ecad49b276fd783d159dfc0a022c8a7f6f47ad6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -656,6 +656,10 @@ if( CHAMELEON_SCHED_STARPU )
             set(CHAMELEON_USE_MIGRATE "OFF")
             message("-- ${Blue}CHAMELEON_USE_MIGRATE is turned OFF because starpu_mpi_data_migrate not found${ColourReset}")
         endif()
+        check_function_exists(starpu_mpi_interface_datatype_register HAVE_STARPU_MPI_INTERFACE_DATATYPE_REGISTER)
+        if ( HAVE_STARPU_MPI_INTERFACE_DATATYPE_REGISTER )
+            message("-- ${Blue}Add definition HAVE_STARPU_MPI_INTERFACE_DATATYPE_REGISTER${ColourReset}")
+        endif()
         check_function_exists(starpu_interface_copy2d HAVE_STARPU_INTERFACE_COPY2D)
         if ( HAVE_STARPU_INTERFACE_COPY2D )
             message("-- ${Blue}Add definition HAVE_STARPU_INTERFACE_COPY2D${ColourReset}")
diff --git a/runtime/starpu/include/chameleon_starpu.h.in b/runtime/starpu/include/chameleon_starpu.h.in
index 1dec2fd4898764cb08a601e778de6651609d3a10..f5a4fc1e6819f07549341639eb0c08324d01a799 100644
--- a/runtime/starpu/include/chameleon_starpu.h.in
+++ b/runtime/starpu/include/chameleon_starpu.h.in
@@ -38,6 +38,7 @@
 #cmakedefine HAVE_STARPU_MPI_COMM_GET_ATTR
 #cmakedefine HAVE_STARPU_MPI_INIT_CONF
 #cmakedefine HAVE_STARPU_MPI_WAIT_FOR_ALL
+#cmakedefine HAVE_STARPU_MPI_INTERFACE_DATATYPE_REGISTER
 
 #if defined(CHAMELEON_USE_MPI)
 #include <starpu_mpi.h>
diff --git a/runtime/starpu/interface/cham_tile_interface.c b/runtime/starpu/interface/cham_tile_interface.c
index 34091895989c0c8360332ceda412a9d862600735..04325f473fedca87d80380ea3e07bd04dc21040a 100644
--- a/runtime/starpu/interface/cham_tile_interface.c
+++ b/runtime/starpu/interface/cham_tile_interface.c
@@ -481,6 +481,37 @@ cti_handle_get_allocsize( starpu_data_handle_t handle )
     return cham_tile_interface->allocsize;
 }
 
+#if defined(HAVE_STARPU_MPI_INTERFACE_DATATYPE_REGISTER)
+int
+cti_allocate_datatype( starpu_data_handle_t handle,
+                       MPI_Datatype        *datatype )
+{
+    int ret;
+
+    starpu_cham_tile_interface_t *cham_tile_interface = (starpu_cham_tile_interface_t *)
+        starpu_data_get_interface_on_node( handle, STARPU_MAIN_RAM );
+
+    size_t m  = cham_tile_interface->tile.m;
+    size_t n  = cham_tile_interface->tile.n;
+    size_t ld = cham_tile_interface->tile.ld;
+    size_t elemsize = CHAMELEON_Element_Size( cham_tile_interface->flttype );
+
+    ret = MPI_Type_vector( n, m * elemsize, ld * elemsize, MPI_BYTE, datatype );
+    STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_vector failed");
+
+    ret = MPI_Type_commit( datatype );
+    STARPU_ASSERT_MSG(ret == MPI_SUCCESS, "MPI_Type_commit failed");
+
+    return 0;
+}
+
+void
+cti_free_datatype( MPI_Datatype *datatype )
+{
+    MPI_Type_free( datatype );
+}
+#endif
+
 void
 starpu_cham_tile_interface_init() __attribute__((constructor));
 
@@ -490,5 +521,10 @@ starpu_cham_tile_interface_init()
     if ( starpu_interface_cham_tile_ops.interfaceid == STARPU_UNKNOWN_INTERFACE_ID )
     {
         starpu_interface_cham_tile_ops.interfaceid = starpu_data_interface_get_next_id();
+#if defined(HAVE_STARPU_MPI_INTERFACE_DATATYPE_REGISTER)
+        starpu_mpi_interface_datatype_register( starpu_interface_cham_tile_ops.interfaceid,
+                                                cti_allocate_datatype,
+                                                cti_free_datatype );
+#endif
     }
 }