diff --git a/python/mesa_pd/templates/mpi/BroadcastProperty.templ.h b/python/mesa_pd/templates/mpi/BroadcastProperty.templ.h
index 2279df7d1691b32c0c4900309b9fd21ec40c26ba..236c0a65cc59beaf36375c5d659a88ae318ea954 100644
--- a/python/mesa_pd/templates/mpi/BroadcastProperty.templ.h
+++ b/python/mesa_pd/templates/mpi/BroadcastProperty.templ.h
@@ -59,15 +59,18 @@ public:
    template <typename Notification>
    void operator()(data::ParticleStorage& ps) const;
 
-   int64_t getBytesSent() const { return bs.getBytesSent(); }
-   int64_t getBytesReceived() const { return bs.getBytesReceived(); }
+   int64_t getBytesSent() const { return bytesSent_; }
+   int64_t getBytesReceived() const { return bytesReceived_; }
 
-   int64_t getNumberOfSends() const { return bs.getNumberOfSends(); }
-   int64_t getNumberOfReceives() const { return bs.getNumberOfReceives(); }
+   int64_t getNumberOfSends() const { return numberOfSends_; }
+   int64_t getNumberOfReceives() const { return numberOfReceives_; }
 private:
-   mutable walberla::mpi::BufferSystem bs = walberla::mpi::BufferSystem(walberla::mpi::MPIManager::instance()->comm() );
-
    int numProcesses_ = walberla::mpi::MPIManager::instance()->numProcesses();
+
+   mutable int64_t bytesSent_ = 0;
+   mutable int64_t bytesReceived_ = 0;
+   mutable int64_t numberOfSends_ = 0;
+   mutable int64_t numberOfReceives_ = 0;
 };
 
 template <typename Notification>
@@ -75,6 +78,8 @@ void BroadcastProperty::operator()(data::ParticleStorage& ps) const
 {
    if (numProcesses_ == 1) return;
 
+   walberla::mpi::BufferSystem bs(walberla::mpi::MPIManager::instance()->comm());
+
    std::set<int> recvRanks; // potential message senders
 
    WALBERLA_LOG_DETAIL( "Assembling of property reduction message starts...");
@@ -128,6 +133,11 @@ void BroadcastProperty::operator()(data::ParticleStorage& ps) const
       }
    }
    WALBERLA_LOG_DETAIL( "Parsing of property broadcasting message ended." );
+
+   bytesSent_ = bs.getBytesSent();
+   bytesReceived_ = bs.getBytesReceived();
+   numberOfSends_ = bs.getNumberOfSends();
+   numberOfReceives_ = bs.getNumberOfReceives();
 }
 
 }  // namespace mpi
diff --git a/python/mesa_pd/templates/mpi/ReduceProperty.templ.h b/python/mesa_pd/templates/mpi/ReduceProperty.templ.h
index 38f7340854e17934bc5e867757968566393d658a..60abb8985584bfd5e80b96d0c3c1d950b722551c 100644
--- a/python/mesa_pd/templates/mpi/ReduceProperty.templ.h
+++ b/python/mesa_pd/templates/mpi/ReduceProperty.templ.h
@@ -68,15 +68,18 @@ public:
    template <typename Notification>
    void operator()(data::ParticleStorage& ps) const;
 
-   int64_t getBytesSent() const { return bs.getBytesSent(); }
-   int64_t getBytesReceived() const { return bs.getBytesReceived(); }
+   int64_t getBytesSent() const { return bytesSent_; }
+   int64_t getBytesReceived() const { return bytesReceived_; }
 
-   int64_t getNumberOfSends() const { return bs.getNumberOfSends(); }
-   int64_t getNumberOfReceives() const { return bs.getNumberOfReceives(); }
+   int64_t getNumberOfSends() const { return numberOfSends_; }
+   int64_t getNumberOfReceives() const { return numberOfReceives_; }
 private:
-   mutable walberla::mpi::BufferSystem bs = walberla::mpi::BufferSystem(walberla::mpi::MPIManager::instance()->comm() );
-
    int numProcesses_ = walberla::mpi::MPIManager::instance()->numProcesses();
+
+   mutable int64_t bytesSent_ = 0;
+   mutable int64_t bytesReceived_ = 0;
+   mutable int64_t numberOfSends_ = 0;
+   mutable int64_t numberOfReceives_ = 0;
 };
 
 template <typename Notification>
@@ -84,6 +87,8 @@ void ReduceProperty::operator()(data::ParticleStorage& ps) const
 {
    if (numProcesses_ == 1) return;
 
+   walberla::mpi::BufferSystem bs(walberla::mpi::MPIManager::instance()->comm());
+
    std::set<int> recvRanks; // potential message senders
 
    WALBERLA_LOG_DETAIL( "Assembling of property reduction message starts...");
@@ -139,6 +144,11 @@ void ReduceProperty::operator()(data::ParticleStorage& ps) const
       }
    }
    WALBERLA_LOG_DETAIL( "Parsing of property reduction message ended." );
+
+   bytesSent_ = bs.getBytesSent();
+   bytesReceived_ = bs.getBytesReceived();
+   numberOfSends_ = bs.getNumberOfSends();
+   numberOfReceives_ = bs.getNumberOfReceives();
 }
 
 }  // namespace mpi
diff --git a/python/mesa_pd/templates/mpi/SyncGhostOwners.templ.cpp b/python/mesa_pd/templates/mpi/SyncGhostOwners.templ.cpp
index ce0475880157e7de39dc696d5b48b805c85aec7a..1dca2429de6f345715e0cd81ea90685bba0658dd 100644
--- a/python/mesa_pd/templates/mpi/SyncGhostOwners.templ.cpp
+++ b/python/mesa_pd/templates/mpi/SyncGhostOwners.templ.cpp
@@ -39,6 +39,11 @@ void SyncGhostOwners::operator()( data::ParticleStorage& ps,
 {
    if (numProcesses_ == 1) return;
 
+   bytesSent_ = 0;
+   bytesReceived_ = 0;
+   numberOfSends_ = 0;
+   numberOfReceives_ = 0;
+
    //==========================================================
    // STEP1: Update & Migrate
    //==========================================================
@@ -59,6 +64,8 @@ void SyncGhostOwners::updateAndMigrate( data::ParticleStorage& ps,
    // STEP1: Update & Migrate
    //==========================================================
 
+   walberla::mpi::BufferSystem bs1( walberla::mpi::MPIManager::instance()->comm(), 749861);
+
    WALBERLA_CHECK(!bs1.isCommunicationRunning());
 
    WALBERLA_LOG_DETAIL( "Assembling of Update&Migrate starts..." );
@@ -192,6 +199,11 @@ void SyncGhostOwners::updateAndMigrate( data::ParticleStorage& ps,
       }
    }
    WALBERLA_LOG_DETAIL( "Parsing of Update&Migrate ended." );
+
+   bytesSent_ += bs1.getBytesSent();
+   bytesReceived_ += bs1.getBytesReceived();
+   numberOfSends_ += bs1.getNumberOfSends();
+   numberOfReceives_ += bs1.getNumberOfReceives();
 }
 
 void SyncGhostOwners::checkAndResolveOverlap( data::ParticleStorage& ps,
@@ -204,6 +216,8 @@ void SyncGhostOwners::checkAndResolveOverlap( data::ParticleStorage& ps,
    // STEP2: Check&Resolve
    //==========================================================
 
+   walberla::mpi::BufferSystem bs2( walberla::mpi::MPIManager::instance()->comm(), 255367);
+
    WALBERLA_CHECK(!bs2.isCommunicationRunning());
 
    //init buffers
@@ -350,6 +364,11 @@ void SyncGhostOwners::checkAndResolveOverlap( data::ParticleStorage& ps,
       }
    }
    WALBERLA_LOG_DETAIL( "Parsing of Check&Resolve ended." );
+
+   bytesSent_ += bs2.getBytesSent();
+   bytesReceived_ += bs2.getBytesReceived();
+   numberOfSends_ += bs2.getNumberOfSends();
+   numberOfReceives_ += bs2.getNumberOfReceives();
 }
 
 }  // namespace mpi
diff --git a/python/mesa_pd/templates/mpi/SyncGhostOwners.templ.h b/python/mesa_pd/templates/mpi/SyncGhostOwners.templ.h
index 8ec931a686671a285bcfe000807c42425026c67f..0be135507c793080a5b7b8db30415839d59f2ae7 100644
--- a/python/mesa_pd/templates/mpi/SyncGhostOwners.templ.h
+++ b/python/mesa_pd/templates/mpi/SyncGhostOwners.templ.h
@@ -60,11 +60,11 @@ public:
                     const real_t dx = real_t(0),
                     const bool syncNonCommunicatingBodies = false ) const;
 
-   int64_t getBytesSent() const { return bs1.getBytesSent() + bs2.getBytesSent(); }
-   int64_t getBytesReceived() const { return bs1.getBytesReceived() + bs2.getBytesReceived(); }
+   int64_t getBytesSent() const { return bytesSent_; }
+   int64_t getBytesReceived() const { return bytesReceived_; }
 
-   int64_t getNumberOfSends() const { return bs1.getNumberOfSends() + bs2.getNumberOfSends(); }
-   int64_t getNumberOfReceives() const { return bs1.getNumberOfReceives() + bs2.getNumberOfReceives(); }
+   int64_t getNumberOfSends() const { return numberOfSends_; }
+   int64_t getNumberOfReceives() const { return numberOfReceives_; }
 private:
    void updateAndMigrate( data::ParticleStorage& ps,
                           const domain::IDomain& domain,
@@ -77,11 +77,13 @@ private:
 
    mutable std::vector<uint_t> neighborRanks_; ///cache for neighbor ranks -> will be updated in operator()
 
-   mutable walberla::mpi::BufferSystem bs1 = walberla::mpi::BufferSystem( walberla::mpi::MPIManager::instance()->comm(), 749861);
-   mutable walberla::mpi::BufferSystem bs2 = walberla::mpi::BufferSystem( walberla::mpi::MPIManager::instance()->comm(), 255367);
-
    int numProcesses_ = walberla::mpi::MPIManager::instance()->numProcesses();
    int rank_         = walberla::mpi::MPIManager::instance()->rank();
+
+   mutable int64_t bytesSent_ = 0;
+   mutable int64_t bytesReceived_ = 0;
+   mutable int64_t numberOfSends_ = 0;
+   mutable int64_t numberOfReceives_ = 0;
 };
 
 }  // namespace mpi
diff --git a/python/mesa_pd/templates/mpi/SyncNextNeighbors.templ.cpp b/python/mesa_pd/templates/mpi/SyncNextNeighbors.templ.cpp
index dcf86e8bed632796fb1b36730daf56d0f78126a6..f631bb0e7b49e814556f93664521d7fb5f5c30de 100644
--- a/python/mesa_pd/templates/mpi/SyncNextNeighbors.templ.cpp
+++ b/python/mesa_pd/templates/mpi/SyncNextNeighbors.templ.cpp
@@ -38,6 +38,8 @@ void SyncNextNeighbors::operator()(data::ParticleStorage& ps,
 {
    if (numProcesses_ == 1) return;
 
+   walberla::mpi::BufferSystem bs( walberla::mpi::MPIManager::instance()->comm() );
+
    neighborRanks_ = domain.getNeighborProcesses();
    for( uint_t nbProcessRank : neighborRanks_ )
    {
@@ -47,7 +49,7 @@ void SyncNextNeighbors::operator()(data::ParticleStorage& ps,
          bs.sendBuffer(nbProcessRank) << walberla::uint8_c(0);
       }
    }
-   generateSynchronizationMessages(ps, domain, dx);
+   generateSynchronizationMessages(bs, ps, domain, dx);
 
    // size of buffer is unknown and changes with each send
    bs.setReceiverInfoFromSendBufferState(false, true);
@@ -66,9 +68,15 @@ void SyncNextNeighbors::operator()(data::ParticleStorage& ps,
       }
    }
    WALBERLA_LOG_DETAIL( "Parsing of particle synchronization response ended." );
+
+   bytesSent_ = bs.getBytesSent();
+   bytesReceived_ = bs.getBytesReceived();
+   numberOfSends_ = bs.getNumberOfSends();
+   numberOfReceives_ = bs.getNumberOfReceives();
 }
 
-void SyncNextNeighbors::generateSynchronizationMessages(data::ParticleStorage& ps,
+void SyncNextNeighbors::generateSynchronizationMessages(walberla::mpi::BufferSystem& bs,
+                                                        data::ParticleStorage& ps,
                                                         const domain::IDomain& domain,
                                                         const real_t dx) const
 {
diff --git a/python/mesa_pd/templates/mpi/SyncNextNeighbors.templ.h b/python/mesa_pd/templates/mpi/SyncNextNeighbors.templ.h
index 5c9402d4c0f0c0f9a8f15343eac067496238514d..7a9dc110bc1e51bdfc4f052c08840cd9b077796c 100644
--- a/python/mesa_pd/templates/mpi/SyncNextNeighbors.templ.h
+++ b/python/mesa_pd/templates/mpi/SyncNextNeighbors.templ.h
@@ -57,21 +57,25 @@ public:
                    const domain::IDomain& domain,
                    const real_t dx = real_t(0)) const;
 
-   int64_t getBytesSent() const { return bs.getBytesSent(); }
-   int64_t getBytesReceived() const { return bs.getBytesReceived(); }
+   int64_t getBytesSent() const { return bytesSent_; }
+   int64_t getBytesReceived() const { return bytesReceived_; }
 
-   int64_t getNumberOfSends() const { return bs.getNumberOfSends(); }
-   int64_t getNumberOfReceives() const { return bs.getNumberOfReceives(); }
+   int64_t getNumberOfSends() const { return numberOfSends_; }
+   int64_t getNumberOfReceives() const { return numberOfReceives_; }
 private:
-   void generateSynchronizationMessages(data::ParticleStorage& ps,
+   void generateSynchronizationMessages(walberla::mpi::BufferSystem& bs,
+                                        data::ParticleStorage& ps,
                                         const domain::IDomain& domain,
                                         const real_t dx) const;
    mutable std::vector<uint_t> neighborRanks_; ///cache for neighbor ranks -> will be updated in operator()
 
-   mutable walberla::mpi::BufferSystem bs = walberla::mpi::BufferSystem( walberla::mpi::MPIManager::instance()->comm() );
-
    int numProcesses_ = walberla::mpi::MPIManager::instance()->numProcesses();
    int rank_         = walberla::mpi::MPIManager::instance()->rank();
+
+   mutable int64_t bytesSent_ = 0;
+   mutable int64_t bytesReceived_ = 0;
+   mutable int64_t numberOfSends_ = 0;
+   mutable int64_t numberOfReceives_ = 0;
 };
 
 }  // namespace mpi
diff --git a/python/mesa_pd/templates/mpi/SyncNextNeighborsNoGhosts.templ.cpp b/python/mesa_pd/templates/mpi/SyncNextNeighborsNoGhosts.templ.cpp
index bab7acfcc9be2aeabd5c74494db0168dd3df291e..ce8c9100d2615ac8660ff3a1040c259b36fc02bd 100644
--- a/python/mesa_pd/templates/mpi/SyncNextNeighborsNoGhosts.templ.cpp
+++ b/python/mesa_pd/templates/mpi/SyncNextNeighborsNoGhosts.templ.cpp
@@ -37,6 +37,8 @@ void SyncNextNeighborsNoGhosts::operator()(data::ParticleStorage& ps,
 {
    if (numProcesses_ == 1) return;
 
+   walberla::mpi::BufferSystem bs( walberla::mpi::MPIManager::instance()->comm() );
+
    neighborRanks_ = domain.getNeighborProcesses();
    for( uint_t nbProcessRank : neighborRanks_ )
    {
@@ -46,7 +48,7 @@ void SyncNextNeighborsNoGhosts::operator()(data::ParticleStorage& ps,
          bs.sendBuffer(nbProcessRank) << walberla::uint8_c(0);
       }
    }
-   generateSynchronizationMessages(ps, domain);
+   generateSynchronizationMessages(bs, ps, domain);
 
    // size of buffer is unknown and changes with each send
    bs.setReceiverInfoFromSendBufferState(false, true);
@@ -65,9 +67,15 @@ void SyncNextNeighborsNoGhosts::operator()(data::ParticleStorage& ps,
       }
    }
    WALBERLA_LOG_DETAIL( "Parsing of particle synchronization response ended." );
+
+   bytesSent_ = bs.getBytesSent();
+   bytesReceived_ = bs.getBytesReceived();
+   numberOfSends_ = bs.getNumberOfSends();
+   numberOfReceives_ = bs.getNumberOfReceives();
 }
 
-void SyncNextNeighborsNoGhosts::generateSynchronizationMessages(data::ParticleStorage& ps,
+void SyncNextNeighborsNoGhosts::generateSynchronizationMessages(walberla::mpi::BufferSystem& bs,
+                                                                data::ParticleStorage& ps,
                                                                 const domain::IDomain& domain) const
 {
    const uint_t ownRank = uint_c(rank_);
diff --git a/python/mesa_pd/templates/mpi/SyncNextNeighborsNoGhosts.templ.h b/python/mesa_pd/templates/mpi/SyncNextNeighborsNoGhosts.templ.h
index 7ffc5f2b7b915997c0a88b33e0d9fdd8b1b4f860..8030c09e76f1362a2e5e4d9f16531c8525ef2046 100644
--- a/python/mesa_pd/templates/mpi/SyncNextNeighborsNoGhosts.templ.h
+++ b/python/mesa_pd/templates/mpi/SyncNextNeighborsNoGhosts.templ.h
@@ -60,20 +60,24 @@ public:
    void operator()(data::ParticleStorage& ps,
                    const domain::IDomain& domain) const;
 
-   int64_t getBytesSent() const { return bs.getBytesSent(); }
-   int64_t getBytesReceived() const { return bs.getBytesReceived(); }
+   int64_t getBytesSent() const { return bytesSent_; }
+   int64_t getBytesReceived() const { return bytesReceived_; }
 
-   int64_t getNumberOfSends() const { return bs.getNumberOfSends(); }
-   int64_t getNumberOfReceives() const { return bs.getNumberOfReceives(); }
+   int64_t getNumberOfSends() const { return numberOfSends_; }
+   int64_t getNumberOfReceives() const { return numberOfReceives_; }
 private:
-   void generateSynchronizationMessages(data::ParticleStorage& ps,
+   void generateSynchronizationMessages(walberla::mpi::BufferSystem& bs,
+                                        data::ParticleStorage& ps,
                                         const domain::IDomain& domain) const;
    mutable std::vector<uint_t> neighborRanks_; ///cache for neighbor ranks -> will be updated in operator()
 
-   mutable walberla::mpi::BufferSystem bs = walberla::mpi::BufferSystem( walberla::mpi::MPIManager::instance()->comm() );
-
    int numProcesses_ = walberla::mpi::MPIManager::instance()->numProcesses();
    int rank_         = walberla::mpi::MPIManager::instance()->rank();
+
+   mutable int64_t bytesSent_ = 0;
+   mutable int64_t bytesReceived_ = 0;
+   mutable int64_t numberOfSends_ = 0;
+   mutable int64_t numberOfReceives_ = 0;
 };
 
 }  // namespace mpi
diff --git a/src/mesa_pd/common/ParticleFunctions.h b/src/mesa_pd/common/ParticleFunctions.h
index 462e3f2e8ec428b10d56171e54f1baf97597c11c..b546b36a7347e8e655062986415533158bf76105 100644
--- a/src/mesa_pd/common/ParticleFunctions.h
+++ b/src/mesa_pd/common/ParticleFunctions.h
@@ -18,6 +18,12 @@
 //
 //======================================================================================================================
 
+//======================================================================================================================
+//
+//  THIS FILE IS GENERATED - PLEASE CHANGE THE TEMPLATE !!!
+//
+//======================================================================================================================
+
 #pragma once
 
 #include <mesa_pd/data/DataTypes.h>
diff --git a/src/mesa_pd/mpi/BroadcastProperty.h b/src/mesa_pd/mpi/BroadcastProperty.h
index 856e030ec1dd861db98c9984faa2eaa79f95f9c3..27c4542cf29f2b2b8c08019bbb3a1611de1e02ca 100644
--- a/src/mesa_pd/mpi/BroadcastProperty.h
+++ b/src/mesa_pd/mpi/BroadcastProperty.h
@@ -59,15 +59,18 @@ public:
    template <typename Notification>
    void operator()(data::ParticleStorage& ps) const;
 
-   int64_t getBytesSent() const { return bs.getBytesSent(); }
-   int64_t getBytesReceived() const { return bs.getBytesReceived(); }
+   int64_t getBytesSent() const { return bytesSent_; }
+   int64_t getBytesReceived() const { return bytesReceived_; }
 
-   int64_t getNumberOfSends() const { return bs.getNumberOfSends(); }
-   int64_t getNumberOfReceives() const { return bs.getNumberOfReceives(); }
+   int64_t getNumberOfSends() const { return numberOfSends_; }
+   int64_t getNumberOfReceives() const { return numberOfReceives_; }
 private:
-   mutable walberla::mpi::BufferSystem bs = walberla::mpi::BufferSystem(walberla::mpi::MPIManager::instance()->comm() );
-
    int numProcesses_ = walberla::mpi::MPIManager::instance()->numProcesses();
+
+   mutable int64_t bytesSent_ = 0;
+   mutable int64_t bytesReceived_ = 0;
+   mutable int64_t numberOfSends_ = 0;
+   mutable int64_t numberOfReceives_ = 0;
 };
 
 template <typename Notification>
@@ -75,6 +78,8 @@ void BroadcastProperty::operator()(data::ParticleStorage& ps) const
 {
    if (numProcesses_ == 1) return;
 
+   walberla::mpi::BufferSystem bs(walberla::mpi::MPIManager::instance()->comm());
+
    std::set<int> recvRanks; // potential message senders
 
    WALBERLA_LOG_DETAIL( "Assembling of property reduction message starts...");
@@ -128,6 +133,11 @@ void BroadcastProperty::operator()(data::ParticleStorage& ps) const
       }
    }
    WALBERLA_LOG_DETAIL( "Parsing of property broadcasting message ended." );
+
+   bytesSent_ = bs.getBytesSent();
+   bytesReceived_ = bs.getBytesReceived();
+   numberOfSends_ = bs.getNumberOfSends();
+   numberOfReceives_ = bs.getNumberOfReceives();
 }
 
 }  // namespace mpi
diff --git a/src/mesa_pd/mpi/ReduceProperty.h b/src/mesa_pd/mpi/ReduceProperty.h
index 7f55c334973729778ca7dd87ada38ed175a522e7..46736d9edd5006565e223a12ab7a69e577ccae27 100644
--- a/src/mesa_pd/mpi/ReduceProperty.h
+++ b/src/mesa_pd/mpi/ReduceProperty.h
@@ -68,15 +68,18 @@ public:
    template <typename Notification>
    void operator()(data::ParticleStorage& ps) const;
 
-   int64_t getBytesSent() const { return bs.getBytesSent(); }
-   int64_t getBytesReceived() const { return bs.getBytesReceived(); }
+   int64_t getBytesSent() const { return bytesSent_; }
+   int64_t getBytesReceived() const { return bytesReceived_; }
 
-   int64_t getNumberOfSends() const { return bs.getNumberOfSends(); }
-   int64_t getNumberOfReceives() const { return bs.getNumberOfReceives(); }
+   int64_t getNumberOfSends() const { return numberOfSends_; }
+   int64_t getNumberOfReceives() const { return numberOfReceives_; }
 private:
-   mutable walberla::mpi::BufferSystem bs = walberla::mpi::BufferSystem(walberla::mpi::MPIManager::instance()->comm() );
-
    int numProcesses_ = walberla::mpi::MPIManager::instance()->numProcesses();
+
+   mutable int64_t bytesSent_ = 0;
+   mutable int64_t bytesReceived_ = 0;
+   mutable int64_t numberOfSends_ = 0;
+   mutable int64_t numberOfReceives_ = 0;
 };
 
 template <typename Notification>
@@ -84,6 +87,8 @@ void ReduceProperty::operator()(data::ParticleStorage& ps) const
 {
    if (numProcesses_ == 1) return;
 
+   walberla::mpi::BufferSystem bs(walberla::mpi::MPIManager::instance()->comm());
+
    std::set<int> recvRanks; // potential message senders
 
    WALBERLA_LOG_DETAIL( "Assembling of property reduction message starts...");
@@ -139,6 +144,11 @@ void ReduceProperty::operator()(data::ParticleStorage& ps) const
       }
    }
    WALBERLA_LOG_DETAIL( "Parsing of property reduction message ended." );
+
+   bytesSent_ = bs.getBytesSent();
+   bytesReceived_ = bs.getBytesReceived();
+   numberOfSends_ = bs.getNumberOfSends();
+   numberOfReceives_ = bs.getNumberOfReceives();
 }
 
 }  // namespace mpi
diff --git a/src/mesa_pd/mpi/SyncGhostOwners.cpp b/src/mesa_pd/mpi/SyncGhostOwners.cpp
index 7f115fdb214350ef0c3b4cc9714a1a71c6d4be9f..dd13a9fb2623fe2cba41fd8bcca1318176ec1757 100644
--- a/src/mesa_pd/mpi/SyncGhostOwners.cpp
+++ b/src/mesa_pd/mpi/SyncGhostOwners.cpp
@@ -39,6 +39,11 @@ void SyncGhostOwners::operator()( data::ParticleStorage& ps,
 {
    if (numProcesses_ == 1) return;
 
+   bytesSent_ = 0;
+   bytesReceived_ = 0;
+   numberOfSends_ = 0;
+   numberOfReceives_ = 0;
+
    //==========================================================
    // STEP1: Update & Migrate
    //==========================================================
@@ -59,6 +64,8 @@ void SyncGhostOwners::updateAndMigrate( data::ParticleStorage& ps,
    // STEP1: Update & Migrate
    //==========================================================
 
+   walberla::mpi::BufferSystem bs1( walberla::mpi::MPIManager::instance()->comm(), 749861);
+
    WALBERLA_CHECK(!bs1.isCommunicationRunning());
 
    WALBERLA_LOG_DETAIL( "Assembling of Update&Migrate starts..." );
@@ -192,6 +199,11 @@ void SyncGhostOwners::updateAndMigrate( data::ParticleStorage& ps,
       }
    }
    WALBERLA_LOG_DETAIL( "Parsing of Update&Migrate ended." );
+
+   bytesSent_ += bs1.getBytesSent();
+   bytesReceived_ += bs1.getBytesReceived();
+   numberOfSends_ += bs1.getNumberOfSends();
+   numberOfReceives_ += bs1.getNumberOfReceives();
 }
 
 void SyncGhostOwners::checkAndResolveOverlap( data::ParticleStorage& ps,
@@ -204,6 +216,8 @@ void SyncGhostOwners::checkAndResolveOverlap( data::ParticleStorage& ps,
    // STEP2: Check&Resolve
    //==========================================================
 
+   walberla::mpi::BufferSystem bs2( walberla::mpi::MPIManager::instance()->comm(), 255367);
+
    WALBERLA_CHECK(!bs2.isCommunicationRunning());
 
    //init buffers
@@ -350,6 +364,11 @@ void SyncGhostOwners::checkAndResolveOverlap( data::ParticleStorage& ps,
       }
    }
    WALBERLA_LOG_DETAIL( "Parsing of Check&Resolve ended." );
+
+   bytesSent_ += bs2.getBytesSent();
+   bytesReceived_ += bs2.getBytesReceived();
+   numberOfSends_ += bs2.getNumberOfSends();
+   numberOfReceives_ += bs2.getNumberOfReceives();
 }
 
 }  // namespace mpi
diff --git a/src/mesa_pd/mpi/SyncGhostOwners.h b/src/mesa_pd/mpi/SyncGhostOwners.h
index 0b9d1db826f85044591595ca136d27ff2a84af4a..02089e33c33cd6878731110cb4b349b6213a2788 100644
--- a/src/mesa_pd/mpi/SyncGhostOwners.h
+++ b/src/mesa_pd/mpi/SyncGhostOwners.h
@@ -60,11 +60,11 @@ public:
                     const real_t dx = real_t(0),
                     const bool syncNonCommunicatingBodies = false ) const;
 
-   int64_t getBytesSent() const { return bs1.getBytesSent() + bs2.getBytesSent(); }
-   int64_t getBytesReceived() const { return bs1.getBytesReceived() + bs2.getBytesReceived(); }
+   int64_t getBytesSent() const { return bytesSent_; }
+   int64_t getBytesReceived() const { return bytesReceived_; }
 
-   int64_t getNumberOfSends() const { return bs1.getNumberOfSends() + bs2.getNumberOfSends(); }
-   int64_t getNumberOfReceives() const { return bs1.getNumberOfReceives() + bs2.getNumberOfReceives(); }
+   int64_t getNumberOfSends() const { return numberOfSends_; }
+   int64_t getNumberOfReceives() const { return numberOfReceives_; }
 private:
    void updateAndMigrate( data::ParticleStorage& ps,
                           const domain::IDomain& domain,
@@ -77,11 +77,13 @@ private:
 
    mutable std::vector<uint_t> neighborRanks_; ///cache for neighbor ranks -> will be updated in operator()
 
-   mutable walberla::mpi::BufferSystem bs1 = walberla::mpi::BufferSystem( walberla::mpi::MPIManager::instance()->comm(), 749861);
-   mutable walberla::mpi::BufferSystem bs2 = walberla::mpi::BufferSystem( walberla::mpi::MPIManager::instance()->comm(), 255367);
-
    int numProcesses_ = walberla::mpi::MPIManager::instance()->numProcesses();
    int rank_         = walberla::mpi::MPIManager::instance()->rank();
+
+   mutable int64_t bytesSent_ = 0;
+   mutable int64_t bytesReceived_ = 0;
+   mutable int64_t numberOfSends_ = 0;
+   mutable int64_t numberOfReceives_ = 0;
 };
 
 }  // namespace mpi
diff --git a/src/mesa_pd/mpi/SyncNextNeighbors.cpp b/src/mesa_pd/mpi/SyncNextNeighbors.cpp
index e36c352dc8e60c490d36ded178be585e2a82f62d..52d922375c06dae902fef936d4db61b69edfebdf 100644
--- a/src/mesa_pd/mpi/SyncNextNeighbors.cpp
+++ b/src/mesa_pd/mpi/SyncNextNeighbors.cpp
@@ -38,6 +38,8 @@ void SyncNextNeighbors::operator()(data::ParticleStorage& ps,
 {
    if (numProcesses_ == 1) return;
 
+   walberla::mpi::BufferSystem bs( walberla::mpi::MPIManager::instance()->comm() );
+
    neighborRanks_ = domain.getNeighborProcesses();
    for( uint_t nbProcessRank : neighborRanks_ )
    {
@@ -47,7 +49,7 @@ void SyncNextNeighbors::operator()(data::ParticleStorage& ps,
          bs.sendBuffer(nbProcessRank) << walberla::uint8_c(0);
       }
    }
-   generateSynchronizationMessages(ps, domain, dx);
+   generateSynchronizationMessages(bs, ps, domain, dx);
 
    // size of buffer is unknown and changes with each send
    bs.setReceiverInfoFromSendBufferState(false, true);
@@ -66,9 +68,15 @@ void SyncNextNeighbors::operator()(data::ParticleStorage& ps,
       }
    }
    WALBERLA_LOG_DETAIL( "Parsing of particle synchronization response ended." );
+
+   bytesSent_ = bs.getBytesSent();
+   bytesReceived_ = bs.getBytesReceived();
+   numberOfSends_ = bs.getNumberOfSends();
+   numberOfReceives_ = bs.getNumberOfReceives();
 }
 
-void SyncNextNeighbors::generateSynchronizationMessages(data::ParticleStorage& ps,
+void SyncNextNeighbors::generateSynchronizationMessages(walberla::mpi::BufferSystem& bs,
+                                                        data::ParticleStorage& ps,
                                                         const domain::IDomain& domain,
                                                         const real_t dx) const
 {
diff --git a/src/mesa_pd/mpi/SyncNextNeighbors.h b/src/mesa_pd/mpi/SyncNextNeighbors.h
index 8d8364cbf5fd28d1dae06f677a4334ba7293e3d7..31e51f56b8324ba3dc99cb7cb01345a51c08afd7 100644
--- a/src/mesa_pd/mpi/SyncNextNeighbors.h
+++ b/src/mesa_pd/mpi/SyncNextNeighbors.h
@@ -57,21 +57,25 @@ public:
                    const domain::IDomain& domain,
                    const real_t dx = real_t(0)) const;
 
-   int64_t getBytesSent() const { return bs.getBytesSent(); }
-   int64_t getBytesReceived() const { return bs.getBytesReceived(); }
+   int64_t getBytesSent() const { return bytesSent_; }
+   int64_t getBytesReceived() const { return bytesReceived_; }
 
-   int64_t getNumberOfSends() const { return bs.getNumberOfSends(); }
-   int64_t getNumberOfReceives() const { return bs.getNumberOfReceives(); }
+   int64_t getNumberOfSends() const { return numberOfSends_; }
+   int64_t getNumberOfReceives() const { return numberOfReceives_; }
 private:
-   void generateSynchronizationMessages(data::ParticleStorage& ps,
+   void generateSynchronizationMessages(walberla::mpi::BufferSystem& bs,
+                                        data::ParticleStorage& ps,
                                         const domain::IDomain& domain,
                                         const real_t dx) const;
    mutable std::vector<uint_t> neighborRanks_; ///cache for neighbor ranks -> will be updated in operator()
 
-   mutable walberla::mpi::BufferSystem bs = walberla::mpi::BufferSystem( walberla::mpi::MPIManager::instance()->comm() );
-
    int numProcesses_ = walberla::mpi::MPIManager::instance()->numProcesses();
    int rank_         = walberla::mpi::MPIManager::instance()->rank();
+
+   mutable int64_t bytesSent_ = 0;
+   mutable int64_t bytesReceived_ = 0;
+   mutable int64_t numberOfSends_ = 0;
+   mutable int64_t numberOfReceives_ = 0;
 };
 
 }  // namespace mpi
diff --git a/src/mesa_pd/mpi/SyncNextNeighborsBlockForest.cpp b/src/mesa_pd/mpi/SyncNextNeighborsBlockForest.cpp
index 417d1a86bd8005173550f358310f19aaba75f07e..34778d0e2ca5b458666498f296f8109ac72b4f50 100644
--- a/src/mesa_pd/mpi/SyncNextNeighborsBlockForest.cpp
+++ b/src/mesa_pd/mpi/SyncNextNeighborsBlockForest.cpp
@@ -51,6 +51,8 @@ void SyncNextNeighborsBlockForest::operator()(data::ParticleStorage& ps,
 {
    if (numProcesses_ == 1) return;
 
+   walberla::mpi::BufferSystem bs( walberla::mpi::MPIManager::instance()->comm() );
+
    WALBERLA_CHECK(!bs.isCommunicationRunning());
    WALBERLA_CHECK_EQUAL(bs.size(), 0);
 
@@ -67,7 +69,7 @@ void SyncNextNeighborsBlockForest::operator()(data::ParticleStorage& ps,
       }
    }
 
-   generateSynchronizationMessages(ps, bf, dx);
+   generateSynchronizationMessages(bs, ps, bf, dx);
 
    // size of buffer is unknown and changes with each send
    bs.setReceiverInfoFromSendBufferState(false, true);
@@ -86,9 +88,15 @@ void SyncNextNeighborsBlockForest::operator()(data::ParticleStorage& ps,
       }
    }
    WALBERLA_LOG_DETAIL( "Parsing of particle synchronization response ended." );
+
+   bytesSent_ = bs.getBytesSent();
+   bytesReceived_ = bs.getBytesReceived();
+   numberOfSends_ = bs.getNumberOfSends();
+   numberOfReceives_ = bs.getNumberOfReceives();
 }
 
-void SyncNextNeighborsBlockForest::generateSynchronizationMessages(data::ParticleStorage& ps,
+void SyncNextNeighborsBlockForest::generateSynchronizationMessages(walberla::mpi::BufferSystem& bs,
+                                                                   data::ParticleStorage& ps,
                                                                    const std::shared_ptr<blockforest::BlockForest>& bf,
                                                                    const real_t dx) const
 {
diff --git a/src/mesa_pd/mpi/SyncNextNeighborsBlockForest.h b/src/mesa_pd/mpi/SyncNextNeighborsBlockForest.h
index 2fa8dfc2d9a9e282f3e1f5c72b557e442f030009..8c04c3ceed47a17f5ec147722549ca4cd25f456d 100644
--- a/src/mesa_pd/mpi/SyncNextNeighborsBlockForest.h
+++ b/src/mesa_pd/mpi/SyncNextNeighborsBlockForest.h
@@ -60,20 +60,24 @@ public:
                    const std::shared_ptr<domain::BlockForestDomain>& domain,
                    const real_t dx = real_t(0)) const;
 
-   int64_t getBytesSent() const { return bs.getBytesSent(); }
-   int64_t getBytesReceived() const { return bs.getBytesReceived(); }
+   int64_t getBytesSent() const { return bytesSent_; }
+   int64_t getBytesReceived() const { return bytesReceived_; }
 
-   int64_t getNumberOfSends() const { return bs.getNumberOfSends(); }
-   int64_t getNumberOfReceives() const { return bs.getNumberOfReceives(); }
+   int64_t getNumberOfSends() const { return numberOfSends_; }
+   int64_t getNumberOfReceives() const { return numberOfReceives_; }
 private:
-   void generateSynchronizationMessages(data::ParticleStorage& ps,
+   void generateSynchronizationMessages(walberla::mpi::BufferSystem& bs,
+                                        data::ParticleStorage& ps,
                                         const std::shared_ptr<blockforest::BlockForest>& blockforest,
                                         const real_t dx) const;
 
-   mutable walberla::mpi::BufferSystem bs = walberla::mpi::BufferSystem( walberla::mpi::MPIManager::instance()->comm() );
-
    int numProcesses_ = walberla::mpi::MPIManager::instance()->numProcesses();
    int rank_         = walberla::mpi::MPIManager::instance()->rank();
+
+   mutable int64_t bytesSent_ = 0;
+   mutable int64_t bytesReceived_ = 0;
+   mutable int64_t numberOfSends_ = 0;
+   mutable int64_t numberOfReceives_ = 0;
 };
 
 }  // namespace mpi
diff --git a/src/mesa_pd/mpi/SyncNextNeighborsNoGhosts.cpp b/src/mesa_pd/mpi/SyncNextNeighborsNoGhosts.cpp
index cfd313cefa151826650f8a095f310674902afcdd..145b95cd8bea0732f1f8b507d7d9ed21bfd1c421 100644
--- a/src/mesa_pd/mpi/SyncNextNeighborsNoGhosts.cpp
+++ b/src/mesa_pd/mpi/SyncNextNeighborsNoGhosts.cpp
@@ -37,6 +37,8 @@ void SyncNextNeighborsNoGhosts::operator()(data::ParticleStorage& ps,
 {
    if (numProcesses_ == 1) return;
 
+   walberla::mpi::BufferSystem bs( walberla::mpi::MPIManager::instance()->comm() );
+
    neighborRanks_ = domain.getNeighborProcesses();
    for( uint_t nbProcessRank : neighborRanks_ )
    {
@@ -46,7 +48,7 @@ void SyncNextNeighborsNoGhosts::operator()(data::ParticleStorage& ps,
          bs.sendBuffer(nbProcessRank) << walberla::uint8_c(0);
       }
    }
-   generateSynchronizationMessages(ps, domain);
+   generateSynchronizationMessages(bs, ps, domain);
 
    // size of buffer is unknown and changes with each send
    bs.setReceiverInfoFromSendBufferState(false, true);
@@ -65,9 +67,15 @@ void SyncNextNeighborsNoGhosts::operator()(data::ParticleStorage& ps,
       }
    }
    WALBERLA_LOG_DETAIL( "Parsing of particle synchronization response ended." );
+
+   bytesSent_ = bs.getBytesSent();
+   bytesReceived_ = bs.getBytesReceived();
+   numberOfSends_ = bs.getNumberOfSends();
+   numberOfReceives_ = bs.getNumberOfReceives();
 }
 
-void SyncNextNeighborsNoGhosts::generateSynchronizationMessages(data::ParticleStorage& ps,
+void SyncNextNeighborsNoGhosts::generateSynchronizationMessages(walberla::mpi::BufferSystem& bs,
+                                                                data::ParticleStorage& ps,
                                                                 const domain::IDomain& domain) const
 {
    const uint_t ownRank = uint_c(rank_);
diff --git a/src/mesa_pd/mpi/SyncNextNeighborsNoGhosts.h b/src/mesa_pd/mpi/SyncNextNeighborsNoGhosts.h
index a802fe4d631a5b5499b07a24560984f3b98f86bf..a95bc567f5c8846f72262f457c9447b6f7f36f4e 100644
--- a/src/mesa_pd/mpi/SyncNextNeighborsNoGhosts.h
+++ b/src/mesa_pd/mpi/SyncNextNeighborsNoGhosts.h
@@ -60,20 +60,24 @@ public:
    void operator()(data::ParticleStorage& ps,
                    const domain::IDomain& domain) const;
 
-   int64_t getBytesSent() const { return bs.getBytesSent(); }
-   int64_t getBytesReceived() const { return bs.getBytesReceived(); }
+   int64_t getBytesSent() const { return bytesSent_; }
+   int64_t getBytesReceived() const { return bytesReceived_; }
 
-   int64_t getNumberOfSends() const { return bs.getNumberOfSends(); }
-   int64_t getNumberOfReceives() const { return bs.getNumberOfReceives(); }
+   int64_t getNumberOfSends() const { return numberOfSends_; }
+   int64_t getNumberOfReceives() const { return numberOfReceives_; }
 private:
-   void generateSynchronizationMessages(data::ParticleStorage& ps,
+   void generateSynchronizationMessages(walberla::mpi::BufferSystem& bs,
+                                        data::ParticleStorage& ps,
                                         const domain::IDomain& domain) const;
    mutable std::vector<uint_t> neighborRanks_; ///cache for neighbor ranks -> will be updated in operator()
 
-   mutable walberla::mpi::BufferSystem bs = walberla::mpi::BufferSystem( walberla::mpi::MPIManager::instance()->comm() );
-
    int numProcesses_ = walberla::mpi::MPIManager::instance()->numProcesses();
    int rank_         = walberla::mpi::MPIManager::instance()->rank();
+
+   mutable int64_t bytesSent_ = 0;
+   mutable int64_t bytesReceived_ = 0;
+   mutable int64_t numberOfSends_ = 0;
+   mutable int64_t numberOfReceives_ = 0;
 };
 
 }  // namespace mpi