diff --git a/Src/Core/FFmmAlgorithmStarpu.hpp b/Src/Core/FFmmAlgorithmStarpu.hpp
index bfc3795f4eef886643dc288b567e18966589f9ab..077b01be036bd2d15163bdfadf346f5dcf1724be 100644
--- a/Src/Core/FFmmAlgorithmStarpu.hpp
+++ b/Src/Core/FFmmAlgorithmStarpu.hpp
@@ -1,3 +1,13 @@
+// ===================================================================================
+// Logiciel initial: ScalFmm Version 0.5
+// Co-auteurs : Olivier Coulaud, Bérenger Bramas.
+// Propriétaires : INRIA.
+// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire.
+// Initial software: ScalFmm Version 0.5
+// Co-authors: Olivier Coulaud, Bérenger Bramas.
+// Owners: INRIA.
+// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license.
+// ===================================================================================
 #ifndef FFMMALGORITHMSTARPU_HPP
 #define FFMMALGORITHMSTARPU_HPP
 // /!\ Please, you must read the license at the bottom of this page
@@ -73,10 +83,12 @@ template <class CellClass>
 class FStarCell : public CellClass{
 public:
     /** The handle to register the data */
-    StarHandle handle;
+    StarHandle handleUp;
+    StarHandle handleDown;
     /** Called by fmm starpu to register data */
     void initHandle(){
-        handle.registerVariable( static_cast<CellClass*>(this) );
+        handleUp.registerVariable( static_cast<CellClass*>(this) );
+        handleDown.registerVariable( static_cast<CellClass*>(this) );
     }
 };
 
@@ -448,7 +460,7 @@ public:
             // P2M
             {
                 //kernels->P2M( octreeIterator.getCurrentCell() , octreeIterator.getCurrentListSrc());
-                starpu_insert_task( &p2m_cl, STARPU_W, octreeIterator.getCurrentCell()->handle.handle,
+                starpu_insert_task( &p2m_cl, STARPU_W, octreeIterator.getCurrentCell()->handleUp.handle,
                                     STARPU_R, octreeIterator.getCurrentLeaf()->getSrc()->handle.handle, 0);
             }
             // P2P
@@ -523,14 +535,14 @@ public:
                     // create task
                     struct starpu_task* const task = starpu_task_create();
                     // buffer 0 is current leaf
-                    task->handles[0] = octreeIterator.getCurrentCell()->handle.handle;
+                    task->handles[0] = octreeIterator.getCurrentCell()->handleDown.handle;
 
                     // insert other with a mask
                     memset(mask_m2l, 0, sizeof(unsigned int) * 12);
                     int idxInsert = 1;
                     for(int idxNeigh = 0 ; idxNeigh < 343 ; ++idxNeigh){
                         if( neighbors[idxNeigh] ){
-                            task->handles[idxInsert++] = neighbors[idxNeigh]->handle.handle;
+                            task->handles[idxInsert++] = neighbors[idxNeigh]->handleUp.handle;
                             mask_m2l[ idxNeigh >> 5 ] = mask_m2l[ idxNeigh >> 5 ] | (1 << (idxNeigh & 0x1F));
                         }
                     }
@@ -562,14 +574,14 @@ public:
                 //kernels->M2M( octreeIterator.getCurrentCell() , octreeIterator.getCurrentChild(), idxLevel);
                 struct starpu_task* const task = starpu_task_create();
                 // buffer 0 is parent cell
-                task->handles[0] = octreeIterator.getCurrentCell()->handle.handle;
+                task->handles[0] = octreeIterator.getCurrentCell()->handleUp.handle;
                 // add child with mask
                 unsigned int mask = 0;
                 int idxInsert = 1;
                 CellClass*const*const child = octreeIterator.getCurrentChild();
                 for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){
                     if(child[idxChild]){
-                        task->handles[idxInsert++] = child[idxChild]->handle.handle;
+                        task->handles[idxInsert++] = child[idxChild]->handleUp.handle;
                         mask = mask | (1 << idxChild);
                     }
                 }
@@ -600,14 +612,14 @@ public:
                     // create task
                     struct starpu_task* const task = starpu_task_create();
                     // buffer 0 is current leaf
-                    task->handles[0] = octreeIterator.getCurrentCell()->handle.handle;
+                    task->handles[0] = octreeIterator.getCurrentCell()->handleDown.handle;
 
                     // insert other with a mask
                     memset(mask_m2l, 0, sizeof(unsigned int) * 12);
                     int idxInsert = 1;
                     for(int idxNeigh = 0 ; idxNeigh < 343 ; ++idxNeigh){
                         if( neighbors[idxNeigh] ){
-                            task->handles[idxInsert++] = neighbors[idxNeigh]->handle.handle;
+                            task->handles[idxInsert++] = neighbors[idxNeigh]->handleUp.handle;
                             mask_m2l[ idxNeigh >> 5 ] = mask_m2l[ idxNeigh >> 5 ] | (1 << (idxNeigh & 0x1F));
                         }
                     }
@@ -658,14 +670,14 @@ public:
                 //kernels->L2L( octreeIterator.getCurrentCell() , octreeIterator.getCurrentChild(), idxLevel);
                 struct starpu_task* const task = starpu_task_create();
                 // buffer 0 is parent cell
-                task->handles[0] = octreeIterator.getCurrentCell()->handle.handle;
+                task->handles[0] = octreeIterator.getCurrentCell()->handleDown.handle;
                 // insert children with mask
                 unsigned int mask = 0;
                 int idxInsert = 1;
                 CellClass*const*const child = octreeIterator.getCurrentChild();
                 for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){
                     if(child[idxChild]){
-                        task->handles[idxInsert++] = child[idxChild]->handle.handle;
+                        task->handles[idxInsert++] = child[idxChild]->handleDown.handle;
                         mask = mask | (1 << idxChild);
                     }
                 }
@@ -708,7 +720,7 @@ public:
         octreeIterator.gotoBottomLeft();
         do{
             //kernels->L2P( octreeIterator.getCurrentCell() , octreeIterator.getCurrentListSrc());
-            starpu_insert_task(&l2p_cl, STARPU_R, octreeIterator.getCurrentCell()->handle.handle,
+            starpu_insert_task(&l2p_cl, STARPU_R, octreeIterator.getCurrentCell()->handleDown.handle,
                                STARPU_RW, octreeIterator.getCurrentLeaf()->getTargets()->handle.handle, 0);
         } while(octreeIterator.moveRight());