diff --git a/Src/GroupTree/Core/FGroupTaskStarpuImplicitAlgorithm.hpp b/Src/GroupTree/Core/FGroupTaskStarpuImplicitAlgorithm.hpp
index 09c92becab9165a123b1941b509a985a634ad48b..cb57a9a209e27e5c79f185390be418b830994d12 100644
--- a/Src/GroupTree/Core/FGroupTaskStarpuImplicitAlgorithm.hpp
+++ b/Src/GroupTree/Core/FGroupTaskStarpuImplicitAlgorithm.hpp
@@ -212,6 +212,7 @@ protected:
 
     starpu_codelet cell_extract_up;
     starpu_codelet cell_insert_up;
+    starpu_codelet cell_insert_up_bis;
 
 public:
     FGroupTaskStarPUImplicitAlgorithm(OctreeClass*const inTree, KernelClass* inKernels, std::vector<MortonIndex>& distributedMortonIndex)
@@ -867,6 +868,16 @@ protected:
         cell_insert_up.name = "cell_insert_up";
         cell_insert_up.cpu_funcs[0] = ThisClass::InsertCellUp;
         cell_insert_up.where |= STARPU_CPU;
+
+
+        memset(&cell_insert_up_bis, 0, sizeof(cell_insert_up_bis));
+        cell_insert_up_bis.nbuffers = 3;
+        cell_insert_up_bis.modes[0] = STARPU_R;
+        cell_insert_up_bis.modes[1] = STARPU_RW;
+        cell_insert_up_bis.modes[2] = STARPU_RW;
+        cell_insert_up_bis.name = "cell_insert_up_bis";
+        cell_insert_up_bis.cpu_funcs[0] = ThisClass::InsertCellUpBis;
+        cell_insert_up_bis.where |= STARPU_CPU;
     }
 
     static void InsertP2P(void *buffers[], void *cl_arg){
@@ -909,6 +920,28 @@ protected:
                                    STARPU_VECTOR_GET_NX(buffers[0]));
     }
 
+    static void InsertCellUpBis(void *buffers[], void *cl_arg){
+        unsigned char* ptr1;
+        size_t size1;
+        unsigned char* ptr2;
+        size_t size2;
+        CellExtractedHandles* interactionBufferPtr;
+        starpu_codelet_unpack_args(cl_arg, &interactionBufferPtr, &ptr1, &size1, &ptr2, &size2);
+
+        memcpy((unsigned char*)STARPU_VECTOR_GET_PTR(buffers[1]), ptr1, size1);
+        memcpy((unsigned char*)STARPU_VECTOR_GET_PTR(buffers[2]), ptr2, size2);
+
+        CellContainerClass currentCells((unsigned char*)STARPU_VECTOR_GET_PTR(buffers[1]),
+                                        STARPU_VECTOR_GET_NX(buffers[1]),
+                                        (unsigned char*)STARPU_VECTOR_GET_PTR(buffers[2]),
+                                        nullptr);
+
+
+        currentCells.restoreDataUp(interactionBufferPtr->cellsToExtract,
+                                   (unsigned char*)STARPU_VECTOR_GET_PTR(buffers[0]),
+                                   STARPU_VECTOR_GET_NX(buffers[0]));
+    }
+
     static void ExtractCellUp(void *buffers[], void *cl_arg){
         CellContainerClass currentCells((unsigned char*)STARPU_VECTOR_GET_PTR(buffers[0]),
                                         STARPU_VECTOR_GET_NX(buffers[0]),
@@ -1740,9 +1773,9 @@ protected:
                                 if(starpu_mpi_data_get_rank(cellHandles[idxLevel][interactionid].symb) == mpi_rank){
                                     // Reuse block but just to perform the send
                                     duplicateB.dataSymbPtr.reset(new unsigned char[duplicateB.sizeSymb]);//const_cast<unsigned char*>(tree->getCellGroup(idxLevel,idxGroup)->getRawBuffer());
-                                    memcpy(duplicateB.dataSymbPtr.get(), tree->getCellGroup(idxLevel,idxGroup)->getRawBuffer(), duplicateB.sizeSymb);
+                                    //memcpy(duplicateB.dataSymbPtr.get(), tree->getCellGroup(idxLevel,idxGroup)->getRawBuffer(), duplicateB.sizeSymb);
                                     duplicateB.dataOtherPtr.reset(new unsigned char[duplicateB.sizeOther]);//reinterpret_cast<unsigned char*>(tree->getCellGroup(idxLevel,idxGroup)->getRawMultipoleBuffer());
-                                    memcpy(duplicateB.dataOtherPtr.get(), tree->getCellGroup(idxLevel,idxGroup)->getRawMultipoleBuffer(), duplicateB.sizeOther);
+                                    //memcpy(duplicateB.dataOtherPtr.get(), tree->getCellGroup(idxLevel,idxGroup)->getRawMultipoleBuffer(), duplicateB.sizeOther);
                                 }
                                 duplicateB.dataSymb = nullptr;
                                 duplicateB.dataOther = nullptr;
@@ -1756,9 +1789,17 @@ protected:
                                                               (uintptr_t)duplicateB.dataOtherPtr.get(), duplicateB.sizeOther);
                                 starpu_mpi_data_register(duplicateB.other, tag++, registeringNode);
 
+                                const unsigned char* ptr1 = const_cast<unsigned char*>(tree->getCellGroup(idxLevel,idxGroup)->getRawBuffer());
+                                size_t size1 = duplicateB.sizeSymb;
+                                const unsigned char* ptr2 = reinterpret_cast<unsigned char*>(tree->getCellGroup(idxLevel,idxGroup)->getRawMultipoleBuffer());
+                                size_t size2 = duplicateB.sizeOther;
                                 starpu_mpi_insert_task(MPI_COMM_WORLD,
-                                                       &cell_insert_up,
+                                                       &cell_insert_up_bis,
                                                        STARPU_VALUE, &interactionBufferPtr, sizeof(CellExtractedHandles*),
+                                                       STARPU_VALUE, &ptr1, sizeof(ptr1),
+                                                       STARPU_VALUE, &size1, sizeof(size1),
+                                                       STARPU_VALUE, &ptr2, sizeof(ptr2),
+                                                       STARPU_VALUE, &size2, sizeof(size2),
                                #ifdef SCALFMM_STARPU_USE_PRIO
                                                        STARPU_PRIORITY, PrioClass::Controller().getInsertionPosM2LExtern(idxLevel),
                                #endif