diff --git a/CMakeLists.txt b/CMakeLists.txt
index 15ea0144e1860d88c8d9b87ba0464dfb46a92df0..3ca797c2129058e1db8af4ce189a3565b5243306 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_interface_copy2d HAVE_STARPU_INTERFACE_COPY2D)
+        if ( HAVE_STARPU_INTERFACE_COPY2D )
+            message("-- ${Blue}Add definition HAVE_STARPU_INTERFACE_COPY2D${ColourReset}")
+        endif()
         if (CHAMELEON_USE_MPI)
             # Check if a specific function exist
             check_function_exists(starpu_mpi_data_register_comm HAVE_STARPU_MPI_DATA_REGISTER)
diff --git a/runtime/starpu/include/chameleon_starpu.h.in b/runtime/starpu/include/chameleon_starpu.h.in
index 7fb15f321ab21ad2c9bfb17a8e93771bbb0d0b2e..fed67ec50d78da3e941a3423775683218a983b6b 100644
--- a/runtime/starpu/include/chameleon_starpu.h.in
+++ b/runtime/starpu/include/chameleon_starpu.h.in
@@ -30,6 +30,7 @@
 #cmakedefine HAVE_STARPU_DATA_SET_COORDINATES
 #cmakedefine HAVE_STARPU_MALLOC_ON_NODE_SET_DEFAULT_FLAGS
 #cmakedefine HAVE_STARPU_DATA_SET_OOC_FLAG
+#cmakedefine HAVE_STARPU_INTERFACE_COPY2D
 #cmakedefine HAVE_STARPU_MPI_DATA_MIGRATE
 #cmakedefine HAVE_STARPU_MPI_DATA_REGISTER
 #cmakedefine HAVE_STARPU_MPI_COMM_RANK
diff --git a/runtime/starpu/interface/cham_tile_interface.c b/runtime/starpu/interface/cham_tile_interface.c
index 549ed65f14f8692db8e623cbbd0cb6ecba56dc8f..93ecebfc193b4f3aa6fc23acdc3741b8d7bafb98 100644
--- a/runtime/starpu/interface/cham_tile_interface.c
+++ b/runtime/starpu/interface/cham_tile_interface.c
@@ -361,6 +361,36 @@ cti_describe( void *data_interface, char *buf, size_t size )
                      (unsigned) cham_tile_interface->flttype );
 }
 
+#ifdef HAVE_STARPU_INTERFACE_COPY2D
+static int cti_copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data)
+{
+    starpu_cham_tile_interface_t *cham_tile_src = (starpu_cham_tile_interface_t *) src_interface;
+    starpu_cham_tile_interface_t *cham_tile_dst = (starpu_cham_tile_interface_t *) dst_interface;
+    size_t elemsize = CHAMELEON_Element_Size( cham_tile_src->flttype );
+    size_t m = cham_tile_src->tile.m;
+    size_t n = cham_tile_src->tile.n;
+    size_t ld_src = cham_tile_src->tile.ld;
+    size_t ld_dst = cham_tile_dst->tile.ld;
+    int ret = 0;
+
+    if (starpu_interface_copy2d( (uintptr_t) cham_tile_src->tile.mat, 0, src_node,
+                                 (uintptr_t) cham_tile_dst->tile.mat, 0, dst_node,
+                                 m * elemsize,
+                                 n, ld_src * elemsize, ld_dst * elemsize,
+                                 async_data) )
+        ret = -EAGAIN;
+
+    starpu_interface_data_copy( src_node, dst_node, (size_t) n*m*elemsize );
+
+    return ret;
+}
+
+static const struct starpu_data_copy_methods cti_copy_methods =
+{
+    .any_to_any = cti_copy_any_to_any,
+};
+#endif
+
 struct starpu_data_interface_ops starpu_interface_cham_tile_ops =
 {
     .init                  = cti_init,
@@ -379,7 +409,9 @@ struct starpu_data_interface_ops starpu_interface_cham_tile_ops =
     .pack_data             = cti_pack_data,
     .unpack_data           = cti_unpack_data,
     .describe              = cti_describe,
-    //.copy_methods          =&cti_copy_methods,
+#ifdef HAVE_STARPU_INTERFACE_COPY2D
+    .copy_methods          =&cti_copy_methods,
+#endif
     .interfaceid           = STARPU_UNKNOWN_INTERFACE_ID,
     .interface_size        = sizeof(starpu_cham_tile_interface_t),
     .name                  = "STARPU_CHAM_TILE_INTERFACE"