diff --git a/bfps/cpp/particles/abstract_particles_distr.hpp b/bfps/cpp/particles/abstract_particles_distr.hpp
index 911dd6e2901bd07679fa6c6da140b35c1d846434..6e1776868510142ebedeb80d0751aeaa8bf31d3d 100644
--- a/bfps/cpp/particles/abstract_particles_distr.hpp
+++ b/bfps/cpp/particles/abstract_particles_distr.hpp
@@ -166,7 +166,7 @@ public:
         int nbProcToRecvLower;
         {
             int nextDestProc = my_rank;
-            for(int idxLower = 1 ; idxLower <= interpolation_size ; idxLower += partition_interval_size_per_proc[nextDestProc]){
+            for(int idxLower = 1 ; idxLower <= interpolation_size+1 ; idxLower += partition_interval_size_per_proc[nextDestProc]){
                 nextDestProc = (nextDestProc-1+nb_processes_involved)%nb_processes_involved;
                 if(nextDestProc == my_rank){
                     // We are back on our process
@@ -177,9 +177,11 @@ public:
                 const int lowerRankDiff = (nextDestProc < my_rank ? my_rank - nextDestProc : nb_processes_involved-nextDestProc+my_rank);
 
                 const int nbPartitionsToSend = std::min(current_partition_size, interpolation_size-(idxLower-1));
+                assert(nbPartitionsToSend >= 0);
                 const int nbParticlesToSend = current_offset_particles_for_partition[nbPartitionsToSend] - current_offset_particles_for_partition[0];
 
                 const int nbPartitionsToRecv = std::min(partition_interval_size_per_proc[destProc], (interpolation_size+1)-(idxLower-1));
+                assert(nbPartitionsToRecv > 0);
                 const int nbParticlesToRecv = -1;
 
                 NeighborDescriptor descriptor;
@@ -197,7 +199,7 @@ public:
             nbProcToRecvLower = neigDescriptors.size();
 
             nextDestProc = my_rank;
-            for(int idxUpper = 1 ; idxUpper <= interpolation_size ; idxUpper += partition_interval_size_per_proc[nextDestProc]){
+            for(int idxUpper = 1 ; idxUpper <= interpolation_size+1 ; idxUpper += partition_interval_size_per_proc[nextDestProc]){
                 nextDestProc = (nextDestProc+1+nb_processes_involved)%nb_processes_involved;
                 if(nextDestProc == my_rank){
                     // We are back on our process
@@ -208,9 +210,11 @@ public:
                 const int upperRankDiff = (nextDestProc > my_rank ? nextDestProc - my_rank: nb_processes_involved-my_rank+nextDestProc);
 
                 const int nbPartitionsToSend = std::min(current_partition_size, (interpolation_size+1)-(idxUpper-1));
+                assert(nbPartitionsToSend > 0);
                 const int nbParticlesToSend = current_offset_particles_for_partition[current_partition_size] - current_offset_particles_for_partition[current_partition_size-nbPartitionsToSend];
 
                 const int nbPartitionsToRecv = std::min(partition_interval_size_per_proc[destProc], interpolation_size-(idxUpper-1));
+                assert(nbPartitionsToSend >= 0);
                 const int nbParticlesToRecv = -1;
 
                 NeighborDescriptor descriptor;
@@ -234,25 +238,28 @@ public:
             NeighborDescriptor& descriptor = neigDescriptors[idxDescr];
 
             if(descriptor.isLower){
-                whatNext.emplace_back(std::pair<Action,int>{NOTHING_TODO, -1});
-                mpiRequests.emplace_back();
-                AssertMpi(MPI_Isend(const_cast<int*>(&descriptor.nbParticlesToSend), 1, MPI_INT, descriptor.destProc, TAG_LOW_UP_NB_PARTICLES,
-                          current_com, &mpiRequests.back()));
-
-                if(descriptor.nbParticlesToSend){
+                if(descriptor.nbPartitionsToSend > 0){
                     whatNext.emplace_back(std::pair<Action,int>{NOTHING_TODO, -1});
                     mpiRequests.emplace_back();
-                    AssertMpi(MPI_Isend(const_cast<real_number*>(&particles_positions[0]), descriptor.nbParticlesToSend*size_particle_positions, particles_utils::GetMpiType(real_number()), descriptor.destProc, TAG_LOW_UP_PARTICLES,
+                    AssertMpi(MPI_Isend(const_cast<int*>(&descriptor.nbParticlesToSend), 1, MPI_INT, descriptor.destProc, TAG_LOW_UP_NB_PARTICLES,
                               current_com, &mpiRequests.back()));
 
-                    assert(descriptor.toRecvAndMerge == nullptr);
-                    descriptor.toRecvAndMerge.reset(new real_number[descriptor.nbParticlesToSend*size_particle_rhs]);
-                    whatNext.emplace_back(std::pair<Action,int>{MERGE_PARTICLES, idxDescr});
-                    mpiRequests.emplace_back();
-                    AssertMpi(MPI_Irecv(descriptor.toRecvAndMerge.get(), descriptor.nbParticlesToSend*size_particle_rhs, particles_utils::GetMpiType(real_number()), descriptor.destProc, TAG_UP_LOW_RESULTS,
-                              current_com, &mpiRequests.back()));
+                    if(descriptor.nbParticlesToSend){
+                        whatNext.emplace_back(std::pair<Action,int>{NOTHING_TODO, -1});
+                        mpiRequests.emplace_back();
+                        AssertMpi(MPI_Isend(const_cast<real_number*>(&particles_positions[0]), descriptor.nbParticlesToSend*size_particle_positions, particles_utils::GetMpiType(real_number()), descriptor.destProc, TAG_LOW_UP_PARTICLES,
+                                  current_com, &mpiRequests.back()));
+
+                        assert(descriptor.toRecvAndMerge == nullptr);
+                        descriptor.toRecvAndMerge.reset(new real_number[descriptor.nbParticlesToSend*size_particle_rhs]);
+                        whatNext.emplace_back(std::pair<Action,int>{MERGE_PARTICLES, idxDescr});
+                        mpiRequests.emplace_back();
+                        AssertMpi(MPI_Irecv(descriptor.toRecvAndMerge.get(), descriptor.nbParticlesToSend*size_particle_rhs, particles_utils::GetMpiType(real_number()), descriptor.destProc, TAG_UP_LOW_RESULTS,
+                                  current_com, &mpiRequests.back()));
+                    }
                 }
 
+                assert(descriptor.nbPartitionsToRecv);
                 whatNext.emplace_back(std::pair<Action,int>{RECV_PARTICLES, idxDescr});
                 mpiRequests.emplace_back();
                 AssertMpi(MPI_Irecv(&descriptor.nbParticlesToRecv,
@@ -260,6 +267,7 @@ public:
                           current_com, &mpiRequests.back()));
             }
             else{
+                assert(descriptor.nbPartitionsToSend);
                 whatNext.emplace_back(std::pair<Action,int>{NOTHING_TODO, -1});
                 mpiRequests.emplace_back();
                 AssertMpi(MPI_Isend(const_cast<int*>(&descriptor.nbParticlesToSend), 1, MPI_INT, descriptor.destProc, TAG_UP_LOW_NB_PARTICLES,
@@ -279,11 +287,13 @@ public:
                               current_com, &mpiRequests.back()));
                 }
 
-                whatNext.emplace_back(std::pair<Action,int>{RECV_PARTICLES, idxDescr});
-                mpiRequests.emplace_back();
-                AssertMpi(MPI_Irecv(&descriptor.nbParticlesToRecv,
-                          1, MPI_INT, descriptor.destProc, TAG_LOW_UP_NB_PARTICLES,
-                          current_com, &mpiRequests.back()));
+                if(descriptor.nbPartitionsToRecv){
+                    whatNext.emplace_back(std::pair<Action,int>{RECV_PARTICLES, idxDescr});
+                    mpiRequests.emplace_back();
+                    AssertMpi(MPI_Irecv(&descriptor.nbParticlesToRecv,
+                              1, MPI_INT, descriptor.destProc, TAG_LOW_UP_NB_PARTICLES,
+                              current_com, &mpiRequests.back()));
+                }
             }
         }