diff --git a/bfps/cpp/particles/abstract_particles_output.hpp b/bfps/cpp/particles/abstract_particles_output.hpp
index 7510bc6e9990e8cb714580567da7e9ae9842bf87..cf71c99e72adec24273da23b5c113de5e1af02fb 100644
--- a/bfps/cpp/particles/abstract_particles_output.hpp
+++ b/bfps/cpp/particles/abstract_particles_output.hpp
@@ -28,11 +28,13 @@ class abstract_particles_output {
     std::unique_ptr<real_number[]> buffer_particles_positions_send;
     std::vector<std::unique_ptr<real_number[]>> buffer_particles_rhs_send;
     partsize_t size_buffers_send;
+    int buffers_size_particle_rhs_send;
 
     std::unique_ptr<real_number[]> buffer_particles_positions_recv;
     std::vector<std::unique_ptr<real_number[]>> buffer_particles_rhs_recv;
     std::unique_ptr<partsize_t[]> buffer_indexes_recv;
-    partsize_t size_buffers_recv;
+    partsize_t size_buffers_recv;    
+    int buffers_size_particle_rhs_recv;
 
     int nb_processes_involved;
     bool current_is_involved;
@@ -66,7 +68,9 @@ public:
             : mpi_com(in_mpi_com), my_rank(-1), nb_processes(-1),
                 total_nb_particles(inTotalNbParticles), nb_rhs(in_nb_rhs),
                 buffer_particles_rhs_send(in_nb_rhs), size_buffers_send(-1),
+                buffers_size_particle_rhs_send(-1),
                 buffer_particles_rhs_recv(in_nb_rhs), size_buffers_recv(-1),
+                buffers_size_particle_rhs_recv(-1),
                 nb_processes_involved(0), current_is_involved(true), particles_chunk_per_process(0),
                 particles_chunk_current_size(0), particles_chunk_current_offset(0) {
 
@@ -143,6 +147,8 @@ public:
             buffer_particles_rhs_send[idx_rhs].release();
             buffer_particles_rhs_recv[idx_rhs].release();
         }
+        buffers_size_particle_rhs_send = -1;
+        buffers_size_particle_rhs_recv = -1;
     }
 
     template <int size_particle_rhs>
@@ -159,12 +165,22 @@ public:
             TIMEZONE("sort-to-distribute");
 
             if(size_buffers_send < nb_particles && nb_particles){
-                buffer_indexes_send.reset(new std::pair<partsize_t,partsize_t>[nb_particles]);
-                buffer_particles_positions_send.reset(new real_number[nb_particles*size_particle_positions]);
+                size_buffers_send = nb_particles;
+                buffer_indexes_send.reset(new std::pair<partsize_t,partsize_t>[size_buffers_send]);
+                buffer_particles_positions_send.reset(new real_number[size_buffers_send*size_particle_positions]);
+                
+                if(buffers_size_particle_rhs_send < size_particle_rhs){
+                    buffers_size_particle_rhs_send = size_particle_rhs;
+                }
                 for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){
-                    buffer_particles_rhs_send[idx_rhs].reset(new real_number[nb_particles*size_particle_rhs]);
+                    buffer_particles_rhs_send[idx_rhs].reset(new real_number[size_buffers_send*buffers_size_particle_rhs_send]);
+                }
+            }
+            else if(buffers_size_particle_rhs_send < size_particle_rhs){
+                buffers_size_particle_rhs_send = size_particle_rhs;
+                for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){
+                    buffer_particles_rhs_send[idx_rhs].reset(new real_number[size_buffers_send*buffers_size_particle_rhs_send]);
                 }
-                size_buffers_send = nb_particles;
             }
 
             for(partsize_t idx_part = 0 ; idx_part < nb_particles ; ++idx_part){
@@ -210,12 +226,22 @@ public:
         assert(nb_to_receive == particles_chunk_current_size);
 
         if(size_buffers_recv < nb_to_receive && nb_to_receive){
-            buffer_indexes_recv.reset(new partsize_t[nb_to_receive]);
-            buffer_particles_positions_recv.reset(new real_number[nb_to_receive*size_particle_positions]);
+            size_buffers_recv = nb_to_receive;
+            buffer_indexes_recv.reset(new partsize_t[size_buffers_recv]);
+            buffer_particles_positions_recv.reset(new real_number[size_buffers_recv*size_particle_positions]);
+            
+            if(buffers_size_particle_rhs_recv < size_particle_rhs){
+                buffers_size_particle_rhs_recv = size_particle_rhs;
+            }
             for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){
-                buffer_particles_rhs_recv[idx_rhs].reset(new real_number[nb_to_receive*size_particle_rhs]);
+                buffer_particles_rhs_recv[idx_rhs].reset(new real_number[size_buffers_recv*buffers_size_particle_rhs_recv]);
             }
-            size_buffers_recv = nb_to_receive;
+        }
+        else if(buffers_size_particle_rhs_recv < size_particle_rhs){
+            buffers_size_particle_rhs_recv = size_particle_rhs;
+            for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){
+                buffer_particles_rhs_recv[idx_rhs].reset(new real_number[size_buffers_recv*buffers_size_particle_rhs_recv]);
+            }        
         }
 
         {
@@ -235,12 +261,12 @@ public:
         }
 
         if(size_buffers_send < nb_to_receive && nb_to_receive){
-            buffer_indexes_send.reset(new std::pair<partsize_t,partsize_t>[nb_to_receive]);
-            buffer_particles_positions_send.reset(new real_number[nb_to_receive*size_particle_positions]);
+            size_buffers_send = nb_to_receive;
+            buffer_indexes_send.reset(new std::pair<partsize_t,partsize_t>[size_buffers_send]);
+            buffer_particles_positions_send.reset(new real_number[size_buffers_send*size_particle_positions]);
             for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){
-                buffer_particles_rhs_send[idx_rhs].reset(new real_number[nb_to_receive*size_particle_rhs]);
+                buffer_particles_rhs_send[idx_rhs].reset(new real_number[size_buffers_send*buffers_size_particle_rhs_send]);
             }
-            size_buffers_send = nb_to_receive;
         }
 
         {