diff --git a/bfps/cpp/full_code/NSVEparticlesP2P.hpp b/bfps/cpp/full_code/NSVEparticlesP2P.hpp
index 6bfaa3a8632484d50d5d7973ee8faffa1624ccd4..62ae8165cec05a69b8d56e68c632152ce0669161 100644
--- a/bfps/cpp/full_code/NSVEparticlesP2P.hpp
+++ b/bfps/cpp/full_code/NSVEparticlesP2P.hpp
@@ -73,7 +73,7 @@ class NSVEparticlesP2P: public NSVE<rnumber>
             NSVE<rnumber>(
                     COMMUNICATOR,
                     simulation_name),
-            cutoff(std::numeric_limits<double>::max()){}
+            cutoff(10), inner_v0(1), enable_p2p(true), enable_inner(true), enable_vorticity_omega(true){}
         ~NSVEparticlesP2P(){}
 
         int initialize(void);
diff --git a/bfps/cpp/particles/p2p_distr_mpi.hpp b/bfps/cpp/particles/p2p_distr_mpi.hpp
index b009a57e97b8be046cea74cc290cab0f2327c96c..d607666a3b37358abe504c203842138ed140d92b 100644
--- a/bfps/cpp/particles/p2p_distr_mpi.hpp
+++ b/bfps/cpp/particles/p2p_distr_mpi.hpp
@@ -32,7 +32,6 @@ protected:
         int destProc;
         int nbLevelsToExchange;
         bool isRecv;
-        bool positionsReceived;
 
         std::unique_ptr<real_number[]> toRecvAndMerge;
         std::unique_ptr<real_number[]> toCompute;
@@ -40,17 +39,11 @@ protected:
     };
 
     enum Action{
-        NOTHING_TODO,
+        NOTHING_TODO = 512,
         RECV_PARTICLES,
         COMPUTE_PARTICLES,
-        CHECK_PARTICLES,
         RELEASE_BUFFER_PARTICLES,
-        MERGE_PARTICLES,
-
-        RECV_MOVE_NB_LOW,
-        RECV_MOVE_NB_UP,
-        RECV_MOVE_LOW,
-        RECV_MOVE_UP
+        MERGE_PARTICLES
     };
 
     MPI_Comm current_com;
@@ -392,7 +385,6 @@ public:
                 descriptor.nbLevelsToExchange = nb_levels_to_send;
                 descriptor.nbParticlesToExchange = particles_offset_layers[my_nb_cell_levels] - particles_offset_layers[my_nb_cell_levels-nb_levels_to_send];
                 descriptor.isRecv = false;
-                descriptor.positionsReceived = false;
 
                 neigDescriptors.emplace_back(std::move(descriptor));
 
@@ -415,7 +407,6 @@ public:
                 descriptor.nbLevelsToExchange = nb_levels_to_recv;
                 descriptor.nbParticlesToExchange = -1;
                 descriptor.isRecv = true;
-                descriptor.positionsReceived = false;
 
                 neigDescriptors.emplace_back(std::move(descriptor));
 
@@ -507,7 +498,7 @@ public:
 
                         if(NbParticlesToReceive){
                             descriptor.toCompute.reset(new real_number[NbParticlesToReceive*size_particle_positions]);
-                            whatNext.emplace_back(std::pair<Action,int>{CHECK_PARTICLES, releasedAction.second});
+                            whatNext.emplace_back(std::pair<Action,int>{COMPUTE_PARTICLES, releasedAction.second});
                             mpiRequests.emplace_back();
                             assert(NbParticlesToReceive*size_particle_positions < std::numeric_limits<int>::max());
                             AssertMpi(MPI_Irecv(descriptor.toCompute.get(), int(NbParticlesToReceive*size_particle_positions),
@@ -526,7 +517,6 @@ public:
                         const partsize_t NbParticlesToReceive = descriptor.nbParticlesToExchange;
 
                         assert(descriptor.toCompute != nullptr);
-                        assert(descriptor.positionsReceived == true);
                         descriptor.results.reset(new real_number[NbParticlesToReceive*size_particle_rhs]);
                         in_computer.template init_result_array<size_particle_rhs>(descriptor.results.get(), NbParticlesToReceive);
 
@@ -594,24 +584,16 @@ public:
                         AssertMpi(MPI_Isend(descriptor.results.get(), int(NbParticlesToReceive*size_particle_rhs),
                                             particles_utils::GetMpiType(real_number()), destProc, TAG_RESULT_PARTICLES,
                                             current_com, &mpiRequests.back()));
+                        descriptor.toCompute.release();
                     }
                     //////////////////////////////////////////////////////////////////////
-                    /// Computation
-                    //////////////////////////////////////////////////////////////////////
-                    if(releasedAction.first == CHECK_PARTICLES){
-                        NeighborDescriptor& descriptor = neigDescriptors[releasedAction.second];
-                        assert(descriptor.toCompute != nullptr);
-                        assert(descriptor.isRecv);
-                        descriptor.positionsReceived = true;
-                    }
-                    //////////////////////////////////////////////////////////////////////
-                    /// Computation
+                    /// Release memory that was sent back
                     //////////////////////////////////////////////////////////////////////
                     if(releasedAction.first == RELEASE_BUFFER_PARTICLES){
                         NeighborDescriptor& descriptor = neigDescriptors[releasedAction.second];
-                        assert(descriptor.toCompute != nullptr);
+                        assert(descriptor.results != nullptr);
                         assert(descriptor.isRecv);
-                        descriptor.toCompute.release();
+                        descriptor.results.release();
                     }
                     //////////////////////////////////////////////////////////////////////
                     /// Merge